From 9cd6964dc2d5eef0dd12b1fa0bdd6c63819d4ca3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Robert=20Gr=C3=BCndler?= Date: Wed, 20 Jul 2022 06:02:54 +0200 Subject: [PATCH 001/394] added support for geoip database mounting (#668) --- sentry/Chart.yaml | 2 +- sentry/README.md | 47 ++++++++++++++++++- sentry/templates/configmap-relay.yaml | 3 ++ sentry/templates/configmap-sentry.yaml | 6 ++- sentry/templates/deployment-relay.yaml | 4 ++ sentry/templates/deployment-sentry-web.yaml | 4 ++ .../templates/deployment-sentry-worker.yaml | 4 ++ sentry/values.yaml | 11 +++-- 8 files changed, 75 insertions(+), 6 deletions(-) diff --git a/sentry/Chart.yaml b/sentry/Chart.yaml index 1c1ecdb49..c299e0b8c 100644 --- a/sentry/Chart.yaml +++ b/sentry/Chart.yaml @@ -2,7 +2,7 @@ apiVersion: v2 name: sentry description: A Helm chart for Kubernetes type: application -version: 15.0.0 +version: 15.0.1 appVersion: 22.6.0 dependencies: - name: memcached diff --git a/sentry/README.md b/sentry/README.md index 0495ca5a2..2fbfaa859 100644 --- a/sentry/README.md +++ b/sentry/README.md @@ -121,7 +121,52 @@ sourcemaps: For details on the background see this blog post: https://engblog.yext.com/post/sentry-js-source-maps +## Geolocation + +[Geolocation of IP addresses](https://develop.sentry.dev/self-hosted/geolocation/) is supported if you provide a GeoIP database: + +Example values.yaml: + +```yaml + +relay: + # provide a volume for relay that contains the geoip database + volumes: + - name: geoip + hostPath: + path: /geodata + type: Directory + + +sentry: + web: + # provide a volume for sentry-web that contains the geoip database + volumes: + - name: geoip + hostPath: + path: /geodata + type: Directory + + worker: + # provide a volume for sentry-worker that contains the geoip database + volumes: + - name: geoip + hostPath: + path: /geodata + type: Directory + + +# enable and reference the volume +geodata: + volumeName: geoip + # mountPath of the volume containing the database + mountPath: /geodata + # path to the geoip database inside the volumemount + path: /geodata/GeoLite2-City.mmdb +``` + + # Usage - [AWS + Terraform](docs/usage-aws-terraform.md) -- [DigitalOcean](docs/usage-digitalocean.md) \ No newline at end of file +- [DigitalOcean](docs/usage-digitalocean.md) diff --git a/sentry/templates/configmap-relay.yaml b/sentry/templates/configmap-relay.yaml index cfcd0b938..5574ecb02 100644 --- a/sentry/templates/configmap-relay.yaml +++ b/sentry/templates/configmap-relay.yaml @@ -22,6 +22,9 @@ data: processing: enabled: true + {{- if .Values.geodata.path }} + geoip_path: {{ .Values.geodata.path | quote }} + {{- end }} kafka_config: - name: "bootstrap.servers" diff --git a/sentry/templates/configmap-sentry.yaml b/sentry/templates/configmap-sentry.yaml index 44fc78f98..9812840bd 100644 --- a/sentry/templates/configmap-sentry.yaml +++ b/sentry/templates/configmap-sentry.yaml @@ -128,7 +128,7 @@ data: from sentry.conf.server import * # NOQA from distutils.util import strtobool - + {{- if .Values.sourcemaps.enabled }} CACHES = { "default": { @@ -156,6 +156,10 @@ data: } } + {{- if .Values.geodata.path }} + GEOIP_PATH_MMDB = {{ .Values.geodata.path | quote }} + {{- end }} + # You should not change this setting after your database has been created # unless you have altered all schemas first SENTRY_USE_BIG_INTS = True diff --git a/sentry/templates/deployment-relay.yaml b/sentry/templates/deployment-relay.yaml index 08ae85364..588a76543 100644 --- a/sentry/templates/deployment-relay.yaml +++ b/sentry/templates/deployment-relay.yaml @@ -105,6 +105,10 @@ spec: mountPath: /work/.relay/config.yml subPath: config.yml readOnly: true + {{- if .Values.geodata.volumeName }} + - name: {{ .Values.geodata.volumeName }} + mountPath: {{ .Values.geodata.mountPath }} + {{- end }} livenessProbe: failureThreshold: {{ .Values.relay.probeFailureThreshold }} httpGet: diff --git a/sentry/templates/deployment-sentry-web.yaml b/sentry/templates/deployment-sentry-web.yaml index 641e775a1..e800c1a76 100644 --- a/sentry/templates/deployment-sentry-web.yaml +++ b/sentry/templates/deployment-sentry-web.yaml @@ -97,6 +97,10 @@ spec: readOnly: true - mountPath: {{ .Values.filestore.filesystem.path }} name: sentry-data + {{- if .Values.geodata.volumeName }} + - name: {{ .Values.geodata.volumeName }} + mountPath: {{ .Values.geodata.mountPath }} + {{- end }} {{- if and (eq .Values.filestore.backend "gcs") .Values.filestore.gcs.secretName }} - name: sentry-google-cloud-key mountPath: /var/run/secrets/google diff --git a/sentry/templates/deployment-sentry-worker.yaml b/sentry/templates/deployment-sentry-worker.yaml index 569cf29fa..762a97c64 100644 --- a/sentry/templates/deployment-sentry-worker.yaml +++ b/sentry/templates/deployment-sentry-worker.yaml @@ -98,6 +98,10 @@ spec: readOnly: true - mountPath: {{ .Values.filestore.filesystem.path }} name: sentry-data + {{- if .Values.geodata.volumeName }} + - name: {{ .Values.geodata.volumeName }} + mountPath: {{ .Values.geodata.mountPath }} + {{- end }} {{- if and (eq .Values.filestore.backend "gcs") .Values.filestore.gcs.secretName }} - name: sentry-google-cloud-key mountPath: /var/run/secrets/google diff --git a/sentry/values.yaml b/sentry/values.yaml index 679f09120..6e2b78603 100644 --- a/sentry/values.yaml +++ b/sentry/values.yaml @@ -7,7 +7,7 @@ user: ## set this value to an existingSecret name to create the admin user with the password in the secret # existingSecret: sentry-admin-password - + ## set this value to an existingSecretKey which holds the password to be used for sentry admin user default key is `admin-password` # existingSecretKey: admin-password @@ -75,6 +75,11 @@ relay: sidecars: [] volumes: [] +geodata: + path: "" + volumeName: "" + mountPath: "" + sentry: singleOrganization: true web: @@ -569,7 +574,7 @@ nginx: replicaCount: 1 service: type: ClusterIP - ports: + ports: http: 80 ## Use this to enable an extra service account # serviceAccount: @@ -745,7 +750,7 @@ kafka: socketRequestMaxBytes: "50000000" service: - ports: + ports: client: 9092 ## Use this to enable an extra service account From 2418ba8c38a85991c9c9eb5a281bfb3d5d72a020 Mon Sep 17 00:00:00 2001 From: Nishant Ravi Date: Fri, 22 Jul 2022 12:09:32 +0200 Subject: [PATCH 002/394] feat: added activeDeadlineSeconds to all jobs (#683) Co-authored-by: nrav --- sentry/templates/cronjob-sentry-cleanup.yaml | 3 +++ sentry/templates/cronjob-snuba-cleanup-errors.yaml | 3 +++ sentry/templates/cronjob-snuba-cleanup-transactions.yaml | 3 +++ sentry/templates/hooks/sentry-db-check.job.yaml | 3 +++ sentry/templates/hooks/sentry-db-init.job.yaml | 3 +++ sentry/templates/hooks/snuba-db-init.job.yaml | 3 +++ sentry/templates/hooks/snuba-migrate.job.yaml | 3 +++ sentry/templates/hooks/user-create.yaml | 3 +++ sentry/values.yaml | 4 ++++ 9 files changed, 28 insertions(+) diff --git a/sentry/templates/cronjob-sentry-cleanup.yaml b/sentry/templates/cronjob-sentry-cleanup.yaml index 076ce16e6..9d6de5008 100644 --- a/sentry/templates/cronjob-sentry-cleanup.yaml +++ b/sentry/templates/cronjob-sentry-cleanup.yaml @@ -13,6 +13,9 @@ spec: concurrencyPolicy: "{{ .Values.sentry.cleanup.concurrencyPolicy }}" jobTemplate: spec: + {{- if .Values.sentry.cleanup.activeDeadlineSeconds }} + activeDeadlineSeconds: {{ .Values.sentry.cleanup.activeDeadlineSeconds }} + {{- end}} template: metadata: annotations: diff --git a/sentry/templates/cronjob-snuba-cleanup-errors.yaml b/sentry/templates/cronjob-snuba-cleanup-errors.yaml index e2a5d447f..a6c6ee25f 100644 --- a/sentry/templates/cronjob-snuba-cleanup-errors.yaml +++ b/sentry/templates/cronjob-snuba-cleanup-errors.yaml @@ -13,6 +13,9 @@ spec: concurrencyPolicy: "{{ .Values.snuba.cleanupErrors.concurrencyPolicy }}" jobTemplate: spec: + {{- if .Values.snuba.cleanupErrors.activeDeadlineSeconds }} + activeDeadlineSeconds: {{ .Values.snuba.cleanupErrors.activeDeadlineSeconds }} + {{- end}} template: metadata: annotations: diff --git a/sentry/templates/cronjob-snuba-cleanup-transactions.yaml b/sentry/templates/cronjob-snuba-cleanup-transactions.yaml index 463933442..a33d0a7cc 100644 --- a/sentry/templates/cronjob-snuba-cleanup-transactions.yaml +++ b/sentry/templates/cronjob-snuba-cleanup-transactions.yaml @@ -13,6 +13,9 @@ spec: concurrencyPolicy: "{{ .Values.snuba.cleanupTransactions.concurrencyPolicy }}" jobTemplate: spec: + {{- if .Values.snuba.cleanupTransactions.activeDeadlineSeconds }} + activeDeadlineSeconds: {{ .Values.snuba.cleanupTransactions.activeDeadlineSeconds }} + {{- end}} template: metadata: annotations: diff --git a/sentry/templates/hooks/sentry-db-check.job.yaml b/sentry/templates/hooks/sentry-db-check.job.yaml index 4b21a1870..9d551dc9b 100644 --- a/sentry/templates/hooks/sentry-db-check.job.yaml +++ b/sentry/templates/hooks/sentry-db-check.job.yaml @@ -19,6 +19,9 @@ metadata: "helm.sh/hook-delete-policy": "{{ if .Values.hooks.removeOnSuccess }}hook-succeeded,{{ end }}before-hook-creation" "helm.sh/hook-weight": "-1" spec: + {{- if .Values.hooks.activeDeadlineSeconds }} + activeDeadlineSeconds: {{ .Values.hooks.activeDeadlineSeconds }} + {{- end}} template: metadata: name: {{ template "sentry.fullname" . }}-db-check diff --git a/sentry/templates/hooks/sentry-db-init.job.yaml b/sentry/templates/hooks/sentry-db-init.job.yaml index 510b367a6..f8ca98464 100644 --- a/sentry/templates/hooks/sentry-db-init.job.yaml +++ b/sentry/templates/hooks/sentry-db-init.job.yaml @@ -15,6 +15,9 @@ metadata: "helm.sh/hook-delete-policy": "{{ if .Values.hooks.removeOnSuccess }}hook-succeeded,{{ end }}before-hook-creation" "helm.sh/hook-weight": "6" spec: + {{- if .Values.hooks.activeDeadlineSeconds }} + activeDeadlineSeconds: {{ .Values.hooks.activeDeadlineSeconds }} + {{- end}} template: metadata: name: {{ template "sentry.fullname" . }}-db-init diff --git a/sentry/templates/hooks/snuba-db-init.job.yaml b/sentry/templates/hooks/snuba-db-init.job.yaml index 591ed8d69..b81f98756 100644 --- a/sentry/templates/hooks/snuba-db-init.job.yaml +++ b/sentry/templates/hooks/snuba-db-init.job.yaml @@ -16,6 +16,9 @@ metadata: "helm.sh/hook-delete-policy": "{{ if .Values.hooks.removeOnSuccess }}hook-succeeded,{{ end }}before-hook-creation" "helm.sh/hook-weight": "3" spec: + {{- if .Values.hooks.activeDeadlineSeconds }} + activeDeadlineSeconds: {{ .Values.hooks.activeDeadlineSeconds }} + {{- end}} template: metadata: name: {{ template "sentry.fullname" . }}-snuba-db-init diff --git a/sentry/templates/hooks/snuba-migrate.job.yaml b/sentry/templates/hooks/snuba-migrate.job.yaml index b2977dbf4..57ade6551 100644 --- a/sentry/templates/hooks/snuba-migrate.job.yaml +++ b/sentry/templates/hooks/snuba-migrate.job.yaml @@ -16,6 +16,9 @@ metadata: "helm.sh/hook-delete-policy": "{{ if .Values.hooks.removeOnSuccess }}hook-succeeded,{{ end }}before-hook-creation" "helm.sh/hook-weight": "5" spec: + {{- if .Values.hooks.activeDeadlineSeconds }} + activeDeadlineSeconds: {{ .Values.hooks.activeDeadlineSeconds }} + {{- end}} template: metadata: name: {{ template "sentry.fullname" . }}-snuba-migrate diff --git a/sentry/templates/hooks/user-create.yaml b/sentry/templates/hooks/user-create.yaml index 69d682a9e..fb071ade7 100644 --- a/sentry/templates/hooks/user-create.yaml +++ b/sentry/templates/hooks/user-create.yaml @@ -13,6 +13,9 @@ metadata: "helm.sh/hook-delete-policy": "{{ if .Values.hooks.removeOnSuccess }}hook-succeeded,{{ end }}before-hook-creation" "helm.sh/hook-weight": "9" spec: + {{- if .Values.hooks.activeDeadlineSeconds }} + activeDeadlineSeconds: {{ .Values.hooks.activeDeadlineSeconds }} + {{- end}} template: metadata: name: {{ template "sentry.fullname" . }}-user-create diff --git a/sentry/values.yaml b/sentry/values.yaml index 6e2b78603..58fac2774 100644 --- a/sentry/values.yaml +++ b/sentry/values.yaml @@ -215,6 +215,7 @@ sentry: sidecars: [] volumes: [] cleanup: + activeDeadlineSeconds: 100 concurrencyPolicy: Allow enabled: true schedule: "0 0 * * *" @@ -401,6 +402,7 @@ snuba: env: [] cleanupErrors: + activeDeadlineSeconds: 100 concurrencyPolicy: Allow enabled: true schedule: "0 * * * *" @@ -408,6 +410,7 @@ snuba: volumes: [] cleanupTransactions: + activeDeadlineSeconds: 100 concurrencyPolicy: Allow enabled: true schedule: "0 * * * *" @@ -417,6 +420,7 @@ snuba: hooks: enabled: true removeOnSuccess: true + activeDeadlineSeconds: 100 dbCheck: image: # repository: subfuzion/netcat From 0bc212daf3a999019d035deaed979f157f69d8ad Mon Sep 17 00:00:00 2001 From: Nishant Ravi Date: Fri, 22 Jul 2022 13:58:52 +0200 Subject: [PATCH 003/394] Feat: add service account names for cronjobs (#681) --- sentry/Chart.yaml | 2 +- sentry/templates/cronjob-sentry-cleanup.yaml | 3 +++ sentry/templates/cronjob-snuba-cleanup-errors.yaml | 3 +++ sentry/templates/cronjob-snuba-cleanup-transactions.yaml | 3 +++ sentry/values.yaml | 3 +++ 5 files changed, 13 insertions(+), 1 deletion(-) diff --git a/sentry/Chart.yaml b/sentry/Chart.yaml index c299e0b8c..9637d91dc 100644 --- a/sentry/Chart.yaml +++ b/sentry/Chart.yaml @@ -2,7 +2,7 @@ apiVersion: v2 name: sentry description: A Helm chart for Kubernetes type: application -version: 15.0.1 +version: 15.0.2 appVersion: 22.6.0 dependencies: - name: memcached diff --git a/sentry/templates/cronjob-sentry-cleanup.yaml b/sentry/templates/cronjob-sentry-cleanup.yaml index 9d6de5008..4a42c9ff4 100644 --- a/sentry/templates/cronjob-sentry-cleanup.yaml +++ b/sentry/templates/cronjob-sentry-cleanup.yaml @@ -129,4 +129,7 @@ spec: {{- if .Values.sentry.cleanup.priorityClassName }} priorityClassName: "{{ .Values.sentry.cleanup.priorityClassName }}" {{- end }} + {{- if .Values.sentry.cleanup.serviceAccount }} + serviceAccountName: {{ .Values.sentry.cleanup.serviceAccount.name }} + {{- end }} {{- end }} diff --git a/sentry/templates/cronjob-snuba-cleanup-errors.yaml b/sentry/templates/cronjob-snuba-cleanup-errors.yaml index a6c6ee25f..aef3aaf6c 100644 --- a/sentry/templates/cronjob-snuba-cleanup-errors.yaml +++ b/sentry/templates/cronjob-snuba-cleanup-errors.yaml @@ -98,4 +98,7 @@ spec: {{- if .Values.snuba.cleanupErrors.priorityClassName }} priorityClassName: "{{ .Values.snuba.cleanupErrors.priorityClassName }}" {{- end }} + {{- if .Values.snuba.cleanupErrors.serviceAccount }} + serviceAccountName: {{ .Values.snuba.cleanupErrors.serviceAccount.name }} + {{- end }} {{- end }} diff --git a/sentry/templates/cronjob-snuba-cleanup-transactions.yaml b/sentry/templates/cronjob-snuba-cleanup-transactions.yaml index a33d0a7cc..1bb051bd7 100644 --- a/sentry/templates/cronjob-snuba-cleanup-transactions.yaml +++ b/sentry/templates/cronjob-snuba-cleanup-transactions.yaml @@ -98,4 +98,7 @@ spec: {{- if .Values.snuba.cleanupTransactions.priorityClassName }} priorityClassName: "{{ .Values.snuba.cleanupTransactions.priorityClassName }}" {{- end }} + {{- if .Values.snuba.cleanupTransactions.serviceAccount }} + serviceAccountName: {{ .Values.snuba.cleanupTransactions.serviceAccount.name }} + {{- end }} {{- end }} diff --git a/sentry/values.yaml b/sentry/values.yaml index 58fac2774..d926de677 100644 --- a/sentry/values.yaml +++ b/sentry/values.yaml @@ -222,6 +222,7 @@ sentry: days: 90 sidecars: [] volumes: [] + serviceAccount: {} snuba: api: @@ -408,6 +409,7 @@ snuba: schedule: "0 * * * *" sidecars: [] volumes: [] + serviceAccount: {} cleanupTransactions: activeDeadlineSeconds: 100 @@ -416,6 +418,7 @@ snuba: schedule: "0 * * * *" sidecars: [] volumes: [] + serviceAccount: {} hooks: enabled: true From f13da86b541aa8645f1e7a72e54ea3df5ad6f7b2 Mon Sep 17 00:00:00 2001 From: Nishant Ravi Date: Fri, 22 Jul 2022 14:17:21 +0200 Subject: [PATCH 004/394] feat: history limits for cronjobs (#682) * feat: added history limits for cronjobs * chore: updated chart version to 15.0.3 Co-authored-by: nrav --- sentry/Chart.yaml | 2 +- sentry/templates/cronjob-sentry-cleanup.yaml | 2 ++ sentry/templates/cronjob-snuba-cleanup-errors.yaml | 2 ++ sentry/templates/cronjob-snuba-cleanup-transactions.yaml | 2 ++ sentry/values.yaml | 5 +++++ 5 files changed, 12 insertions(+), 1 deletion(-) diff --git a/sentry/Chart.yaml b/sentry/Chart.yaml index 9637d91dc..388a0e639 100644 --- a/sentry/Chart.yaml +++ b/sentry/Chart.yaml @@ -2,7 +2,7 @@ apiVersion: v2 name: sentry description: A Helm chart for Kubernetes type: application -version: 15.0.2 +version: 15.0.3 appVersion: 22.6.0 dependencies: - name: memcached diff --git a/sentry/templates/cronjob-sentry-cleanup.yaml b/sentry/templates/cronjob-sentry-cleanup.yaml index 4a42c9ff4..7590db501 100644 --- a/sentry/templates/cronjob-sentry-cleanup.yaml +++ b/sentry/templates/cronjob-sentry-cleanup.yaml @@ -10,6 +10,8 @@ metadata: heritage: "{{ .Release.Service }}" spec: schedule: "{{ .Values.sentry.cleanup.schedule }}" + successfulJobsHistoryLimit: {{ .Values.sentry.cleanup.successfulJobsHistoryLimit }} + failedJobsHistoryLimit: {{ .Values.sentry.cleanup.failedJobsHistoryLimit }} concurrencyPolicy: "{{ .Values.sentry.cleanup.concurrencyPolicy }}" jobTemplate: spec: diff --git a/sentry/templates/cronjob-snuba-cleanup-errors.yaml b/sentry/templates/cronjob-snuba-cleanup-errors.yaml index aef3aaf6c..7a92c3b82 100644 --- a/sentry/templates/cronjob-snuba-cleanup-errors.yaml +++ b/sentry/templates/cronjob-snuba-cleanup-errors.yaml @@ -10,6 +10,8 @@ metadata: heritage: "{{ .Release.Service }}" spec: schedule: "{{ .Values.snuba.cleanupErrors.schedule }}" + successfulJobsHistoryLimit: {{ .Values.snuba.cleanupErrors.successfulJobsHistoryLimit }} + failedJobsHistoryLimit: {{ .Values.snuba.cleanupErrors.failedJobsHistoryLimit }} concurrencyPolicy: "{{ .Values.snuba.cleanupErrors.concurrencyPolicy }}" jobTemplate: spec: diff --git a/sentry/templates/cronjob-snuba-cleanup-transactions.yaml b/sentry/templates/cronjob-snuba-cleanup-transactions.yaml index 1bb051bd7..ad2350eaa 100644 --- a/sentry/templates/cronjob-snuba-cleanup-transactions.yaml +++ b/sentry/templates/cronjob-snuba-cleanup-transactions.yaml @@ -10,6 +10,8 @@ metadata: heritage: "{{ .Release.Service }}" spec: schedule: "{{ .Values.snuba.cleanupTransactions.schedule }}" + successfulJobsHistoryLimit: {{ .Values.snuba.cleanupTransactions.successfulJobsHistoryLimit }} + failedJobsHistoryLimit: {{ .Values.snuba.cleanupTransactions.failedJobsHistoryLimit }} concurrencyPolicy: "{{ .Values.snuba.cleanupTransactions.concurrencyPolicy }}" jobTemplate: spec: diff --git a/sentry/values.yaml b/sentry/values.yaml index d926de677..b338ac4fa 100644 --- a/sentry/values.yaml +++ b/sentry/values.yaml @@ -215,6 +215,8 @@ sentry: sidecars: [] volumes: [] cleanup: + successfulJobsHistoryLimit: 5 + failedJobsHistoryLimit: 5 activeDeadlineSeconds: 100 concurrencyPolicy: Allow enabled: true @@ -403,6 +405,7 @@ snuba: env: [] cleanupErrors: + successfulJobsHistoryLimit: 5 activeDeadlineSeconds: 100 concurrencyPolicy: Allow enabled: true @@ -412,6 +415,8 @@ snuba: serviceAccount: {} cleanupTransactions: + successfulJobsHistoryLimit: 5 + failedJobsHistoryLimit: 5 activeDeadlineSeconds: 100 concurrencyPolicy: Allow enabled: true From 50b8f1e8879e22dcf7d10035b64c8ffa2b7e41ae Mon Sep 17 00:00:00 2001 From: Nishant Ravi Date: Wed, 27 Jul 2022 05:24:02 +0200 Subject: [PATCH 005/394] feat: add podLables to Sentry hooks (#659) --- sentry/Chart.yaml | 2 +- sentry/templates/hooks/sentry-db-check.job.yaml | 3 +++ sentry/templates/hooks/sentry-db-init.job.yaml | 3 +++ sentry/templates/hooks/snuba-db-init.job.yaml | 3 +++ sentry/templates/hooks/snuba-migrate.job.yaml | 3 +++ sentry/values.yaml | 5 +++++ 6 files changed, 18 insertions(+), 1 deletion(-) diff --git a/sentry/Chart.yaml b/sentry/Chart.yaml index 388a0e639..414de7627 100644 --- a/sentry/Chart.yaml +++ b/sentry/Chart.yaml @@ -2,7 +2,7 @@ apiVersion: v2 name: sentry description: A Helm chart for Kubernetes type: application -version: 15.0.3 +version: 15.0.7 appVersion: 22.6.0 dependencies: - name: memcached diff --git a/sentry/templates/hooks/sentry-db-check.job.yaml b/sentry/templates/hooks/sentry-db-check.job.yaml index 9d551dc9b..ddbab4b0d 100644 --- a/sentry/templates/hooks/sentry-db-check.job.yaml +++ b/sentry/templates/hooks/sentry-db-check.job.yaml @@ -38,6 +38,9 @@ spec: {{- if .Values.sentry.worker.podLabels }} {{ toYaml .Values.sentry.worker.podLabels | indent 8 }} {{- end }} + {{- if .Values.hooks.dbCheck.podLabels }} +{{ toYaml .Values.hooks.dbCheck.podLabels | indent 8 }} + {{- end }} spec: {{- if .Values.hooks.dbCheck.affinity }} affinity: diff --git a/sentry/templates/hooks/sentry-db-init.job.yaml b/sentry/templates/hooks/sentry-db-init.job.yaml index f8ca98464..11c0bb600 100644 --- a/sentry/templates/hooks/sentry-db-init.job.yaml +++ b/sentry/templates/hooks/sentry-db-init.job.yaml @@ -35,6 +35,9 @@ spec: {{- if .Values.sentry.worker.podLabels }} {{ toYaml .Values.sentry.worker.podLabels | indent 8 }} {{- end }} + {{- if .Values.hooks.dbInit.podLabels }} +{{ toYaml .Values.hooks.dbInit.podLabels | indent 8 }} + {{- end }} spec: {{- if .Values.hooks.dbInit.affinity }} affinity: diff --git a/sentry/templates/hooks/snuba-db-init.job.yaml b/sentry/templates/hooks/snuba-db-init.job.yaml index b81f98756..1d1524c47 100644 --- a/sentry/templates/hooks/snuba-db-init.job.yaml +++ b/sentry/templates/hooks/snuba-db-init.job.yaml @@ -37,6 +37,9 @@ spec: {{- if .Values.snuba.podLabels }} {{ toYaml .Values.snuba.podLabels | indent 8 }} {{- end }} + {{- if .Values.hooks.snubaInit.podLabels }} +{{ toYaml .Values.hooks.snubaInit.podLabels | indent 8 }} + {{- end }} spec: {{- if .Values.hooks.snubaInit.affinity }} affinity: diff --git a/sentry/templates/hooks/snuba-migrate.job.yaml b/sentry/templates/hooks/snuba-migrate.job.yaml index 57ade6551..8f01c8d98 100644 --- a/sentry/templates/hooks/snuba-migrate.job.yaml +++ b/sentry/templates/hooks/snuba-migrate.job.yaml @@ -37,6 +37,9 @@ spec: {{- if .Values.snuba.podLabels }} {{ toYaml .Values.snuba.podLabels | indent 8 }} {{- end }} + {{- if .Values.hooks.snubaMigrate.podLabels }} +{{ toYaml .Values.hooks.snubaMigrate.podLabels | indent 8 }} + {{- end }} spec: {{- if .Values.hooks.snubaInit.affinity }} affinity: diff --git a/sentry/values.yaml b/sentry/values.yaml index b338ac4fa..c6b222449 100644 --- a/sentry/values.yaml +++ b/sentry/values.yaml @@ -436,6 +436,7 @@ hooks: # pullPolicy: IfNotPresent imagePullSecrets: [] env: [] + # podLabels: [] podAnnotations: {} resources: limits: @@ -449,6 +450,7 @@ hooks: # tolerations: [] dbInit: env: [] + # podLabels: [] podAnnotations: {} resources: limits: @@ -462,6 +464,7 @@ hooks: nodeSelector: {} # tolerations: [] snubaInit: + # podLabels: [] podAnnotations: {} resources: limits: @@ -473,6 +476,8 @@ hooks: affinity: {} nodeSelector: {} # tolerations: [] + snubaMigrate: {} + # podLabels: [] system: ## be sure to include the scheme on the url, for example: "https://sentry.example.com" From b81316d4b524e19b6f2968c7552f76c47ef33368 Mon Sep 17 00:00:00 2001 From: Nishant Ravi Date: Wed, 27 Jul 2022 15:38:29 +0200 Subject: [PATCH 006/394] feat: add share process namespace to hook jobs (#688) --- sentry/Chart.yaml | 2 +- sentry/templates/hooks/sentry-db-check.job.yaml | 3 +++ sentry/templates/hooks/sentry-db-init.job.yaml | 3 +++ sentry/templates/hooks/snuba-db-init.job.yaml | 3 +++ sentry/templates/hooks/snuba-migrate.job.yaml | 3 +++ sentry/templates/hooks/user-create.yaml | 3 +++ sentry/values.yaml | 1 + 7 files changed, 17 insertions(+), 1 deletion(-) diff --git a/sentry/Chart.yaml b/sentry/Chart.yaml index 414de7627..b7f1e426a 100644 --- a/sentry/Chart.yaml +++ b/sentry/Chart.yaml @@ -2,7 +2,7 @@ apiVersion: v2 name: sentry description: A Helm chart for Kubernetes type: application -version: 15.0.7 +version: 15.0.8 appVersion: 22.6.0 dependencies: - name: memcached diff --git a/sentry/templates/hooks/sentry-db-check.job.yaml b/sentry/templates/hooks/sentry-db-check.job.yaml index ddbab4b0d..3ee62e593 100644 --- a/sentry/templates/hooks/sentry-db-check.job.yaml +++ b/sentry/templates/hooks/sentry-db-check.job.yaml @@ -143,4 +143,7 @@ spec: {{- end }} resources: {{ toYaml .Values.hooks.dbCheck.resources | indent 10 }} + {{- if .Values.hooks.shareProcessNamespace }} + shareProcessNamespace: {{ .Values.hooks.shareProcessNamespace }} + {{- end }} {{- end }} diff --git a/sentry/templates/hooks/sentry-db-init.job.yaml b/sentry/templates/hooks/sentry-db-init.job.yaml index 11c0bb600..1eb0d38b9 100644 --- a/sentry/templates/hooks/sentry-db-init.job.yaml +++ b/sentry/templates/hooks/sentry-db-init.job.yaml @@ -99,4 +99,7 @@ spec: {{- if .Values.hooks.dbInit.volumes }} {{ toYaml .Values.hooks.dbInit.volumes | indent 6 }} {{- end }} + {{- if .Values.hooks.shareProcessNamespace }} + shareProcessNamespace: {{ .Values.hooks.shareProcessNamespace }} + {{- end }} {{- end -}} diff --git a/sentry/templates/hooks/snuba-db-init.job.yaml b/sentry/templates/hooks/snuba-db-init.job.yaml index 1d1524c47..685afd328 100644 --- a/sentry/templates/hooks/snuba-db-init.job.yaml +++ b/sentry/templates/hooks/snuba-db-init.job.yaml @@ -93,4 +93,7 @@ spec: - name: config configMap: name: {{ template "sentry.fullname" . }}-snuba + {{- if .Values.hooks.shareProcessNamespace }} + shareProcessNamespace: {{ .Values.hooks.shareProcessNamespace }} + {{- end }} {{- end }} diff --git a/sentry/templates/hooks/snuba-migrate.job.yaml b/sentry/templates/hooks/snuba-migrate.job.yaml index 8f01c8d98..adf719c20 100644 --- a/sentry/templates/hooks/snuba-migrate.job.yaml +++ b/sentry/templates/hooks/snuba-migrate.job.yaml @@ -93,4 +93,7 @@ spec: - name: config configMap: name: {{ template "sentry.fullname" . }}-snuba + {{- if .Values.hooks.shareProcessNamespace }} + shareProcessNamespace: {{ .Values.hooks.shareProcessNamespace }} + {{- end }} {{- end }} diff --git a/sentry/templates/hooks/user-create.yaml b/sentry/templates/hooks/user-create.yaml index fb071ade7..cc68a81f7 100644 --- a/sentry/templates/hooks/user-create.yaml +++ b/sentry/templates/hooks/user-create.yaml @@ -104,4 +104,7 @@ spec: - name: config configMap: name: {{ template "sentry.fullname" . }}-sentry + {{- if .Values.hooks.shareProcessNamespace }} + shareProcessNamespace: {{ .Values.hooks.shareProcessNamespace }} + {{- end }} {{- end -}} diff --git a/sentry/values.yaml b/sentry/values.yaml index c6b222449..9fb0e8239 100644 --- a/sentry/values.yaml +++ b/sentry/values.yaml @@ -429,6 +429,7 @@ hooks: enabled: true removeOnSuccess: true activeDeadlineSeconds: 100 + shareProcessNamespace: false dbCheck: image: # repository: subfuzion/netcat From c49a0532d3d7558d5e23499fec7e5ae085f282d5 Mon Sep 17 00:00:00 2001 From: leo108 Date: Wed, 27 Jul 2022 22:25:16 +0800 Subject: [PATCH 007/394] Fix Clickhouse servicemonitor (#689) --- clickhouse/Chart.yaml | 2 +- .../servicemonitor-clickhouse-replica.yaml | 14 ++++++++++++++ .../templates/servicemonitor-clickhouse.yaml | 14 +++++++++++++- 3 files changed, 28 insertions(+), 2 deletions(-) diff --git a/clickhouse/Chart.yaml b/clickhouse/Chart.yaml index 248947d26..ad2fc8f51 100755 --- a/clickhouse/Chart.yaml +++ b/clickhouse/Chart.yaml @@ -11,6 +11,6 @@ keywords: name: clickhouse sources: - https://github.com/sentry-kubernetes/charts -version: 3.1.2 +version: 3.1.3 maintainers: - name: sentry-kubernetes diff --git a/clickhouse/templates/servicemonitor-clickhouse-replica.yaml b/clickhouse/templates/servicemonitor-clickhouse-replica.yaml index 642b44966..f7fa907af 100755 --- a/clickhouse/templates/servicemonitor-clickhouse-replica.yaml +++ b/clickhouse/templates/servicemonitor-clickhouse-replica.yaml @@ -1,3 +1,4 @@ +{{- if .Values.clickhouse.configmap.remote_servers.replica.backup.enabled }} {{- if .Values.clickhouse.metrics.serviceMonitor.enabled }} apiVersion: monitoring.coreos.com/v1 kind: ServiceMonitor @@ -14,13 +15,26 @@ metadata: {{- toYaml .Values.clickhouse.metrics.serviceMonitor.selector | nindent 4 }} {{- end }} spec: + namespaceSelector: + matchNames: + - {{ .Release.Namespace }} selector: matchLabels: app.kubernetes.io/name: {{ include "clickhouse.name" . }}-replica-metrics endpoints: - port: metrics + path: /metrics {{- if .Values.clickhouse.metrics.serviceMonitor.interval }} interval: {{ .Values.clickhouse.metrics.serviceMonitor.interval }} {{- end }} +{{- if .Values.clickhouse.metrics.serviceMonitor.metricRelabelings }} + metricRelabelings: +{{ toYaml .Values.clickhouse.metrics.serviceMonitor.metricRelabelings | indent 6 }} +{{- end }} +{{- if .Values.clickhouse.metrics.serviceMonitor.relabelings }} + relabelings: +{{ toYaml .Values.clickhouse.metrics.serviceMonitor.relabelings | nindent 6 }} +{{- end }} --- {{- end }} +{{- end }} diff --git a/clickhouse/templates/servicemonitor-clickhouse.yaml b/clickhouse/templates/servicemonitor-clickhouse.yaml index ab5d94c2c..bb9aa3056 100755 --- a/clickhouse/templates/servicemonitor-clickhouse.yaml +++ b/clickhouse/templates/servicemonitor-clickhouse.yaml @@ -14,13 +14,25 @@ metadata: {{- toYaml .Values.clickhouse.metrics.serviceMonitor.selector | nindent 4 }} {{- end }} spec: + namespaceSelector: + matchNames: + - {{ .Release.Namespace }} selector: matchLabels: app.kubernetes.io/name: {{ include "clickhouse.name" . }}-metrics endpoints: - port: metrics + path: /metrics {{- if .Values.clickhouse.metrics.serviceMonitor.interval }} interval: {{ .Values.clickhouse.metrics.serviceMonitor.interval }} - {{- end }} + {{- end }} +{{- if .Values.clickhouse.metrics.serviceMonitor.metricRelabelings }} + metricRelabelings: +{{ toYaml .Values.clickhouse.metrics.serviceMonitor.metricRelabelings | indent 6 }} +{{- end }} +{{- if .Values.clickhouse.metrics.serviceMonitor.relabelings }} + relabelings: +{{ toYaml .Values.clickhouse.metrics.serviceMonitor.relabelings | nindent 6 }} +{{- end }} --- {{- end}} From af18ad2fa051383c0db96ef50fcdc9832c86c99c Mon Sep 17 00:00:00 2001 From: Jamk124 <110166038+Jamk124@users.noreply.github.com> Date: Mon, 1 Aug 2022 09:33:54 +0200 Subject: [PATCH 008/394] Fixing indent in user-create.yaml (#692) Co-authored-by: Jona.Krois --- sentry/templates/hooks/user-create.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sentry/templates/hooks/user-create.yaml b/sentry/templates/hooks/user-create.yaml index cc68a81f7..c795b58ef 100644 --- a/sentry/templates/hooks/user-create.yaml +++ b/sentry/templates/hooks/user-create.yaml @@ -92,7 +92,7 @@ spec: key: {{ default "postgresql-password" .Values.postgresql.existingSecretKey }} {{- end }} {{- if .Values.hooks.dbInit.env }} -{{ toYaml .Values.hooks.dbInit.env | indent 10 }} +{{ toYaml .Values.hooks.dbInit.env | indent 8 }} {{- end }} volumeMounts: - mountPath: /etc/sentry From 8dd1d3975cbf843cf98301a15315cf9b73c92454 Mon Sep 17 00:00:00 2001 From: Aqeel Ahmad Date: Mon, 1 Aug 2022 18:26:44 +0400 Subject: [PATCH 009/394] Add instructions for cluster of external Kafka instances (#691) This improves an example on how one can configure a cluster of external Kafka instances. --- sentry/README.md | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/sentry/README.md b/sentry/README.md index 2fbfaa859..f43929c41 100644 --- a/sentry/README.md +++ b/sentry/README.md @@ -165,6 +165,32 @@ geodata: path: /geodata/GeoLite2-City.mmdb ``` +## External Kafka configuration + +You can either provide a single host, which is there by default in `values.yaml`, like this: + +```yaml +externalKafka: + ## Hostname or ip address of external kafka + ## + host: "kafka-confluent" + port: 9092 +``` + +or you can feed in a cluster of Kafka instances like below: + +```yaml +externalKafka: + ## List of Hostnames or ip addresses of external kafka + - host: "233.5.100.28" + port: 9092 + - host: "233.5.100.29" + port: 9092 + - host: "233.5.100.30" + port: 9092 +``` + + # Usage From 412841202e136f64266139132ebc96037a43d9ca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Yann=20Toqu=C3=A9?= <14300737+yanntoque@users.noreply.github.com> Date: Mon, 8 Aug 2022 14:47:15 +0200 Subject: [PATCH 010/394] fix: Apply appropriate batch apiVersion based on kubernetes version (#700) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit As stated in the [deprecated API Migration Guide](https://kubernetes.io/docs/reference/using-api/deprecation-guide/\#cronjob-v125), batch/v1beta1 will no longer be served in v1.25 This commit allows to set the appropriate batch apiVersion based on sentry.kubeVersion Signed-off-by: Yann Toqué --- sentry/Chart.yaml | 2 +- sentry/templates/_helper.tpl | 20 +++++++++++++++++++ sentry/templates/cronjob-sentry-cleanup.yaml | 3 ++- .../cronjob-snuba-cleanup-errors.yaml | 3 ++- .../cronjob-snuba-cleanup-transactions.yaml | 3 ++- .../templates/hooks/sentry-db-check.job.yaml | 3 ++- .../templates/hooks/sentry-db-init.job.yaml | 3 ++- sentry/templates/hooks/snuba-db-init.job.yaml | 3 ++- sentry/templates/hooks/snuba-migrate.job.yaml | 3 ++- sentry/templates/hooks/user-create.yaml | 3 ++- 10 files changed, 37 insertions(+), 9 deletions(-) diff --git a/sentry/Chart.yaml b/sentry/Chart.yaml index b7f1e426a..b43b75b05 100644 --- a/sentry/Chart.yaml +++ b/sentry/Chart.yaml @@ -2,7 +2,7 @@ apiVersion: v2 name: sentry description: A Helm chart for Kubernetes type: application -version: 15.0.8 +version: 15.0.9 appVersion: 22.6.0 dependencies: - name: memcached diff --git a/sentry/templates/_helper.tpl b/sentry/templates/_helper.tpl index 94332c7ec..4364190fc 100644 --- a/sentry/templates/_helper.tpl +++ b/sentry/templates/_helper.tpl @@ -98,6 +98,26 @@ Return if ingress is stable. {{- eq (include "sentry.ingress.apiVersion" .) "networking.k8s.io/v1" -}} {{- end -}} +{{/* +Return the appropriate apiVersion for batch (cronjobs and jobs). +batch/v1beta1 will no longer be served in v1.25 +See more at https://kubernetes.io/docs/reference/using-api/deprecation-guide/#cronjob-v125 +*/}} +{{- define "sentry.batch.apiVersion" -}} + {{- if and (.Capabilities.APIVersions.Has "batch/v1") (semverCompare ">= 1.21.x" (include "sentry.kubeVersion" .)) -}} + {{- print "batch/v1" -}} + {{- else if .Capabilities.APIVersions.Has "batch/v1beta1" -}} + {{- print "batch/v1beta1" -}} + {{- end -}} +{{- end -}} + +{{/* +Return if batch is stable. +*/}} +{{- define "sentry.batch.isStable" -}} + {{- eq (include "sentry.batch.apiVersion" .) "batch/v1" -}} +{{- end -}} + {{/* Return if ingress supports ingressClassName. */}} diff --git a/sentry/templates/cronjob-sentry-cleanup.yaml b/sentry/templates/cronjob-sentry-cleanup.yaml index 7590db501..581bc05a9 100644 --- a/sentry/templates/cronjob-sentry-cleanup.yaml +++ b/sentry/templates/cronjob-sentry-cleanup.yaml @@ -1,5 +1,6 @@ {{- if .Values.sentry.cleanup.enabled }} -apiVersion: batch/v1beta1 +{{- $batchApiIsStable := eq (include "sentry.batch.isStable" .) "true" -}} +apiVersion: {{ include "sentry.batch.apiVersion" . }} kind: CronJob metadata: name: {{ template "sentry.fullname" . }}-sentry-cleanup diff --git a/sentry/templates/cronjob-snuba-cleanup-errors.yaml b/sentry/templates/cronjob-snuba-cleanup-errors.yaml index 7a92c3b82..52d0c7b8e 100644 --- a/sentry/templates/cronjob-snuba-cleanup-errors.yaml +++ b/sentry/templates/cronjob-snuba-cleanup-errors.yaml @@ -1,5 +1,6 @@ {{- if .Values.snuba.cleanupErrors.enabled }} -apiVersion: batch/v1beta1 +{{- $batchApiIsStable := eq (include "sentry.batch.isStable" .) "true" -}} +apiVersion: {{ include "sentry.batch.apiVersion" . }} kind: CronJob metadata: name: {{ template "sentry.fullname" . }}-snuba-cleanup-errors diff --git a/sentry/templates/cronjob-snuba-cleanup-transactions.yaml b/sentry/templates/cronjob-snuba-cleanup-transactions.yaml index ad2350eaa..bdbd32913 100644 --- a/sentry/templates/cronjob-snuba-cleanup-transactions.yaml +++ b/sentry/templates/cronjob-snuba-cleanup-transactions.yaml @@ -1,5 +1,6 @@ {{- if .Values.snuba.cleanupTransactions.enabled }} -apiVersion: batch/v1beta1 +{{- $batchApiIsStable := eq (include "sentry.batch.isStable" .) "true" -}} +apiVersion: {{ include "sentry.batch.apiVersion" . }} kind: CronJob metadata: name: {{ template "sentry.fullname" . }}-snuba-cleanup-transactions diff --git a/sentry/templates/hooks/sentry-db-check.job.yaml b/sentry/templates/hooks/sentry-db-check.job.yaml index 3ee62e593..f137dd628 100644 --- a/sentry/templates/hooks/sentry-db-check.job.yaml +++ b/sentry/templates/hooks/sentry-db-check.job.yaml @@ -3,7 +3,8 @@ {{- $clickhousePort := include "sentry.clickhouse.port" . -}} {{- $kafkaHost := include "sentry.kafka.host" . -}} {{- $kafkaPort := include "sentry.kafka.port" . -}} -apiVersion: batch/v1 +{{- $batchApiIsStable := eq (include "sentry.batch.isStable" .) "true" -}} +apiVersion: {{ include "sentry.batch.apiVersion" . }} kind: Job metadata: name: {{ template "sentry.fullname" . }}-db-check diff --git a/sentry/templates/hooks/sentry-db-init.job.yaml b/sentry/templates/hooks/sentry-db-init.job.yaml index 1eb0d38b9..29e76f88c 100644 --- a/sentry/templates/hooks/sentry-db-init.job.yaml +++ b/sentry/templates/hooks/sentry-db-init.job.yaml @@ -1,5 +1,6 @@ {{- if .Values.hooks.enabled -}} -apiVersion: batch/v1 +{{- $batchApiIsStable := eq (include "sentry.batch.isStable" .) "true" -}} +apiVersion: {{ include "sentry.batch.apiVersion" . }} kind: Job metadata: name: {{ template "sentry.fullname" . }}-db-init diff --git a/sentry/templates/hooks/snuba-db-init.job.yaml b/sentry/templates/hooks/snuba-db-init.job.yaml index 685afd328..7c2a633b6 100644 --- a/sentry/templates/hooks/snuba-db-init.job.yaml +++ b/sentry/templates/hooks/snuba-db-init.job.yaml @@ -1,6 +1,7 @@ {{- if .Values.hooks.enabled -}} {{- $clickhouseHost := include "sentry.clickhouse.host" . -}} -apiVersion: batch/v1 +{{- $batchApiIsStable := eq (include "sentry.batch.isStable" .) "true" -}} +apiVersion: {{ include "sentry.batch.apiVersion" . }} kind: Job metadata: name: {{ template "sentry.fullname" . }}-snuba-db-init diff --git a/sentry/templates/hooks/snuba-migrate.job.yaml b/sentry/templates/hooks/snuba-migrate.job.yaml index adf719c20..fbdd42cd2 100644 --- a/sentry/templates/hooks/snuba-migrate.job.yaml +++ b/sentry/templates/hooks/snuba-migrate.job.yaml @@ -1,6 +1,7 @@ {{- if .Values.hooks.enabled -}} {{- $clickhouseHost := include "sentry.clickhouse.host" . -}} -apiVersion: batch/v1 +{{- $batchApiIsStable := eq (include "sentry.batch.isStable" .) "true" -}} +apiVersion: {{ include "sentry.batch.apiVersion" . }} kind: Job metadata: name: {{ template "sentry.fullname" . }}-snuba-migrate diff --git a/sentry/templates/hooks/user-create.yaml b/sentry/templates/hooks/user-create.yaml index c795b58ef..2ab54cd48 100644 --- a/sentry/templates/hooks/user-create.yaml +++ b/sentry/templates/hooks/user-create.yaml @@ -1,5 +1,6 @@ {{- if and .Values.user.create .Values.hooks.enabled -}} -apiVersion: batch/v1 +{{- $batchApiIsStable := eq (include "sentry.batch.isStable" .) "true" -}} +apiVersion: {{ include "sentry.batch.apiVersion" . }} kind: Job metadata: name: {{ template "sentry.fullname" . }}-user-create From b1623f358040f022c1c8583414a43582f09b8d95 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Yann=20Toqu=C3=A9?= <14300737+yanntoque@users.noreply.github.com> Date: Wed, 10 Aug 2022 06:45:30 +0200 Subject: [PATCH 011/394] fix issue #701 : Job relies on batch/v1 (#704) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Yann Toqué --- sentry/Chart.yaml | 2 +- sentry/templates/_helper.tpl | 2 +- sentry/templates/hooks/sentry-db-check.job.yaml | 3 +-- sentry/templates/hooks/sentry-db-init.job.yaml | 3 +-- sentry/templates/hooks/snuba-db-init.job.yaml | 3 +-- sentry/templates/hooks/snuba-migrate.job.yaml | 3 +-- sentry/templates/hooks/user-create.yaml | 3 +-- 7 files changed, 7 insertions(+), 12 deletions(-) diff --git a/sentry/Chart.yaml b/sentry/Chart.yaml index b43b75b05..202a55487 100644 --- a/sentry/Chart.yaml +++ b/sentry/Chart.yaml @@ -2,7 +2,7 @@ apiVersion: v2 name: sentry description: A Helm chart for Kubernetes type: application -version: 15.0.9 +version: 15.0.10 appVersion: 22.6.0 dependencies: - name: memcached diff --git a/sentry/templates/_helper.tpl b/sentry/templates/_helper.tpl index 4364190fc..d654d8cc0 100644 --- a/sentry/templates/_helper.tpl +++ b/sentry/templates/_helper.tpl @@ -99,7 +99,7 @@ Return if ingress is stable. {{- end -}} {{/* -Return the appropriate apiVersion for batch (cronjobs and jobs). +Return the appropriate batch apiVersion for cronjobs. batch/v1beta1 will no longer be served in v1.25 See more at https://kubernetes.io/docs/reference/using-api/deprecation-guide/#cronjob-v125 */}} diff --git a/sentry/templates/hooks/sentry-db-check.job.yaml b/sentry/templates/hooks/sentry-db-check.job.yaml index f137dd628..3ee62e593 100644 --- a/sentry/templates/hooks/sentry-db-check.job.yaml +++ b/sentry/templates/hooks/sentry-db-check.job.yaml @@ -3,8 +3,7 @@ {{- $clickhousePort := include "sentry.clickhouse.port" . -}} {{- $kafkaHost := include "sentry.kafka.host" . -}} {{- $kafkaPort := include "sentry.kafka.port" . -}} -{{- $batchApiIsStable := eq (include "sentry.batch.isStable" .) "true" -}} -apiVersion: {{ include "sentry.batch.apiVersion" . }} +apiVersion: batch/v1 kind: Job metadata: name: {{ template "sentry.fullname" . }}-db-check diff --git a/sentry/templates/hooks/sentry-db-init.job.yaml b/sentry/templates/hooks/sentry-db-init.job.yaml index 29e76f88c..1eb0d38b9 100644 --- a/sentry/templates/hooks/sentry-db-init.job.yaml +++ b/sentry/templates/hooks/sentry-db-init.job.yaml @@ -1,6 +1,5 @@ {{- if .Values.hooks.enabled -}} -{{- $batchApiIsStable := eq (include "sentry.batch.isStable" .) "true" -}} -apiVersion: {{ include "sentry.batch.apiVersion" . }} +apiVersion: batch/v1 kind: Job metadata: name: {{ template "sentry.fullname" . }}-db-init diff --git a/sentry/templates/hooks/snuba-db-init.job.yaml b/sentry/templates/hooks/snuba-db-init.job.yaml index 7c2a633b6..685afd328 100644 --- a/sentry/templates/hooks/snuba-db-init.job.yaml +++ b/sentry/templates/hooks/snuba-db-init.job.yaml @@ -1,7 +1,6 @@ {{- if .Values.hooks.enabled -}} {{- $clickhouseHost := include "sentry.clickhouse.host" . -}} -{{- $batchApiIsStable := eq (include "sentry.batch.isStable" .) "true" -}} -apiVersion: {{ include "sentry.batch.apiVersion" . }} +apiVersion: batch/v1 kind: Job metadata: name: {{ template "sentry.fullname" . }}-snuba-db-init diff --git a/sentry/templates/hooks/snuba-migrate.job.yaml b/sentry/templates/hooks/snuba-migrate.job.yaml index fbdd42cd2..adf719c20 100644 --- a/sentry/templates/hooks/snuba-migrate.job.yaml +++ b/sentry/templates/hooks/snuba-migrate.job.yaml @@ -1,7 +1,6 @@ {{- if .Values.hooks.enabled -}} {{- $clickhouseHost := include "sentry.clickhouse.host" . -}} -{{- $batchApiIsStable := eq (include "sentry.batch.isStable" .) "true" -}} -apiVersion: {{ include "sentry.batch.apiVersion" . }} +apiVersion: batch/v1 kind: Job metadata: name: {{ template "sentry.fullname" . }}-snuba-migrate diff --git a/sentry/templates/hooks/user-create.yaml b/sentry/templates/hooks/user-create.yaml index 2ab54cd48..c795b58ef 100644 --- a/sentry/templates/hooks/user-create.yaml +++ b/sentry/templates/hooks/user-create.yaml @@ -1,6 +1,5 @@ {{- if and .Values.user.create .Values.hooks.enabled -}} -{{- $batchApiIsStable := eq (include "sentry.batch.isStable" .) "true" -}} -apiVersion: {{ include "sentry.batch.apiVersion" . }} +apiVersion: batch/v1 kind: Job metadata: name: {{ template "sentry.fullname" . }}-user-create From 5c955d8177ff7f69e801e23bc1e8115b84973e4c Mon Sep 17 00:00:00 2001 From: Ihor Urazov Date: Tue, 16 Aug 2022 07:17:12 +0300 Subject: [PATCH 012/394] Sentry 22.7.0 (#694) * Sentry 22.7.0 https://github.com/getsentry/self-hosted/releases/tag/22.7.0 * Add generic_metrics_distributions storage set Ref: https://github.com/getsentry/snuba/pull/2899 --- sentry/Chart.yaml | 4 ++-- sentry/templates/configmap-snuba.yaml | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/sentry/Chart.yaml b/sentry/Chart.yaml index 202a55487..25fc4a60b 100644 --- a/sentry/Chart.yaml +++ b/sentry/Chart.yaml @@ -2,8 +2,8 @@ apiVersion: v2 name: sentry description: A Helm chart for Kubernetes type: application -version: 15.0.10 -appVersion: 22.6.0 +version: 15.1.0 +appVersion: 22.7.0 dependencies: - name: memcached repository: https://charts.bitnami.com/bitnami diff --git a/sentry/templates/configmap-snuba.yaml b/sentry/templates/configmap-snuba.yaml index b41d9c388..a5f88672d 100644 --- a/sentry/templates/configmap-snuba.yaml +++ b/sentry/templates/configmap-snuba.yaml @@ -45,6 +45,7 @@ data: "profiles", "replays", "generic_metrics_sets", + "generic_metrics_distributions", }, {{- /* The default clickhouse installation runs in distributed mode, while the external From 69922920a8e5ee33a29cb6a8bf044ccb321c0fba Mon Sep 17 00:00:00 2001 From: Sem Schilder Date: Fri, 26 Aug 2022 22:16:46 +0200 Subject: [PATCH 013/394] Update to sentry 22.8.0 (#719) --- sentry/Chart.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sentry/Chart.yaml b/sentry/Chart.yaml index 25fc4a60b..7ade9304c 100644 --- a/sentry/Chart.yaml +++ b/sentry/Chart.yaml @@ -2,8 +2,8 @@ apiVersion: v2 name: sentry description: A Helm chart for Kubernetes type: application -version: 15.1.0 -appVersion: 22.7.0 +version: 15.2.0 +appVersion: 22.8.0 dependencies: - name: memcached repository: https://charts.bitnami.com/bitnami From c58468907781e70a2aa80527bdada08c6dc6ea5c Mon Sep 17 00:00:00 2001 From: JHeil <52839010+JHeilCoveo@users.noreply.github.com> Date: Tue, 30 Aug 2022 12:26:52 +0200 Subject: [PATCH 014/394] Add noStrictOffsetReset to consumers (#722) --- sentry/Chart.yaml | 2 +- sentry/templates/deployment-snuba-consumer.yaml | 3 +++ sentry/templates/deployment-snuba-outcomes-consumer.yaml | 3 +++ sentry/templates/deployment-snuba-sessions-consumer.yaml | 3 +++ .../deployment-snuba-subscription-consumer-events.yaml | 2 ++ ...deployment-snuba-subscription-consumer-transactions.yaml | 2 ++ .../templates/deployment-snuba-transactions-consumer.yaml | 3 +++ sentry/values.yaml | 6 ++++++ 8 files changed, 23 insertions(+), 1 deletion(-) diff --git a/sentry/Chart.yaml b/sentry/Chart.yaml index 7ade9304c..70ccf5e92 100644 --- a/sentry/Chart.yaml +++ b/sentry/Chart.yaml @@ -2,7 +2,7 @@ apiVersion: v2 name: sentry description: A Helm chart for Kubernetes type: application -version: 15.2.0 +version: 15.2.1 appVersion: 22.8.0 dependencies: - name: memcached diff --git a/sentry/templates/deployment-snuba-consumer.yaml b/sentry/templates/deployment-snuba-consumer.yaml index 89b30a290..741ce5d8a 100644 --- a/sentry/templates/deployment-snuba-consumer.yaml +++ b/sentry/templates/deployment-snuba-consumer.yaml @@ -108,6 +108,9 @@ spec: - "--queued-min-messages" - "{{ .Values.snuba.consumer.queuedMinMessages }}" {{- end }} + {{- if .Values.snuba.consumer.noStrictOffsetReset }} + - "--no-strict-offset-reset" + {{- end }} ports: - containerPort: {{ template "snuba.port" }} env: diff --git a/sentry/templates/deployment-snuba-outcomes-consumer.yaml b/sentry/templates/deployment-snuba-outcomes-consumer.yaml index d9d775536..4ad919808 100644 --- a/sentry/templates/deployment-snuba-outcomes-consumer.yaml +++ b/sentry/templates/deployment-snuba-outcomes-consumer.yaml @@ -104,6 +104,9 @@ spec: - "--queued-min-messages" - "{{ .Values.snuba.outcomesConsumer.queuedMinMessages }}" {{- end }} + {{- if .Values.snuba.outcomesConsumer.noStrictOffsetReset }} + - "--no-strict-offset-reset" + {{- end }} ports: - containerPort: {{ template "snuba.port" }} env: diff --git a/sentry/templates/deployment-snuba-sessions-consumer.yaml b/sentry/templates/deployment-snuba-sessions-consumer.yaml index ee1263d00..e2a9b5833 100644 --- a/sentry/templates/deployment-snuba-sessions-consumer.yaml +++ b/sentry/templates/deployment-snuba-sessions-consumer.yaml @@ -108,6 +108,9 @@ spec: - "--queued-min-messages" - "{{ .Values.snuba.sessionsConsumer.queuedMinMessages }}" {{- end }} + {{- if .Values.snuba.sessionsConsumer.noStrictOffsetReset }} + - "--no-strict-offset-reset" + {{- end }} ports: - containerPort: {{ template "snuba.port" }} env: diff --git a/sentry/templates/deployment-snuba-subscription-consumer-events.yaml b/sentry/templates/deployment-snuba-subscription-consumer-events.yaml index d567dbfaa..0c21d0cbc 100644 --- a/sentry/templates/deployment-snuba-subscription-consumer-events.yaml +++ b/sentry/templates/deployment-snuba-subscription-consumer-events.yaml @@ -70,7 +70,9 @@ spec: - "--auto-offset-reset={{ .Values.snuba.subscriptionConsumerEvents.autoOffsetReset }}" - "--dataset=events" - "--entity=events" + {{- if .Values.snuba.subscriptionConsumerEvents.noStrictOffsetReset }} - "--no-strict-offset-reset" + {{- end }} - "--consumer-group=snuba-events-subscriptions-consumers" - "--followed-consumer-group=snuba-consumers" - "--delay-seconds=60" diff --git a/sentry/templates/deployment-snuba-subscription-consumer-transactions.yaml b/sentry/templates/deployment-snuba-subscription-consumer-transactions.yaml index a8ca9e18e..1982988ea 100644 --- a/sentry/templates/deployment-snuba-subscription-consumer-transactions.yaml +++ b/sentry/templates/deployment-snuba-subscription-consumer-transactions.yaml @@ -70,7 +70,9 @@ spec: - "--auto-offset-reset={{ .Values.snuba.subscriptionConsumerTransactions.autoOffsetReset }}" - "--dataset=transactions" - "--entity=transactions" + {{- if .Values.snuba.subscriptionConsumerTransactions.noStrictOffsetReset }} - "--no-strict-offset-reset" + {{- end }} - "--consumer-group=snuba-transactions-subscriptions-consumers" - "--followed-consumer-group=transactions_group" - "--delay-seconds=60" diff --git a/sentry/templates/deployment-snuba-transactions-consumer.yaml b/sentry/templates/deployment-snuba-transactions-consumer.yaml index 487d222ac..d38e4287e 100644 --- a/sentry/templates/deployment-snuba-transactions-consumer.yaml +++ b/sentry/templates/deployment-snuba-transactions-consumer.yaml @@ -110,6 +110,9 @@ spec: - "--queued-min-messages" - "{{ .Values.snuba.transactionsConsumer.queuedMinMessages }}" {{- end }} + {{- if .Values.snuba.transactionsConsumer.noStrictOffsetReset }} + - "--no-strict-offset-reset" + {{- end }} ports: - containerPort: {{ template "snuba.port" }} env: diff --git a/sentry/values.yaml b/sentry/values.yaml index 9fb0e8239..02fe05508 100644 --- a/sentry/values.yaml +++ b/sentry/values.yaml @@ -190,6 +190,7 @@ sentry: # commitBatchSize: 1 sidecars: [] volumes: [] + # noStrictOffsetReset: false subscriptionConsumerTransactions: replicas: 1 env: [] @@ -202,6 +203,7 @@ sentry: # commitBatchSize: 1 sidecars: [] volumes: [] + # noStrictOffsetReset: false postProcessForward: replicas: 1 env: [] @@ -267,6 +269,7 @@ snuba: # tolerations: [] # podLabels: [] autoOffsetReset: "earliest" + # noStrictOffsetReset: false # maxBatchSize: "" # processes: "" # inputBlockSize: "" @@ -293,6 +296,7 @@ snuba: # tolerations: [] # podLabels: [] autoOffsetReset: "earliest" + # noStrictOffsetReset: false maxBatchSize: "3" # processes: "" # inputBlockSize: "" @@ -356,6 +360,7 @@ snuba: # tolerations: [] # podLabels: [] autoOffsetReset: "earliest" + # noStrictOffsetReset: false # maxBatchSize: "" # processes: "" # inputBlockSize: "" @@ -382,6 +387,7 @@ snuba: # tolerations: [] # podLabels: [] autoOffsetReset: "earliest" + # noStrictOffsetReset: false # maxBatchSize: "" # processes: "" # inputBlockSize: "" From 48e017466f0c495ee3f644aa146af4b0215d8fe6 Mon Sep 17 00:00:00 2001 From: Agalin <6164461+Agalin@users.noreply.github.com> Date: Sun, 2 Oct 2022 16:33:22 +0200 Subject: [PATCH 015/394] Configurable resources and env for relay init container (#709) Co-authored-by: Szymon Soloch --- sentry/Chart.yaml | 2 +- sentry/templates/deployment-relay.yaml | 5 +++++ sentry/values.yaml | 3 +++ 3 files changed, 9 insertions(+), 1 deletion(-) diff --git a/sentry/Chart.yaml b/sentry/Chart.yaml index 70ccf5e92..d706f817f 100644 --- a/sentry/Chart.yaml +++ b/sentry/Chart.yaml @@ -2,7 +2,7 @@ apiVersion: v2 name: sentry description: A Helm chart for Kubernetes type: application -version: 15.2.1 +version: 15.2.2 appVersion: 22.8.0 dependencies: - name: memcached diff --git a/sentry/templates/deployment-relay.yaml b/sentry/templates/deployment-relay.yaml index 588a76543..d4974162b 100644 --- a/sentry/templates/deployment-relay.yaml +++ b/sentry/templates/deployment-relay.yaml @@ -69,9 +69,14 @@ spec: args: - "credentials" - "generate" + resources: +{{ toYaml .Values.relay.init.resources | indent 12 }} env: - name: RELAY_PORT value: '{{ template "relay.port" }}' +{{- if .Values.relay.init.env }} +{{ toYaml .Values.relay.init.env | indent 12 }} +{{- end }} volumeMounts: - name: credentials mountPath: /work/.relay diff --git a/sentry/values.yaml b/sentry/values.yaml index 02fe05508..be908a604 100644 --- a/sentry/values.yaml +++ b/sentry/values.yaml @@ -74,6 +74,9 @@ relay: targetCPUUtilizationPercentage: 50 sidecars: [] volumes: [] + init: + resources: {} + # env: [] geodata: path: "" From 60edf5becaacab215c4eb2909e9fda902b9f89ec Mon Sep 17 00:00:00 2001 From: Ore Olarewaju Date: Sun, 2 Oct 2022 17:54:43 +0200 Subject: [PATCH 016/394] allow using externalPostgresql.existingSecret to inject password (#641) --- sentry/templates/_helper.tpl | 2 +- sentry/templates/cronjob-sentry-cleanup.yaml | 8 +++++++- sentry/templates/deployment-sentry-cron.yaml | 9 +++++++++ sentry/templates/deployment-sentry-ingest-consumer.yaml | 9 +++++++++ .../deployment-sentry-post-process-forwarder.yaml | 9 +++++++++ .../deployment-sentry-subscription-consumer-events.yaml | 9 +++++++++ ...oyment-sentry-subscription-consumer-transactions.yaml | 9 +++++++++ sentry/templates/deployment-sentry-web.yaml | 9 +++++++++ sentry/templates/deployment-sentry-worker.yaml | 9 +++++++++ sentry/templates/hooks/sentry-db-init.job.yaml | 9 +++++++++ sentry/templates/hooks/user-create.yaml | 9 +++++++++ sentry/values.yaml | 6 +++++- 12 files changed, 94 insertions(+), 3 deletions(-) diff --git a/sentry/templates/_helper.tpl b/sentry/templates/_helper.tpl index d654d8cc0..b3240f30b 100644 --- a/sentry/templates/_helper.tpl +++ b/sentry/templates/_helper.tpl @@ -237,7 +237,7 @@ Set postgresql password {{- define "sentry.postgresql.password" -}} {{- if .Values.postgresql.enabled -}} {{- default "" .Values.postgresql.postgresqlPassword }} -{{- else -}} +{{- else if not .Values.externalPostgresql.existingSecret }} {{ required "A valid .Values.externalPostgresql.password is required" .Values.externalPostgresql.password }} {{- end -}} {{- end -}} diff --git a/sentry/templates/cronjob-sentry-cleanup.yaml b/sentry/templates/cronjob-sentry-cleanup.yaml index 581bc05a9..c4a7323ec 100644 --- a/sentry/templates/cronjob-sentry-cleanup.yaml +++ b/sentry/templates/cronjob-sentry-cleanup.yaml @@ -80,7 +80,13 @@ spec: key: {{ default "postgresql-password" .Values.postgresql.existingSecretKey }} {{- else if .Values.externalPostgresql.password }} - name: POSTGRES_PASSWORD - value: {{ include "sentry.postgresql.password" . | quote }} + value: {{ .Values.externalPostgresql.password | quote }} + {{- else if .Values.externalPostgresql.existingSecret }} + - name: POSTGRES_PASSWORD + valueFrom: + secretKeyRef: + name: {{ .Values.externalPostgresql.existingSecret }} + key: {{ default "postgresql-password" .Values.externalPostgresql.existingSecretKey }} {{- end }} {{- if and (eq .Values.filestore.backend "gcs") .Values.filestore.gcs.secretName }} - name: GOOGLE_APPLICATION_CREDENTIALS diff --git a/sentry/templates/deployment-sentry-cron.yaml b/sentry/templates/deployment-sentry-cron.yaml index fe4f584e4..8d87500e5 100644 --- a/sentry/templates/deployment-sentry-cron.yaml +++ b/sentry/templates/deployment-sentry-cron.yaml @@ -78,6 +78,15 @@ spec: secretKeyRef: name: {{ default (include "sentry.postgresql.fullname" .) .Values.postgresql.existingSecret }} key: {{ default "postgresql-password" .Values.postgresql.existingSecretKey }} + {{- else if .Values.externalPostgresql.password }} + - name: POSTGRES_PASSWORD + value: {{ .Values.externalPostgresql.password | quote }} + {{- else if .Values.externalPostgresql.existingSecret }} + - name: POSTGRES_PASSWORD + valueFrom: + secretKeyRef: + name: {{ .Values.externalPostgresql.existingSecret }} + key: {{ default "postgresql-password" .Values.externalPostgresql.existingSecretKey }} {{- end }} {{ if and (eq .Values.filestore.backend "gcs") .Values.filestore.gcs.secretName }} - name: GOOGLE_APPLICATION_CREDENTIALS diff --git a/sentry/templates/deployment-sentry-ingest-consumer.yaml b/sentry/templates/deployment-sentry-ingest-consumer.yaml index 188fbb3e4..31bc32cc7 100644 --- a/sentry/templates/deployment-sentry-ingest-consumer.yaml +++ b/sentry/templates/deployment-sentry-ingest-consumer.yaml @@ -98,6 +98,15 @@ spec: secretKeyRef: name: {{ default (include "sentry.postgresql.fullname" .) .Values.postgresql.existingSecret }} key: {{ default "postgresql-password" .Values.postgresql.existingSecretKey }} + {{- else if .Values.externalPostgresql.password }} + - name: POSTGRES_PASSWORD + value: {{ .Values.externalPostgresql.password | quote }} + {{- else if .Values.externalPostgresql.existingSecret }} + - name: POSTGRES_PASSWORD + valueFrom: + secretKeyRef: + name: {{ .Values.externalPostgresql.existingSecret }} + key: {{ default "postgresql-password" .Values.externalPostgresql.existingSecretKey }} {{- end }} {{ if and (eq .Values.filestore.backend "gcs") .Values.filestore.gcs.secretName }} - name: GOOGLE_APPLICATION_CREDENTIALS diff --git a/sentry/templates/deployment-sentry-post-process-forwarder.yaml b/sentry/templates/deployment-sentry-post-process-forwarder.yaml index 9d0fa67ba..c9f2b3124 100644 --- a/sentry/templates/deployment-sentry-post-process-forwarder.yaml +++ b/sentry/templates/deployment-sentry-post-process-forwarder.yaml @@ -82,6 +82,15 @@ spec: secretKeyRef: name: {{ default (include "sentry.postgresql.fullname" .) .Values.postgresql.existingSecret }} key: {{ default "postgresql-password" .Values.postgresql.existingSecretKey }} + {{- else if .Values.externalPostgresql.password }} + - name: POSTGRES_PASSWORD + value: {{ .Values.externalPostgresql.password | quote }} + {{- else if .Values.externalPostgresql.existingSecret }} + - name: POSTGRES_PASSWORD + valueFrom: + secretKeyRef: + name: {{ .Values.externalPostgresql.existingSecret }} + key: {{ default "postgresql-password" .Values.externalPostgresql.existingSecretKey }} {{- end }} {{ if and (eq .Values.filestore.backend "gcs") .Values.filestore.gcs.secretName }} - name: GOOGLE_APPLICATION_CREDENTIALS diff --git a/sentry/templates/deployment-sentry-subscription-consumer-events.yaml b/sentry/templates/deployment-sentry-subscription-consumer-events.yaml index 11f6423c2..29c831793 100644 --- a/sentry/templates/deployment-sentry-subscription-consumer-events.yaml +++ b/sentry/templates/deployment-sentry-subscription-consumer-events.yaml @@ -82,6 +82,15 @@ spec: secretKeyRef: name: {{ default (include "sentry.postgresql.fullname" .) .Values.postgresql.existingSecret }} key: {{ default "postgresql-password" .Values.postgresql.existingSecretKey }} + {{- else if .Values.externalPostgresql.password }} + - name: POSTGRES_PASSWORD + value: {{ .Values.externalPostgresql.password | quote }} + {{- else if .Values.externalPostgresql.existingSecret }} + - name: POSTGRES_PASSWORD + valueFrom: + secretKeyRef: + name: {{ .Values.externalPostgresql.existingSecret }} + key: {{ default "postgresql-password" .Values.externalPostgresql.existingSecretKey }} {{- end }} {{ if and (eq .Values.filestore.backend "gcs") .Values.filestore.gcs.secretName }} - name: GOOGLE_APPLICATION_CREDENTIALS diff --git a/sentry/templates/deployment-sentry-subscription-consumer-transactions.yaml b/sentry/templates/deployment-sentry-subscription-consumer-transactions.yaml index 756c83ac0..280f23b57 100644 --- a/sentry/templates/deployment-sentry-subscription-consumer-transactions.yaml +++ b/sentry/templates/deployment-sentry-subscription-consumer-transactions.yaml @@ -82,6 +82,15 @@ spec: secretKeyRef: name: {{ default (include "sentry.postgresql.fullname" .) .Values.postgresql.existingSecret }} key: {{ default "postgresql-password" .Values.postgresql.existingSecretKey }} + {{- else if .Values.externalPostgresql.password }} + - name: POSTGRES_PASSWORD + value: {{ .Values.externalPostgresql.password | quote }} + {{- else if .Values.externalPostgresql.existingSecret }} + - name: POSTGRES_PASSWORD + valueFrom: + secretKeyRef: + name: {{ .Values.externalPostgresql.existingSecret }} + key: {{ default "postgresql-password" .Values.externalPostgresql.existingSecretKey }} {{- end }} {{ if and (eq .Values.filestore.backend "gcs") .Values.filestore.gcs.secretName }} - name: GOOGLE_APPLICATION_CREDENTIALS diff --git a/sentry/templates/deployment-sentry-web.yaml b/sentry/templates/deployment-sentry-web.yaml index e800c1a76..cb25f1292 100644 --- a/sentry/templates/deployment-sentry-web.yaml +++ b/sentry/templates/deployment-sentry-web.yaml @@ -79,6 +79,15 @@ spec: secretKeyRef: name: {{ default (include "sentry.postgresql.fullname" .) .Values.postgresql.existingSecret }} key: {{ default "postgresql-password" .Values.postgresql.existingSecretKey }} + {{- else if .Values.externalPostgresql.password }} + - name: POSTGRES_PASSWORD + value: {{ .Values.externalPostgresql.password | quote }} + {{- else if .Values.externalPostgresql.existingSecret }} + - name: POSTGRES_PASSWORD + valueFrom: + secretKeyRef: + name: {{ .Values.externalPostgresql.existingSecret }} + key: {{ default "postgresql-password" .Values.externalPostgresql.existingSecretKey }} {{- end }} {{ if and (eq .Values.filestore.backend "gcs") .Values.filestore.gcs.secretName }} - name: GOOGLE_APPLICATION_CREDENTIALS diff --git a/sentry/templates/deployment-sentry-worker.yaml b/sentry/templates/deployment-sentry-worker.yaml index 762a97c64..3635906da 100644 --- a/sentry/templates/deployment-sentry-worker.yaml +++ b/sentry/templates/deployment-sentry-worker.yaml @@ -84,6 +84,15 @@ spec: secretKeyRef: name: {{ default (include "sentry.postgresql.fullname" .) .Values.postgresql.existingSecret }} key: {{ default "postgresql-password" .Values.postgresql.existingSecretKey }} + {{- else if .Values.externalPostgresql.password }} + - name: POSTGRES_PASSWORD + value: {{ .Values.externalPostgresql.password | quote }} + {{- else if .Values.externalPostgresql.existingSecret }} + - name: POSTGRES_PASSWORD + valueFrom: + secretKeyRef: + name: {{ .Values.externalPostgresql.existingSecret }} + key: {{ default "postgresql-password" .Values.externalPostgresql.existingSecretKey }} {{- end }} {{ if and (eq .Values.filestore.backend "gcs") .Values.filestore.gcs.secretName }} - name: GOOGLE_APPLICATION_CREDENTIALS diff --git a/sentry/templates/hooks/sentry-db-init.job.yaml b/sentry/templates/hooks/sentry-db-init.job.yaml index 1eb0d38b9..7db0f45b8 100644 --- a/sentry/templates/hooks/sentry-db-init.job.yaml +++ b/sentry/templates/hooks/sentry-db-init.job.yaml @@ -79,6 +79,15 @@ spec: secretKeyRef: name: {{ default (include "sentry.postgresql.fullname" .) .Values.postgresql.existingSecret }} key: {{ default "postgresql-password" .Values.postgresql.existingSecretKey }} + {{- else if .Values.externalPostgresql.password }} + - name: POSTGRES_PASSWORD + value: {{ .Values.externalPostgresql.password | quote }} + {{- else if .Values.externalPostgresql.existingSecret }} + - name: POSTGRES_PASSWORD + valueFrom: + secretKeyRef: + name: {{ .Values.externalPostgresql.existingSecret }} + key: {{ default "postgresql-password" .Values.externalPostgresql.existingSecretKey }} {{- end }} {{- if .Values.hooks.dbInit.env }} {{ toYaml .Values.hooks.dbInit.env | indent 8 }} diff --git a/sentry/templates/hooks/user-create.yaml b/sentry/templates/hooks/user-create.yaml index c795b58ef..30dfda640 100644 --- a/sentry/templates/hooks/user-create.yaml +++ b/sentry/templates/hooks/user-create.yaml @@ -90,6 +90,15 @@ spec: secretKeyRef: name: {{ default (include "sentry.postgresql.fullname" .) .Values.postgresql.existingSecret }} key: {{ default "postgresql-password" .Values.postgresql.existingSecretKey }} + {{- else if .Values.externalPostgresql.password }} + - name: POSTGRES_PASSWORD + value: {{ .Values.externalPostgresql.password | quote }} + {{- else if .Values.externalPostgresql.existingSecret }} + - name: POSTGRES_PASSWORD + valueFrom: + secretKeyRef: + name: {{ .Values.externalPostgresql.existingSecret }} + key: {{ default "postgresql-password" .Values.externalPostgresql.existingSecretKey }} {{- end }} {{- if .Values.hooks.dbInit.env }} {{ toYaml .Values.hooks.dbInit.env | indent 8 }} diff --git a/sentry/values.yaml b/sentry/values.yaml index be908a604..47dfa9929 100644 --- a/sentry/values.yaml +++ b/sentry/values.yaml @@ -845,12 +845,16 @@ postgresql: # enabled: false ## This value is only used when postgresql.enabled is set to false -## +## Set either externalPostgresql.password or externalPostgresql.existingSecret to configure password +## externalPostgresql.existingSecret should have a key of 'postgres-password' which holds the password externalPostgresql: # host: postgres port: 5432 username: postgres # password: postgres + # existingSecret: secret-name + ## set existingSecretKey if key name inside existingSecret is different from 'postgres-password' + # existingSecretKey: secret-key-name database: sentry # sslMode: require From e2d2d8f688d605d35d413cee48ec0550a8385e01 Mon Sep 17 00:00:00 2001 From: Andrey Izotikov Date: Mon, 3 Oct 2022 17:22:27 +0300 Subject: [PATCH 017/394] fix snuba storagesets for 22.9.0 (#735) --- sentry/Chart.yaml | 4 ++-- sentry/templates/configmap-snuba.yaml | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/sentry/Chart.yaml b/sentry/Chart.yaml index d706f817f..0ed553fd7 100644 --- a/sentry/Chart.yaml +++ b/sentry/Chart.yaml @@ -2,8 +2,8 @@ apiVersion: v2 name: sentry description: A Helm chart for Kubernetes type: application -version: 15.2.2 -appVersion: 22.8.0 +version: 15.3.0 +appVersion: 22.9.0 dependencies: - name: memcached repository: https://charts.bitnami.com/bitnami diff --git a/sentry/templates/configmap-snuba.yaml b/sentry/templates/configmap-snuba.yaml index a5f88672d..70923079a 100644 --- a/sentry/templates/configmap-snuba.yaml +++ b/sentry/templates/configmap-snuba.yaml @@ -43,6 +43,7 @@ data: "errors_v2", "errors_v2_ro", "profiles", + "functions", "replays", "generic_metrics_sets", "generic_metrics_distributions", From 559afc90bfc7e2fdfd8b2d471ade5293f56c94d7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Robert=20Gr=C3=BCndler?= Date: Mon, 3 Oct 2022 17:26:07 +0200 Subject: [PATCH 018/394] feat: secret key generation (#672) --- sentry/Chart.yaml | 2 +- sentry/README.md | 9 ++++----- sentry/templates/configmap-sentry.yaml | 8 +++++++- sentry/templates/cronjob-sentry-cleanup.yaml | 13 ++++++++++++ sentry/templates/deployment-sentry-cron.yaml | 13 ++++++++++++ .../deployment-sentry-ingest-consumer.yaml | 13 ++++++++++++ ...loyment-sentry-post-process-forwarder.yaml | 13 ++++++++++++ ...t-sentry-subscription-consumer-events.yaml | 13 ++++++++++++ ...ry-subscription-consumer-transactions.yaml | 13 ++++++++++++ sentry/templates/deployment-sentry-web.yaml | 13 ++++++++++++ .../templates/deployment-sentry-worker.yaml | 13 ++++++++++++ .../templates/hooks/sentry-db-init.job.yaml | 13 ++++++++++++ .../templates/hooks/sentry-secret-create.yaml | 20 +++++++++++++++++++ sentry/templates/hooks/user-create.yaml | 13 ++++++++++++ sentry/values.yaml | 3 +++ 15 files changed, 165 insertions(+), 7 deletions(-) create mode 100644 sentry/templates/hooks/sentry-secret-create.yaml diff --git a/sentry/Chart.yaml b/sentry/Chart.yaml index 0ed553fd7..fc1c7194f 100644 --- a/sentry/Chart.yaml +++ b/sentry/Chart.yaml @@ -2,7 +2,7 @@ apiVersion: v2 name: sentry description: A Helm chart for Kubernetes type: application -version: 15.3.0 +version: 16.0.0 appVersion: 22.9.0 dependencies: - name: memcached diff --git a/sentry/README.md b/sentry/README.md index f43929c41..d87fabf03 100644 --- a/sentry/README.md +++ b/sentry/README.md @@ -63,7 +63,7 @@ Note: this table is incomplete, so have a look at the values.yaml in case you mi | `serviceAccount.enabled` | If `true`, a custom Service Account will be used. | `false` | | `serviceAccount.name` | The base name of the ServiceAccount to use. Will be appended with e.g. `snuba` or `web` for the pods accordingly. | `"sentry"` | | `serviceAccount.automountServiceAccountToken` | Automount API credentials for a Service Account. | `true` | -| `system.secretKey` | secret key for the session cookie ([documentation](https://develop.sentry.dev/config/#general)) | `nil` | +| `sentry.existingSecret` | Existing kubernetes secret to be used for secret key for the session cookie ([documentation](https://develop.sentry.dev/config/#general)) | `nil` | | `sentry.features.vstsLimitedScopes` | Disables the azdo-integrations with limited scopes that is the cause of so much pain | `true` | | `sentry.web.customCA.secretName` | Allows mounting a custom CA secret | `nil` | | `sentry.web.customCA.item` | Key of CA cert object within the secret | `ca.crt` | @@ -76,11 +76,10 @@ By default, NGINX is enabled to allow sending the incoming requests to [Sentry R ## Sentry secret key -For your security, the [`system.secret-key`](https://develop.sentry.dev/config/#general) is generated for you on the first installation. Another one will be regenerated on each upgrade invalidating all the current sessions unless it's been provided. The value is stored in the `sentry-sentry` configmap. +If no `sentry.existingSecret` value is specified, for your security, the [`system.secret-key`](https://develop.sentry.dev/config/#general) is generated for you on the first installation and stored in a kubernetes secret. + +If `sentry.existingSecret` / `sentry.existingSecretKey` values are provided, those secrets will be used. -``` -helm upgrade ... --set system.secretKey=xx -``` ## Symbolicator and or JavaScript source maps diff --git a/sentry/templates/configmap-sentry.yaml b/sentry/templates/configmap-sentry.yaml index 9812840bd..76199833c 100644 --- a/sentry/templates/configmap-sentry.yaml +++ b/sentry/templates/configmap-sentry.yaml @@ -15,7 +15,6 @@ data: {{- if .Values.system.adminEmail }} system.admin-email: {{ .Values.system.adminEmail | quote }} {{- end }} - system.secret-key: {{ .Values.system.secretKey | default (randAlphaNum 50) | quote }} {{- if .Values.system.url }} system.url-prefix: {{ .Values.system.url | quote }} {{- end }} @@ -168,6 +167,13 @@ data: # General # ########### + + secret_key = env('SENTRY_SECRET_KEY') + if not secret_key: + raise Exception('Error: SENTRY_SECRET_KEY is undefined') + + SENTRY_OPTIONS['system.secret-key'] = secret_key + # Instruct Sentry that this install intends to be run by a single organization # and thus various UI optimizations should be enabled. SENTRY_SINGLE_ORGANIZATION = {{ if .Values.sentry.singleOrganization }}True{{ else }}False{{ end }} diff --git a/sentry/templates/cronjob-sentry-cleanup.yaml b/sentry/templates/cronjob-sentry-cleanup.yaml index c4a7323ec..601820959 100644 --- a/sentry/templates/cronjob-sentry-cleanup.yaml +++ b/sentry/templates/cronjob-sentry-cleanup.yaml @@ -72,6 +72,19 @@ spec: value: http://{{ template "sentry.fullname" . }}-snuba:{{ template "snuba.port" }} - name: C_FORCE_ROOT value: "true" + {{- if .Values.sentry.existingSecret }} + - name: SENTRY_SECRET_KEY + valueFrom: + secretKeyRef: + name: {{ .Values.sentry.existingSecret }} + key: {{ default "key" .Values.sentry.existingSecretKey }} + {{- else }} + - name: SENTRY_SECRET_KEY + valueFrom: + secretKeyRef: + name: {{ template "sentry.fullname" . }}-sentry-secret + key: "key" + {{- end }} {{- if .Values.postgresql.enabled }} - name: POSTGRES_PASSWORD valueFrom: diff --git a/sentry/templates/deployment-sentry-cron.yaml b/sentry/templates/deployment-sentry-cron.yaml index 8d87500e5..db85ea9ac 100644 --- a/sentry/templates/deployment-sentry-cron.yaml +++ b/sentry/templates/deployment-sentry-cron.yaml @@ -70,6 +70,19 @@ spec: env: - name: SNUBA value: http://{{ template "sentry.fullname" . }}-snuba:{{ template "snuba.port" }} + {{- if .Values.sentry.existingSecret }} + - name: SENTRY_SECRET_KEY + valueFrom: + secretKeyRef: + name: {{ .Values.sentry.existingSecret }} + key: {{ default "key" .Values.sentry.existingSecretKey }} + {{- else }} + - name: SENTRY_SECRET_KEY + valueFrom: + secretKeyRef: + name: {{ template "sentry.fullname" . }}-sentry-secret + key: "key" + {{- end }} - name: C_FORCE_ROOT value: "true" {{- if .Values.postgresql.enabled }} diff --git a/sentry/templates/deployment-sentry-ingest-consumer.yaml b/sentry/templates/deployment-sentry-ingest-consumer.yaml index 31bc32cc7..3a97da97d 100644 --- a/sentry/templates/deployment-sentry-ingest-consumer.yaml +++ b/sentry/templates/deployment-sentry-ingest-consumer.yaml @@ -92,6 +92,19 @@ spec: value: http://{{ template "sentry.fullname" . }}-snuba:{{ template "snuba.port" }} - name: C_FORCE_ROOT value: "true" + {{- if .Values.sentry.existingSecret }} + - name: SENTRY_SECRET_KEY + valueFrom: + secretKeyRef: + name: {{ .Values.sentry.existingSecret }} + key: {{ default "key" .Values.sentry.existingSecretKey }} + {{- else }} + - name: SENTRY_SECRET_KEY + valueFrom: + secretKeyRef: + name: {{ template "sentry.fullname" . }}-sentry-secret + key: "key" + {{- end }} {{- if .Values.postgresql.enabled }} - name: POSTGRES_PASSWORD valueFrom: diff --git a/sentry/templates/deployment-sentry-post-process-forwarder.yaml b/sentry/templates/deployment-sentry-post-process-forwarder.yaml index c9f2b3124..529237005 100644 --- a/sentry/templates/deployment-sentry-post-process-forwarder.yaml +++ b/sentry/templates/deployment-sentry-post-process-forwarder.yaml @@ -76,6 +76,19 @@ spec: env: - name: SNUBA value: http://{{ template "sentry.fullname" . }}-snuba:{{ template "snuba.port" }} + {{- if .Values.sentry.existingSecret }} + - name: SENTRY_SECRET_KEY + valueFrom: + secretKeyRef: + name: {{ .Values.sentry.existingSecret }} + key: {{ default "key" .Values.sentry.existingSecretKey }} + {{- else }} + - name: SENTRY_SECRET_KEY + valueFrom: + secretKeyRef: + name: {{ template "sentry.fullname" . }}-sentry-secret + key: "key" + {{- end }} {{- if .Values.postgresql.enabled }} - name: POSTGRES_PASSWORD valueFrom: diff --git a/sentry/templates/deployment-sentry-subscription-consumer-events.yaml b/sentry/templates/deployment-sentry-subscription-consumer-events.yaml index 29c831793..b42f039ca 100644 --- a/sentry/templates/deployment-sentry-subscription-consumer-events.yaml +++ b/sentry/templates/deployment-sentry-subscription-consumer-events.yaml @@ -76,6 +76,19 @@ spec: env: - name: SNUBA value: http://{{ template "sentry.fullname" . }}-snuba:{{ template "snuba.port" }} + {{- if .Values.sentry.existingSecret }} + - name: SENTRY_SECRET_KEY + valueFrom: + secretKeyRef: + name: {{ .Values.sentry.existingSecret }} + key: {{ default "key" .Values.sentry.existingSecretKey }} + {{- else }} + - name: SENTRY_SECRET_KEY + valueFrom: + secretKeyRef: + name: {{ template "sentry.fullname" . }}-sentry-secret + key: "key" + {{- end }} {{- if .Values.postgresql.enabled }} - name: POSTGRES_PASSWORD valueFrom: diff --git a/sentry/templates/deployment-sentry-subscription-consumer-transactions.yaml b/sentry/templates/deployment-sentry-subscription-consumer-transactions.yaml index 280f23b57..fa94ad070 100644 --- a/sentry/templates/deployment-sentry-subscription-consumer-transactions.yaml +++ b/sentry/templates/deployment-sentry-subscription-consumer-transactions.yaml @@ -76,6 +76,19 @@ spec: env: - name: SNUBA value: http://{{ template "sentry.fullname" . }}-snuba:{{ template "snuba.port" }} + {{- if .Values.sentry.existingSecret }} + - name: SENTRY_SECRET_KEY + valueFrom: + secretKeyRef: + name: {{ .Values.sentry.existingSecret }} + key: {{ default "key" .Values.sentry.existingSecretKey }} + {{- else }} + - name: SENTRY_SECRET_KEY + valueFrom: + secretKeyRef: + name: {{ template "sentry.fullname" . }}-sentry-secret + key: "key" + {{- end }} {{- if .Values.postgresql.enabled }} - name: POSTGRES_PASSWORD valueFrom: diff --git a/sentry/templates/deployment-sentry-web.yaml b/sentry/templates/deployment-sentry-web.yaml index cb25f1292..28b426354 100644 --- a/sentry/templates/deployment-sentry-web.yaml +++ b/sentry/templates/deployment-sentry-web.yaml @@ -73,6 +73,19 @@ spec: env: - name: SNUBA value: http://{{ template "sentry.fullname" . }}-snuba:{{ template "snuba.port" }} + {{- if .Values.sentry.existingSecret }} + - name: SENTRY_SECRET_KEY + valueFrom: + secretKeyRef: + name: {{ .Values.sentry.existingSecret }} + key: {{ default "key" .Values.sentry.existingSecretKey }} + {{- else }} + - name: SENTRY_SECRET_KEY + valueFrom: + secretKeyRef: + name: {{ template "sentry.fullname" . }}-sentry-secret + key: "key" + {{- end }} {{- if .Values.postgresql.enabled }} - name: POSTGRES_PASSWORD valueFrom: diff --git a/sentry/templates/deployment-sentry-worker.yaml b/sentry/templates/deployment-sentry-worker.yaml index 3635906da..f85a3dcbc 100644 --- a/sentry/templates/deployment-sentry-worker.yaml +++ b/sentry/templates/deployment-sentry-worker.yaml @@ -76,6 +76,19 @@ spec: env: - name: SNUBA value: http://{{ template "sentry.fullname" . }}-snuba:{{ template "snuba.port" }} + {{- if .Values.sentry.existingSecret }} + - name: SENTRY_SECRET_KEY + valueFrom: + secretKeyRef: + name: {{ .Values.sentry.existingSecret }} + key: {{ default "key" .Values.sentry.existingSecretKey }} + {{- else }} + - name: SENTRY_SECRET_KEY + valueFrom: + secretKeyRef: + name: {{ template "sentry.fullname" . }}-sentry-secret + key: "key" + {{- end }} - name: C_FORCE_ROOT value: "true" {{- if .Values.postgresql.enabled }} diff --git a/sentry/templates/hooks/sentry-db-init.job.yaml b/sentry/templates/hooks/sentry-db-init.job.yaml index 7db0f45b8..237aef0b3 100644 --- a/sentry/templates/hooks/sentry-db-init.job.yaml +++ b/sentry/templates/hooks/sentry-db-init.job.yaml @@ -73,6 +73,19 @@ spec: imagePullPolicy: {{ default "IfNotPresent" .Values.images.sentry.pullPolicy }} command: ["sentry","upgrade","--noinput"] env: + {{- if .Values.sentry.existingSecret }} + - name: SENTRY_SECRET_KEY + valueFrom: + secretKeyRef: + name: {{ .Values.sentry.existingSecret }} + key: {{ default "key" .Values.sentry.existingSecretKey }} + {{- else }} + - name: SENTRY_SECRET_KEY + valueFrom: + secretKeyRef: + name: {{ template "sentry.fullname" . }}-sentry-secret + key: "key" + {{- end }} {{- if .Values.postgresql.enabled }} - name: POSTGRES_PASSWORD valueFrom: diff --git a/sentry/templates/hooks/sentry-secret-create.yaml b/sentry/templates/hooks/sentry-secret-create.yaml new file mode 100644 index 000000000..b6e976223 --- /dev/null +++ b/sentry/templates/hooks/sentry-secret-create.yaml @@ -0,0 +1,20 @@ +{{- if not .Values.sentry.existingSecret -}} +apiVersion: v1 +kind: Secret +metadata: + name: {{ template "sentry.fullname" . }}-sentry-secret + labels: + app: sentry + chart: "{{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }}" + release: "{{ .Release.Name }}" + heritage: "{{ .Release.Service }}" + annotations: + # This is what defines this resource as a hook. Without this line, the + # job is considered part of the release. + "helm.sh/hook": "pre-install" + "helm.sh/hook-delete-policy": "{{ if .Values.hooks.removeOnSuccess }}hook-succeeded,{{ end }}before-hook-creation" + "helm.sh/hook-weight": "3" +type: Opaque +data: + key: {{ randAlphaNum 50 | b64enc | quote }} +{{- end -}} \ No newline at end of file diff --git a/sentry/templates/hooks/user-create.yaml b/sentry/templates/hooks/user-create.yaml index 30dfda640..3d4afc0da 100644 --- a/sentry/templates/hooks/user-create.yaml +++ b/sentry/templates/hooks/user-create.yaml @@ -74,6 +74,19 @@ spec: exit 1; \ fi env: + {{- if .Values.sentry.existingSecret }} + - name: SENTRY_SECRET_KEY + valueFrom: + secretKeyRef: + name: {{ .Values.sentry.existingSecret }} + key: {{ default "key" .Values.sentry.existingSecretKey }} + {{- else }} + - name: SENTRY_SECRET_KEY + valueFrom: + secretKeyRef: + name: {{ template "sentry.fullname" . }}-sentry-secret + key: "key" + {{- end }} {{- if .Values.user.existingSecret }} - name: ADMIN_PASSWORD valueFrom: diff --git a/sentry/values.yaml b/sentry/values.yaml index 47dfa9929..ddc992cdf 100644 --- a/sentry/values.yaml +++ b/sentry/values.yaml @@ -84,6 +84,9 @@ geodata: mountPath: "" sentry: + # to not generate a sentry-secret, use these 2 values to reference an existing secret + # existingSecret: "my-secret" + # existingSecretKey: "my-secret-key" singleOrganization: true web: # if using filestore backend filesystem with RWO access, set strategyType to Recreate From f28e4458d84ae06a01cf039a55fe2fdf77d5d5b5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Th=C3=A9o=20Mathieu?= Date: Mon, 3 Oct 2022 17:28:13 +0200 Subject: [PATCH 019/394] Update README.md --- README.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/README.md b/README.md index 3df0f9262..201635b73 100644 --- a/README.md +++ b/README.md @@ -14,6 +14,13 @@ Big thanks to the maintainers of the [deprecated chart](https://github.com/helm/ For now the full list of values is not documented but you can get inspired by the values.yaml specific to each directory. +## Upgrading from 15.x.x version of this Chart to 16.x.x + +system.secret-key is removed + +See https://github.com/sentry-kubernetes/charts/tree/develop/sentry#sentry-secret-key + + ## Upgrading from 14.x.x version of this Chart to 15.x.x Chart dependencies has been upgraded because of bitnami charts removal. From 8ec44a4d48fef5592f9332e4e60b6e7eff4ffaa7 Mon Sep 17 00:00:00 2001 From: Andrey Izotikov Date: Wed, 5 Oct 2022 16:28:39 +0300 Subject: [PATCH 020/394] Fix sentry features for 22.9.0 (#746) in case of deprecation eventsv2 endpoint in favor of events, this fixes dashboards and performance frontend parts, that use eventsv2 by default --- sentry/Chart.yaml | 2 +- sentry/templates/configmap-sentry.yaml | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/sentry/Chart.yaml b/sentry/Chart.yaml index fc1c7194f..ecf7356f8 100644 --- a/sentry/Chart.yaml +++ b/sentry/Chart.yaml @@ -2,7 +2,7 @@ apiVersion: v2 name: sentry description: A Helm chart for Kubernetes type: application -version: 16.0.0 +version: 16.0.1 appVersion: 22.9.0 dependencies: - name: memcached diff --git a/sentry/templates/configmap-sentry.yaml b/sentry/templates/configmap-sentry.yaml index 76199833c..ee31ef98d 100644 --- a/sentry/templates/configmap-sentry.yaml +++ b/sentry/templates/configmap-sentry.yaml @@ -366,6 +366,7 @@ data: "organizations:discover", "organizations:discover-basic", "organizations:discover-query", + "organizations:discover-frontend-use-events-endpoint", "organizations:enterprise-perf", "organizations:event-attachments", "organizations:events", @@ -393,6 +394,7 @@ data: "organizations:onboarding", "organizations:org-saved-searches", "organizations:performance-view", + "organizations:performance-frontend-use-events-endpoint", "organizations:project-detail", "organizations:relay", "organizations:release-performance-views", From 7d90ddaa49c3b629049620d08b582bedbcd89b79 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Th=C3=A9o=20Mathieu?= Date: Thu, 6 Oct 2022 14:58:16 +0200 Subject: [PATCH 021/394] fix: sentry secret deleted (#748) --- sentry/Chart.yaml | 2 +- sentry/templates/hooks/sentry-secret-create.yaml | 3 --- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/sentry/Chart.yaml b/sentry/Chart.yaml index ecf7356f8..4b59ad9d8 100644 --- a/sentry/Chart.yaml +++ b/sentry/Chart.yaml @@ -2,7 +2,7 @@ apiVersion: v2 name: sentry description: A Helm chart for Kubernetes type: application -version: 16.0.1 +version: 16.0.2 appVersion: 22.9.0 dependencies: - name: memcached diff --git a/sentry/templates/hooks/sentry-secret-create.yaml b/sentry/templates/hooks/sentry-secret-create.yaml index b6e976223..287c1bd2e 100644 --- a/sentry/templates/hooks/sentry-secret-create.yaml +++ b/sentry/templates/hooks/sentry-secret-create.yaml @@ -9,10 +9,7 @@ metadata: release: "{{ .Release.Name }}" heritage: "{{ .Release.Service }}" annotations: - # This is what defines this resource as a hook. Without this line, the - # job is considered part of the release. "helm.sh/hook": "pre-install" - "helm.sh/hook-delete-policy": "{{ if .Values.hooks.removeOnSuccess }}hook-succeeded,{{ end }}before-hook-creation" "helm.sh/hook-weight": "3" type: Opaque data: From b04aed78076a87cbb7090569f87ff40a84f1216d Mon Sep 17 00:00:00 2001 From: Sem Schilder Date: Wed, 12 Oct 2022 12:41:07 +0200 Subject: [PATCH 022/394] Allow for v0 API endpoints (#757) * Update ingress.yaml Support the V0 api endpoints. In the newest release of this chart, sentry 22.9.0. This does API calls to the uri: `example.com/api/0/organizations/[org-name]/eventsv2/?data=here` * Update version --- sentry/Chart.yaml | 2 +- sentry/templates/ingress.yaml | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/sentry/Chart.yaml b/sentry/Chart.yaml index 4b59ad9d8..b45eeedc9 100644 --- a/sentry/Chart.yaml +++ b/sentry/Chart.yaml @@ -2,7 +2,7 @@ apiVersion: v2 name: sentry description: A Helm chart for Kubernetes type: application -version: 16.0.2 +version: 16.0.3 appVersion: 22.9.0 dependencies: - name: memcached diff --git a/sentry/templates/ingress.yaml b/sentry/templates/ingress.yaml index d84927257..0292adacf 100644 --- a/sentry/templates/ingress.yaml +++ b/sentry/templates/ingress.yaml @@ -139,9 +139,9 @@ spec: servicePort: {{ template "relay.port" . }} {{- end }} {{- if eq (default "nginx" .Values.ingress.regexPathStyle) "traefik" }} - - path: {{ default "/" .Values.ingress.path }}api/{[1-9][0-9]*}/{(.*)} + - path: {{ default "/" .Values.ingress.path }}api/{[0-9][0-9]*}/{(.*)} {{- else }} - - path: {{ default "/" .Values.ingress.path }}api/[1-9][0-9]*/(.*) + - path: {{ default "/" .Values.ingress.path }}api/[0-9][0-9]*/(.*) {{- end }} {{- if $ingressSupportsPathType }} pathType: {{ $ingressPathType }} From 086dea2bf766572fa12ce78c3ab411ba4ec8db42 Mon Sep 17 00:00:00 2001 From: Pin Jin Date: Thu, 13 Oct 2022 16:33:56 +1100 Subject: [PATCH 023/394] include clickhouse port for secret snuba env (#756) --- sentry/Chart.yaml | 2 +- sentry/templates/secret-snuba-env.yaml | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/sentry/Chart.yaml b/sentry/Chart.yaml index b45eeedc9..5a26047b2 100644 --- a/sentry/Chart.yaml +++ b/sentry/Chart.yaml @@ -2,7 +2,7 @@ apiVersion: v2 name: sentry description: A Helm chart for Kubernetes type: application -version: 16.0.3 +version: 16.0.4 appVersion: 22.9.0 dependencies: - name: memcached diff --git a/sentry/templates/secret-snuba-env.yaml b/sentry/templates/secret-snuba-env.yaml index ac578bd03..444372e63 100644 --- a/sentry/templates/secret-snuba-env.yaml +++ b/sentry/templates/secret-snuba-env.yaml @@ -9,6 +9,7 @@ metadata: heritage: "{{ .Release.Service }}" type: Opaque data: + CLICKHOUSE_PORT: {{ include "sentry.clickhouse.port" . | b64enc | quote }} CLICKHOUSE_DATABASE: {{ include "sentry.clickhouse.database" . | b64enc | quote }} CLICKHOUSE_USER: {{ include "sentry.clickhouse.username" . | b64enc | quote }} CLICKHOUSE_PASSWORD: {{ include "sentry.clickhouse.password" . | b64enc | quote }} From 0a64d95000183837c2c55ee458bfd59de0754578 Mon Sep 17 00:00:00 2001 From: Agalin <6164461+Agalin@users.noreply.github.com> Date: Mon, 17 Oct 2022 17:08:03 +0200 Subject: [PATCH 024/394] Configurable Security Context for CronJobs (#705) * Configurable Security Context for Snuba CronJobs Configurable Security Context is missing from both Snuba cleanup jobs (cleanup transactions and cleanup errors). It makes it impossible to run those jobs with `runAsNonRoot` - k8s cannot verify id of a named user. * Configurable Security Context for Sentry Cleanup It's necessary to run it in restrictive environment blocking pods running as root. Co-authored-by: Szymon Soloch --- sentry/Chart.yaml | 2 +- sentry/templates/cronjob-sentry-cleanup.yaml | 4 ++++ sentry/templates/cronjob-snuba-cleanup-errors.yaml | 4 ++++ sentry/templates/cronjob-snuba-cleanup-transactions.yaml | 4 ++++ sentry/values.yaml | 3 +++ 5 files changed, 16 insertions(+), 1 deletion(-) diff --git a/sentry/Chart.yaml b/sentry/Chart.yaml index 5a26047b2..d63deb2f5 100644 --- a/sentry/Chart.yaml +++ b/sentry/Chart.yaml @@ -2,7 +2,7 @@ apiVersion: v2 name: sentry description: A Helm chart for Kubernetes type: application -version: 16.0.4 +version: 16.0.5 appVersion: 22.9.0 dependencies: - name: memcached diff --git a/sentry/templates/cronjob-sentry-cleanup.yaml b/sentry/templates/cronjob-sentry-cleanup.yaml index 601820959..2c5b87b80 100644 --- a/sentry/templates/cronjob-sentry-cleanup.yaml +++ b/sentry/templates/cronjob-sentry-cleanup.yaml @@ -58,6 +58,10 @@ spec: imagePullSecrets: {{ toYaml .Values.images.sentry.imagePullSecrets | indent 12 }} {{- end }} + {{- if .Values.sentry.cleanup.securityContext }} + securityContext: +{{ toYaml .Values.sentry.cleanup.securityContext | indent 12 }} + {{- end }} containers: - name: {{ .Chart.Name }}-sentry-cleanup image: "{{ template "sentry.image" . }}" diff --git a/sentry/templates/cronjob-snuba-cleanup-errors.yaml b/sentry/templates/cronjob-snuba-cleanup-errors.yaml index 52d0c7b8e..63197bbeb 100644 --- a/sentry/templates/cronjob-snuba-cleanup-errors.yaml +++ b/sentry/templates/cronjob-snuba-cleanup-errors.yaml @@ -57,6 +57,10 @@ spec: imagePullSecrets: {{ toYaml .Values.images.snuba.imagePullSecrets | indent 12 }} {{- end }} + {{- if .Values.snuba.cleanupErrors.securityContext }} + securityContext: +{{ toYaml .Values.snuba.cleanupErrors.securityContext | indent 12 }} + {{- end }} containers: - name: {{ .Chart.Name }}-snuba-cleanup-errors image: "{{ template "snuba.image" . }}" diff --git a/sentry/templates/cronjob-snuba-cleanup-transactions.yaml b/sentry/templates/cronjob-snuba-cleanup-transactions.yaml index bdbd32913..3fd08e837 100644 --- a/sentry/templates/cronjob-snuba-cleanup-transactions.yaml +++ b/sentry/templates/cronjob-snuba-cleanup-transactions.yaml @@ -57,6 +57,10 @@ spec: imagePullSecrets: {{ toYaml .Values.images.snuba.imagePullSecrets | indent 12 }} {{- end }} + {{- if .Values.snuba.cleanupTransactions.securityContext }} + securityContext: +{{ toYaml .Values.snuba.cleanupTransactions.securityContext | indent 12 }} + {{- end }} containers: - name: {{ .Chart.Name }}-snuba-cleanup-errors image: "{{ template "snuba.image" . }}" diff --git a/sentry/values.yaml b/sentry/values.yaml index ddc992cdf..c8f4c10f4 100644 --- a/sentry/values.yaml +++ b/sentry/values.yaml @@ -230,6 +230,7 @@ sentry: enabled: true schedule: "0 0 * * *" days: 90 + # securityContext: {} sidecars: [] volumes: [] serviceAccount: {} @@ -424,6 +425,7 @@ snuba: schedule: "0 * * * *" sidecars: [] volumes: [] + # securityContext: {} serviceAccount: {} cleanupTransactions: @@ -435,6 +437,7 @@ snuba: schedule: "0 * * * *" sidecars: [] volumes: [] + # securityContext: {} serviceAccount: {} hooks: From 510cf13caf9cb58071d996655ffe4fc7aa4de5b3 Mon Sep 17 00:00:00 2001 From: Paul Voss Date: Mon, 31 Oct 2022 08:14:02 +0100 Subject: [PATCH 025/394] fix relay upstream issues by setting http-keepalive to 15 (#671) (#765) The http-keepalive option was changed from 'True' to '15' in the getsentry/self-hosted repo. The current setting causes connection/authentication issues between relay and web containers. see https://github.com/sentry-kubernetes/charts/issues/671 thanks to @junowong0114 for pointing out the solution --- sentry/Chart.yaml | 2 +- sentry/templates/configmap-sentry.yaml | 7 ++----- sentry/values.yaml | 2 ++ 3 files changed, 5 insertions(+), 6 deletions(-) diff --git a/sentry/Chart.yaml b/sentry/Chart.yaml index d63deb2f5..8c2d3488c 100644 --- a/sentry/Chart.yaml +++ b/sentry/Chart.yaml @@ -2,7 +2,7 @@ apiVersion: v2 name: sentry description: A Helm chart for Kubernetes type: application -version: 16.0.5 +version: 16.0.6 appVersion: 22.9.0 dependencies: - name: memcached diff --git a/sentry/templates/configmap-sentry.yaml b/sentry/templates/configmap-sentry.yaml index ee31ef98d..befc39437 100644 --- a/sentry/templates/configmap-sentry.yaml +++ b/sentry/templates/configmap-sentry.yaml @@ -291,11 +291,8 @@ data: "protocol": "uwsgi", # This is needed to prevent https://git.io/fj7Lw "uwsgi-socket": None, - - # These ase for proper HTTP/1.1 support from uWSGI - # Without these it doesn't do keep-alives causing - # issues with Relay's direct requests. - "http-keepalive": True, + # Keep this between 15s-75s as that's what Relay supports + "http-keepalive": {{ .Values.config.web.httpKeepalive }}, "http-chunked-input": True, # the number of web workers 'workers': 3, diff --git a/sentry/values.yaml b/sentry/values.yaml index c8f4c10f4..10c82566f 100644 --- a/sentry/values.yaml +++ b/sentry/values.yaml @@ -698,6 +698,8 @@ config: # No Python Extension Config Given relay: | # No YAML relay config given + web: + httpKeepalive: 15 clickhouse: enabled: true From ca611efde92be5deb7756ae05837e6ff1402f839 Mon Sep 17 00:00:00 2001 From: Cong Nguyen Date: Mon, 31 Oct 2022 20:05:44 +0700 Subject: [PATCH 026/394] feat: sentry 22.10 & split post-process-forwarder (#766) --- README.md | 10 ++ sentry/Chart.yaml | 4 +- ...sentry-post-process-forwarder-errors.yaml} | 63 ++++--- ...y-post-process-forwarder-transactions.yaml | 169 ++++++++++++++++++ ...sentry-post-process-forwarder-errors.yaml} | 2 +- ...y-post-process-forwarder-transactions.yaml | 10 ++ sentry/values.yaml | 14 +- 7 files changed, 240 insertions(+), 32 deletions(-) rename sentry/templates/{deployment-sentry-post-process-forwarder.yaml => deployment-sentry-post-process-forwarder-errors.yaml} (71%) create mode 100644 sentry/templates/deployment-sentry-post-process-forwarder-transactions.yaml rename sentry/templates/{serviceaccount-sentry-post-process-forwarder.yaml => serviceaccount-sentry-post-process-forwarder-errors.yaml} (97%) create mode 100644 sentry/templates/serviceaccount-sentry-post-process-forwarder-transactions.yaml diff --git a/README.md b/README.md index 201635b73..eea82f14f 100644 --- a/README.md +++ b/README.md @@ -14,6 +14,16 @@ Big thanks to the maintainers of the [deprecated chart](https://github.com/helm/ For now the full list of values is not documented but you can get inspired by the values.yaml specific to each directory. +## Upgrading from 16.x.x version of this Chart to 17.x.x + +Sentry version from 22.10.0 onwards should be using chart 17.x.x + +- post process forwarder events and transactions topics are splitted in Sentry 22.10.0 + +You can delete the deployment "sentry-post-process-forward" as it's no longer needed. + + + ## Upgrading from 15.x.x version of this Chart to 16.x.x system.secret-key is removed diff --git a/sentry/Chart.yaml b/sentry/Chart.yaml index 8c2d3488c..5498175a2 100644 --- a/sentry/Chart.yaml +++ b/sentry/Chart.yaml @@ -2,8 +2,8 @@ apiVersion: v2 name: sentry description: A Helm chart for Kubernetes type: application -version: 16.0.6 -appVersion: 22.9.0 +version: 17.0.0 +appVersion: 22.10.0 dependencies: - name: memcached repository: https://charts.bitnami.com/bitnami diff --git a/sentry/templates/deployment-sentry-post-process-forwarder.yaml b/sentry/templates/deployment-sentry-post-process-forwarder-errors.yaml similarity index 71% rename from sentry/templates/deployment-sentry-post-process-forwarder.yaml rename to sentry/templates/deployment-sentry-post-process-forwarder-errors.yaml index 529237005..8a85a8ccd 100644 --- a/sentry/templates/deployment-sentry-post-process-forwarder.yaml +++ b/sentry/templates/deployment-sentry-post-process-forwarder-errors.yaml @@ -1,7 +1,7 @@ apiVersion: apps/v1 kind: Deployment metadata: - name: {{ template "sentry.fullname" . }}-post-process-forward + name: {{ template "sentry.fullname" . }}-post-process-forward-errors labels: app: sentry chart: "{{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }}" @@ -22,36 +22,36 @@ spec: matchLabels: app: sentry release: "{{ .Release.Name }}" - role: sentry-post-process-forward - replicas: {{ .Values.sentry.postProcessForward.replicas }} + role: sentry-post-process-forward-errors + replicas: {{ .Values.sentry.postProcessForwardErrors.replicas }} template: metadata: annotations: checksum/configYml: {{ .Values.config.configYml | toYaml | toString | sha256sum }} checksum/sentryConfPy: {{ .Values.config.sentryConfPy | sha256sum }} checksum/config.yaml: {{ include (print $.Template.BasePath "/configmap-sentry.yaml") . | sha256sum }} - {{- if .Values.sentry.postProcessForward.annotations }} -{{ toYaml .Values.sentry.postProcessForward.annotations | indent 8 }} + {{- if .Values.sentry.postProcessForwardErrors.annotations }} +{{ toYaml .Values.sentry.postProcessForwardErrors.annotations | indent 8 }} {{- end }} labels: app: sentry release: "{{ .Release.Name }}" - role: sentry-post-process-forward - {{- if .Values.sentry.postProcessForward.podLabels }} -{{ toYaml .Values.sentry.postProcessForward.podLabels | indent 8 }} + role: sentry-post-process-forward-errors + {{- if .Values.sentry.postProcessForwardErrors.podLabels }} +{{ toYaml .Values.sentry.postProcessForwardErrors.podLabels | indent 8 }} {{- end }} spec: affinity: - {{- if .Values.sentry.postProcessForward.affinity }} -{{ toYaml .Values.sentry.postProcessForward.affinity | indent 8 }} + {{- if .Values.sentry.postProcessForwardErrors.affinity }} +{{ toYaml .Values.sentry.postProcessForwardErrors.affinity | indent 8 }} {{- end }} - {{- if .Values.sentry.postProcessForward.nodeSelector }} + {{- if .Values.sentry.postProcessForwardErrors.nodeSelector }} nodeSelector: -{{ toYaml .Values.sentry.postProcessForward.nodeSelector | indent 8 }} +{{ toYaml .Values.sentry.postProcessForwardErrors.nodeSelector | indent 8 }} {{- end }} - {{- if .Values.sentry.postProcessForward.tolerations }} + {{- if .Values.sentry.postProcessForwardErrors.tolerations }} tolerations: -{{ toYaml .Values.sentry.postProcessForward.tolerations | indent 8 }} +{{ toYaml .Values.sentry.postProcessForwardErrors.tolerations | indent 8 }} {{- end }} {{- if .Values.images.sentry.imagePullSecrets }} imagePullSecrets: @@ -64,15 +64,22 @@ spec: dnsConfig: {{ toYaml .Values.dnsConfig | indent 8 }} {{- end }} - {{- if .Values.sentry.postProcessForward.securityContext }} + {{- if .Values.sentry.postProcessForwardErrors.securityContext }} securityContext: -{{ toYaml .Values.sentry.postProcessForward.securityContext | indent 8 }} +{{ toYaml .Values.sentry.postProcessForwardErrors.securityContext | indent 8 }} {{- end }} containers: - - name: {{ .Chart.Name }}-post-process-forward + - name: {{ .Chart.Name }}-post-process-forward-errors image: "{{ template "sentry.image" . }}" imagePullPolicy: {{ default "IfNotPresent" .Values.images.sentry.pullPolicy }} - command: ["sentry", "run", "post-process-forwarder", "--commit-batch-size", "{{ default "1" .Values.sentry.postProcessForward.commitBatchSize }}"] + command: ["sentry"] + args: + - "run" + - "post-process-forwarder" + - "--commit-batch-size" + - "{{ default "1" .Values.sentry.postProcessForwardErrors.commitBatchSize }}" + - "--entity" + - "errors" env: - name: SNUBA value: http://{{ template "sentry.fullname" . }}-snuba:{{ template "snuba.port" }} @@ -109,8 +116,8 @@ spec: - name: GOOGLE_APPLICATION_CREDENTIALS value: /var/run/secrets/google/{{ .Values.filestore.gcs.credentialsFile }} {{ end }} -{{- if .Values.sentry.postProcessForward.env }} -{{ toYaml .Values.sentry.postProcessForward.env | indent 8 }} +{{- if .Values.sentry.postProcessForwardErrors.env }} +{{ toYaml .Values.sentry.postProcessForwardErrors.env | indent 8 }} {{- end }} volumeMounts: - mountPath: /etc/sentry @@ -123,12 +130,12 @@ spec: mountPath: /var/run/secrets/google {{ end }} resources: -{{ toYaml .Values.sentry.postProcessForward.resources | indent 12 }} -{{- if .Values.sentry.postProcessForward.sidecars }} -{{ toYaml .Values.sentry.postProcessForward.sidecars | indent 6 }} +{{ toYaml .Values.sentry.postProcessForwardErrors.resources | indent 12 }} +{{- if .Values.sentry.postProcessForwardErrors.sidecars }} +{{ toYaml .Values.sentry.postProcessForwardErrors.sidecars | indent 6 }} {{- end }} {{- if .Values.serviceAccount.enabled }} - serviceAccountName: {{ .Values.serviceAccount.name }}-post-process-forwarder + serviceAccountName: {{ .Values.serviceAccount.name }}-post-process-forwarder-errors {{- end }} volumes: - name: config @@ -151,9 +158,9 @@ spec: secret: secretName: {{ .Values.filestore.gcs.secretName }} {{ end }} -{{- if .Values.sentry.postProcessForward.volumes }} -{{ toYaml .Values.sentry.postProcessForward.volumes | indent 6 }} +{{- if .Values.sentry.postProcessForwardErrors.volumes }} +{{ toYaml .Values.sentry.postProcessForwardErrors.volumes | indent 6 }} {{- end }} - {{- if .Values.sentry.postProcessForward.priorityClassName }} - priorityClassName: "{{ .Values.sentry.postProcessForward.priorityClassName }}" + {{- if .Values.sentry.postProcessForwardErrors.priorityClassName }} + priorityClassName: "{{ .Values.sentry.postProcessForwardErrors.priorityClassName }}" {{- end }} diff --git a/sentry/templates/deployment-sentry-post-process-forwarder-transactions.yaml b/sentry/templates/deployment-sentry-post-process-forwarder-transactions.yaml new file mode 100644 index 000000000..4968f5132 --- /dev/null +++ b/sentry/templates/deployment-sentry-post-process-forwarder-transactions.yaml @@ -0,0 +1,169 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: {{ template "sentry.fullname" . }}-post-process-forward-transactions + labels: + app: sentry + chart: "{{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }}" + release: "{{ .Release.Name }}" + heritage: "{{ .Release.Service }}" + app.kubernetes.io/managed-by: "Helm" + {{- if .Values.asHook }} + {{- /* Add the Helm annotations so that deployment after asHook from true to false works */}} + annotations: + meta.helm.sh/release-name: "{{ .Release.Name }}" + meta.helm.sh/release-namespace: "{{ .Release.Namespace }}" + "helm.sh/hook": "post-install,post-upgrade" + "helm.sh/hook-weight": "10" + {{- end }} +spec: + revisionHistoryLimit: {{ .Values.revisionHistoryLimit }} + selector: + matchLabels: + app: sentry + release: "{{ .Release.Name }}" + role: sentry-post-process-forward-transactions + replicas: {{ .Values.sentry.postProcessForwardTransactions.replicas }} + template: + metadata: + annotations: + checksum/configYml: {{ .Values.config.configYml | toYaml | toString | sha256sum }} + checksum/sentryConfPy: {{ .Values.config.sentryConfPy | sha256sum }} + checksum/config.yaml: {{ include (print $.Template.BasePath "/configmap-sentry.yaml") . | sha256sum }} + {{- if .Values.sentry.postProcessForwardTransactions.annotations }} +{{ toYaml .Values.sentry.postProcessForwardTransactions.annotations | indent 8 }} + {{- end }} + labels: + app: sentry + release: "{{ .Release.Name }}" + role: sentry-post-process-forward-transactions + {{- if .Values.sentry.postProcessForwardTransactions.podLabels }} +{{ toYaml .Values.sentry.postProcessForwardTransactions.podLabels | indent 8 }} + {{- end }} + spec: + affinity: + {{- if .Values.sentry.postProcessForwardTransactions.affinity }} +{{ toYaml .Values.sentry.postProcessForwardTransactions.affinity | indent 8 }} + {{- end }} + {{- if .Values.sentry.postProcessForwardTransactions.nodeSelector }} + nodeSelector: +{{ toYaml .Values.sentry.postProcessForwardTransactions.nodeSelector | indent 8 }} + {{- end }} + {{- if .Values.sentry.postProcessForwardTransactions.tolerations }} + tolerations: +{{ toYaml .Values.sentry.postProcessForwardTransactions.tolerations | indent 8 }} + {{- end }} + {{- if .Values.images.sentry.imagePullSecrets }} + imagePullSecrets: +{{ toYaml .Values.images.sentry.imagePullSecrets | indent 8 }} + {{- end }} + {{- if .Values.dnsPolicy }} + dnsPolicy: {{ .Values.dnsPolicy | quote }} + {{- end }} + {{- if .Values.dnsConfig }} + dnsConfig: +{{ toYaml .Values.dnsConfig | indent 8 }} + {{- end }} + {{- if .Values.sentry.postProcessForwardTransactions.securityContext }} + securityContext: +{{ toYaml .Values.sentry.postProcessForwardTransactions.securityContext | indent 8 }} + {{- end }} + containers: + - name: {{ .Chart.Name }}-post-process-forward-transactions + image: "{{ template "sentry.image" . }}" + imagePullPolicy: {{ default "IfNotPresent" .Values.images.sentry.pullPolicy }} + command: ["sentry"] + args: + - "run" + - "post-process-forwarder" + - "--commit-batch-size" + - "{{ default "1" .Values.sentry.postProcessForwardTransactions.commitBatchSize }}" + - "--entity" + - "transactions" + - "--commit-log-topic=snuba-transactions-commit-log" + - "--synchronize-commit-group" + - "transactions_group" + env: + - name: SNUBA + value: http://{{ template "sentry.fullname" . }}-snuba:{{ template "snuba.port" }} + {{- if .Values.sentry.existingSecret }} + - name: SENTRY_SECRET_KEY + valueFrom: + secretKeyRef: + name: {{ .Values.sentry.existingSecret }} + key: {{ default "key" .Values.sentry.existingSecretKey }} + {{- else }} + - name: SENTRY_SECRET_KEY + valueFrom: + secretKeyRef: + name: {{ template "sentry.fullname" . }}-sentry-secret + key: "key" + {{- end }} + {{- if .Values.postgresql.enabled }} + - name: POSTGRES_PASSWORD + valueFrom: + secretKeyRef: + name: {{ default (include "sentry.postgresql.fullname" .) .Values.postgresql.existingSecret }} + key: {{ default "postgresql-password" .Values.postgresql.existingSecretKey }} + {{- else if .Values.externalPostgresql.password }} + - name: POSTGRES_PASSWORD + value: {{ .Values.externalPostgresql.password | quote }} + {{- else if .Values.externalPostgresql.existingSecret }} + - name: POSTGRES_PASSWORD + valueFrom: + secretKeyRef: + name: {{ .Values.externalPostgresql.existingSecret }} + key: {{ default "postgresql-password" .Values.externalPostgresql.existingSecretKey }} + {{- end }} + {{ if and (eq .Values.filestore.backend "gcs") .Values.filestore.gcs.secretName }} + - name: GOOGLE_APPLICATION_CREDENTIALS + value: /var/run/secrets/google/{{ .Values.filestore.gcs.credentialsFile }} + {{ end }} +{{- if .Values.sentry.postProcessForwardTransactions.env }} +{{ toYaml .Values.sentry.postProcessForwardTransactions.env | indent 8 }} +{{- end }} + volumeMounts: + - mountPath: /etc/sentry + name: config + readOnly: true + - mountPath: {{ .Values.filestore.filesystem.path }} + name: sentry-data + {{- if and (eq .Values.filestore.backend "gcs") .Values.filestore.gcs.secretName }} + - name: sentry-google-cloud-key + mountPath: /var/run/secrets/google + {{ end }} + resources: +{{ toYaml .Values.sentry.postProcessForwardTransactions.resources | indent 12 }} +{{- if .Values.sentry.postProcessForwardTransactions.sidecars }} +{{ toYaml .Values.sentry.postProcessForwardTransactions.sidecars | indent 6 }} +{{- end }} + {{- if .Values.serviceAccount.enabled }} + serviceAccountName: {{ .Values.serviceAccount.name }}-post-process-forwarder-transactions + {{- end }} + volumes: + - name: config + configMap: + name: {{ template "sentry.fullname" . }}-sentry + - name: sentry-data + {{- if and (eq .Values.filestore.backend "filesystem") .Values.filestore.filesystem.persistence.enabled (.Values.filestore.filesystem.persistence.persistentWorkers) }} + {{- if .Values.filestore.filesystem.persistence.existingClaim }} + persistentVolumeClaim: + claimName: {{ .Values.filestore.filesystem.persistence.existingClaim }} + {{- else }} + persistentVolumeClaim: + claimName: {{ template "sentry.fullname" . }}-data + {{- end }} + {{- else }} + emptyDir: {} + {{ end }} + {{- if and (eq .Values.filestore.backend "gcs") .Values.filestore.gcs.secretName }} + - name: sentry-google-cloud-key + secret: + secretName: {{ .Values.filestore.gcs.secretName }} + {{ end }} +{{- if .Values.sentry.postProcessForwardTransactions.volumes }} +{{ toYaml .Values.sentry.postProcessForwardTransactions.volumes | indent 6 }} +{{- end }} + {{- if .Values.sentry.postProcessForwardTransactions.priorityClassName }} + priorityClassName: "{{ .Values.sentry.postProcessForwardTransactions.priorityClassName }}" + {{- end }} diff --git a/sentry/templates/serviceaccount-sentry-post-process-forwarder.yaml b/sentry/templates/serviceaccount-sentry-post-process-forwarder-errors.yaml similarity index 97% rename from sentry/templates/serviceaccount-sentry-post-process-forwarder.yaml rename to sentry/templates/serviceaccount-sentry-post-process-forwarder-errors.yaml index 87132901d..a38e8fb01 100644 --- a/sentry/templates/serviceaccount-sentry-post-process-forwarder.yaml +++ b/sentry/templates/serviceaccount-sentry-post-process-forwarder-errors.yaml @@ -2,7 +2,7 @@ apiVersion: v1 kind: ServiceAccount metadata: - name: {{ .Values.serviceAccount.name }}-post-process-forwarder + name: {{ .Values.serviceAccount.name }}-post-process-forwarder-errors {{- if .Values.serviceAccount.annotations }} annotations: {{ toYaml .Values.serviceAccount.annotations | nindent 4 }} {{- end }} diff --git a/sentry/templates/serviceaccount-sentry-post-process-forwarder-transactions.yaml b/sentry/templates/serviceaccount-sentry-post-process-forwarder-transactions.yaml new file mode 100644 index 000000000..3659704be --- /dev/null +++ b/sentry/templates/serviceaccount-sentry-post-process-forwarder-transactions.yaml @@ -0,0 +1,10 @@ +{{- if .Values.serviceAccount.enabled }} +apiVersion: v1 +kind: ServiceAccount +metadata: + name: {{ .Values.serviceAccount.name }}-post-process-forwarder-transactions +{{- if .Values.serviceAccount.annotations }} + annotations: {{ toYaml .Values.serviceAccount.annotations | nindent 4 }} +{{- end }} +automountServiceAccountToken: {{ .Values.serviceAccount.automountServiceAccountToken }} +{{- end }} diff --git a/sentry/values.yaml b/sentry/values.yaml index 10c82566f..45da4699c 100644 --- a/sentry/values.yaml +++ b/sentry/values.yaml @@ -210,7 +210,19 @@ sentry: sidecars: [] volumes: [] # noStrictOffsetReset: false - postProcessForward: + postProcessForwardErrors: + replicas: 1 + env: [] + resources: {} + affinity: {} + nodeSelector: {} + securityContext: {} + # tolerations: [] + # podLabels: [] + # commitBatchSize: 1 + sidecars: [] + volumes: [] + postProcessForwardTransactions: replicas: 1 env: [] resources: {} From baf2acff170f091f41f2a1461cd01ff16bce92c7 Mon Sep 17 00:00:00 2001 From: Jan Jansen Date: Tue, 1 Nov 2022 08:59:25 +0100 Subject: [PATCH 027/394] Refactor env behavior (#762) --- sentry/Chart.yaml | 2 +- sentry/templates/_helper.tpl | 68 +++++++++++++------ sentry/templates/configmap-sentry.yaml | 2 +- sentry/templates/cronjob-sentry-cleanup.yaml | 40 +---------- .../cronjob-snuba-cleanup-errors.yaml | 9 ++- .../cronjob-snuba-cleanup-transactions.yaml | 7 +- sentry/templates/deployment-sentry-cron.yaml | 36 +--------- .../deployment-sentry-ingest-consumer.yaml | 36 +--------- ...-sentry-post-process-forwarder-errors.yaml | 36 +--------- ...y-post-process-forwarder-transactions.yaml | 36 +--------- ...t-sentry-subscription-consumer-events.yaml | 36 +--------- ...ry-subscription-consumer-transactions.yaml | 36 +--------- sentry/templates/deployment-sentry-web.yaml | 36 +--------- .../templates/deployment-sentry-worker.yaml | 36 +--------- .../templates/hooks/sentry-db-init.job.yaml | 30 +------- sentry/templates/hooks/user-create.yaml | 30 +------- sentry/templates/secret-snuba-env.yaml | 2 + sentry/values.yaml | 3 + 18 files changed, 76 insertions(+), 405 deletions(-) diff --git a/sentry/Chart.yaml b/sentry/Chart.yaml index 5498175a2..e48773173 100644 --- a/sentry/Chart.yaml +++ b/sentry/Chart.yaml @@ -2,7 +2,7 @@ apiVersion: v2 name: sentry description: A Helm chart for Kubernetes type: application -version: 17.0.0 +version: 17.1.0 appVersion: 22.10.0 dependencies: - name: memcached diff --git a/sentry/templates/_helper.tpl b/sentry/templates/_helper.tpl index b3240f30b..14c10f2fd 100644 --- a/sentry/templates/_helper.tpl +++ b/sentry/templates/_helper.tpl @@ -231,17 +231,6 @@ Set postgresql username {{- end -}} {{- end -}} -{{/* -Set postgresql password -*/}} -{{- define "sentry.postgresql.password" -}} -{{- if .Values.postgresql.enabled -}} -{{- default "" .Values.postgresql.postgresqlPassword }} -{{- else if not .Values.externalPostgresql.existingSecret }} -{{ required "A valid .Values.externalPostgresql.password is required" .Values.externalPostgresql.password }} -{{- end -}} -{{- end -}} - {{/* Set postgresql database */}} @@ -352,13 +341,6 @@ default {{- end -}} {{- end -}} -{{/* -Set ClickHouse Authorization -*/}} -{{- define "sentry.clickhouse.auth" -}} ---user {{ include "sentry.clickhouse.username" . }} --password {{ include "sentry.clickhouse.password" .| quote }} -{{- end -}} - {{/* Set ClickHouse User */}} @@ -454,4 +436,52 @@ Common Snuba environment variables value: /etc/snuba/settings.py - name: DEFAULT_BROKERS value: {{ include "sentry.kafka.bootstrap_servers_string" . | quote }} -{{- end -}} +{{- if .Values.externalClickhouse.existingSecret }} +- name: CLICKHOUSE_PASSWORD + valueFrom: + secretKeyRef: + name: {{ .Values.externalClickhouse.existingSecret }} + key: {{ default "clickhouse-password" .Values.externalClickhouse.existingSecretKey }} +{{- end }} +{{- end -}} + +{{/* +Common Sentry environment variables +*/}} +{{- define "sentry.env" -}} +- name: SNUBA + value: http://{{ template "sentry.fullname" . }}-snuba:{{ template "snuba.port" . }} +{{- if .Values.sentry.existingSecret }} +- name: SENTRY_SECRET_KEY + valueFrom: + secretKeyRef: + name: {{ .Values.sentry.existingSecret }} + key: {{ default "key" .Values.sentry.existingSecretKey }} +{{- else }} +- name: SENTRY_SECRET_KEY + valueFrom: + secretKeyRef: + name: {{ template "sentry.fullname" . }}-sentry-secret + key: "key" +{{- end }} +{{- if .Values.postgresql.enabled }} +- name: POSTGRES_PASSWORD + valueFrom: + secretKeyRef: + name: {{ default (include "sentry.postgresql.fullname" .) .Values.postgresql.existingSecret }} + key: {{ default "postgresql-password" .Values.postgresql.existingSecretKey }} +{{- else if .Values.externalPostgresql.password }} +- name: POSTGRES_PASSWORD + value: {{ .Values.externalPostgresql.password | quote }} +{{- else if .Values.externalPostgresql.existingSecret }} +- name: POSTGRES_PASSWORD + valueFrom: + secretKeyRef: + name: {{ .Values.externalPostgresql.existingSecret }} + key: {{ default "postgresql-password" .Values.externalPostgresql.existingSecretKey }} +{{- end }} +{{- if and (eq .Values.filestore.backend "gcs") .Values.filestore.gcs.secretName }} +- name: GOOGLE_APPLICATION_CREDENTIALS + value: /var/run/secrets/google/{{ .Values.filestore.gcs.credentialsFile }} +{{- end }} +{{- end -}} \ No newline at end of file diff --git a/sentry/templates/configmap-sentry.yaml b/sentry/templates/configmap-sentry.yaml index befc39437..771094bd8 100644 --- a/sentry/templates/configmap-sentry.yaml +++ b/sentry/templates/configmap-sentry.yaml @@ -144,7 +144,7 @@ data: "ENGINE": "sentry.db.postgres", "NAME": {{ include "sentry.postgresql.database" . | quote }}, "USER": {{ include "sentry.postgresql.username" . | quote }}, - "PASSWORD": os.environ.get("POSTGRES_PASSWORD", {{ include "sentry.postgresql.password" . | quote }}), + "PASSWORD": os.environ.get("POSTGRES_PASSWORD", ""), "HOST": {{ include "sentry.postgresql.host" . | quote }}, "PORT": {{ template "sentry.postgresql.port" . }}, {{- if .Values.externalPostgresql.sslMode }} diff --git a/sentry/templates/cronjob-sentry-cleanup.yaml b/sentry/templates/cronjob-sentry-cleanup.yaml index 2c5b87b80..6db23fee1 100644 --- a/sentry/templates/cronjob-sentry-cleanup.yaml +++ b/sentry/templates/cronjob-sentry-cleanup.yaml @@ -72,46 +72,12 @@ spec: - "--days" - "{{ .Values.sentry.cleanup.days }}" env: - - name: SNUBA - value: http://{{ template "sentry.fullname" . }}-snuba:{{ template "snuba.port" }} - name: C_FORCE_ROOT value: "true" - {{- if .Values.sentry.existingSecret }} - - name: SENTRY_SECRET_KEY - valueFrom: - secretKeyRef: - name: {{ .Values.sentry.existingSecret }} - key: {{ default "key" .Values.sentry.existingSecretKey }} - {{- else }} - - name: SENTRY_SECRET_KEY - valueFrom: - secretKeyRef: - name: {{ template "sentry.fullname" . }}-sentry-secret - key: "key" - {{- end }} - {{- if .Values.postgresql.enabled }} - - name: POSTGRES_PASSWORD - valueFrom: - secretKeyRef: - name: {{ default (include "sentry.postgresql.fullname" .) .Values.postgresql.existingSecret }} - key: {{ default "postgresql-password" .Values.postgresql.existingSecretKey }} - {{- else if .Values.externalPostgresql.password }} - - name: POSTGRES_PASSWORD - value: {{ .Values.externalPostgresql.password | quote }} - {{- else if .Values.externalPostgresql.existingSecret }} - - name: POSTGRES_PASSWORD - valueFrom: - secretKeyRef: - name: {{ .Values.externalPostgresql.existingSecret }} - key: {{ default "postgresql-password" .Values.externalPostgresql.existingSecretKey }} - {{- end }} - {{- if and (eq .Values.filestore.backend "gcs") .Values.filestore.gcs.secretName }} - - name: GOOGLE_APPLICATION_CREDENTIALS - value: /var/run/secrets/google/{{ .Values.filestore.gcs.credentialsFile }} - {{- end }} - {{- if .Values.sentry.cleanup.env }} +{{ include "sentry.env" . | indent 12 }} +{{- if .Values.sentry.cleanup.env }} {{ toYaml .Values.sentry.cleanup.env | indent 12 }} - {{- end }} +{{- end }} volumeMounts: - mountPath: /etc/sentry name: config diff --git a/sentry/templates/cronjob-snuba-cleanup-errors.yaml b/sentry/templates/cronjob-snuba-cleanup-errors.yaml index 63197bbeb..f5595f160 100644 --- a/sentry/templates/cronjob-snuba-cleanup-errors.yaml +++ b/sentry/templates/cronjob-snuba-cleanup-errors.yaml @@ -77,11 +77,10 @@ spec: - "--clickhouse-port" - {{ include "sentry.clickhouse.port" . | quote }} env: - - name: SNUBA_SETTINGS - value: /etc/snuba/settings.py - {{- if .Values.snuba.cleanupErrors.env }} -{{ toYaml .Values.snuba.cleanupErrors.env | indent 14 }} - {{- end }} +{{ include "sentry.snuba.env" . | indent 12 }} +{{- if .Values.snuba.cleanupErrors.env }} +{{ toYaml .Values.snuba.cleanupErrors.env | indent 12 }} +{{- end }} envFrom: - secretRef: name: {{ template "sentry.fullname" . }}-snuba-env diff --git a/sentry/templates/cronjob-snuba-cleanup-transactions.yaml b/sentry/templates/cronjob-snuba-cleanup-transactions.yaml index 3fd08e837..5fa331e6b 100644 --- a/sentry/templates/cronjob-snuba-cleanup-transactions.yaml +++ b/sentry/templates/cronjob-snuba-cleanup-transactions.yaml @@ -77,11 +77,10 @@ spec: - "--clickhouse-port" - {{ include "sentry.clickhouse.port" . | quote }} env: - - name: SNUBA_SETTINGS - value: /etc/snuba/settings.py - {{- if .Values.snuba.cleanupTransactions.env }} +{{ include "sentry.snuba.env" . | indent 14 }} +{{- if .Values.snuba.cleanupTransactions.env }} {{ toYaml .Values.snuba.cleanupTransactions.env | indent 14 }} - {{- end }} +{{- end }} envFrom: - secretRef: name: {{ template "sentry.fullname" . }}-snuba-env diff --git a/sentry/templates/deployment-sentry-cron.yaml b/sentry/templates/deployment-sentry-cron.yaml index db85ea9ac..ece85d764 100644 --- a/sentry/templates/deployment-sentry-cron.yaml +++ b/sentry/templates/deployment-sentry-cron.yaml @@ -68,43 +68,9 @@ spec: - "run" - "cron" env: - - name: SNUBA - value: http://{{ template "sentry.fullname" . }}-snuba:{{ template "snuba.port" }} - {{- if .Values.sentry.existingSecret }} - - name: SENTRY_SECRET_KEY - valueFrom: - secretKeyRef: - name: {{ .Values.sentry.existingSecret }} - key: {{ default "key" .Values.sentry.existingSecretKey }} - {{- else }} - - name: SENTRY_SECRET_KEY - valueFrom: - secretKeyRef: - name: {{ template "sentry.fullname" . }}-sentry-secret - key: "key" - {{- end }} - name: C_FORCE_ROOT value: "true" - {{- if .Values.postgresql.enabled }} - - name: POSTGRES_PASSWORD - valueFrom: - secretKeyRef: - name: {{ default (include "sentry.postgresql.fullname" .) .Values.postgresql.existingSecret }} - key: {{ default "postgresql-password" .Values.postgresql.existingSecretKey }} - {{- else if .Values.externalPostgresql.password }} - - name: POSTGRES_PASSWORD - value: {{ .Values.externalPostgresql.password | quote }} - {{- else if .Values.externalPostgresql.existingSecret }} - - name: POSTGRES_PASSWORD - valueFrom: - secretKeyRef: - name: {{ .Values.externalPostgresql.existingSecret }} - key: {{ default "postgresql-password" .Values.externalPostgresql.existingSecretKey }} - {{- end }} - {{ if and (eq .Values.filestore.backend "gcs") .Values.filestore.gcs.secretName }} - - name: GOOGLE_APPLICATION_CREDENTIALS - value: /var/run/secrets/google/{{ .Values.filestore.gcs.credentialsFile }} - {{ end }} +{{ include "sentry.env" . | indent 8 }} {{- if .Values.sentry.cron.env }} {{ toYaml .Values.sentry.cron.env | indent 8 }} {{- end }} diff --git a/sentry/templates/deployment-sentry-ingest-consumer.yaml b/sentry/templates/deployment-sentry-ingest-consumer.yaml index 3a97da97d..5e56374cf 100644 --- a/sentry/templates/deployment-sentry-ingest-consumer.yaml +++ b/sentry/templates/deployment-sentry-ingest-consumer.yaml @@ -88,43 +88,9 @@ spec: - "{{ .Values.sentry.ingestConsumer.maxBatchSize }}" {{- end }} env: - - name: SNUBA - value: http://{{ template "sentry.fullname" . }}-snuba:{{ template "snuba.port" }} - name: C_FORCE_ROOT value: "true" - {{- if .Values.sentry.existingSecret }} - - name: SENTRY_SECRET_KEY - valueFrom: - secretKeyRef: - name: {{ .Values.sentry.existingSecret }} - key: {{ default "key" .Values.sentry.existingSecretKey }} - {{- else }} - - name: SENTRY_SECRET_KEY - valueFrom: - secretKeyRef: - name: {{ template "sentry.fullname" . }}-sentry-secret - key: "key" - {{- end }} - {{- if .Values.postgresql.enabled }} - - name: POSTGRES_PASSWORD - valueFrom: - secretKeyRef: - name: {{ default (include "sentry.postgresql.fullname" .) .Values.postgresql.existingSecret }} - key: {{ default "postgresql-password" .Values.postgresql.existingSecretKey }} - {{- else if .Values.externalPostgresql.password }} - - name: POSTGRES_PASSWORD - value: {{ .Values.externalPostgresql.password | quote }} - {{- else if .Values.externalPostgresql.existingSecret }} - - name: POSTGRES_PASSWORD - valueFrom: - secretKeyRef: - name: {{ .Values.externalPostgresql.existingSecret }} - key: {{ default "postgresql-password" .Values.externalPostgresql.existingSecretKey }} - {{- end }} - {{ if and (eq .Values.filestore.backend "gcs") .Values.filestore.gcs.secretName }} - - name: GOOGLE_APPLICATION_CREDENTIALS - value: /var/run/secrets/google/{{ .Values.filestore.gcs.credentialsFile }} - {{ end }} +{{ include "sentry.env" . | indent 8 }} {{- if .Values.sentry.ingestConsumer.env }} {{ toYaml .Values.sentry.ingestConsumer.env | indent 8 }} {{- end }} diff --git a/sentry/templates/deployment-sentry-post-process-forwarder-errors.yaml b/sentry/templates/deployment-sentry-post-process-forwarder-errors.yaml index 8a85a8ccd..dd768a770 100644 --- a/sentry/templates/deployment-sentry-post-process-forwarder-errors.yaml +++ b/sentry/templates/deployment-sentry-post-process-forwarder-errors.yaml @@ -81,41 +81,7 @@ spec: - "--entity" - "errors" env: - - name: SNUBA - value: http://{{ template "sentry.fullname" . }}-snuba:{{ template "snuba.port" }} - {{- if .Values.sentry.existingSecret }} - - name: SENTRY_SECRET_KEY - valueFrom: - secretKeyRef: - name: {{ .Values.sentry.existingSecret }} - key: {{ default "key" .Values.sentry.existingSecretKey }} - {{- else }} - - name: SENTRY_SECRET_KEY - valueFrom: - secretKeyRef: - name: {{ template "sentry.fullname" . }}-sentry-secret - key: "key" - {{- end }} - {{- if .Values.postgresql.enabled }} - - name: POSTGRES_PASSWORD - valueFrom: - secretKeyRef: - name: {{ default (include "sentry.postgresql.fullname" .) .Values.postgresql.existingSecret }} - key: {{ default "postgresql-password" .Values.postgresql.existingSecretKey }} - {{- else if .Values.externalPostgresql.password }} - - name: POSTGRES_PASSWORD - value: {{ .Values.externalPostgresql.password | quote }} - {{- else if .Values.externalPostgresql.existingSecret }} - - name: POSTGRES_PASSWORD - valueFrom: - secretKeyRef: - name: {{ .Values.externalPostgresql.existingSecret }} - key: {{ default "postgresql-password" .Values.externalPostgresql.existingSecretKey }} - {{- end }} - {{ if and (eq .Values.filestore.backend "gcs") .Values.filestore.gcs.secretName }} - - name: GOOGLE_APPLICATION_CREDENTIALS - value: /var/run/secrets/google/{{ .Values.filestore.gcs.credentialsFile }} - {{ end }} +{{ include "sentry.env" . | indent 8 }} {{- if .Values.sentry.postProcessForwardErrors.env }} {{ toYaml .Values.sentry.postProcessForwardErrors.env | indent 8 }} {{- end }} diff --git a/sentry/templates/deployment-sentry-post-process-forwarder-transactions.yaml b/sentry/templates/deployment-sentry-post-process-forwarder-transactions.yaml index 4968f5132..1f1b8b8a7 100644 --- a/sentry/templates/deployment-sentry-post-process-forwarder-transactions.yaml +++ b/sentry/templates/deployment-sentry-post-process-forwarder-transactions.yaml @@ -84,41 +84,7 @@ spec: - "--synchronize-commit-group" - "transactions_group" env: - - name: SNUBA - value: http://{{ template "sentry.fullname" . }}-snuba:{{ template "snuba.port" }} - {{- if .Values.sentry.existingSecret }} - - name: SENTRY_SECRET_KEY - valueFrom: - secretKeyRef: - name: {{ .Values.sentry.existingSecret }} - key: {{ default "key" .Values.sentry.existingSecretKey }} - {{- else }} - - name: SENTRY_SECRET_KEY - valueFrom: - secretKeyRef: - name: {{ template "sentry.fullname" . }}-sentry-secret - key: "key" - {{- end }} - {{- if .Values.postgresql.enabled }} - - name: POSTGRES_PASSWORD - valueFrom: - secretKeyRef: - name: {{ default (include "sentry.postgresql.fullname" .) .Values.postgresql.existingSecret }} - key: {{ default "postgresql-password" .Values.postgresql.existingSecretKey }} - {{- else if .Values.externalPostgresql.password }} - - name: POSTGRES_PASSWORD - value: {{ .Values.externalPostgresql.password | quote }} - {{- else if .Values.externalPostgresql.existingSecret }} - - name: POSTGRES_PASSWORD - valueFrom: - secretKeyRef: - name: {{ .Values.externalPostgresql.existingSecret }} - key: {{ default "postgresql-password" .Values.externalPostgresql.existingSecretKey }} - {{- end }} - {{ if and (eq .Values.filestore.backend "gcs") .Values.filestore.gcs.secretName }} - - name: GOOGLE_APPLICATION_CREDENTIALS - value: /var/run/secrets/google/{{ .Values.filestore.gcs.credentialsFile }} - {{ end }} +{{ include "sentry.env" . | indent 8 }} {{- if .Values.sentry.postProcessForwardTransactions.env }} {{ toYaml .Values.sentry.postProcessForwardTransactions.env | indent 8 }} {{- end }} diff --git a/sentry/templates/deployment-sentry-subscription-consumer-events.yaml b/sentry/templates/deployment-sentry-subscription-consumer-events.yaml index b42f039ca..fb90e3cba 100644 --- a/sentry/templates/deployment-sentry-subscription-consumer-events.yaml +++ b/sentry/templates/deployment-sentry-subscription-consumer-events.yaml @@ -74,41 +74,7 @@ spec: - "--commit-batch-size" - "{{ default "1" .Values.sentry.subscriptionConsumerEvents.commitBatchSize }}" env: - - name: SNUBA - value: http://{{ template "sentry.fullname" . }}-snuba:{{ template "snuba.port" }} - {{- if .Values.sentry.existingSecret }} - - name: SENTRY_SECRET_KEY - valueFrom: - secretKeyRef: - name: {{ .Values.sentry.existingSecret }} - key: {{ default "key" .Values.sentry.existingSecretKey }} - {{- else }} - - name: SENTRY_SECRET_KEY - valueFrom: - secretKeyRef: - name: {{ template "sentry.fullname" . }}-sentry-secret - key: "key" - {{- end }} - {{- if .Values.postgresql.enabled }} - - name: POSTGRES_PASSWORD - valueFrom: - secretKeyRef: - name: {{ default (include "sentry.postgresql.fullname" .) .Values.postgresql.existingSecret }} - key: {{ default "postgresql-password" .Values.postgresql.existingSecretKey }} - {{- else if .Values.externalPostgresql.password }} - - name: POSTGRES_PASSWORD - value: {{ .Values.externalPostgresql.password | quote }} - {{- else if .Values.externalPostgresql.existingSecret }} - - name: POSTGRES_PASSWORD - valueFrom: - secretKeyRef: - name: {{ .Values.externalPostgresql.existingSecret }} - key: {{ default "postgresql-password" .Values.externalPostgresql.existingSecretKey }} - {{- end }} - {{ if and (eq .Values.filestore.backend "gcs") .Values.filestore.gcs.secretName }} - - name: GOOGLE_APPLICATION_CREDENTIALS - value: /var/run/secrets/google/{{ .Values.filestore.gcs.credentialsFile }} - {{ end }} +{{ include "sentry.env" . | indent 8 }} {{- if .Values.sentry.subscriptionConsumerEvents.env }} {{ toYaml .Values.sentry.subscriptionConsumerEvents.env | indent 8 }} {{- end }} diff --git a/sentry/templates/deployment-sentry-subscription-consumer-transactions.yaml b/sentry/templates/deployment-sentry-subscription-consumer-transactions.yaml index fa94ad070..612725869 100644 --- a/sentry/templates/deployment-sentry-subscription-consumer-transactions.yaml +++ b/sentry/templates/deployment-sentry-subscription-consumer-transactions.yaml @@ -74,41 +74,7 @@ spec: - "--commit-batch-size" - "{{ default "1" .Values.sentry.subscriptionConsumerEvents.commitBatchSize }}" env: - - name: SNUBA - value: http://{{ template "sentry.fullname" . }}-snuba:{{ template "snuba.port" }} - {{- if .Values.sentry.existingSecret }} - - name: SENTRY_SECRET_KEY - valueFrom: - secretKeyRef: - name: {{ .Values.sentry.existingSecret }} - key: {{ default "key" .Values.sentry.existingSecretKey }} - {{- else }} - - name: SENTRY_SECRET_KEY - valueFrom: - secretKeyRef: - name: {{ template "sentry.fullname" . }}-sentry-secret - key: "key" - {{- end }} - {{- if .Values.postgresql.enabled }} - - name: POSTGRES_PASSWORD - valueFrom: - secretKeyRef: - name: {{ default (include "sentry.postgresql.fullname" .) .Values.postgresql.existingSecret }} - key: {{ default "postgresql-password" .Values.postgresql.existingSecretKey }} - {{- else if .Values.externalPostgresql.password }} - - name: POSTGRES_PASSWORD - value: {{ .Values.externalPostgresql.password | quote }} - {{- else if .Values.externalPostgresql.existingSecret }} - - name: POSTGRES_PASSWORD - valueFrom: - secretKeyRef: - name: {{ .Values.externalPostgresql.existingSecret }} - key: {{ default "postgresql-password" .Values.externalPostgresql.existingSecretKey }} - {{- end }} - {{ if and (eq .Values.filestore.backend "gcs") .Values.filestore.gcs.secretName }} - - name: GOOGLE_APPLICATION_CREDENTIALS - value: /var/run/secrets/google/{{ .Values.filestore.gcs.credentialsFile }} - {{ end }} +{{ include "sentry.env" . | indent 8 }} {{- if .Values.sentry.subscriptionConsumerTransactions.env }} {{ toYaml .Values.sentry.subscriptionConsumerTransactions.env | indent 8 }} {{- end }} diff --git a/sentry/templates/deployment-sentry-web.yaml b/sentry/templates/deployment-sentry-web.yaml index 28b426354..20fe3f0de 100644 --- a/sentry/templates/deployment-sentry-web.yaml +++ b/sentry/templates/deployment-sentry-web.yaml @@ -71,41 +71,7 @@ spec: ports: - containerPort: {{ template "sentry.port" }} env: - - name: SNUBA - value: http://{{ template "sentry.fullname" . }}-snuba:{{ template "snuba.port" }} - {{- if .Values.sentry.existingSecret }} - - name: SENTRY_SECRET_KEY - valueFrom: - secretKeyRef: - name: {{ .Values.sentry.existingSecret }} - key: {{ default "key" .Values.sentry.existingSecretKey }} - {{- else }} - - name: SENTRY_SECRET_KEY - valueFrom: - secretKeyRef: - name: {{ template "sentry.fullname" . }}-sentry-secret - key: "key" - {{- end }} - {{- if .Values.postgresql.enabled }} - - name: POSTGRES_PASSWORD - valueFrom: - secretKeyRef: - name: {{ default (include "sentry.postgresql.fullname" .) .Values.postgresql.existingSecret }} - key: {{ default "postgresql-password" .Values.postgresql.existingSecretKey }} - {{- else if .Values.externalPostgresql.password }} - - name: POSTGRES_PASSWORD - value: {{ .Values.externalPostgresql.password | quote }} - {{- else if .Values.externalPostgresql.existingSecret }} - - name: POSTGRES_PASSWORD - valueFrom: - secretKeyRef: - name: {{ .Values.externalPostgresql.existingSecret }} - key: {{ default "postgresql-password" .Values.externalPostgresql.existingSecretKey }} - {{- end }} - {{ if and (eq .Values.filestore.backend "gcs") .Values.filestore.gcs.secretName }} - - name: GOOGLE_APPLICATION_CREDENTIALS - value: /var/run/secrets/google/{{ .Values.filestore.gcs.credentialsFile }} - {{ end }} +{{ include "sentry.env" . | indent 8 }} {{ if .Values.sentry.web.customCA }} - name: REQUESTS_CA_BUNDLE value: /etc/pki/ca-trust/custom/{{ default "ca.crt" .Values.sentry.web.customCA.item }} diff --git a/sentry/templates/deployment-sentry-worker.yaml b/sentry/templates/deployment-sentry-worker.yaml index f85a3dcbc..0f1895003 100644 --- a/sentry/templates/deployment-sentry-worker.yaml +++ b/sentry/templates/deployment-sentry-worker.yaml @@ -74,43 +74,9 @@ spec: - "{{ .Values.sentry.worker.concurrency }}" {{- end }} env: - - name: SNUBA - value: http://{{ template "sentry.fullname" . }}-snuba:{{ template "snuba.port" }} - {{- if .Values.sentry.existingSecret }} - - name: SENTRY_SECRET_KEY - valueFrom: - secretKeyRef: - name: {{ .Values.sentry.existingSecret }} - key: {{ default "key" .Values.sentry.existingSecretKey }} - {{- else }} - - name: SENTRY_SECRET_KEY - valueFrom: - secretKeyRef: - name: {{ template "sentry.fullname" . }}-sentry-secret - key: "key" - {{- end }} - name: C_FORCE_ROOT value: "true" - {{- if .Values.postgresql.enabled }} - - name: POSTGRES_PASSWORD - valueFrom: - secretKeyRef: - name: {{ default (include "sentry.postgresql.fullname" .) .Values.postgresql.existingSecret }} - key: {{ default "postgresql-password" .Values.postgresql.existingSecretKey }} - {{- else if .Values.externalPostgresql.password }} - - name: POSTGRES_PASSWORD - value: {{ .Values.externalPostgresql.password | quote }} - {{- else if .Values.externalPostgresql.existingSecret }} - - name: POSTGRES_PASSWORD - valueFrom: - secretKeyRef: - name: {{ .Values.externalPostgresql.existingSecret }} - key: {{ default "postgresql-password" .Values.externalPostgresql.existingSecretKey }} - {{- end }} - {{ if and (eq .Values.filestore.backend "gcs") .Values.filestore.gcs.secretName }} - - name: GOOGLE_APPLICATION_CREDENTIALS - value: /var/run/secrets/google/{{ .Values.filestore.gcs.credentialsFile }} - {{ end }} +{{ include "sentry.env" . | indent 8 }} {{- if .Values.sentry.worker.env }} {{ toYaml .Values.sentry.worker.env | indent 8 }} {{- end }} diff --git a/sentry/templates/hooks/sentry-db-init.job.yaml b/sentry/templates/hooks/sentry-db-init.job.yaml index 237aef0b3..081cfa795 100644 --- a/sentry/templates/hooks/sentry-db-init.job.yaml +++ b/sentry/templates/hooks/sentry-db-init.job.yaml @@ -73,35 +73,7 @@ spec: imagePullPolicy: {{ default "IfNotPresent" .Values.images.sentry.pullPolicy }} command: ["sentry","upgrade","--noinput"] env: - {{- if .Values.sentry.existingSecret }} - - name: SENTRY_SECRET_KEY - valueFrom: - secretKeyRef: - name: {{ .Values.sentry.existingSecret }} - key: {{ default "key" .Values.sentry.existingSecretKey }} - {{- else }} - - name: SENTRY_SECRET_KEY - valueFrom: - secretKeyRef: - name: {{ template "sentry.fullname" . }}-sentry-secret - key: "key" - {{- end }} - {{- if .Values.postgresql.enabled }} - - name: POSTGRES_PASSWORD - valueFrom: - secretKeyRef: - name: {{ default (include "sentry.postgresql.fullname" .) .Values.postgresql.existingSecret }} - key: {{ default "postgresql-password" .Values.postgresql.existingSecretKey }} - {{- else if .Values.externalPostgresql.password }} - - name: POSTGRES_PASSWORD - value: {{ .Values.externalPostgresql.password | quote }} - {{- else if .Values.externalPostgresql.existingSecret }} - - name: POSTGRES_PASSWORD - valueFrom: - secretKeyRef: - name: {{ .Values.externalPostgresql.existingSecret }} - key: {{ default "postgresql-password" .Values.externalPostgresql.existingSecretKey }} - {{- end }} +{{ include "sentry.env" . | indent 8 }} {{- if .Values.hooks.dbInit.env }} {{ toYaml .Values.hooks.dbInit.env | indent 8 }} {{- end }} diff --git a/sentry/templates/hooks/user-create.yaml b/sentry/templates/hooks/user-create.yaml index 3d4afc0da..7fa3156f6 100644 --- a/sentry/templates/hooks/user-create.yaml +++ b/sentry/templates/hooks/user-create.yaml @@ -74,19 +74,7 @@ spec: exit 1; \ fi env: - {{- if .Values.sentry.existingSecret }} - - name: SENTRY_SECRET_KEY - valueFrom: - secretKeyRef: - name: {{ .Values.sentry.existingSecret }} - key: {{ default "key" .Values.sentry.existingSecretKey }} - {{- else }} - - name: SENTRY_SECRET_KEY - valueFrom: - secretKeyRef: - name: {{ template "sentry.fullname" . }}-sentry-secret - key: "key" - {{- end }} +{{ include "sentry.env" . | indent 8 }} {{- if .Values.user.existingSecret }} - name: ADMIN_PASSWORD valueFrom: @@ -96,22 +84,6 @@ spec: {{- else if .Values.user.password }} - name: ADMIN_PASSWORD value: {{ .Values.user.password | quote }} - {{- end }} - {{- if .Values.postgresql.enabled }} - - name: POSTGRES_PASSWORD - valueFrom: - secretKeyRef: - name: {{ default (include "sentry.postgresql.fullname" .) .Values.postgresql.existingSecret }} - key: {{ default "postgresql-password" .Values.postgresql.existingSecretKey }} - {{- else if .Values.externalPostgresql.password }} - - name: POSTGRES_PASSWORD - value: {{ .Values.externalPostgresql.password | quote }} - {{- else if .Values.externalPostgresql.existingSecret }} - - name: POSTGRES_PASSWORD - valueFrom: - secretKeyRef: - name: {{ .Values.externalPostgresql.existingSecret }} - key: {{ default "postgresql-password" .Values.externalPostgresql.existingSecretKey }} {{- end }} {{- if .Values.hooks.dbInit.env }} {{ toYaml .Values.hooks.dbInit.env | indent 8 }} diff --git a/sentry/templates/secret-snuba-env.yaml b/sentry/templates/secret-snuba-env.yaml index 444372e63..b9d08e1b9 100644 --- a/sentry/templates/secret-snuba-env.yaml +++ b/sentry/templates/secret-snuba-env.yaml @@ -12,4 +12,6 @@ data: CLICKHOUSE_PORT: {{ include "sentry.clickhouse.port" . | b64enc | quote }} CLICKHOUSE_DATABASE: {{ include "sentry.clickhouse.database" . | b64enc | quote }} CLICKHOUSE_USER: {{ include "sentry.clickhouse.username" . | b64enc | quote }} +{{- if not .Values.externalClickhouse.existingSecret }} CLICKHOUSE_PASSWORD: {{ include "sentry.clickhouse.password" . | b64enc | quote }} +{{- end }} \ No newline at end of file diff --git a/sentry/values.yaml b/sentry/values.yaml index 45da4699c..b24a71f95 100644 --- a/sentry/values.yaml +++ b/sentry/values.yaml @@ -768,6 +768,9 @@ externalClickhouse: password: "" database: default singleNode: true + # existingSecret: secret-name + ## set existingSecretKey if key name inside existingSecret is different from 'postgres-password' + # existingSecretKey: secret-key-name ## Cluster name, can be found in config ## (https://clickhouse.tech/docs/en/operations/server-configuration-parameters/settings/#server-settings-remote-servers) ## or by executing `select * from system.clusters` From 9520f5d49c0fc87aa1014af85be42ae8f9ae4ede Mon Sep 17 00:00:00 2001 From: Robing Date: Wed, 2 Nov 2022 13:19:06 +0800 Subject: [PATCH 028/394] Update configmap-sentry.yaml (#771) --- sentry/Chart.yaml | 2 +- sentry/templates/configmap-sentry.yaml | 7 +++++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/sentry/Chart.yaml b/sentry/Chart.yaml index e48773173..04b6b116d 100644 --- a/sentry/Chart.yaml +++ b/sentry/Chart.yaml @@ -2,7 +2,7 @@ apiVersion: v2 name: sentry description: A Helm chart for Kubernetes type: application -version: 17.1.0 +version: 17.2.0 appVersion: 22.10.0 dependencies: - name: memcached diff --git a/sentry/templates/configmap-sentry.yaml b/sentry/templates/configmap-sentry.yaml index 771094bd8..29849a2d8 100644 --- a/sentry/templates/configmap-sentry.yaml +++ b/sentry/templates/configmap-sentry.yaml @@ -118,6 +118,13 @@ data: {{- if .Values.filestore.s3.default_acl }} default_acl: {{ .Values.filestore.s3.default_acl | quote }} {{- end }} + #add comfig params for s3 + {{- if .Values.filestore.s3.addressing_style }} + addressing_style: {{ .Values.filestore.s3.addressing_style | quote }} + {{- end }} + {{- if .Values.filestore.s3.location }} + location: {{ .Values.filestore.s3.location | quote }} + {{- end }} {{ end }} {{- if .Values.config.configYml }} From 92c446da496e3ef83064b21ee2106868a04649bd Mon Sep 17 00:00:00 2001 From: Agalin <6164461+Agalin@users.noreply.github.com> Date: Wed, 2 Nov 2022 09:22:07 +0100 Subject: [PATCH 029/394] Custom relay args (#768) Co-authored-by: Szymon Soloch --- sentry/Chart.yaml | 2 +- sentry/templates/deployment-relay.yaml | 7 +++++++ sentry/values.yaml | 2 ++ 3 files changed, 10 insertions(+), 1 deletion(-) diff --git a/sentry/Chart.yaml b/sentry/Chart.yaml index 04b6b116d..ea5372210 100644 --- a/sentry/Chart.yaml +++ b/sentry/Chart.yaml @@ -2,7 +2,7 @@ apiVersion: v2 name: sentry description: A Helm chart for Kubernetes type: application -version: 17.2.0 +version: 17.3.0 appVersion: 22.10.0 dependencies: - name: memcached diff --git a/sentry/templates/deployment-relay.yaml b/sentry/templates/deployment-relay.yaml index d4974162b..622efd895 100644 --- a/sentry/templates/deployment-relay.yaml +++ b/sentry/templates/deployment-relay.yaml @@ -69,6 +69,9 @@ spec: args: - "credentials" - "generate" +{{- if .Values.relay.init.additionalArgs }} +{{ toYaml .Values.relay.init.additionalArgs | indent 12 }} +{{- end }} resources: {{ toYaml .Values.relay.init.resources | indent 12 }} env: @@ -93,6 +96,10 @@ spec: {{- end }} containers: - name: {{ .Chart.Name }}-relay +{{- if .Values.relay.args }} + args: +{{ toYaml .Values.relay.args | indent 10 }} +{{- end }} image: "{{ template "relay.image" . }}" imagePullPolicy: {{ default "IfNotPresent" .Values.images.sentry.pullPolicy }} ports: diff --git a/sentry/values.yaml b/sentry/values.yaml index b24a71f95..19a30b09b 100644 --- a/sentry/values.yaml +++ b/sentry/values.yaml @@ -51,6 +51,7 @@ serviceAccount: relay: replicas: 1 + # args: [] mode: managed env: [] probeFailureThreshold: 5 @@ -76,6 +77,7 @@ relay: volumes: [] init: resources: {} + # additionalArgs: [] # env: [] geodata: From d9f2f00eac8fb9de98f4fdd49d18f4f9f556d78c Mon Sep 17 00:00:00 2001 From: Daniel McAssey Date: Wed, 2 Nov 2022 09:26:38 +0000 Subject: [PATCH 030/394] Add ability to use a secret for the mail password (#770) --- sentry/Chart.yaml | 2 +- sentry/templates/_helper.tpl | 10 ++++++++++ sentry/templates/configmap-sentry.yaml | 2 +- sentry/values.yaml | 3 +++ 4 files changed, 15 insertions(+), 2 deletions(-) diff --git a/sentry/Chart.yaml b/sentry/Chart.yaml index ea5372210..b64073ce2 100644 --- a/sentry/Chart.yaml +++ b/sentry/Chart.yaml @@ -2,7 +2,7 @@ apiVersion: v2 name: sentry description: A Helm chart for Kubernetes type: application -version: 17.3.0 +version: 17.4.0 appVersion: 22.10.0 dependencies: - name: memcached diff --git a/sentry/templates/_helper.tpl b/sentry/templates/_helper.tpl index 14c10f2fd..684d00b84 100644 --- a/sentry/templates/_helper.tpl +++ b/sentry/templates/_helper.tpl @@ -484,4 +484,14 @@ Common Sentry environment variables - name: GOOGLE_APPLICATION_CREDENTIALS value: /var/run/secrets/google/{{ .Values.filestore.gcs.credentialsFile }} {{- end }} +{{- if .Values.mail.password }} +- name: SENTRY_EMAIL_PASSWORD + value: {{ .Values.mail.password | quote }} +{{- else if .Values.mail.existingSecret }} +- name: SENTRY_EMAIL_PASSWORD + valueFrom: + secretKeyRef: + name: {{ .Values.mail.existingSecret }} + key: {{ default "mail-password" .Values.mail.existingSecretKey }} +{{- end }} {{- end -}} \ No newline at end of file diff --git a/sentry/templates/configmap-sentry.yaml b/sentry/templates/configmap-sentry.yaml index 29849a2d8..af7cf5c88 100644 --- a/sentry/templates/configmap-sentry.yaml +++ b/sentry/templates/configmap-sentry.yaml @@ -446,7 +446,7 @@ data: SENTRY_OPTIONS['mail.use-tls'] = bool(strtobool(os.getenv("SENTRY_EMAIL_USE_TLS", {{ .Values.mail.useTls | quote }}))) SENTRY_OPTIONS['mail.use-ssl'] = bool(strtobool(os.getenv("SENTRY_EMAIL_USE_SSL", {{ .Values.mail.useSsl | quote }}))) SENTRY_OPTIONS['mail.username'] = os.getenv("SENTRY_EMAIL_USERNAME", {{ .Values.mail.username | quote }}) - SENTRY_OPTIONS['mail.password'] = os.getenv("SENTRY_EMAIL_PASSWORD", {{ .Values.mail.password | quote }}) + SENTRY_OPTIONS['mail.password'] = os.getenv("SENTRY_EMAIL_PASSWORD", "") SENTRY_OPTIONS['mail.port'] = int(os.getenv("SENTRY_EMAIL_PORT", {{ .Values.mail.port | quote }})) SENTRY_OPTIONS['mail.host'] = os.getenv("SENTRY_EMAIL_HOST", {{ .Values.mail.host | quote }}) SENTRY_OPTIONS['mail.from'] = os.getenv("SENTRY_EMAIL_FROM", {{ .Values.mail.from | quote }}) diff --git a/sentry/values.yaml b/sentry/values.yaml index 19a30b09b..9c02339c8 100644 --- a/sentry/values.yaml +++ b/sentry/values.yaml @@ -525,6 +525,9 @@ mail: useSsl: false username: "" password: "" + # existingSecret: secret-name + ## set existingSecretKey if key name inside existingSecret is different from 'mail-password' + # existingSecretKey: secret-key-name port: 25 host: "" from: "" From 25bd8e2ccd7723726cea0c6cb4c72ecb28a83d44 Mon Sep 17 00:00:00 2001 From: Agalin <6164461+Agalin@users.noreply.github.com> Date: Wed, 2 Nov 2022 16:35:37 +0100 Subject: [PATCH 031/394] Support custom volume mounts everywhere (#702) --- clickhouse/Chart.yaml | 2 +- clickhouse/templates/deployment-tabix.yaml | 8 ++++ .../statefulset-clickhouse-replica.yaml | 10 +++++ .../templates/statefulset-clickhouse.yaml | 12 +++++- clickhouse/values.yaml | 12 ++++++ sentry/Chart.yaml | 2 +- sentry/templates/cronjob-sentry-cleanup.yaml | 3 ++ .../cronjob-snuba-cleanup-errors.yaml | 11 +++-- .../cronjob-snuba-cleanup-transactions.yaml | 11 +++-- sentry/templates/deployment-metrics.yaml | 9 ++++ sentry/templates/deployment-relay.yaml | 6 +++ sentry/templates/deployment-sentry-cron.yaml | 3 ++ ...-sentry-post-process-forwarder-errors.yaml | 3 ++ ...y-post-process-forwarder-transactions.yaml | 3 ++ ...t-sentry-subscription-consumer-events.yaml | 3 ++ ...ry-subscription-consumer-transactions.yaml | 3 ++ sentry/templates/deployment-sentry-web.yaml | 3 ++ .../templates/deployment-sentry-worker.yaml | 3 ++ sentry/templates/deployment-snuba-api.yaml | 3 ++ .../templates/deployment-snuba-replacer.yaml | 12 ++++-- ...nt-snuba-subscription-consumer-events.yaml | 12 ++++-- ...ba-subscription-consumer-transactions.yaml | 12 ++++-- sentry/templates/deployment-symbolicator.yaml | 6 +++ .../templates/hooks/sentry-db-check.job.yaml | 8 ++++ .../templates/hooks/sentry-db-init.job.yaml | 3 ++ sentry/templates/hooks/snuba-db-init.job.yaml | 12 ++++-- sentry/templates/hooks/snuba-migrate.job.yaml | 12 ++++-- sentry/templates/hooks/user-create.yaml | 6 +++ sentry/values.yaml | 41 ++++++++++++++++++- 29 files changed, 207 insertions(+), 27 deletions(-) diff --git a/clickhouse/Chart.yaml b/clickhouse/Chart.yaml index ad2fc8f51..3b80b2103 100755 --- a/clickhouse/Chart.yaml +++ b/clickhouse/Chart.yaml @@ -11,6 +11,6 @@ keywords: name: clickhouse sources: - https://github.com/sentry-kubernetes/charts -version: 3.1.3 +version: 3.2.0 maintainers: - name: sentry-kubernetes diff --git a/clickhouse/templates/deployment-tabix.yaml b/clickhouse/templates/deployment-tabix.yaml index 697de913f..c5259da7a 100755 --- a/clickhouse/templates/deployment-tabix.yaml +++ b/clickhouse/templates/deployment-tabix.yaml @@ -58,6 +58,10 @@ spec: ports: - name: http containerPort: 80 +{{- if .Values.tabix.volumeMounts }} + volumeMounts: +{{ toYaml .Values.tabix.volumeMounts | indent 8 }} +{{- end }} env: {{- if .Values.tabix.security }} - name: USER @@ -101,6 +105,10 @@ spec: resources: {{ toYaml .Values.tabix.resources | indent 10 }} {{- end }} +{{- if .Values.tabix.volumes }} + volumes: +{{ toYaml .Values.tabix.volumes | indent 6 }} +{{- end }} {{- if .Values.serviceAccount.enabled }} serviceAccountName: {{ .Values.serviceAccount.name }}-tabix {{- end }} diff --git a/clickhouse/templates/statefulset-clickhouse-replica.yaml b/clickhouse/templates/statefulset-clickhouse-replica.yaml index c0f7ec69d..2a7a7fc7c 100755 --- a/clickhouse/templates/statefulset-clickhouse-replica.yaml +++ b/clickhouse/templates/statefulset-clickhouse-replica.yaml @@ -128,6 +128,9 @@ spec: mountPath: /etc/clickhouse-server/metrica.d - name: {{ include "clickhouse.fullname" . }}-users mountPath: /etc/clickhouse-server/users.d +{{- if .Values.clickhouse.volumeMounts }} +{{ toYaml .Values.clickhouse.volumeMounts | indent 8 }} +{{- end }} {{- with .Values.clickhouse.securityContext }} securityContext: {{- toYaml . | nindent 10 }} @@ -141,6 +144,10 @@ spec: containerPort: {{ .Values.clickhouse.metrics.image.port }} protocol: TCP {{- if .Values.clickhouse.metrics.resources }} +{{- if .Values.clickhouse.metrics.volumeMounts }} + volumeMounts: +{{ toYaml .Values.clickhouse.metrics.volumeMounts | indent 8 }} +{{- end }} resources: {{- toYaml .Values.clickhouse.metrics.resources | nindent 8 }} {{- end }} {{- end }} @@ -183,6 +190,9 @@ spec: - key: users.xml path: users.xml {{- end }} +{{- if .Values.clickhouse.volumes }} +{{ toYaml .Values.clickhouse.volumes | indent 6 }} +{{- end }} {{- if .Values.serviceAccount.enabled }} serviceAccountName: {{ .Values.serviceAccount.name }}-replica {{- end }} diff --git a/clickhouse/templates/statefulset-clickhouse.yaml b/clickhouse/templates/statefulset-clickhouse.yaml index 9bc69c64b..3e84b8884 100755 --- a/clickhouse/templates/statefulset-clickhouse.yaml +++ b/clickhouse/templates/statefulset-clickhouse.yaml @@ -127,6 +127,9 @@ spec: mountPath: /etc/clickhouse-server/metrica.d - name: {{ include "clickhouse.fullname" . }}-users mountPath: /etc/clickhouse-server/users.d +{{- if .Values.clickhouse.volumeMounts }} +{{ toYaml .Values.clickhouse.volumeMounts | indent 8 }} +{{- end }} {{- with .Values.clickhouse.securityContext }} securityContext: {{- toYaml . | nindent 10 }} @@ -139,8 +142,12 @@ spec: - name: metrics containerPort: {{ .Values.clickhouse.metrics.image.port }} protocol: TCP +{{- if .Values.clickhouse.metrics.volumeMounts }} + volumeMounts: +{{ toYaml .Values.clickhouse.metrics.volumeMounts | indent 8 }} +{{- end }} {{- if .Values.clickhouse.metrics.resources }} - resources: {{- toYaml .Values.clickhouse.metrics.resources | nindent 8 }} + resources: {{- toYaml .Values.clickhouse.metrics.resources | nindent 10 }} {{- end }} {{- end }} {{- if .Values.clickhouse.nodeSelector }} @@ -182,6 +189,9 @@ spec: - key: users.xml path: users.xml {{- end }} +{{- if .Values.clickhouse.volumes }} +{{ toYaml .Values.clickhouse.volumes | indent 6 }} +{{- end }} {{- if .Values.serviceAccount.enabled }} serviceAccountName: {{ .Values.serviceAccount.name }} {{- end }} diff --git a/clickhouse/values.yaml b/clickhouse/values.yaml index a77baccd2..3ae2043ea 100755 --- a/clickhouse/values.yaml +++ b/clickhouse/values.yaml @@ -56,6 +56,10 @@ clickhouse: # Security Context securityContext: {} + ## Additional Volumes + # volumes: [] + # volumeMounts: [] + ## Prometheus Exporter / Metrics ## metrics: @@ -70,6 +74,10 @@ clickhouse: ## Metrics exporter resource requests and limits # resources: {} + ## Additional Volumes + # volumes: [] + # volumeMounts: [] + ## Metrics exporter pod Annotation and Labels podAnnotations: prometheus.io/scrape: "true" @@ -460,3 +468,7 @@ tabix: ## Additional Labels podLabels: + + ## Additional Volumes + # volumes: [] + # volumeMounts: [] diff --git a/sentry/Chart.yaml b/sentry/Chart.yaml index b64073ce2..bd654c65d 100644 --- a/sentry/Chart.yaml +++ b/sentry/Chart.yaml @@ -2,7 +2,7 @@ apiVersion: v2 name: sentry description: A Helm chart for Kubernetes type: application -version: 17.4.0 +version: 17.5.0 appVersion: 22.10.0 dependencies: - name: memcached diff --git a/sentry/templates/cronjob-sentry-cleanup.yaml b/sentry/templates/cronjob-sentry-cleanup.yaml index 6db23fee1..33b0a894b 100644 --- a/sentry/templates/cronjob-sentry-cleanup.yaml +++ b/sentry/templates/cronjob-sentry-cleanup.yaml @@ -88,6 +88,9 @@ spec: - name: sentry-google-cloud-key mountPath: /var/run/secrets/google {{ end }} +{{- if .Values.sentry.cleanup.volumeMounts }} +{{ toYaml .Values.sentry.cleanup.volumeMounts | indent 12 }} +{{- end }} resources: {{ toYaml .Values.sentry.cleanup.resources | indent 14 }} {{- if .Values.sentry.cleanup.sidecars }} diff --git a/sentry/templates/cronjob-snuba-cleanup-errors.yaml b/sentry/templates/cronjob-snuba-cleanup-errors.yaml index f5595f160..f33178403 100644 --- a/sentry/templates/cronjob-snuba-cleanup-errors.yaml +++ b/sentry/templates/cronjob-snuba-cleanup-errors.yaml @@ -85,9 +85,12 @@ spec: - secretRef: name: {{ template "sentry.fullname" . }}-snuba-env volumeMounts: - - mountPath: /etc/snuba - name: config - readOnly: true + - mountPath: /etc/snuba + name: config + readOnly: true +{{- if .Values.snuba.cleanupErrors.volumeMounts }} +{{ toYaml .Values.snuba.cleanupErrors.volumeMounts | indent 14 }} +{{- end }} resources: {{ toYaml .Values.snuba.cleanupErrors.resources | indent 14 }} {{- if .Values.snuba.cleanupErrors.sidecars }} @@ -99,7 +102,7 @@ spec: configMap: name: {{ template "sentry.fullname" . }}-snuba {{- if .Values.snuba.cleanupErrors.volumes }} -{{ toYaml .Values.snuba.cleanupErrors.volumes | indent 10 }} +{{ toYaml .Values.snuba.cleanupErrors.volumes | indent 12 }} {{- end }} {{- if .Values.snuba.cleanupErrors.priorityClassName }} priorityClassName: "{{ .Values.snuba.cleanupErrors.priorityClassName }}" diff --git a/sentry/templates/cronjob-snuba-cleanup-transactions.yaml b/sentry/templates/cronjob-snuba-cleanup-transactions.yaml index 5fa331e6b..4fe489965 100644 --- a/sentry/templates/cronjob-snuba-cleanup-transactions.yaml +++ b/sentry/templates/cronjob-snuba-cleanup-transactions.yaml @@ -85,9 +85,12 @@ spec: - secretRef: name: {{ template "sentry.fullname" . }}-snuba-env volumeMounts: - - mountPath: /etc/snuba - name: config - readOnly: true + - mountPath: /etc/snuba + name: config + readOnly: true +{{- if .Values.snuba.cleanupTransactions.volumeMounts }} +{{ toYaml .Values.snuba.cleanupTransactions.volumeMounts | indent 14 }} +{{- end }} resources: {{ toYaml .Values.snuba.cleanupTransactions.resources | indent 14 }} {{- if .Values.snuba.cleanupTransactions.sidecars }} @@ -99,7 +102,7 @@ spec: configMap: name: {{ template "sentry.fullname" . }}-snuba {{- if .Values.snuba.cleanupTransactions.volumes }} -{{ toYaml .Values.snuba.cleanupTransactions.volumes | indent 10 }} +{{ toYaml .Values.snuba.cleanupTransactions.volumes | indent 12 }} {{- end }} {{- if .Values.snuba.cleanupTransactions.priorityClassName }} priorityClassName: "{{ .Values.snuba.cleanupTransactions.priorityClassName }}" diff --git a/sentry/templates/deployment-metrics.yaml b/sentry/templates/deployment-metrics.yaml index f6b1af584..d97fbdd60 100644 --- a/sentry/templates/deployment-metrics.yaml +++ b/sentry/templates/deployment-metrics.yaml @@ -68,6 +68,10 @@ spec: containerPort: 9125 - name: metrics containerPort: 9102 +{{- if .Values.metrics.volumeMounts }} + volumeMounts: +{{ toYaml .Values.metrics.volumeMounts | indent 8 }} +{{- end }} {{- if .Values.metrics.livenessProbe.enabled }} livenessProbe: httpGet: @@ -94,6 +98,11 @@ spec: {{- end }} resources: {{ toYaml .Values.metrics.resources | indent 10 }} +{{- if .Values.metrics.volumes }} + volumes: +{{ toYaml .Values.metrics.volumes | indent 6 }} +{{- end }} + {{- if .Values.serviceAccount.enabled }} serviceAccountName: {{ .Values.serviceAccount.name }}-metrics {{- end }} diff --git a/sentry/templates/deployment-relay.yaml b/sentry/templates/deployment-relay.yaml index 622efd895..16e0c25c4 100644 --- a/sentry/templates/deployment-relay.yaml +++ b/sentry/templates/deployment-relay.yaml @@ -87,6 +87,9 @@ spec: mountPath: /work/.relay/config.yml subPath: config.yml readOnly: true +{{- if .Values.relay.init.volumeMounts }} +{{ toYaml .Values.relay.volumeMounts | indent 12 }} +{{- end }} {{- if .Values.dnsPolicy }} dnsPolicy: {{ .Values.dnsPolicy | quote }} {{- end }} @@ -121,6 +124,9 @@ spec: - name: {{ .Values.geodata.volumeName }} mountPath: {{ .Values.geodata.mountPath }} {{- end }} +{{- if .Values.relay.volumeMounts }} +{{ toYaml .Values.relay.volumeMounts | indent 10 }} +{{- end }} livenessProbe: failureThreshold: {{ .Values.relay.probeFailureThreshold }} httpGet: diff --git a/sentry/templates/deployment-sentry-cron.yaml b/sentry/templates/deployment-sentry-cron.yaml index ece85d764..bd85f1041 100644 --- a/sentry/templates/deployment-sentry-cron.yaml +++ b/sentry/templates/deployment-sentry-cron.yaml @@ -84,6 +84,9 @@ spec: - name: sentry-google-cloud-key mountPath: /var/run/secrets/google {{ end }} +{{- if .Values.sentry.cron.volumeMounts }} +{{ toYaml .Values.sentry.cron.volumeMounts | indent 8 }} +{{- end }} resources: {{ toYaml .Values.sentry.cron.resources | indent 12 }} {{- if .Values.sentry.cron.sidecars }} diff --git a/sentry/templates/deployment-sentry-post-process-forwarder-errors.yaml b/sentry/templates/deployment-sentry-post-process-forwarder-errors.yaml index dd768a770..9670e8714 100644 --- a/sentry/templates/deployment-sentry-post-process-forwarder-errors.yaml +++ b/sentry/templates/deployment-sentry-post-process-forwarder-errors.yaml @@ -95,6 +95,9 @@ spec: - name: sentry-google-cloud-key mountPath: /var/run/secrets/google {{ end }} +{{- if .Values.sentry.postProcessForwardErrors.volumeMounts }} +{{ toYaml .Values.sentry.postProcessForwardErrors.volumeMounts | indent 8 }} +{{- end }} resources: {{ toYaml .Values.sentry.postProcessForwardErrors.resources | indent 12 }} {{- if .Values.sentry.postProcessForwardErrors.sidecars }} diff --git a/sentry/templates/deployment-sentry-post-process-forwarder-transactions.yaml b/sentry/templates/deployment-sentry-post-process-forwarder-transactions.yaml index 1f1b8b8a7..9edb1c7a8 100644 --- a/sentry/templates/deployment-sentry-post-process-forwarder-transactions.yaml +++ b/sentry/templates/deployment-sentry-post-process-forwarder-transactions.yaml @@ -98,6 +98,9 @@ spec: - name: sentry-google-cloud-key mountPath: /var/run/secrets/google {{ end }} +{{- if .Values.sentry.postProcessForwardTransactions.volumeMounts }} +{{ toYaml .Values.sentry.postProcessForwardTransactions.volumeMounts | indent 8 }} +{{- end }} resources: {{ toYaml .Values.sentry.postProcessForwardTransactions.resources | indent 12 }} {{- if .Values.sentry.postProcessForwardTransactions.sidecars }} diff --git a/sentry/templates/deployment-sentry-subscription-consumer-events.yaml b/sentry/templates/deployment-sentry-subscription-consumer-events.yaml index fb90e3cba..b98c77d06 100644 --- a/sentry/templates/deployment-sentry-subscription-consumer-events.yaml +++ b/sentry/templates/deployment-sentry-subscription-consumer-events.yaml @@ -88,6 +88,9 @@ spec: - name: sentry-google-cloud-key mountPath: /var/run/secrets/google {{ end }} +{{- if .Values.sentry.subscriptionConsumerEvents.volumeMounts }} +{{ toYaml .Values.sentry.subscriptionConsumerEvents.volumeMounts | indent 8 }} +{{- end }} resources: {{ toYaml .Values.sentry.subscriptionConsumerEvents.resources | indent 12 }} {{- if .Values.sentry.subscriptionConsumerEvents.sidecars }} diff --git a/sentry/templates/deployment-sentry-subscription-consumer-transactions.yaml b/sentry/templates/deployment-sentry-subscription-consumer-transactions.yaml index 612725869..45af3caee 100644 --- a/sentry/templates/deployment-sentry-subscription-consumer-transactions.yaml +++ b/sentry/templates/deployment-sentry-subscription-consumer-transactions.yaml @@ -88,6 +88,9 @@ spec: - name: sentry-google-cloud-key mountPath: /var/run/secrets/google {{ end }} +{{- if .Values.sentry.subscriptionConsumerTransactions.volumeMounts }} +{{ toYaml .Values.sentry.subscriptionConsumerTransactions.volumeMounts | indent 8 }} +{{- end }} resources: {{ toYaml .Values.sentry.subscriptionConsumerTransactions.resources | indent 12 }} {{- if .Values.sentry.subscriptionConsumerTransactions.sidecars }} diff --git a/sentry/templates/deployment-sentry-web.yaml b/sentry/templates/deployment-sentry-web.yaml index 20fe3f0de..5b656876e 100644 --- a/sentry/templates/deployment-sentry-web.yaml +++ b/sentry/templates/deployment-sentry-web.yaml @@ -97,6 +97,9 @@ spec: - name: custom-ca mountPath: /etc/pki/ca-trust/custom {{ end }} +{{- if .Values.sentry.web.volumeMounts }} +{{ toYaml .Values.sentry.web.volumeMounts | indent 8 }} +{{- end }} livenessProbe: failureThreshold: {{ .Values.sentry.web.probeFailureThreshold }} httpGet: diff --git a/sentry/templates/deployment-sentry-worker.yaml b/sentry/templates/deployment-sentry-worker.yaml index 0f1895003..ec7d027f6 100644 --- a/sentry/templates/deployment-sentry-worker.yaml +++ b/sentry/templates/deployment-sentry-worker.yaml @@ -94,6 +94,9 @@ spec: - name: sentry-google-cloud-key mountPath: /var/run/secrets/google {{ end }} +{{- if .Values.sentry.worker.volumeMounts }} +{{ toYaml .Values.sentry.worker.volumeMounts | indent 8 }} +{{- end }} {{- if .Values.sentry.worker.livenessProbe.enabled }} livenessProbe: periodSeconds: {{ .Values.sentry.worker.livenessProbe.periodSeconds }} diff --git a/sentry/templates/deployment-snuba-api.yaml b/sentry/templates/deployment-snuba-api.yaml index 948509dfa..7655e199a 100644 --- a/sentry/templates/deployment-snuba-api.yaml +++ b/sentry/templates/deployment-snuba-api.yaml @@ -82,6 +82,9 @@ spec: - mountPath: /etc/snuba name: config readOnly: true +{{- if .Values.snuba.api.volumeMounts }} +{{ toYaml .Values.snuba.api.volumeMounts | indent 8 }} +{{- end }} livenessProbe: failureThreshold: 5 httpGet: diff --git a/sentry/templates/deployment-snuba-replacer.yaml b/sentry/templates/deployment-snuba-replacer.yaml index bf5fdd939..ba4e3609a 100644 --- a/sentry/templates/deployment-snuba-replacer.yaml +++ b/sentry/templates/deployment-snuba-replacer.yaml @@ -106,12 +106,18 @@ spec: - mountPath: /etc/snuba name: config readOnly: true +{{- if .Values.snuba.replacer.volumeMounts }} +{{ toYaml .Values.snuba.replacer.volumeMounts | indent 8 }} +{{- end }} resources: {{ toYaml .Values.snuba.replacer.resources | indent 12 }} {{- if .Values.serviceAccount.enabled }} serviceAccountName: {{ .Values.serviceAccount.name }}-snuba {{- end }} volumes: - - name: config - configMap: - name: {{ template "sentry.fullname" . }}-snuba + - name: config + configMap: + name: {{ template "sentry.fullname" . }}-snuba +{{- if .Values.snuba.replacer.volumes }} +{{ toYaml .Values.snuba.replacer.volumes | indent 6 }} +{{- end }} diff --git a/sentry/templates/deployment-snuba-subscription-consumer-events.yaml b/sentry/templates/deployment-snuba-subscription-consumer-events.yaml index 0c21d0cbc..494eabece 100644 --- a/sentry/templates/deployment-snuba-subscription-consumer-events.yaml +++ b/sentry/templates/deployment-snuba-subscription-consumer-events.yaml @@ -92,12 +92,18 @@ spec: - mountPath: /etc/snuba name: config readOnly: true +{{- if .Values.snuba.subscriptionConsumerEvents.volumeMounts }} +{{ toYaml .Values.snuba.subscriptionConsumerEvents.volumeMounts | indent 8 }} +{{- end }} resources: {{ toYaml .Values.snuba.subscriptionConsumerEvents.resources | indent 12 }} {{- if .Values.serviceAccount.enabled }} serviceAccountName: {{ .Values.serviceAccount.name }}-snuba {{- end }} volumes: - - name: config - configMap: - name: {{ template "sentry.fullname" . }}-snuba + - name: config + configMap: + name: {{ template "sentry.fullname" . }}-snuba +{{- if .Values.snuba.subscriptionConsumerEvents.volumes }} +{{ toYaml .Values.snuba.subscriptionConsumerEvents.volumes | indent 6 }} +{{- end }} diff --git a/sentry/templates/deployment-snuba-subscription-consumer-transactions.yaml b/sentry/templates/deployment-snuba-subscription-consumer-transactions.yaml index 1982988ea..828da0a03 100644 --- a/sentry/templates/deployment-snuba-subscription-consumer-transactions.yaml +++ b/sentry/templates/deployment-snuba-subscription-consumer-transactions.yaml @@ -92,12 +92,18 @@ spec: - mountPath: /etc/snuba name: config readOnly: true +{{- if .Values.snuba.subscriptionConsumerTransactions.volumeMounts }} +{{ toYaml .Values.snuba.subscriptionConsumerTransactions.volumeMounts | indent 8 }} +{{- end }} resources: {{ toYaml .Values.snuba.subscriptionConsumerTransactions.resources | indent 12 }} {{- if .Values.serviceAccount.enabled }} serviceAccountName: {{ .Values.serviceAccount.name }}-snuba {{- end }} volumes: - - name: config - configMap: - name: {{ template "sentry.fullname" . }}-snuba + - name: config + configMap: + name: {{ template "sentry.fullname" . }}-snuba +{{- if .Values.snuba.subscriptionConsumerTransactions.volumes }} +{{ toYaml .Values.snuba.subscriptionConsumerTransactions.volumes | indent 6 }} +{{- end }} diff --git a/sentry/templates/deployment-symbolicator.yaml b/sentry/templates/deployment-symbolicator.yaml index 5f57c2399..74c92a17b 100644 --- a/sentry/templates/deployment-symbolicator.yaml +++ b/sentry/templates/deployment-symbolicator.yaml @@ -85,6 +85,9 @@ spec: - name: sentry-google-cloud-key mountPath: /var/run/secrets/google {{ end }} +{{- if .Values.symbolicator.api.volumeMounts }} +{{ toYaml .Values.symbolicator.api.volumeMounts | indent 8 }} +{{- end }} livenessProbe: failureThreshold: 5 httpGet: @@ -121,6 +124,9 @@ spec: secret: secretName: {{ .Values.filestore.gcs.secretName }} {{ end }} +{{- if .Values.sentry.ingestConsumer.volumes }} +{{ toYaml .Values.symbolicator.api.volumes | indent 6 }} +{{- end }} {{- if .Values.symbolicator.api.priorityClassName }} priorityClassName: "{{ .Values.symbolicator.api.priorityClassName }}" {{- end }} diff --git a/sentry/templates/hooks/sentry-db-check.job.yaml b/sentry/templates/hooks/sentry-db-check.job.yaml index 3ee62e593..32da1541a 100644 --- a/sentry/templates/hooks/sentry-db-check.job.yaml +++ b/sentry/templates/hooks/sentry-db-check.job.yaml @@ -137,12 +137,20 @@ spec: fi done echo "Kafka is up" +{{- if .Values.hooks.dbCheck.volumeMounts }} + volumeMounts: +{{ toYaml .Values.hooks.dbCheck.volumeMounts | indent 8 }} +{{- end }} env: {{- if .Values.hooks.dbCheck.env }} {{ toYaml .Values.hooks.dbCheck.env | indent 8 }} {{- end }} resources: {{ toYaml .Values.hooks.dbCheck.resources | indent 10 }} +{{- if .Values.hooks.dbCheck.volumes }} + volumes: +{{ toYaml .Values.hooks.dbCheck.volumes | indent 6 }} +{{- end }} {{- if .Values.hooks.shareProcessNamespace }} shareProcessNamespace: {{ .Values.hooks.shareProcessNamespace }} {{- end }} diff --git a/sentry/templates/hooks/sentry-db-init.job.yaml b/sentry/templates/hooks/sentry-db-init.job.yaml index 081cfa795..aaecae300 100644 --- a/sentry/templates/hooks/sentry-db-init.job.yaml +++ b/sentry/templates/hooks/sentry-db-init.job.yaml @@ -81,6 +81,9 @@ spec: - mountPath: /etc/sentry name: config readOnly: true +{{- if .Values.hooks.dbInit.volumeMounts }} +{{ toYaml .Values.hooks.dbInit.volumeMounts | indent 8 }} +{{- end }} resources: {{ toYaml .Values.hooks.dbInit.resources | indent 10 }} {{- if .Values.hooks.dbInit.sidecars }} diff --git a/sentry/templates/hooks/snuba-db-init.job.yaml b/sentry/templates/hooks/snuba-db-init.job.yaml index 685afd328..c4b9d7a48 100644 --- a/sentry/templates/hooks/snuba-db-init.job.yaml +++ b/sentry/templates/hooks/snuba-db-init.job.yaml @@ -87,12 +87,18 @@ spec: - mountPath: /etc/snuba name: config readOnly: true +{{- if .Values.hooks.snubaInit.volumeMounts }} +{{ toYaml .Values.hooks.snubaInit.volumeMounts | indent 8 }} +{{- end }} resources: {{ toYaml .Values.hooks.snubaInit.resources | indent 10 }} volumes: - - name: config - configMap: - name: {{ template "sentry.fullname" . }}-snuba + - name: config + configMap: + name: {{ template "sentry.fullname" . }}-snuba +{{- if .Values.hooks.snubaInit.volumes }} +{{ toYaml .Values.hooks.snubaInit.volumes | indent 6 }} +{{- end }} {{- if .Values.hooks.shareProcessNamespace }} shareProcessNamespace: {{ .Values.hooks.shareProcessNamespace }} {{- end }} diff --git a/sentry/templates/hooks/snuba-migrate.job.yaml b/sentry/templates/hooks/snuba-migrate.job.yaml index adf719c20..a43c63683 100644 --- a/sentry/templates/hooks/snuba-migrate.job.yaml +++ b/sentry/templates/hooks/snuba-migrate.job.yaml @@ -87,12 +87,18 @@ spec: - mountPath: /etc/snuba name: config readOnly: true +{{- if .Values.hooks.snubaInit.volumeMounts }} +{{ toYaml .Values.hooks.snubaInit.volumeMounts | indent 8 }} +{{- end }} resources: {{ toYaml .Values.hooks.snubaInit.resources | indent 10 }} volumes: - - name: config - configMap: - name: {{ template "sentry.fullname" . }}-snuba + - name: config + configMap: + name: {{ template "sentry.fullname" . }}-snuba +{{- if .Values.hooks.snubaInit.volumes }} +{{ toYaml .Values.hooks.snubaInit.volumes | indent 6 }} +{{- end }} {{- if .Values.hooks.shareProcessNamespace }} shareProcessNamespace: {{ .Values.hooks.shareProcessNamespace }} {{- end }} diff --git a/sentry/templates/hooks/user-create.yaml b/sentry/templates/hooks/user-create.yaml index 7fa3156f6..f4df28cee 100644 --- a/sentry/templates/hooks/user-create.yaml +++ b/sentry/templates/hooks/user-create.yaml @@ -92,12 +92,18 @@ spec: - mountPath: /etc/sentry name: config readOnly: true +{{- if .Values.hooks.dbInit.volumeMounts }} +{{ toYaml .Values.hooks.dbInit.volumeMounts | indent 8 }} +{{- end }} resources: {{ toYaml .Values.hooks.dbInit.resources | indent 10 }} volumes: - name: config configMap: name: {{ template "sentry.fullname" . }}-sentry +{{- if .Values.hooks.dbInit.volumes }} +{{ toYaml .Values.hooks.dbInit.volumes | indent 6 }} +{{- end }} {{- if .Values.hooks.shareProcessNamespace }} shareProcessNamespace: {{ .Values.hooks.shareProcessNamespace }} {{- end }} diff --git a/sentry/values.yaml b/sentry/values.yaml index 9c02339c8..b6156bf66 100644 --- a/sentry/values.yaml +++ b/sentry/values.yaml @@ -75,10 +75,13 @@ relay: targetCPUUtilizationPercentage: 50 sidecars: [] volumes: [] + volumeMounts: [] init: resources: {} # additionalArgs: [] # env: [] + # volumes: [] + # volumeMounts: [] geodata: path: "" @@ -120,6 +123,7 @@ sentry: targetCPUUtilizationPercentage: 50 sidecars: [] volumes: [] + volumeMounts: [] features: orgSubdomains: false @@ -149,6 +153,7 @@ sentry: failureThreshold: 3 sidecars: [] volumes: [] + volumeMounts: [] ingestConsumer: replicas: 1 @@ -186,6 +191,8 @@ sentry: # podLabels: [] sidecars: [] volumes: [] + # volumeMounts: [] + subscriptionConsumerEvents: replicas: 1 env: [] @@ -199,6 +206,8 @@ sentry: sidecars: [] volumes: [] # noStrictOffsetReset: false + # volumeMounts: [] + subscriptionConsumerTransactions: replicas: 1 env: [] @@ -212,6 +221,8 @@ sentry: sidecars: [] volumes: [] # noStrictOffsetReset: false + # volumeMounts: [] + postProcessForwardErrors: replicas: 1 env: [] @@ -224,6 +235,8 @@ sentry: # commitBatchSize: 1 sidecars: [] volumes: [] + # volumeMounts: [] + postProcessForwardTransactions: replicas: 1 env: [] @@ -236,6 +249,8 @@ sentry: # commitBatchSize: 1 sidecars: [] volumes: [] + # volumeMounts: [] + cleanup: successfulJobsHistoryLimit: 5 failedJobsHistoryLimit: 5 @@ -247,6 +262,7 @@ sentry: # securityContext: {} sidecars: [] volumes: [] + # volumeMounts: [] serviceAccount: {} snuba: @@ -254,7 +270,7 @@ snuba: replicas: 1 # set command to ["snuba","api"] if securityContext.runAsUser > 0 # see: https://github.com/getsentry/snuba/issues/956 - command: {} + command: [] # - snuba # - api env: [] @@ -279,6 +295,7 @@ snuba: targetCPUUtilizationPercentage: 50 sidecars: [] volumes: [] + # volumeMounts: [] consumer: replicas: 1 @@ -348,6 +365,8 @@ snuba: # maxBatchTimeMs: "" # queuedMaxMessagesKbytes: "" # queuedMinMessages: "" + # volumes: [] + # volumeMounts: [] subscriptionConsumerEvents: replicas: 1 @@ -359,6 +378,8 @@ snuba: # tolerations: [] # podLabels: [] autoOffsetReset: "earliest" + # volumes: [] + # volumeMounts: [] subscriptionConsumerTransactions: replicas: 1 @@ -370,6 +391,8 @@ snuba: # tolerations: [] # podLabels: [] autoOffsetReset: "earliest" + # volumes: [] + # volumeMounts: [] sessionsConsumer: replicas: 1 @@ -441,6 +464,8 @@ snuba: volumes: [] # securityContext: {} serviceAccount: {} + # volumes: [] + # volumeMounts: [] cleanupTransactions: successfulJobsHistoryLimit: 5 @@ -453,6 +478,8 @@ snuba: volumes: [] # securityContext: {} serviceAccount: {} + # volumes: [] + # volumeMounts: [] hooks: enabled: true @@ -478,6 +505,8 @@ hooks: nodeSelector: {} securityContext: {} # tolerations: [] + # volumes: [] + # volumeMounts: [] dbInit: env: [] # podLabels: [] @@ -493,6 +522,8 @@ hooks: affinity: {} nodeSelector: {} # tolerations: [] + # volumes: [] + # volumeMounts: [] snubaInit: # podLabels: [] podAnnotations: {} @@ -506,8 +537,12 @@ hooks: affinity: {} nodeSelector: {} # tolerations: [] + # volumes: [] + # volumeMounts: [] snubaMigrate: {} # podLabels: [] + # volumes: [] + # volumeMounts: [] system: ## be sure to include the scheme on the url, for example: "https://sentry.example.com" @@ -574,6 +609,10 @@ symbolicator: minReplicas: 2 maxReplicas: 5 targetCPUUtilizationPercentage: 50 + + # volumes: [] + # volumeMounts: [] + # TODO The cleanup cronjob is not yet implemented cleanup: enabled: false From 49013f29fd46185072b68c7c22b6927d859169d8 Mon Sep 17 00:00:00 2001 From: icew <1966579705@qq.com> Date: Fri, 4 Nov 2022 19:33:53 +0800 Subject: [PATCH 032/394] add: support rabbitmq vhost (#754) Co-authored-by: icew --- sentry/Chart.yaml | 2 +- sentry/templates/configmap-sentry.yaml | 2 +- sentry/values.yaml | 1 + 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/sentry/Chart.yaml b/sentry/Chart.yaml index bd654c65d..a0c99b13f 100644 --- a/sentry/Chart.yaml +++ b/sentry/Chart.yaml @@ -2,7 +2,7 @@ apiVersion: v2 name: sentry description: A Helm chart for Kubernetes type: application -version: 17.5.0 +version: 17.6.0 appVersion: 22.10.0 dependencies: - name: memcached diff --git a/sentry/templates/configmap-sentry.yaml b/sentry/templates/configmap-sentry.yaml index af7cf5c88..b7b278b31 100644 --- a/sentry/templates/configmap-sentry.yaml +++ b/sentry/templates/configmap-sentry.yaml @@ -196,7 +196,7 @@ data: # on a Python framework called Celery to manage queues. {{- if or (.Values.rabbitmq.enabled) (.Values.rabbitmq.host) }} - BROKER_URL = os.environ.get("BROKER_URL", "amqp://{{ .Values.rabbitmq.auth.username }}:{{ .Values.rabbitmq.auth.password }}@{{ template "sentry.rabbitmq.host" . }}:5672//") + BROKER_URL = os.environ.get("BROKER_URL", "amqp://{{ .Values.rabbitmq.auth.username }}:{{ .Values.rabbitmq.auth.password }}@{{ template "sentry.rabbitmq.host" . }}:5672/{{ .Values.rabbitmq.vhost }}") {{- else if $redisPass }} BROKER_URL = os.environ.get("BROKER_URL", "redis://:{{ $redisPass }}@{{ $redisHost }}:{{ $redisPort }}/0") {{- else }} diff --git a/sentry/values.yaml b/sentry/values.yaml index b6156bf66..59847bba5 100644 --- a/sentry/values.yaml +++ b/sentry/values.yaml @@ -928,6 +928,7 @@ externalPostgresql: rabbitmq: ## If disabled, Redis will be used instead as the broker. enabled: true + vhost: / clustering: forceBoot: true rebalance: true From ef1a55131f343fc9e3ac6041ba27e08353679626 Mon Sep 17 00:00:00 2001 From: Addie Date: Tue, 8 Nov 2022 17:39:59 +1100 Subject: [PATCH 033/394] Add conditional server block to nginx configmap to enable metric scraping (#776) --- sentry/Chart.yaml | 2 +- sentry/templates/configmap-nginx.yaml | 7 +++++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/sentry/Chart.yaml b/sentry/Chart.yaml index a0c99b13f..c27f26325 100644 --- a/sentry/Chart.yaml +++ b/sentry/Chart.yaml @@ -2,7 +2,7 @@ apiVersion: v2 name: sentry description: A Helm chart for Kubernetes type: application -version: 17.6.0 +version: 17.7.0 appVersion: 22.10.0 dependencies: - name: memcached diff --git a/sentry/templates/configmap-nginx.yaml b/sentry/templates/configmap-nginx.yaml index c91464d32..d795ce207 100644 --- a/sentry/templates/configmap-nginx.yaml +++ b/sentry/templates/configmap-nginx.yaml @@ -27,6 +27,13 @@ data: proxy_pass http://relay; } + {{ if and .Values.nginx.metrics.enabled .Values.nginx.metrics.serviceMonitor.enabled -}} + location = /status/ { + stub_status; + } + + {{ end -}} + location / { proxy_pass http://sentry; } From 2292deeef01ea0eb9f6a86b6f289121423ae9d16 Mon Sep 17 00:00:00 2001 From: Sem Schilder Date: Mon, 14 Nov 2022 12:45:01 +0100 Subject: [PATCH 034/394] Revert "Allow for v0 API endpoints (#757)" (#781) --- sentry/Chart.yaml | 2 +- sentry/templates/ingress.yaml | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/sentry/Chart.yaml b/sentry/Chart.yaml index c27f26325..0a91af622 100644 --- a/sentry/Chart.yaml +++ b/sentry/Chart.yaml @@ -2,7 +2,7 @@ apiVersion: v2 name: sentry description: A Helm chart for Kubernetes type: application -version: 17.7.0 +version: 17.7.1 appVersion: 22.10.0 dependencies: - name: memcached diff --git a/sentry/templates/ingress.yaml b/sentry/templates/ingress.yaml index 0292adacf..d84927257 100644 --- a/sentry/templates/ingress.yaml +++ b/sentry/templates/ingress.yaml @@ -139,9 +139,9 @@ spec: servicePort: {{ template "relay.port" . }} {{- end }} {{- if eq (default "nginx" .Values.ingress.regexPathStyle) "traefik" }} - - path: {{ default "/" .Values.ingress.path }}api/{[0-9][0-9]*}/{(.*)} + - path: {{ default "/" .Values.ingress.path }}api/{[1-9][0-9]*}/{(.*)} {{- else }} - - path: {{ default "/" .Values.ingress.path }}api/[0-9][0-9]*/(.*) + - path: {{ default "/" .Values.ingress.path }}api/[1-9][0-9]*/(.*) {{- end }} {{- if $ingressSupportsPathType }} pathType: {{ $ingressPathType }} From bc4dc440443b9b3589246fde07291887242eddf1 Mon Sep 17 00:00:00 2001 From: Agalin <6164461+Agalin@users.noreply.github.com> Date: Wed, 30 Nov 2022 08:26:48 +0100 Subject: [PATCH 035/394] Use latest clickhouse chart (#772) Co-authored-by: Szymon Soloch --- sentry/Chart.lock | 6 +++--- sentry/Chart.yaml | 4 ++-- sentry/charts/clickhouse-3.1.2.tgz | Bin 12733 -> 0 bytes sentry/charts/clickhouse-3.2.0.tgz | Bin 0 -> 12890 bytes 4 files changed, 5 insertions(+), 5 deletions(-) delete mode 100644 sentry/charts/clickhouse-3.1.2.tgz create mode 100644 sentry/charts/clickhouse-3.2.0.tgz diff --git a/sentry/Chart.lock b/sentry/Chart.lock index 2cec84585..8c2f5f84f 100644 --- a/sentry/Chart.lock +++ b/sentry/Chart.lock @@ -10,7 +10,7 @@ dependencies: version: 16.3.2 - name: clickhouse repository: https://sentry-kubernetes.github.io/charts - version: 3.1.2 + version: 3.2.0 - name: zookeeper repository: https://charts.bitnami.com/bitnami version: 9.0.0 @@ -23,5 +23,5 @@ dependencies: - name: nginx repository: https://charts.bitnami.com/bitnami version: 12.0.4 -digest: sha256:5aa28a73d7a983a60887a63b85cf5ae3b35cede1b25e19c184d912a705cdced1 -generated: "2022-07-16T21:41:22.831533442+02:00" +digest: sha256:89370355980c21097da681e8803e3b2911b27645b84d8f7865769282420ad68d +generated: "2022-11-04T13:10:26.422245+01:00" diff --git a/sentry/Chart.yaml b/sentry/Chart.yaml index 0a91af622..5208208d6 100644 --- a/sentry/Chart.yaml +++ b/sentry/Chart.yaml @@ -2,7 +2,7 @@ apiVersion: v2 name: sentry description: A Helm chart for Kubernetes type: application -version: 17.7.1 +version: 17.8.0 appVersion: 22.10.0 dependencies: - name: memcached @@ -19,7 +19,7 @@ dependencies: condition: kafka.enabled - name: clickhouse repository: https://sentry-kubernetes.github.io/charts - version: 3.1.2 + version: 3.2.0 condition: clickhouse.enabled - name: zookeeper repository: https://charts.bitnami.com/bitnami diff --git a/sentry/charts/clickhouse-3.1.2.tgz b/sentry/charts/clickhouse-3.1.2.tgz deleted file mode 100644 index 773e31ead25360c57935d3136ee4fe4fc0e71797..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12733 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 diff --git a/sentry/charts/clickhouse-3.2.0.tgz b/sentry/charts/clickhouse-3.2.0.tgz new file mode 100644 index 0000000000000000000000000000000000000000..de28088d3478ed677ad76f66fc227a956e2babf9 GIT binary patch literal 12890 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 Date: Sun, 18 Dec 2022 08:07:29 +0100 Subject: [PATCH 036/394] Update sentry to 22.11.0 + undocumented services (#800) --- sentry/Chart.yaml | 4 +- sentry/templates/configmap-relay.yaml | 3 + sentry/templates/configmap-sentry.yaml | 3 + sentry/templates/configmap-snuba.yaml | 4 - ...yment-sentry-billing-metrics-consumer.yaml | 139 +++++++++++++++++ ...t-sentry-ingest-metrics-consumer-perf.yaml | 141 ++++++++++++++++++ ...ent-sentry-ingest-metrics-consumer-rh.yaml | 141 ++++++++++++++++++ sentry/values.yaml | 80 +++++++++- 8 files changed, 508 insertions(+), 7 deletions(-) create mode 100644 sentry/templates/deployment-sentry-billing-metrics-consumer.yaml create mode 100644 sentry/templates/deployment-sentry-ingest-metrics-consumer-perf.yaml create mode 100644 sentry/templates/deployment-sentry-ingest-metrics-consumer-rh.yaml diff --git a/sentry/Chart.yaml b/sentry/Chart.yaml index 5208208d6..247d8cf95 100644 --- a/sentry/Chart.yaml +++ b/sentry/Chart.yaml @@ -2,8 +2,8 @@ apiVersion: v2 name: sentry description: A Helm chart for Kubernetes type: application -version: 17.8.0 -appVersion: 22.10.0 +version: 17.9.0 +appVersion: 22.11.0 dependencies: - name: memcached repository: https://charts.bitnami.com/bitnami diff --git a/sentry/templates/configmap-relay.yaml b/sentry/templates/configmap-relay.yaml index 5574ecb02..52713f8ca 100644 --- a/sentry/templates/configmap-relay.yaml +++ b/sentry/templates/configmap-relay.yaml @@ -37,5 +37,8 @@ data: {{- else }} redis: "redis://{{ $redisHost }}:{{ $redisPort }}" {{- end }} + topics: + metrics_transactions: ingest-performance-metrics + metrics_sessions: ingest-metrics {{ .Values.config.relay | indent 4 }} diff --git a/sentry/templates/configmap-sentry.yaml b/sentry/templates/configmap-sentry.yaml index b7b278b31..ca4ed27d6 100644 --- a/sentry/templates/configmap-sentry.yaml +++ b/sentry/templates/configmap-sentry.yaml @@ -418,6 +418,9 @@ data: "organizations:unhandled-issue-flag", "organizations:invite-members-rate-limits", "organizations:dashboards-v2", + "organizations:metrics", + "organizations:metrics-extraction", + "organizations:transaction-metrics-extraction", "projects:alert-filters", "projects:custom-inbound-filters", diff --git a/sentry/templates/configmap-snuba.yaml b/sentry/templates/configmap-snuba.yaml index 70923079a..dd2fc2073 100644 --- a/sentry/templates/configmap-snuba.yaml +++ b/sentry/templates/configmap-snuba.yaml @@ -38,10 +38,6 @@ data: "querylog", "sessions", "transactions", - "transactions_ro", - "transactions_v2", - "errors_v2", - "errors_v2_ro", "profiles", "functions", "replays", diff --git a/sentry/templates/deployment-sentry-billing-metrics-consumer.yaml b/sentry/templates/deployment-sentry-billing-metrics-consumer.yaml new file mode 100644 index 000000000..42a293bb8 --- /dev/null +++ b/sentry/templates/deployment-sentry-billing-metrics-consumer.yaml @@ -0,0 +1,139 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: {{ template "sentry.fullname" . }}-billing-metrics-consumer + labels: + app: {{ template "sentry.fullname" . }} + chart: "{{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }}" + release: "{{ .Release.Name }}" + heritage: "{{ .Release.Service }}" + app.kubernetes.io/managed-by: "Helm" + {{- if .Values.asHook }} + {{- /* Add the Helm annotations so that deployment after asHook from true to false works */}} + annotations: + meta.helm.sh/release-name: "{{ .Release.Name }}" + meta.helm.sh/release-namespace: "{{ .Release.Namespace }}" + "helm.sh/hook": "post-install,post-upgrade" + "helm.sh/hook-weight": "10" + {{- end }} +spec: + revisionHistoryLimit: {{ .Values.revisionHistoryLimit }} + selector: + matchLabels: + app: {{ template "sentry.fullname" . }} + release: "{{ .Release.Name }}" + role: billing-metrics-consumer +{{- if not .Values.sentry.billingMetricsConsumer.autoscaling.enabled }} + replicas: {{ .Values.sentry.billingMetricsConsumer.replicas }} +{{- end }} + template: + metadata: + annotations: + checksum/configYml: {{ .Values.config.configYml | toYaml | toString | sha256sum }} + checksum/sentryConfPy: {{ .Values.config.sentryConfPy | sha256sum }} + checksum/config.yaml: {{ include (print $.Template.BasePath "/configmap-sentry.yaml") . | sha256sum }} + {{- if .Values.sentry.billingMetricsConsumer.annotations }} +{{ toYaml .Values.sentry.billingMetricsConsumer.annotations | indent 8 }} + {{- end }} + labels: + app: {{ template "sentry.fullname" . }} + release: "{{ .Release.Name }}" + role: billing-metrics-consumer + {{- if .Values.sentry.billingMetricsConsumer.podLabels }} +{{ toYaml .Values.sentry.billingMetricsConsumer.podLabels | indent 8 }} + {{- end }} + spec: + affinity: + {{- if .Values.sentry.billingMetricsConsumer.affinity }} +{{ toYaml .Values.sentry.billingMetricsConsumer.affinity | indent 8 }} + {{- end }} + {{- if .Values.sentry.billingMetricsConsumer.nodeSelector }} + nodeSelector: +{{ toYaml .Values.sentry.billingMetricsConsumer.nodeSelector | indent 8 }} + {{- end }} + {{- if .Values.sentry.billingMetricsConsumer.tolerations }} + tolerations: +{{ toYaml .Values.sentry.billingMetricsConsumer.tolerations | indent 8 }} + {{- end }} + {{- if .Values.images.sentry.imagePullSecrets }} + imagePullSecrets: +{{ toYaml .Values.images.sentry.imagePullSecrets | indent 8 }} + {{- end }} + {{- if .Values.dnsPolicy }} + dnsPolicy: {{ .Values.dnsPolicy | quote }} + {{- end }} + {{- if .Values.dnsConfig }} + dnsConfig: +{{ toYaml .Values.dnsConfig | indent 8 }} + {{- end }} + {{- if .Values.sentry.billingMetricsConsumer.securityContext }} + securityContext: +{{ toYaml .Values.sentry.billingMetricsConsumer.securityContext | indent 8 }} + {{- end }} + containers: + - name: {{ .Chart.Name }}-billing-metrics-consumer + image: "{{ template "sentry.image" . }}" + imagePullPolicy: {{ default "IfNotPresent" .Values.images.sentry.pullPolicy }} + command: ["sentry"] + args: + - "run" + - "billing-metrics-consumer" + {{- if .Values.sentry.billingMetricsConsumer.maxBatchSize }} + - "--max-batch-size" + - "{{ .Values.sentry.billingMetricsConsumer.maxBatchSize }}" + {{- end }} + env: + - name: C_FORCE_ROOT + value: "true" +{{ include "sentry.env" . | indent 8 }} +{{- if .Values.sentry.billingMetricsConsumer.env }} +{{ toYaml .Values.sentry.billingMetricsConsumer.env | indent 8 }} +{{- end }} + volumeMounts: + - mountPath: /etc/sentry + name: config + readOnly: true + - mountPath: {{ .Values.filestore.filesystem.path }} + name: sentry-data + {{- if and (eq .Values.filestore.backend "gcs") .Values.filestore.gcs.secretName }} + - name: sentry-google-cloud-key + mountPath: /var/run/secrets/google + {{ end }} +{{- if .Values.sentry.billingMetricsConsumer.volumeMounts }} +{{ toYaml .Values.sentry.billingMetricsConsumer.volumeMounts | indent 8 }} +{{- end }} + resources: +{{ toYaml .Values.sentry.billingMetricsConsumer.resources | indent 12 }} +{{- if .Values.sentry.billingMetricsConsumer.sidecars }} +{{ toYaml .Values.sentry.billingMetricsConsumer.sidecars | indent 6 }} +{{- end }} + {{- if .Values.serviceAccount.enabled }} + serviceAccountName: {{ .Values.serviceAccount.name }}-billing-metrics-consumer + {{- end }} + volumes: + - name: config + configMap: + name: {{ template "sentry.fullname" . }}-sentry + - name: sentry-data + {{- if and (eq .Values.filestore.backend "filesystem") .Values.filestore.filesystem.persistence.enabled (.Values.filestore.filesystem.persistence.persistentWorkers) }} + {{- if .Values.filestore.filesystem.persistence.existingClaim }} + persistentVolumeClaim: + claimName: {{ .Values.filestore.filesystem.persistence.existingClaim }} + {{- else }} + persistentVolumeClaim: + claimName: {{ template "sentry.fullname" . }}-data + {{- end }} + {{- else }} + emptyDir: {} + {{ end }} + {{- if and (eq .Values.filestore.backend "gcs") .Values.filestore.gcs.secretName }} + - name: sentry-google-cloud-key + secret: + secretName: {{ .Values.filestore.gcs.secretName }} + {{ end }} +{{- if .Values.sentry.billingMetricsConsumer.volumes }} +{{ toYaml .Values.sentry.billingMetricsConsumer.volumes | indent 6 }} +{{- end }} + {{- if .Values.sentry.billingMetricsConsumer.priorityClassName }} + priorityClassName: "{{ .Values.sentry.billingMetricsConsumer.priorityClassName }}" + {{- end }} diff --git a/sentry/templates/deployment-sentry-ingest-metrics-consumer-perf.yaml b/sentry/templates/deployment-sentry-ingest-metrics-consumer-perf.yaml new file mode 100644 index 000000000..dda72e62d --- /dev/null +++ b/sentry/templates/deployment-sentry-ingest-metrics-consumer-perf.yaml @@ -0,0 +1,141 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: {{ template "sentry.fullname" . }}-ingest-metrics-consumer-perf + labels: + app: {{ template "sentry.fullname" . }} + chart: "{{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }}" + release: "{{ .Release.Name }}" + heritage: "{{ .Release.Service }}" + app.kubernetes.io/managed-by: "Helm" + {{- if .Values.asHook }} + {{- /* Add the Helm annotations so that deployment after asHook from true to false works */}} + annotations: + meta.helm.sh/release-name: "{{ .Release.Name }}" + meta.helm.sh/release-namespace: "{{ .Release.Namespace }}" + "helm.sh/hook": "post-install,post-upgrade" + "helm.sh/hook-weight": "10" + {{- end }} +spec: + revisionHistoryLimit: {{ .Values.revisionHistoryLimit }} + selector: + matchLabels: + app: {{ template "sentry.fullname" . }} + release: "{{ .Release.Name }}" + role: ingest-metrics-consumer-perf +{{- if not .Values.sentry.ingestMetricsConsumerPerf.autoscaling.enabled }} + replicas: {{ .Values.sentry.ingestMetricsConsumerPerf.replicas }} +{{- end }} + template: + metadata: + annotations: + checksum/configYml: {{ .Values.config.configYml | toYaml | toString | sha256sum }} + checksum/sentryConfPy: {{ .Values.config.sentryConfPy | sha256sum }} + checksum/config.yaml: {{ include (print $.Template.BasePath "/configmap-sentry.yaml") . | sha256sum }} + {{- if .Values.sentry.ingestMetricsConsumerPerf.annotations }} +{{ toYaml .Values.sentry.ingestMetricsConsumerPerf.annotations | indent 8 }} + {{- end }} + labels: + app: {{ template "sentry.fullname" . }} + release: "{{ .Release.Name }}" + role: ingest-metrics-consumer-perf + {{- if .Values.sentry.ingestMetricsConsumerPerf.podLabels }} +{{ toYaml .Values.sentry.ingestMetricsConsumerPerf.podLabels | indent 8 }} + {{- end }} + spec: + affinity: + {{- if .Values.sentry.ingestMetricsConsumerPerf.affinity }} +{{ toYaml .Values.sentry.ingestMetricsConsumerPerf.affinity | indent 8 }} + {{- end }} + {{- if .Values.sentry.ingestMetricsConsumerPerf.nodeSelector }} + nodeSelector: +{{ toYaml .Values.sentry.ingestMetricsConsumerPerf.nodeSelector | indent 8 }} + {{- end }} + {{- if .Values.sentry.ingestMetricsConsumerPerf.tolerations }} + tolerations: +{{ toYaml .Values.sentry.ingestMetricsConsumerPerf.tolerations | indent 8 }} + {{- end }} + {{- if .Values.images.sentry.imagePullSecrets }} + imagePullSecrets: +{{ toYaml .Values.images.sentry.imagePullSecrets | indent 8 }} + {{- end }} + {{- if .Values.dnsPolicy }} + dnsPolicy: {{ .Values.dnsPolicy | quote }} + {{- end }} + {{- if .Values.dnsConfig }} + dnsConfig: +{{ toYaml .Values.dnsConfig | indent 8 }} + {{- end }} + {{- if .Values.sentry.ingestMetricsConsumerPerf.securityContext }} + securityContext: +{{ toYaml .Values.sentry.ingestMetricsConsumerPerf.securityContext | indent 8 }} + {{- end }} + containers: + - name: {{ .Chart.Name }}-ingest-metrics-consumer-perf + image: "{{ template "sentry.image" . }}" + imagePullPolicy: {{ default "IfNotPresent" .Values.images.sentry.pullPolicy }} + command: ["sentry"] + args: + - "run" + - "ingest-metrics-parallel-consumer" + - "--ingest-profile" + - "performance" + {{- if .Values.sentry.ingestMetricsConsumerPerf.maxBatchSize }} + - "--max-msg-batch-size" + - "{{ .Values.sentry.ingestMetricsConsumerPerf.maxBatchSize }}" + {{- end }} + env: + - name: C_FORCE_ROOT + value: "true" +{{ include "sentry.env" . | indent 8 }} +{{- if .Values.sentry.ingestMetricsConsumerPerf.env }} +{{ toYaml .Values.sentry.ingestMetricsConsumerPerf.env | indent 8 }} +{{- end }} + volumeMounts: + - mountPath: /etc/sentry + name: config + readOnly: true + - mountPath: {{ .Values.filestore.filesystem.path }} + name: sentry-data + {{- if and (eq .Values.filestore.backend "gcs") .Values.filestore.gcs.secretName }} + - name: sentry-google-cloud-key + mountPath: /var/run/secrets/google + {{ end }} +{{- if .Values.sentry.ingestMetricsConsumerPerf.volumeMounts }} +{{ toYaml .Values.sentry.ingestMetricsConsumerPerf.volumeMounts | indent 8 }} +{{- end }} + resources: +{{ toYaml .Values.sentry.ingestMetricsConsumerPerf.resources | indent 12 }} +{{- if .Values.sentry.ingestMetricsConsumerPerf.sidecars }} +{{ toYaml .Values.sentry.ingestMetricsConsumerPerf.sidecars | indent 6 }} +{{- end }} + {{- if .Values.serviceAccount.enabled }} + serviceAccountName: {{ .Values.serviceAccount.name }}-ingest-metrics-consumer-perf + {{- end }} + volumes: + - name: config + configMap: + name: {{ template "sentry.fullname" . }}-sentry + - name: sentry-data + {{- if and (eq .Values.filestore.backend "filesystem") .Values.filestore.filesystem.persistence.enabled (.Values.filestore.filesystem.persistence.persistentWorkers) }} + {{- if .Values.filestore.filesystem.persistence.existingClaim }} + persistentVolumeClaim: + claimName: {{ .Values.filestore.filesystem.persistence.existingClaim }} + {{- else }} + persistentVolumeClaim: + claimName: {{ template "sentry.fullname" . }}-data + {{- end }} + {{- else }} + emptyDir: {} + {{ end }} + {{- if and (eq .Values.filestore.backend "gcs") .Values.filestore.gcs.secretName }} + - name: sentry-google-cloud-key + secret: + secretName: {{ .Values.filestore.gcs.secretName }} + {{ end }} +{{- if .Values.sentry.ingestMetricsConsumerPerf.volumes }} +{{ toYaml .Values.sentry.ingestMetricsConsumerPerf.volumes | indent 6 }} +{{- end }} + {{- if .Values.sentry.ingestMetricsConsumerPerf.priorityClassName }} + priorityClassName: "{{ .Values.sentry.ingestMetricsConsumerPerf.priorityClassName }}" + {{- end }} diff --git a/sentry/templates/deployment-sentry-ingest-metrics-consumer-rh.yaml b/sentry/templates/deployment-sentry-ingest-metrics-consumer-rh.yaml new file mode 100644 index 000000000..e67b57c6d --- /dev/null +++ b/sentry/templates/deployment-sentry-ingest-metrics-consumer-rh.yaml @@ -0,0 +1,141 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: {{ template "sentry.fullname" . }}-ingest-metrics-consumer-rh + labels: + app: {{ template "sentry.fullname" . }} + chart: "{{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }}" + release: "{{ .Release.Name }}" + heritage: "{{ .Release.Service }}" + app.kubernetes.io/managed-by: "Helm" + {{- if .Values.asHook }} + {{- /* Add the Helm annotations so that deployment after asHook from true to false works */}} + annotations: + meta.helm.sh/release-name: "{{ .Release.Name }}" + meta.helm.sh/release-namespace: "{{ .Release.Namespace }}" + "helm.sh/hook": "post-install,post-upgrade" + "helm.sh/hook-weight": "10" + {{- end }} +spec: + revisionHistoryLimit: {{ .Values.revisionHistoryLimit }} + selector: + matchLabels: + app: {{ template "sentry.fullname" . }} + release: "{{ .Release.Name }}" + role: ingest-metrics-consumer-rh +{{- if not .Values.sentry.ingestMetricsConsumerRh.autoscaling.enabled }} + replicas: {{ .Values.sentry.ingestMetricsConsumerRh.replicas }} +{{- end }} + template: + metadata: + annotations: + checksum/configYml: {{ .Values.config.configYml | toYaml | toString | sha256sum }} + checksum/sentryConfPy: {{ .Values.config.sentryConfPy | sha256sum }} + checksum/config.yaml: {{ include (print $.Template.BasePath "/configmap-sentry.yaml") . | sha256sum }} + {{- if .Values.sentry.ingestMetricsConsumerRh.annotations }} +{{ toYaml .Values.sentry.ingestMetricsConsumerRh.annotations | indent 8 }} + {{- end }} + labels: + app: {{ template "sentry.fullname" . }} + release: "{{ .Release.Name }}" + role: ingest-metrics-consumer-rh + {{- if .Values.sentry.ingestMetricsConsumerRh.podLabels }} +{{ toYaml .Values.sentry.ingestMetricsConsumerRh.podLabels | indent 8 }} + {{- end }} + spec: + affinity: + {{- if .Values.sentry.ingestMetricsConsumerRh.affinity }} +{{ toYaml .Values.sentry.ingestMetricsConsumerRh.affinity | indent 8 }} + {{- end }} + {{- if .Values.sentry.ingestMetricsConsumerRh.nodeSelector }} + nodeSelector: +{{ toYaml .Values.sentry.ingestMetricsConsumerRh.nodeSelector | indent 8 }} + {{- end }} + {{- if .Values.sentry.ingestMetricsConsumerRh.tolerations }} + tolerations: +{{ toYaml .Values.sentry.ingestMetricsConsumerRh.tolerations | indent 8 }} + {{- end }} + {{- if .Values.images.sentry.imagePullSecrets }} + imagePullSecrets: +{{ toYaml .Values.images.sentry.imagePullSecrets | indent 8 }} + {{- end }} + {{- if .Values.dnsPolicy }} + dnsPolicy: {{ .Values.dnsPolicy | quote }} + {{- end }} + {{- if .Values.dnsConfig }} + dnsConfig: +{{ toYaml .Values.dnsConfig | indent 8 }} + {{- end }} + {{- if .Values.sentry.ingestMetricsConsumerRh.securityContext }} + securityContext: +{{ toYaml .Values.sentry.ingestMetricsConsumerRh.securityContext | indent 8 }} + {{- end }} + containers: + - name: {{ .Chart.Name }}-ingest-metrics-consumer-rh + image: "{{ template "sentry.image" . }}" + imagePullPolicy: {{ default "IfNotPresent" .Values.images.sentry.pullPolicy }} + command: ["sentry"] + args: + - "run" + - "ingest-metrics-parallel-consumer" + - "--ingest-profile" + - "release-health" + {{- if .Values.sentry.ingestMetricsConsumerRh.maxBatchSize }} + - "--max-msg-batch-size" + - "{{ .Values.sentry.ingestMetricsConsumerRh.maxBatchSize }}" + {{- end }} + env: + - name: C_FORCE_ROOT + value: "true" +{{ include "sentry.env" . | indent 8 }} +{{- if .Values.sentry.ingestMetricsConsumerRh.env }} +{{ toYaml .Values.sentry.ingestMetricsConsumerRh.env | indent 8 }} +{{- end }} + volumeMounts: + - mountPath: /etc/sentry + name: config + readOnly: true + - mountPath: {{ .Values.filestore.filesystem.path }} + name: sentry-data + {{- if and (eq .Values.filestore.backend "gcs") .Values.filestore.gcs.secretName }} + - name: sentry-google-cloud-key + mountPath: /var/run/secrets/google + {{ end }} +{{- if .Values.sentry.ingestMetricsConsumerRh.volumeMounts }} +{{ toYaml .Values.sentry.ingestMetricsConsumerRh.volumeMounts | indent 8 }} +{{- end }} + resources: +{{ toYaml .Values.sentry.ingestMetricsConsumerRh.resources | indent 12 }} +{{- if .Values.sentry.ingestMetricsConsumerRh.sidecars }} +{{ toYaml .Values.sentry.ingestMetricsConsumerRh.sidecars | indent 6 }} +{{- end }} + {{- if .Values.serviceAccount.enabled }} + serviceAccountName: {{ .Values.serviceAccount.name }}-ingest-metrics-consumer-rh + {{- end }} + volumes: + - name: config + configMap: + name: {{ template "sentry.fullname" . }}-sentry + - name: sentry-data + {{- if and (eq .Values.filestore.backend "filesystem") .Values.filestore.filesystem.persistence.enabled (.Values.filestore.filesystem.persistence.persistentWorkers) }} + {{- if .Values.filestore.filesystem.persistence.existingClaim }} + persistentVolumeClaim: + claimName: {{ .Values.filestore.filesystem.persistence.existingClaim }} + {{- else }} + persistentVolumeClaim: + claimName: {{ template "sentry.fullname" . }}-data + {{- end }} + {{- else }} + emptyDir: {} + {{ end }} + {{- if and (eq .Values.filestore.backend "gcs") .Values.filestore.gcs.secretName }} + - name: sentry-google-cloud-key + secret: + secretName: {{ .Values.filestore.gcs.secretName }} + {{ end }} +{{- if .Values.sentry.ingestMetricsConsumerRh.volumes }} +{{ toYaml .Values.sentry.ingestMetricsConsumerRh.volumes | indent 6 }} +{{- end }} + {{- if .Values.sentry.ingestMetricsConsumerRh.priorityClassName }} + priorityClassName: "{{ .Values.sentry.ingestMetricsConsumerRh.priorityClassName }}" + {{- end }} diff --git a/sentry/values.yaml b/sentry/values.yaml index 59847bba5..1a0495f1e 100644 --- a/sentry/values.yaml +++ b/sentry/values.yaml @@ -35,7 +35,7 @@ images: imagePullSecrets: [] symbolicator: # repository: getsentry/symbolicator - tag: 0.5.1 + tag: 0.6.0 # pullPolicy: IfNotPresent imagePullSecrets: [] @@ -181,6 +181,84 @@ sentry: # - mountPath: /dev/shm # name: dshm + ingestMetricsConsumerPerf: + replicas: 1 + # concurrency: 4 + env: [] + resources: {} + affinity: {} + nodeSelector: {} + securityContext: {} + # tolerations: [] + # podLabels: [] + # maxBatchSize: "" + + # it's better to use prometheus adapter and scale based on + # the size of the rabbitmq queue + autoscaling: + enabled: false + minReplicas: 1 + maxReplicas: 3 + targetCPUUtilizationPercentage: 50 + sidecars: [] + volumes: [] + + # volumeMounts: + # - mountPath: /dev/shm + # name: dshm + + ingestMetricsConsumerRh: + replicas: 1 + # concurrency: 4 + env: [] + resources: {} + affinity: {} + nodeSelector: {} + securityContext: {} + # tolerations: [] + # podLabels: [] + # maxBatchSize: "" + + # it's better to use prometheus adapter and scale based on + # the size of the rabbitmq queue + autoscaling: + enabled: false + minReplicas: 1 + maxReplicas: 3 + targetCPUUtilizationPercentage: 50 + sidecars: [] + volumes: [] + + # volumeMounts: + # - mountPath: /dev/shm + # name: dshm + + billingMetricsConsumer: + replicas: 1 + # concurrency: 4 + env: [] + resources: {} + affinity: {} + nodeSelector: {} + securityContext: {} + # tolerations: [] + # podLabels: [] + # maxBatchSize: "" + + # it's better to use prometheus adapter and scale based on + # the size of the rabbitmq queue + autoscaling: + enabled: false + minReplicas: 1 + maxReplicas: 3 + targetCPUUtilizationPercentage: 50 + sidecars: [] + volumes: [] + + # volumeMounts: + # - mountPath: /dev/shm + # name: dshm + cron: replicas: 1 env: [] From dcb62c49607f714be23b3a780a11bec91d344c5b Mon Sep 17 00:00:00 2001 From: Khin Nyunt <33210614+cragonnyunt@users.noreply.github.com> Date: Mon, 19 Dec 2022 20:53:35 +0630 Subject: [PATCH 037/394] Update `apiVersion` by comparing kubernetes version (#802) * Update `apiVersion` by comparing kubernetes version * Bump chart version from `3.2.0` to `3.2.1` --- clickhouse/Chart.yaml | 2 +- clickhouse/templates/ingress-clickhouse.yaml | 8 +++++++- clickhouse/templates/ingress-tabix.yaml | 8 +++++++- 3 files changed, 15 insertions(+), 3 deletions(-) diff --git a/clickhouse/Chart.yaml b/clickhouse/Chart.yaml index 3b80b2103..b694ba3e0 100755 --- a/clickhouse/Chart.yaml +++ b/clickhouse/Chart.yaml @@ -11,6 +11,6 @@ keywords: name: clickhouse sources: - https://github.com/sentry-kubernetes/charts -version: 3.2.0 +version: 3.2.1 maintainers: - name: sentry-kubernetes diff --git a/clickhouse/templates/ingress-clickhouse.yaml b/clickhouse/templates/ingress-clickhouse.yaml index 9359efcc2..6904f3eac 100755 --- a/clickhouse/templates/ingress-clickhouse.yaml +++ b/clickhouse/templates/ingress-clickhouse.yaml @@ -1,5 +1,11 @@ {{- if .Values.clickhouse.ingress.enabled}} -apiVersion: {{- if .Capabilities.APIVersions.Has "networking.k8s.io/v1beta1" }} networking.k8s.io/v1beta1 {{- else }} extensions/v1beta1 {{- end }} +{{- if semverCompare ">=1.19-0" .Capabilities.KubeVersion.GitVersion -}} +apiVersion: networking.k8s.io/v1 +{{- else if semverCompare ">=1.14-0" .Capabilities.KubeVersion.GitVersion -}} +apiVersion: networking.k8s.io/v1beta1 +{{- else -}} +apiVersion: extensions/v1beta1 +{{- end }} kind: Ingress metadata: name: {{ include "clickhouse.fullname" . }} diff --git a/clickhouse/templates/ingress-tabix.yaml b/clickhouse/templates/ingress-tabix.yaml index d4cc0f571..8e2c04c95 100755 --- a/clickhouse/templates/ingress-tabix.yaml +++ b/clickhouse/templates/ingress-tabix.yaml @@ -1,6 +1,12 @@ {{- if .Values.tabix.enabled }} {{- if .Values.tabix.ingress.enabled}} -apiVersion: {{- if .Capabilities.APIVersions.Has "networking.k8s.io/v1beta1" }} networking.k8s.io/v1beta1 {{- else }} extensions/v1beta1 {{- end }} +{{- if semverCompare ">=1.19-0" .Capabilities.KubeVersion.GitVersion -}} +apiVersion: networking.k8s.io/v1 +{{- else if semverCompare ">=1.14-0" .Capabilities.KubeVersion.GitVersion -}} +apiVersion: networking.k8s.io/v1beta1 +{{- else -}} +apiVersion: extensions/v1beta1 +{{- end }} kind: Ingress metadata: name: {{ include "clickhouse.fullname" . }}-tabix From f23476450d7acba92e2f490267df78c237de5878 Mon Sep 17 00:00:00 2001 From: Anton Patsev <10828883+patsevanton@users.noreply.github.com> Date: Mon, 2 Jan 2023 22:06:23 +0600 Subject: [PATCH 038/394] Add Letsencrypt on NGINX Ingress Controller to README.md (#808) --- README.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/README.md b/README.md index eea82f14f..f0dc9f5a7 100644 --- a/README.md +++ b/README.md @@ -124,6 +124,18 @@ Note: if you are using NGINX Ingress, please set this annotation on your ingress If you are using `additionalHostNames` the `nginx.ingress.kubernetes.io/upstream-vhost` annotation might also come in handy. It sets the `Host` header to the value you provide to avoid CSRF issues. +### Letsencrypt on NGINX Ingress Controller +``` +nginx: + ingress: + annotations: + cert-manager.io/cluster-issuer: "letsencrypt-prod" + enabled: true + hostname: fqdn + ingressClassName: "nginx" + tls: true +``` + ## Clickhouse warning Snuba only supports a UTC timezone for Clickhouse. Please keep the initial value! From 157dd8daabadf230eb0f88b394cd296f37f80b1c Mon Sep 17 00:00:00 2001 From: Pavel Tumik <18602811+sagor999@users.noreply.github.com> Date: Fri, 17 Feb 2023 04:33:58 -0800 Subject: [PATCH 039/394] fix reprocessing feature flag (#831) --- sentry/Chart.yaml | 2 +- sentry/templates/configmap-sentry.yaml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/sentry/Chart.yaml b/sentry/Chart.yaml index 247d8cf95..a833a4eb8 100644 --- a/sentry/Chart.yaml +++ b/sentry/Chart.yaml @@ -2,7 +2,7 @@ apiVersion: v2 name: sentry description: A Helm chart for Kubernetes type: application -version: 17.9.0 +version: 17.9.1 appVersion: 22.11.0 dependencies: - name: memcached diff --git a/sentry/templates/configmap-sentry.yaml b/sentry/templates/configmap-sentry.yaml index ca4ed27d6..1ce033865 100644 --- a/sentry/templates/configmap-sentry.yaml +++ b/sentry/templates/configmap-sentry.yaml @@ -418,6 +418,7 @@ data: "organizations:unhandled-issue-flag", "organizations:invite-members-rate-limits", "organizations:dashboards-v2", + "organizations:reprocessing-v2", "organizations:metrics", "organizations:metrics-extraction", "organizations:transaction-metrics-extraction", @@ -435,7 +436,6 @@ data: "projects:similarity-indexing", "projects:similarity-view-v2", "projects:similarity-indexing-v2", - "projects:reprocessing-v2", "projects:plugins", ) From a46cd54957f298c7692b336e07651465b67bfc29 Mon Sep 17 00:00:00 2001 From: DONGJIN SHIN <46275039+DongjinS@users.noreply.github.com> Date: Tue, 14 Mar 2023 15:22:48 +0900 Subject: [PATCH 040/394] Add affinity, nodeSelector to user-create job (#792) --- sentry/Chart.yaml | 2 +- sentry/templates/hooks/user-create.yaml | 8 ++++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/sentry/Chart.yaml b/sentry/Chart.yaml index a833a4eb8..f35f46a80 100644 --- a/sentry/Chart.yaml +++ b/sentry/Chart.yaml @@ -2,7 +2,7 @@ apiVersion: v2 name: sentry description: A Helm chart for Kubernetes type: application -version: 17.9.1 +version: 17.9.2 appVersion: 22.11.0 dependencies: - name: memcached diff --git a/sentry/templates/hooks/user-create.yaml b/sentry/templates/hooks/user-create.yaml index f4df28cee..b19fbab24 100644 --- a/sentry/templates/hooks/user-create.yaml +++ b/sentry/templates/hooks/user-create.yaml @@ -34,6 +34,14 @@ spec: {{ toYaml .Values.sentry.worker.podLabels | indent 8 }} {{- end }} spec: + {{- if .Values.hooks.dbInit.affinity }} + affinity: +{{ toYaml .Values.hooks.dbInit.affinity | indent 8 }} + {{- end }} + {{- if .Values.hooks.dbInit.nodeSelector }} + nodeSelector: +{{ toYaml .Values.hooks.dbInit.nodeSelector | indent 8 }} + {{- end }} restartPolicy: Never {{- if .Values.hooks.dbInit.tolerations }} tolerations: From 9fe1b754628e46215d74d28171221ed7bec5513d Mon Sep 17 00:00:00 2001 From: Addie Date: Wed, 22 Mar 2023 03:54:52 +1100 Subject: [PATCH 041/394] Add support for injecting Slack integration secrets via K8s secrets, and fix paths to Bitnami charts (#840) --- .github/workflows/lint.yaml | 2 +- sentry/Chart.lock | 12 ++++++------ sentry/Chart.yaml | 10 +++++----- sentry/templates/_helper.tpl | 17 +++++++++++++++++ sentry/templates/configmap-sentry.yaml | 10 +++++++++- sentry/values.yaml | 1 + 6 files changed, 39 insertions(+), 13 deletions(-) diff --git a/.github/workflows/lint.yaml b/.github/workflows/lint.yaml index 56a22a9c3..4b3ccaf86 100644 --- a/.github/workflows/lint.yaml +++ b/.github/workflows/lint.yaml @@ -29,7 +29,7 @@ jobs: ct lint \ --target-branch=develop \ --chart-dirs=. \ - --chart-repos=bitnami=https://charts.bitnami.com/bitnami,sentry-kubernetes=https://sentry-kubernetes.github.io/charts + --chart-repos=bitnami=https://charts.bitnami.com/bitnami,bitnami-old=https://raw.githubusercontent.com/bitnami/charts/pre-2022/bitnami,sentry-kubernetes=https://sentry-kubernetes.github.io/charts # It would be nice to turn on this testing, but it is hard to get right and # rather complex (as well as expensive in terms of runner compute time). # Additionally, this is out of scope of fixing the issue brought up in #456 diff --git a/sentry/Chart.lock b/sentry/Chart.lock index 8c2f5f84f..c4c7fb1ca 100644 --- a/sentry/Chart.lock +++ b/sentry/Chart.lock @@ -6,22 +6,22 @@ dependencies: repository: https://charts.bitnami.com/bitnami version: 16.12.1 - name: kafka - repository: https://charts.bitnami.com/bitnami + repository: https://raw.githubusercontent.com/bitnami/charts/pre-2022/bitnami version: 16.3.2 - name: clickhouse repository: https://sentry-kubernetes.github.io/charts version: 3.2.0 - name: zookeeper - repository: https://charts.bitnami.com/bitnami + repository: https://raw.githubusercontent.com/bitnami/charts/pre-2022/bitnami version: 9.0.0 - name: rabbitmq - repository: https://charts.bitnami.com/bitnami + repository: https://raw.githubusercontent.com/bitnami/charts/pre-2022/bitnami version: 8.32.2 - name: postgresql - repository: https://charts.bitnami.com/bitnami + repository: https://raw.githubusercontent.com/bitnami/charts/pre-2022/bitnami version: 10.16.2 - name: nginx repository: https://charts.bitnami.com/bitnami version: 12.0.4 -digest: sha256:89370355980c21097da681e8803e3b2911b27645b84d8f7865769282420ad68d -generated: "2022-11-04T13:10:26.422245+01:00" +digest: sha256:100e52b213962d99739dadb3d01800b811ef08340f23fd57ec7c0d2c71547f91 +generated: "2023-03-09T10:48:18.306934+11:00" diff --git a/sentry/Chart.yaml b/sentry/Chart.yaml index f35f46a80..9982f94f2 100644 --- a/sentry/Chart.yaml +++ b/sentry/Chart.yaml @@ -2,7 +2,7 @@ apiVersion: v2 name: sentry description: A Helm chart for Kubernetes type: application -version: 17.9.2 +version: 17.10.1 appVersion: 22.11.0 dependencies: - name: memcached @@ -14,7 +14,7 @@ dependencies: version: 16.12.1 condition: redis.enabled - name: kafka - repository: https://charts.bitnami.com/bitnami + repository: https://raw.githubusercontent.com/bitnami/charts/pre-2022/bitnami version: 16.3.2 condition: kafka.enabled - name: clickhouse @@ -22,16 +22,16 @@ dependencies: version: 3.2.0 condition: clickhouse.enabled - name: zookeeper - repository: https://charts.bitnami.com/bitnami + repository: https://raw.githubusercontent.com/bitnami/charts/pre-2022/bitnami version: 9.0.0 condition: zookeeper.enabled - name: rabbitmq - repository: https://charts.bitnami.com/bitnami + repository: https://raw.githubusercontent.com/bitnami/charts/pre-2022/bitnami version: 8.32.2 alias: rabbitmq condition: rabbitmq.enabled - name: postgresql - repository: https://charts.bitnami.com/bitnami + repository: https://raw.githubusercontent.com/bitnami/charts/pre-2022/bitnami version: 10.16.2 condition: postgresql.enabled - name: nginx diff --git a/sentry/templates/_helper.tpl b/sentry/templates/_helper.tpl index 684d00b84..71bfc735a 100644 --- a/sentry/templates/_helper.tpl +++ b/sentry/templates/_helper.tpl @@ -494,4 +494,21 @@ Common Sentry environment variables name: {{ .Values.mail.existingSecret }} key: {{ default "mail-password" .Values.mail.existingSecretKey }} {{- end }} +{{- if .Values.slack.existingSecret }} +- name: SLACK_CLIENT_ID + valueFrom: + secretKeyRef: + name: {{ .Values.slack.existingSecret }} + key: "client-id" +- name: SLACK_CLIENT_SECRET + valueFrom: + secretKeyRef: + name: {{ .Values.slack.existingSecret }} + key: "client-secret" +- name: SLACK_SIGNING_SECRET + valueFrom: + secretKeyRef: + name: {{ .Values.slack.existingSecret }} + key: "signing-secret" +{{- end }} {{- end -}} \ No newline at end of file diff --git a/sentry/templates/configmap-sentry.yaml b/sentry/templates/configmap-sentry.yaml index 1ce033865..47931b5f3 100644 --- a/sentry/templates/configmap-sentry.yaml +++ b/sentry/templates/configmap-sentry.yaml @@ -62,7 +62,7 @@ data: ######### # Slack # ######### - {{- if .Values.slack.clientId }} + {{- if and (.Values.slack.clientId) (.Values.slack.clientSecret) (.Values.slack.signingSecret) (not .Values.slack.existingSecret) }} slack.client-id: {{ .Values.slack.clientId | quote }} slack.client-secret: {{ .Values.slack.clientSecret | quote }} slack.signing-secret: {{ .Values.slack.signingSecret | quote }} @@ -475,4 +475,12 @@ data: } {{- end }} +{{- if .Values.slack.existingSecret }} + ######### + # SLACK # + ######### + SENTRY_OPTIONS['slack.client-id'] = os.environ.get("SLACK_CLIENT_ID") + SENTRY_OPTIONS['slack.client-secret'] = os.environ.get("SLACK_CLIENT_SECRET") + SENTRY_OPTIONS['slack.signing-secret'] = os.environ.get("SLACK_SIGNING_SECRET") +{{- end }} {{ .Values.config.sentryConfPy | indent 4 }} diff --git a/sentry/values.yaml b/sentry/values.yaml index 1a0495f1e..24e269814 100644 --- a/sentry/values.yaml +++ b/sentry/values.yaml @@ -731,6 +731,7 @@ slack: {} # clientId: # clientSecret: # signingSecret: +# existingSecret: # Reference -> https://develop.sentry.dev/integrations/slack/ nginx: From 013f49772888ba195f99b1e6b6df6288262a7bfe Mon Sep 17 00:00:00 2001 From: Jan Jansen Date: Sun, 26 Mar 2023 06:30:44 +0200 Subject: [PATCH 042/394] allow concurrent cleanup (#828) Signed-off-by: Jan Jansen --- sentry/Chart.yaml | 2 +- sentry/templates/cronjob-sentry-cleanup.yaml | 2 ++ sentry/values.yaml | 1 + 3 files changed, 4 insertions(+), 1 deletion(-) diff --git a/sentry/Chart.yaml b/sentry/Chart.yaml index 9982f94f2..9fd4cb509 100644 --- a/sentry/Chart.yaml +++ b/sentry/Chart.yaml @@ -2,7 +2,7 @@ apiVersion: v2 name: sentry description: A Helm chart for Kubernetes type: application -version: 17.10.1 +version: 17.11.0 appVersion: 22.11.0 dependencies: - name: memcached diff --git a/sentry/templates/cronjob-sentry-cleanup.yaml b/sentry/templates/cronjob-sentry-cleanup.yaml index 33b0a894b..ac7cf8a45 100644 --- a/sentry/templates/cronjob-sentry-cleanup.yaml +++ b/sentry/templates/cronjob-sentry-cleanup.yaml @@ -69,6 +69,8 @@ spec: command: ["sentry"] args: - "cleanup" + - "--concurrency" + - {{ .Values.sentry.cleanup.concurrency | quote }} - "--days" - "{{ .Values.sentry.cleanup.days }}" env: diff --git a/sentry/values.yaml b/sentry/values.yaml index 24e269814..5927f5f4b 100644 --- a/sentry/values.yaml +++ b/sentry/values.yaml @@ -334,6 +334,7 @@ sentry: failedJobsHistoryLimit: 5 activeDeadlineSeconds: 100 concurrencyPolicy: Allow + concurrency: 1 enabled: true schedule: "0 0 * * *" days: 90 From 658c9083dc2f3d4fef0aa78aa0fbb79d8fa33337 Mon Sep 17 00:00:00 2001 From: Rene Luria Date: Wed, 29 Mar 2023 14:44:11 +0200 Subject: [PATCH 043/394] Fix memcached service name (#850) --- sentry/Chart.yaml | 2 +- sentry/templates/configmap-sentry.yaml | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/sentry/Chart.yaml b/sentry/Chart.yaml index 9fd4cb509..690d2fa8d 100644 --- a/sentry/Chart.yaml +++ b/sentry/Chart.yaml @@ -2,7 +2,7 @@ apiVersion: v2 name: sentry description: A Helm chart for Kubernetes type: application -version: 17.11.0 +version: 17.11.1 appVersion: 22.11.0 dependencies: - name: memcached diff --git a/sentry/templates/configmap-sentry.yaml b/sentry/templates/configmap-sentry.yaml index 47931b5f3..913a97efb 100644 --- a/sentry/templates/configmap-sentry.yaml +++ b/sentry/templates/configmap-sentry.yaml @@ -140,10 +140,12 @@ data: "default": { "BACKEND": "django.core.cache.backends.memcached.MemcachedCache", "LOCATION": [ - "sentry-memcached:11211" + "{{ template "sentry.fullname" . }}-memcached:11211" ] } } + import memcache + memcache.SERVER_MAX_VALUE_LENGTH = {{ .Values.memcached.maxItemSize }} {{- end }} DATABASES = { From 45f0c7f0ad25e76599848b0f042ba3c844fae441 Mon Sep 17 00:00:00 2001 From: Anton Donskoy Date: Fri, 31 Mar 2023 23:56:57 +0300 Subject: [PATCH 044/394] Add missing annotations for relay hpa (#853) Co-authored-by: Anton Donskoy --- sentry/Chart.yaml | 2 +- sentry/templates/hpa-relay.yaml | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/sentry/Chart.yaml b/sentry/Chart.yaml index 690d2fa8d..58c986845 100644 --- a/sentry/Chart.yaml +++ b/sentry/Chart.yaml @@ -2,7 +2,7 @@ apiVersion: v2 name: sentry description: A Helm chart for Kubernetes type: application -version: 17.11.1 +version: 17.11.2 appVersion: 22.11.0 dependencies: - name: memcached diff --git a/sentry/templates/hpa-relay.yaml b/sentry/templates/hpa-relay.yaml index 6b3403feb..974b917f0 100644 --- a/sentry/templates/hpa-relay.yaml +++ b/sentry/templates/hpa-relay.yaml @@ -3,6 +3,11 @@ apiVersion: autoscaling/v1 kind: HorizontalPodAutoscaler metadata: name: {{ template "sentry.fullname" . }}-relay + annotations: + meta.helm.sh/release-name: "{{ .Release.Name }}" + meta.helm.sh/release-namespace: "{{ .Release.Namespace }}" + "helm.sh/hook": "post-install,post-upgrade" + "helm.sh/hook-weight": "25" spec: scaleTargetRef: apiVersion: apps/v1 From 8d43592fe3f3a22e3189bd84995e5cecccd088be Mon Sep 17 00:00:00 2001 From: Kseniya Shaydurova Date: Mon, 17 Apr 2023 15:59:04 +0700 Subject: [PATCH 045/394] feat: add `existingSecret` param for Github (#863) --- sentry/Chart.yaml | 2 +- sentry/templates/_helper.tpl | 22 +++++++++++++ sentry/templates/configmap-sentry.yaml | 43 ++++++++++++++++---------- sentry/values.yaml | 15 ++++++++- 4 files changed, 64 insertions(+), 18 deletions(-) diff --git a/sentry/Chart.yaml b/sentry/Chart.yaml index 58c986845..237bb7f0c 100644 --- a/sentry/Chart.yaml +++ b/sentry/Chart.yaml @@ -2,7 +2,7 @@ apiVersion: v2 name: sentry description: A Helm chart for Kubernetes type: application -version: 17.11.2 +version: 17.11.3 appVersion: 22.11.0 dependencies: - name: memcached diff --git a/sentry/templates/_helper.tpl b/sentry/templates/_helper.tpl index 71bfc735a..b2154084f 100644 --- a/sentry/templates/_helper.tpl +++ b/sentry/templates/_helper.tpl @@ -511,4 +511,26 @@ Common Sentry environment variables name: {{ .Values.slack.existingSecret }} key: "signing-secret" {{- end }} +{{- if and .Values.github.existingSecret }} +- name: GITHUB_APP_PRIVATE_KEY + valueFrom: + secretKeyRef: + name: {{ .Values.github.existingSecret }} + key: {{ default "private-key" .Values.github.existingSecretPrivateKeyKey }} +- name: GITHUB_APP_WEBHOOK_SECRET + valueFrom: + secretKeyRef: + name: {{ .Values.github.existingSecret }} + key: {{ default "webhook-secret" .Values.github.existingSecretWebhookSecretKey }} +- name: GITHUB_APP_CLIENT_ID + valueFrom: + secretKeyRef: + name: {{ .Values.github.existingSecret }} + key: {{ default "client-id" .Values.github.existingSecretClientIdKey }} +- name: GITHUB_APP_CLIENT_SECRET + valueFrom: + secretKeyRef: + name: {{ .Values.github.existingSecret }} + key: {{ default "client-secret" .Values.github.existingSecretClientSecretKey }} +{{- end }} {{- end -}} \ No newline at end of file diff --git a/sentry/templates/configmap-sentry.yaml b/sentry/templates/configmap-sentry.yaml index 913a97efb..1a3e8e3c2 100644 --- a/sentry/templates/configmap-sentry.yaml +++ b/sentry/templates/configmap-sentry.yaml @@ -31,24 +31,25 @@ data: ########## # Github # ########## - {{- if .Values.github.appId }} - github-app.id: {{ .Values.github.appId }} + {{- with .Values.github.appId }} + github-app.id: {{ . }} {{- end }} - {{- if .Values.github.appName }} - github-app.name: {{ .Values.github.appName | quote }} + {{- with .Values.github.appName }} + github-app.name: {{ . | quote }} {{- end }} - {{- if .Values.github.privateKey }} - github-app.private-key: |- -{{ .Values.github.privateKey | indent 8 }} - {{- end }} - {{- if .Values.github.webhookSecret }} - github-app.webhook-secret: {{ .Values.github.webhookSecret | quote }} - {{- end }} - {{- if .Values.github.clientId }} - github-app.client-id: {{ .Values.github.clientId | quote }} - {{- end }} - {{- if .Values.github.clientSecret }} - github-app.client-secret: {{ .Values.github.clientSecret | quote }} + {{- if not .Values.github.existingSecret }} + {{- with .Values.github.privateKey }} + github-app.private-key: {{- . | toYaml | indent 4 }} + {{- end }} + {{- with .Values.github.webhookSecret }} + github-app.webhook-secret: {{ . | quote }} + {{- end }} + {{- with .Values.github.clientId }} + github-app.client-id: {{ . | quote }} + {{- end }} + {{- with .Values.github.clientSecret }} + github-app.client-secret: {{ . | quote }} + {{- end }} {{- end }} ########## @@ -485,4 +486,14 @@ data: SENTRY_OPTIONS['slack.client-secret'] = os.environ.get("SLACK_CLIENT_SECRET") SENTRY_OPTIONS['slack.signing-secret'] = os.environ.get("SLACK_SIGNING_SECRET") {{- end }} + +{{- if .Values.github.existingSecret }} + ########## + # Github # + ########## + SENTRY_OPTIONS['github-app.private-key'] = os.environ.get("GITHUB_APP_PRIVATE_KEY") + SENTRY_OPTIONS['github-app.webhook-secret'] = os.environ.get("GITHUB_APP_WEBHOOK_SECRET") + SENTRY_OPTIONS['github-app.client-id'] = os.environ.get("GITHUB_APP_CLIENT_ID") + SENTRY_OPTIONS['github-app.client-secret'] = os.environ.get("GITHUB_APP_CLIENT_SECRET") +{{- end }} {{ .Values.config.sentryConfPy | indent 4 }} diff --git a/sentry/values.yaml b/sentry/values.yaml index 5927f5f4b..9cb042396 100644 --- a/sentry/values.yaml +++ b/sentry/values.yaml @@ -719,7 +719,20 @@ github: {} # clientId: "xxxxx" # clientSecret: "xxxxx" # privateKey: "-----BEGIN RSA PRIVATE KEY-----\nMIIEpA" !!!! Don't forget a trailing \n -# webhookSecret: "xxxxx`" +# webhookSecret: "xxxxx" +# +# Note: if you use `existingSecret`, all above `clientId`, `clientSecret`, `privateKey`, `webhookSecret` +# params would be ignored, because chart will suppose that they are stored in `existingSecret`. So you +# must define all required keys and set it at least to empty strings if they are not needed in `existingSecret` +# secret (client-id, client-secret, webhook-secret, private-key) +# +# existingSecret: "xxxxx" +# existingSecretPrivateKeyKey: "" # by default "private-key" +# existingSecretWebhookSecretKey: "" # by default "webhook-secret" +# existingSecretClientIdKey: "" # by default "client-id" +# existingSecretClientSecretKey: "" # by default "client-secret" +# +# Reference -> https://docs.sentry.io/product/integrations/source-code-mgmt/github/ # https://developers.google.com/identity/sign-in/web/server-side-flow#step_1_create_a_client_id_and_client_secret google: {} From 8ad0d6498ca358280acf8f371013cd912656d3e6 Mon Sep 17 00:00:00 2001 From: "Keiji, Yoshimi" Date: Tue, 18 Apr 2023 18:00:47 +0900 Subject: [PATCH 046/394] write notes for #774 (#864) --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index f0dc9f5a7..42fd40fa1 100644 --- a/README.md +++ b/README.md @@ -22,6 +22,8 @@ Sentry version from 22.10.0 onwards should be using chart 17.x.x You can delete the deployment "sentry-post-process-forward" as it's no longer needed. +`sentry-worker` may failed to start by [#774](https://github.com/sentry-kubernetes/charts/issues/774). +If you encountered this issue, please reset `counters-0`, `triggers-0` queues. ## Upgrading from 15.x.x version of this Chart to 16.x.x From d36812040c60999a0f28ca9e758bb757f4e41d85 Mon Sep 17 00:00:00 2001 From: Jan Jansen Date: Tue, 2 May 2023 11:06:15 +0200 Subject: [PATCH 047/394] Upgrade Sentry 23.3.1 (#849) --- sentry/Chart.yaml | 4 +- sentry/templates/configmap-sentry.yaml | 1 + sentry/templates/configmap-snuba.yaml | 2 + .../cronjob-snuba-cleanup-errors.yaml | 113 -------------- .../cronjob-snuba-cleanup-transactions.yaml | 113 -------------- ...yment-sentry-ingest-replay-recordings.yaml | 135 ++++++++++++++++ ...-sentry-post-process-forwarder-errors.yaml | 2 - ...y-post-process-forwarder-transactions.yaml | 2 - .../templates/deployment-snuba-replacer.yaml | 2 - .../deployment-snuba-replays-consumer.yaml | 144 ++++++++++++++++++ ...-snuba-subscription-consumer-sessions.yaml | 109 +++++++++++++ ...count-sentry-ingest-replay-recordings.yaml | 10 ++ sentry/values.yaml | 111 ++++++++++---- 13 files changed, 484 insertions(+), 264 deletions(-) delete mode 100644 sentry/templates/cronjob-snuba-cleanup-errors.yaml delete mode 100644 sentry/templates/cronjob-snuba-cleanup-transactions.yaml create mode 100644 sentry/templates/deployment-sentry-ingest-replay-recordings.yaml create mode 100644 sentry/templates/deployment-snuba-replays-consumer.yaml create mode 100644 sentry/templates/deployment-snuba-subscription-consumer-sessions.yaml create mode 100644 sentry/templates/serviceaccount-sentry-ingest-replay-recordings.yaml diff --git a/sentry/Chart.yaml b/sentry/Chart.yaml index 237bb7f0c..05c306312 100644 --- a/sentry/Chart.yaml +++ b/sentry/Chart.yaml @@ -2,8 +2,8 @@ apiVersion: v2 name: sentry description: A Helm chart for Kubernetes type: application -version: 17.11.3 -appVersion: 22.11.0 +version: 17.12.0 +appVersion: 23.3.1 dependencies: - name: memcached repository: https://charts.bitnami.com/bitnami diff --git a/sentry/templates/configmap-sentry.yaml b/sentry/templates/configmap-sentry.yaml index 1a3e8e3c2..aeac36736 100644 --- a/sentry/templates/configmap-sentry.yaml +++ b/sentry/templates/configmap-sentry.yaml @@ -425,6 +425,7 @@ data: "organizations:metrics", "organizations:metrics-extraction", "organizations:transaction-metrics-extraction", + "organizations:session-replay", "projects:alert-filters", "projects:custom-inbound-filters", diff --git a/sentry/templates/configmap-snuba.yaml b/sentry/templates/configmap-snuba.yaml index dd2fc2073..05b169c76 100644 --- a/sentry/templates/configmap-snuba.yaml +++ b/sentry/templates/configmap-snuba.yaml @@ -43,6 +43,8 @@ data: "replays", "generic_metrics_sets", "generic_metrics_distributions", + "search_issues", + "generic_metrics_counters", }, {{- /* The default clickhouse installation runs in distributed mode, while the external diff --git a/sentry/templates/cronjob-snuba-cleanup-errors.yaml b/sentry/templates/cronjob-snuba-cleanup-errors.yaml deleted file mode 100644 index f33178403..000000000 --- a/sentry/templates/cronjob-snuba-cleanup-errors.yaml +++ /dev/null @@ -1,113 +0,0 @@ -{{- if .Values.snuba.cleanupErrors.enabled }} -{{- $batchApiIsStable := eq (include "sentry.batch.isStable" .) "true" -}} -apiVersion: {{ include "sentry.batch.apiVersion" . }} -kind: CronJob -metadata: - name: {{ template "sentry.fullname" . }}-snuba-cleanup-errors - labels: - app: {{ template "sentry.fullname" . }} - chart: "{{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }}" - release: "{{ .Release.Name }}" - heritage: "{{ .Release.Service }}" -spec: - schedule: "{{ .Values.snuba.cleanupErrors.schedule }}" - successfulJobsHistoryLimit: {{ .Values.snuba.cleanupErrors.successfulJobsHistoryLimit }} - failedJobsHistoryLimit: {{ .Values.snuba.cleanupErrors.failedJobsHistoryLimit }} - concurrencyPolicy: "{{ .Values.snuba.cleanupErrors.concurrencyPolicy }}" - jobTemplate: - spec: - {{- if .Values.snuba.cleanupErrors.activeDeadlineSeconds }} - activeDeadlineSeconds: {{ .Values.snuba.cleanupErrors.activeDeadlineSeconds }} - {{- end}} - template: - metadata: - annotations: - checksum/snubaSettingsPy: {{ .Values.config.snubaSettingsPy | sha256sum }} - checksum/config.yaml: {{ include (print $.Template.BasePath "/configmap-snuba.yaml") . | sha256sum }} - {{- if .Values.snuba.cleanupErrors.annotations }} -{{ toYaml .Values.snuba.cleanupErrors.annotations | indent 12 }} - {{- end }} - labels: - app: {{ template "sentry.fullname" . }} - release: "{{ .Release.Name }}" - {{- if .Values.snuba.cleanupErrors.podLabels }} -{{ toYaml .Values.snuba.cleanupErrors.podLabels | indent 12 }} - {{- end }} - spec: - affinity: - {{- if .Values.snuba.cleanupErrors.affinity }} -{{ toYaml .Values.snuba.cleanupErrors.affinity | indent 12 }} - {{- end }} - {{- if .Values.snuba.cleanupErrors.nodeSelector }} - nodeSelector: -{{ toYaml .Values.snuba.cleanupErrors.nodeSelector | indent 12 }} - {{- end }} - {{- if .Values.snuba.cleanupErrors.tolerations }} - tolerations: -{{ toYaml .Values.snuba.cleanupErrors.tolerations | indent 12 }} - {{- end }} - {{- if .Values.dnsPolicy }} - dnsPolicy: {{ .Values.dnsPolicy | quote }} - {{- end }} - {{- if .Values.dnsConfig }} - dnsConfig: -{{ toYaml .Values.dnsConfig | indent 12 }} - {{- end }} - {{- if .Values.images.snuba.imagePullSecrets }} - imagePullSecrets: -{{ toYaml .Values.images.snuba.imagePullSecrets | indent 12 }} - {{- end }} - {{- if .Values.snuba.cleanupErrors.securityContext }} - securityContext: -{{ toYaml .Values.snuba.cleanupErrors.securityContext | indent 12 }} - {{- end }} - containers: - - name: {{ .Chart.Name }}-snuba-cleanup-errors - image: "{{ template "snuba.image" . }}" - imagePullPolicy: {{ default "IfNotPresent" .Values.images.snuba.pullPolicy }} - command: - - "snuba" - - "cleanup" - - "--storage" - - "errors" - - "--dry-run" - - "False" - - "--clickhouse-host" - - {{ include "sentry.clickhouse.host" . | quote }} - - "--clickhouse-port" - - {{ include "sentry.clickhouse.port" . | quote }} - env: -{{ include "sentry.snuba.env" . | indent 12 }} -{{- if .Values.snuba.cleanupErrors.env }} -{{ toYaml .Values.snuba.cleanupErrors.env | indent 12 }} -{{- end }} - envFrom: - - secretRef: - name: {{ template "sentry.fullname" . }}-snuba-env - volumeMounts: - - mountPath: /etc/snuba - name: config - readOnly: true -{{- if .Values.snuba.cleanupErrors.volumeMounts }} -{{ toYaml .Values.snuba.cleanupErrors.volumeMounts | indent 14 }} -{{- end }} - resources: -{{ toYaml .Values.snuba.cleanupErrors.resources | indent 14 }} -{{- if .Values.snuba.cleanupErrors.sidecars }} -{{ toYaml .Values.snuba.cleanupErrors.sidecars | indent 10 }} -{{- end }} - restartPolicy: Never - volumes: - - name: config - configMap: - name: {{ template "sentry.fullname" . }}-snuba -{{- if .Values.snuba.cleanupErrors.volumes }} -{{ toYaml .Values.snuba.cleanupErrors.volumes | indent 12 }} -{{- end }} - {{- if .Values.snuba.cleanupErrors.priorityClassName }} - priorityClassName: "{{ .Values.snuba.cleanupErrors.priorityClassName }}" - {{- end }} - {{- if .Values.snuba.cleanupErrors.serviceAccount }} - serviceAccountName: {{ .Values.snuba.cleanupErrors.serviceAccount.name }} - {{- end }} -{{- end }} diff --git a/sentry/templates/cronjob-snuba-cleanup-transactions.yaml b/sentry/templates/cronjob-snuba-cleanup-transactions.yaml deleted file mode 100644 index 4fe489965..000000000 --- a/sentry/templates/cronjob-snuba-cleanup-transactions.yaml +++ /dev/null @@ -1,113 +0,0 @@ -{{- if .Values.snuba.cleanupTransactions.enabled }} -{{- $batchApiIsStable := eq (include "sentry.batch.isStable" .) "true" -}} -apiVersion: {{ include "sentry.batch.apiVersion" . }} -kind: CronJob -metadata: - name: {{ template "sentry.fullname" . }}-snuba-cleanup-transactions - labels: - app: {{ template "sentry.fullname" . }} - chart: "{{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }}" - release: "{{ .Release.Name }}" - heritage: "{{ .Release.Service }}" -spec: - schedule: "{{ .Values.snuba.cleanupTransactions.schedule }}" - successfulJobsHistoryLimit: {{ .Values.snuba.cleanupTransactions.successfulJobsHistoryLimit }} - failedJobsHistoryLimit: {{ .Values.snuba.cleanupTransactions.failedJobsHistoryLimit }} - concurrencyPolicy: "{{ .Values.snuba.cleanupTransactions.concurrencyPolicy }}" - jobTemplate: - spec: - {{- if .Values.snuba.cleanupTransactions.activeDeadlineSeconds }} - activeDeadlineSeconds: {{ .Values.snuba.cleanupTransactions.activeDeadlineSeconds }} - {{- end}} - template: - metadata: - annotations: - checksum/snubaSettingsPy: {{ .Values.config.snubaSettingsPy | sha256sum }} - checksum/config.yaml: {{ include (print $.Template.BasePath "/configmap-snuba.yaml") . | sha256sum }} - {{- if .Values.snuba.cleanupTransactions.annotations }} -{{ toYaml .Values.snuba.cleanupTransactions.annotations | indent 12 }} - {{- end }} - labels: - app: {{ template "sentry.fullname" . }} - release: "{{ .Release.Name }}" - {{- if .Values.snuba.cleanupTransactions.podLabels }} -{{ toYaml .Values.snuba.cleanupTransactions.podLabels | indent 12 }} - {{- end }} - spec: - affinity: - {{- if .Values.snuba.cleanupTransactions.affinity }} -{{ toYaml .Values.snuba.cleanupTransactions.affinity | indent 12 }} - {{- end }} - {{- if .Values.snuba.cleanupTransactions.nodeSelector }} - nodeSelector: -{{ toYaml .Values.snuba.cleanupTransactions.nodeSelector | indent 12 }} - {{- end }} - {{- if .Values.snuba.cleanupTransactions.tolerations }} - tolerations: -{{ toYaml .Values.snuba.cleanupTransactions.tolerations | indent 12 }} - {{- end }} - {{- if .Values.dnsPolicy }} - dnsPolicy: {{ .Values.dnsPolicy | quote }} - {{- end }} - {{- if .Values.dnsConfig }} - dnsConfig: -{{ toYaml .Values.dnsConfig | indent 12 }} - {{- end }} - {{- if .Values.images.snuba.imagePullSecrets }} - imagePullSecrets: -{{ toYaml .Values.images.snuba.imagePullSecrets | indent 12 }} - {{- end }} - {{- if .Values.snuba.cleanupTransactions.securityContext }} - securityContext: -{{ toYaml .Values.snuba.cleanupTransactions.securityContext | indent 12 }} - {{- end }} - containers: - - name: {{ .Chart.Name }}-snuba-cleanup-errors - image: "{{ template "snuba.image" . }}" - imagePullPolicy: {{ default "IfNotPresent" .Values.images.snuba.pullPolicy }} - command: - - "snuba" - - "cleanup" - - "--storage" - - "transactions" - - "--dry-run" - - "False" - - "--clickhouse-host" - - {{ include "sentry.clickhouse.host" . | quote }} - - "--clickhouse-port" - - {{ include "sentry.clickhouse.port" . | quote }} - env: -{{ include "sentry.snuba.env" . | indent 14 }} -{{- if .Values.snuba.cleanupTransactions.env }} -{{ toYaml .Values.snuba.cleanupTransactions.env | indent 14 }} -{{- end }} - envFrom: - - secretRef: - name: {{ template "sentry.fullname" . }}-snuba-env - volumeMounts: - - mountPath: /etc/snuba - name: config - readOnly: true -{{- if .Values.snuba.cleanupTransactions.volumeMounts }} -{{ toYaml .Values.snuba.cleanupTransactions.volumeMounts | indent 14 }} -{{- end }} - resources: -{{ toYaml .Values.snuba.cleanupTransactions.resources | indent 14 }} -{{- if .Values.snuba.cleanupTransactions.sidecars }} -{{ toYaml .Values.snuba.cleanupTransactions.sidecars | indent 10 }} -{{- end }} - restartPolicy: Never - volumes: - - name: config - configMap: - name: {{ template "sentry.fullname" . }}-snuba -{{- if .Values.snuba.cleanupTransactions.volumes }} -{{ toYaml .Values.snuba.cleanupTransactions.volumes | indent 12 }} -{{- end }} - {{- if .Values.snuba.cleanupTransactions.priorityClassName }} - priorityClassName: "{{ .Values.snuba.cleanupTransactions.priorityClassName }}" - {{- end }} - {{- if .Values.snuba.cleanupTransactions.serviceAccount }} - serviceAccountName: {{ .Values.snuba.cleanupTransactions.serviceAccount.name }} - {{- end }} -{{- end }} diff --git a/sentry/templates/deployment-sentry-ingest-replay-recordings.yaml b/sentry/templates/deployment-sentry-ingest-replay-recordings.yaml new file mode 100644 index 000000000..b65edc675 --- /dev/null +++ b/sentry/templates/deployment-sentry-ingest-replay-recordings.yaml @@ -0,0 +1,135 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: {{ template "sentry.fullname" . }}-ingest-replay-recordings + labels: + app: {{ template "sentry.fullname" . }} + chart: "{{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }}" + release: "{{ .Release.Name }}" + heritage: "{{ .Release.Service }}" + app.kubernetes.io/managed-by: "Helm" + {{- if .Values.asHook }} + {{- /* Add the Helm annotations so that deployment after asHook from true to false works */}} + annotations: + meta.helm.sh/release-name: "{{ .Release.Name }}" + meta.helm.sh/release-namespace: "{{ .Release.Namespace }}" + "helm.sh/hook": "post-install,post-upgrade" + "helm.sh/hook-weight": "10" + {{- end }} +spec: + revisionHistoryLimit: {{ .Values.revisionHistoryLimit }} + selector: + matchLabels: + app: {{ template "sentry.fullname" . }} + release: "{{ .Release.Name }}" + role: ingest-replay-recordings +{{- if not .Values.sentry.ingestReplayRecordings.autoscaling.enabled }} + replicas: {{ .Values.sentry.ingestReplayRecordings.replicas }} +{{- end }} + template: + metadata: + annotations: + checksum/configYml: {{ .Values.config.configYml | toYaml | toString | sha256sum }} + checksum/sentryConfPy: {{ .Values.config.sentryConfPy | sha256sum }} + checksum/config.yaml: {{ include (print $.Template.BasePath "/configmap-sentry.yaml") . | sha256sum }} + {{- if .Values.sentry.ingestReplayRecordings.annotations }} +{{ toYaml .Values.sentry.ingestReplayRecordings.annotations | indent 8 }} + {{- end }} + labels: + app: {{ template "sentry.fullname" . }} + release: "{{ .Release.Name }}" + role: ingest-replay-recordings + {{- if .Values.sentry.ingestReplayRecordings.podLabels }} +{{ toYaml .Values.sentry.ingestReplayRecordings.podLabels | indent 8 }} + {{- end }} + spec: + affinity: + {{- if .Values.sentry.ingestReplayRecordings.affinity }} +{{ toYaml .Values.sentry.ingestReplayRecordings.affinity | indent 8 }} + {{- end }} + {{- if .Values.sentry.ingestReplayRecordings.nodeSelector }} + nodeSelector: +{{ toYaml .Values.sentry.ingestReplayRecordings.nodeSelector | indent 8 }} + {{- end }} + {{- if .Values.sentry.ingestReplayRecordings.tolerations }} + tolerations: +{{ toYaml .Values.sentry.ingestReplayRecordings.tolerations | indent 8 }} + {{- end }} + {{- if .Values.images.sentry.imagePullSecrets }} + imagePullSecrets: +{{ toYaml .Values.images.sentry.imagePullSecrets | indent 8 }} + {{- end }} + {{- if .Values.dnsPolicy }} + dnsPolicy: {{ .Values.dnsPolicy | quote }} + {{- end }} + {{- if .Values.dnsConfig }} + dnsConfig: +{{ toYaml .Values.dnsConfig | indent 8 }} + {{- end }} + {{- if .Values.sentry.ingestReplayRecordings.securityContext }} + securityContext: +{{ toYaml .Values.sentry.ingestReplayRecordings.securityContext | indent 8 }} + {{- end }} + containers: + - name: {{ .Chart.Name }}-ingest-replay-recordings + image: "{{ template "sentry.image" . }}" + imagePullPolicy: {{ default "IfNotPresent" .Values.images.sentry.pullPolicy }} + command: ["sentry"] + args: + - "run" + - "ingest-replay-recordings" + env: + - name: C_FORCE_ROOT + value: "true" +{{ include "sentry.env" . | indent 8 }} +{{- if .Values.sentry.ingestReplayRecordings.env }} +{{ toYaml .Values.sentry.ingestReplayRecordings.env | indent 8 }} +{{- end }} + volumeMounts: + - mountPath: /etc/sentry + name: config + readOnly: true + - mountPath: {{ .Values.filestore.filesystem.path }} + name: sentry-data + {{- if and (eq .Values.filestore.backend "gcs") .Values.filestore.gcs.secretName }} + - name: sentry-google-cloud-key + mountPath: /var/run/secrets/google + {{ end }} +{{- if .Values.sentry.ingestReplayRecordings.volumeMounts }} +{{ toYaml .Values.sentry.ingestReplayRecordings.volumeMounts | indent 8 }} +{{- end }} + resources: +{{ toYaml .Values.sentry.ingestReplayRecordings.resources | indent 12 }} +{{- if .Values.sentry.ingestReplayRecordings.sidecars }} +{{ toYaml .Values.sentry.ingestReplayRecordings.sidecars | indent 6 }} +{{- end }} + {{- if .Values.serviceAccount.enabled }} + serviceAccountName: {{ .Values.serviceAccount.name }}-ingest-replay-recordings + {{- end }} + volumes: + - name: config + configMap: + name: {{ template "sentry.fullname" . }}-sentry + - name: sentry-data + {{- if and (eq .Values.filestore.backend "filesystem") .Values.filestore.filesystem.persistence.enabled (.Values.filestore.filesystem.persistence.persistentWorkers) }} + {{- if .Values.filestore.filesystem.persistence.existingClaim }} + persistentVolumeClaim: + claimName: {{ .Values.filestore.filesystem.persistence.existingClaim }} + {{- else }} + persistentVolumeClaim: + claimName: {{ template "sentry.fullname" . }}-data + {{- end }} + {{- else }} + emptyDir: {} + {{ end }} + {{- if and (eq .Values.filestore.backend "gcs") .Values.filestore.gcs.secretName }} + - name: sentry-google-cloud-key + secret: + secretName: {{ .Values.filestore.gcs.secretName }} + {{ end }} +{{- if .Values.sentry.ingestReplayRecordings.volumes }} +{{ toYaml .Values.sentry.ingestReplayRecordings.volumes | indent 6 }} +{{- end }} + {{- if .Values.sentry.ingestReplayRecordings.priorityClassName }} + priorityClassName: "{{ .Values.sentry.ingestReplayRecordings.priorityClassName }}" + {{- end }} diff --git a/sentry/templates/deployment-sentry-post-process-forwarder-errors.yaml b/sentry/templates/deployment-sentry-post-process-forwarder-errors.yaml index 9670e8714..38e88a125 100644 --- a/sentry/templates/deployment-sentry-post-process-forwarder-errors.yaml +++ b/sentry/templates/deployment-sentry-post-process-forwarder-errors.yaml @@ -76,8 +76,6 @@ spec: args: - "run" - "post-process-forwarder" - - "--commit-batch-size" - - "{{ default "1" .Values.sentry.postProcessForwardErrors.commitBatchSize }}" - "--entity" - "errors" env: diff --git a/sentry/templates/deployment-sentry-post-process-forwarder-transactions.yaml b/sentry/templates/deployment-sentry-post-process-forwarder-transactions.yaml index 9edb1c7a8..d7350f9de 100644 --- a/sentry/templates/deployment-sentry-post-process-forwarder-transactions.yaml +++ b/sentry/templates/deployment-sentry-post-process-forwarder-transactions.yaml @@ -76,8 +76,6 @@ spec: args: - "run" - "post-process-forwarder" - - "--commit-batch-size" - - "{{ default "1" .Values.sentry.postProcessForwardTransactions.commitBatchSize }}" - "--entity" - "transactions" - "--commit-log-topic=snuba-transactions-commit-log" diff --git a/sentry/templates/deployment-snuba-replacer.yaml b/sentry/templates/deployment-snuba-replacer.yaml index ba4e3609a..7b451d095 100644 --- a/sentry/templates/deployment-snuba-replacer.yaml +++ b/sentry/templates/deployment-snuba-replacer.yaml @@ -78,8 +78,6 @@ spec: - "errors" - "--auto-offset-reset" - "{{ .Values.snuba.replacer.autoOffsetReset }}" - - "--max-batch-size" - - "{{ default "3" .Values.snuba.replacer.maxBatchSize }}" {{- if .Values.snuba.replacer.maxBatchTimeMs }} - "--max-batch-time-ms" - "{{ .Values.snuba.replacer.maxBatchTimeMs }}" diff --git a/sentry/templates/deployment-snuba-replays-consumer.yaml b/sentry/templates/deployment-snuba-replays-consumer.yaml new file mode 100644 index 000000000..a6308f3ad --- /dev/null +++ b/sentry/templates/deployment-snuba-replays-consumer.yaml @@ -0,0 +1,144 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: {{ template "sentry.fullname" . }}-snuba-replays-consumer + labels: + app: {{ template "sentry.fullname" . }} + chart: "{{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }}" + release: "{{ .Release.Name }}" + heritage: "{{ .Release.Service }}" + app.kubernetes.io/managed-by: "Helm" + {{- if .Values.asHook }} + {{- /* Add the Helm annotations so that deployment after asHook from true to false works */}} + annotations: + meta.helm.sh/release-name: "{{ .Release.Name }}" + meta.helm.sh/release-namespace: "{{ .Release.Namespace }}" + "helm.sh/hook": "post-install,post-upgrade" + "helm.sh/hook-weight": "12" + {{- end }} +spec: + revisionHistoryLimit: {{ .Values.revisionHistoryLimit }} + selector: + matchLabels: + app: {{ template "sentry.fullname" . }} + release: "{{ .Release.Name }}" + role: snuba-replays-consumer + replicas: {{ .Values.snuba.replaysConsumer.replicas }} + template: + metadata: + annotations: + checksum/snubaSettingsPy: {{ .Values.config.snubaSettingsPy | sha256sum }} + checksum/config.yaml: {{ include (print $.Template.BasePath "/configmap-snuba.yaml") . | sha256sum }} + {{- if .Values.snuba.replaysConsumer.annotations }} +{{ toYaml .Values.snuba.replaysConsumer.annotations | indent 8 }} + {{- end }} + labels: + app: {{ template "sentry.fullname" . }} + release: "{{ .Release.Name }}" + role: snuba-replays-consumer + {{- if .Values.snuba.replaysConsumer.podLabels }} +{{ toYaml .Values.snuba.replaysConsumer.podLabels | indent 8 }} + {{- end }} + spec: + affinity: + {{- if .Values.snuba.replaysConsumer.affinity }} +{{ toYaml .Values.snuba.replaysConsumer.affinity | indent 8 }} + {{- end }} + {{- if .Values.snuba.replaysConsumer.nodeSelector }} + nodeSelector: +{{ toYaml .Values.snuba.replaysConsumer.nodeSelector | indent 8 }} + {{- end }} + {{- if .Values.snuba.replaysConsumer.tolerations }} + tolerations: +{{ toYaml .Values.snuba.replaysConsumer.tolerations | indent 8 }} + {{- end }} + {{- if .Values.images.snuba.imagePullSecrets }} + imagePullSecrets: +{{ toYaml .Values.images.snuba.imagePullSecrets | indent 8 }} + {{- end }} + {{- if .Values.dnsPolicy }} + dnsPolicy: {{ .Values.dnsPolicy | quote }} + {{- end }} + {{- if .Values.dnsConfig }} + dnsConfig: +{{ toYaml .Values.dnsConfig | indent 8 }} + {{- end }} + {{- if .Values.snuba.replaysConsumer.securityContext }} + securityContext: +{{ toYaml .Values.snuba.replaysConsumer.securityContext | indent 8 }} + {{- end }} + containers: + - name: {{ .Chart.Name }}-snuba + image: "{{ template "snuba.image" . }}" + imagePullPolicy: {{ default "IfNotPresent" .Values.images.snuba.pullPolicy }} + command: + - "snuba" + - "consumer" + - "--storage" + - "replays" + - "--consumer-group" + - "replays_group" + - "--auto-offset-reset" + - "{{ .Values.snuba.replaysConsumer.autoOffsetReset }}" + - "--max-batch-time-ms" + - "750" + {{- if .Values.snuba.replaysConsumer.maxBatchSize }} + - "--max-batch-size" + - "{{ .Values.snuba.replaysConsumer.maxBatchSize }}" + {{- end }} + {{- if .Values.snuba.replaysConsumer.processes }} + - "--processes" + - "{{ .Values.snuba.replaysConsumer.processes }}" + {{- end }} + {{- if .Values.snuba.replaysConsumer.inputBlockSize }} + - "--input-block-size" + - "{{ .Values.snuba.replaysConsumer.inputBlockSize }}" + {{- end }} + {{- if .Values.snuba.replaysConsumer.outputBlockSize }} + - "--output-block-size" + - "{{ .Values.snuba.replaysConsumer.outputBlockSize }}" + {{- end }} + {{- if .Values.snuba.replaysConsumer.maxBatchTimeMs }} + - "--max-batch-time-ms" + - "{{ .Values.snuba.replaysConsumer.maxBatchTimeMs }}" + {{- end }} + {{- if .Values.snuba.replaysConsumer.queuedMaxMessagesKbytes }} + - "--queued-max-messages-kbytes" + - "{{ .Values.snuba.replaysConsumer.queuedMaxMessagesKbytes }}" + {{- end }} + {{- if .Values.snuba.replaysConsumer.queuedMinMessages }} + - "--queued-min-messages" + - "{{ .Values.snuba.replaysConsumer.queuedMinMessages }}" + {{- end }} + {{- if .Values.snuba.replaysConsumer.noStrictOffsetReset }} + - "--no-strict-offset-reset" + {{- end }} + ports: + - containerPort: {{ template "snuba.port" }} + env: +{{ include "sentry.snuba.env" . | indent 8 }} +{{- if .Values.snuba.replaysConsumer.env }} +{{ toYaml .Values.snuba.replaysConsumer.env | indent 8 }} +{{- end }} + envFrom: + - secretRef: + name: {{ template "sentry.fullname" . }}-snuba-env + volumeMounts: + - mountPath: /etc/snuba + name: config + readOnly: true +{{- if .Values.snuba.replaysConsumer.volumeMounts }} +{{ toYaml .Values.snuba.replaysConsumer.volumeMounts | indent 8 }} +{{- end }} + resources: +{{ toYaml .Values.snuba.replaysConsumer.resources | indent 12 }} + {{- if .Values.serviceAccount.enabled }} + serviceAccountName: {{ .Values.serviceAccount.name }}-snuba + {{- end }} + volumes: + - name: config + configMap: + name: {{ template "sentry.fullname" . }}-snuba +{{- if .Values.snuba.replaysConsumer.volumes }} +{{ toYaml .Values.snuba.replaysConsumer.volumes | indent 8 }} +{{- end }} diff --git a/sentry/templates/deployment-snuba-subscription-consumer-sessions.yaml b/sentry/templates/deployment-snuba-subscription-consumer-sessions.yaml new file mode 100644 index 000000000..3aa6f83cc --- /dev/null +++ b/sentry/templates/deployment-snuba-subscription-consumer-sessions.yaml @@ -0,0 +1,109 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: {{ template "sentry.fullname" . }}-snuba-subscription-consumer-sessions + labels: + app: {{ template "sentry.fullname" . }} + chart: "{{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }}" + release: "{{ .Release.Name }}" + heritage: "{{ .Release.Service }}" + app.kubernetes.io/managed-by: "Helm" + {{- if .Values.asHook }} + {{- /* Add the Helm annotations so that deployment after asHook from true to false works */}} + annotations: + meta.helm.sh/release-name: "{{ .Release.Name }}" + meta.helm.sh/release-namespace: "{{ .Release.Namespace }}" + "helm.sh/hook": "post-install,post-upgrade" + "helm.sh/hook-weight": "18" + {{- end }} +spec: + revisionHistoryLimit: {{ .Values.revisionHistoryLimit }} + selector: + matchLabels: + app: {{ template "sentry.fullname" . }} + release: "{{ .Release.Name }}" + role: snuba-subscription-consumer-sessions + replicas: {{ .Values.snuba.subscriptionConsumerSessions.replicas }} + template: + metadata: + annotations: + checksum/snubaSettingsPy: {{ .Values.config.snubaSettingsPy | sha256sum }} + checksum/config.yaml: {{ include (print $.Template.BasePath "/configmap-snuba.yaml") . | sha256sum }} + {{- if .Values.snuba.subscriptionConsumerSessions.annotations }} +{{ toYaml .Values.snuba.subscriptionConsumerSessions.annotations | indent 8 }} + {{- end }} + labels: + app: {{ template "sentry.fullname" . }} + release: "{{ .Release.Name }}" + role: snuba-subscription-consumer-sessions + {{- if .Values.snuba.subscriptionConsumerSessions.podLabels }} +{{ toYaml .Values.snuba.subscriptionConsumerSessions.podLabels | indent 8 }} + {{- end }} + spec: + affinity: + {{- if .Values.snuba.subscriptionConsumerSessions.affinity }} +{{ toYaml .Values.snuba.subscriptionConsumerSessions.affinity | indent 8 }} + {{- end }} + {{- if .Values.snuba.subscriptionConsumerSessions.nodeSelector }} + nodeSelector: +{{ toYaml .Values.snuba.subscriptionConsumerSessions.nodeSelector | indent 8 }} + {{- end }} + {{- if .Values.snuba.subscriptionConsumerSessions.tolerations }} + tolerations: +{{ toYaml .Values.snuba.subscriptionConsumerSessions.tolerations | indent 8 }} + {{- end }} + {{- if .Values.images.snuba.imagePullSecrets }} + imagePullSecrets: +{{ toYaml .Values.images.snuba.imagePullSecrets | indent 8 }} + {{- end }} + {{- if .Values.snuba.subscriptionConsumerSessions.securityContext }} + securityContext: +{{ toYaml .Values.snuba.subscriptionConsumerSessions.securityContext | indent 8 }} + {{- end }} + containers: + - name: {{ .Chart.Name }}-snuba + image: "{{ template "snuba.image" . }}" + imagePullPolicy: {{ default "IfNotPresent" .Values.images.snuba.pullPolicy }} + command: + - "snuba" + - "subscriptions-scheduler-executor" + - "--auto-offset-reset={{ .Values.snuba.subscriptionConsumerSessions.autoOffsetReset }}" + - "--dataset=sessions" + - "--entity=sessions" + {{- if .Values.snuba.subscriptionConsumerSessions.noStrictOffsetReset }} + - "--no-strict-offset-reset" + {{- end }} + - "--consumer-group=snuba-sessions-subscriptions-consumers" + - "--followed-consumer-group=snuba-consumers" + - "--delay-seconds=60" + - "--schedule-ttl=60" + - "--stale-threshold-seconds=900" + ports: + - containerPort: {{ template "snuba.port" }} + env: +{{ include "sentry.snuba.env" . | indent 8 }} +{{- if .Values.snuba.subscriptionConsumerSessions.env }} +{{ toYaml .Values.snuba.subscriptionConsumerSessions.env | indent 8 }} +{{- end }} + envFrom: + - secretRef: + name: {{ template "sentry.fullname" . }}-snuba-env + volumeMounts: + - mountPath: /etc/snuba + name: config + readOnly: true +{{- if .Values.snuba.subscriptionConsumerSessions.volumeMounts }} +{{ toYaml .Values.snuba.subscriptionConsumerSessions.volumeMounts | indent 8 }} +{{- end }} + resources: +{{ toYaml .Values.snuba.subscriptionConsumerSessions.resources | indent 12 }} + {{- if .Values.serviceAccount.enabled }} + serviceAccountName: {{ .Values.serviceAccount.name }}-snuba + {{- end }} + volumes: + - name: config + configMap: + name: {{ template "sentry.fullname" . }}-snuba +{{- if .Values.snuba.subscriptionConsumerSessions.volumes }} +{{ toYaml .Values.snuba.subscriptionConsumerSessions.volumes | indent 6 }} +{{- end }} diff --git a/sentry/templates/serviceaccount-sentry-ingest-replay-recordings.yaml b/sentry/templates/serviceaccount-sentry-ingest-replay-recordings.yaml new file mode 100644 index 000000000..cd9cd9114 --- /dev/null +++ b/sentry/templates/serviceaccount-sentry-ingest-replay-recordings.yaml @@ -0,0 +1,10 @@ +{{- if .Values.serviceAccount.enabled }} +apiVersion: v1 +kind: ServiceAccount +metadata: + name: {{ .Values.serviceAccount.name }}-ingest-replay-recordings +{{- if .Values.serviceAccount.annotations }} + annotations: {{ toYaml .Values.serviceAccount.annotations | nindent 4 }} +{{- end }} +automountServiceAccountToken: {{ .Values.serviceAccount.automountServiceAccountToken }} +{{- end }} \ No newline at end of file diff --git a/sentry/values.yaml b/sentry/values.yaml index 9cb042396..1470e071d 100644 --- a/sentry/values.yaml +++ b/sentry/values.yaml @@ -233,6 +233,30 @@ sentry: # - mountPath: /dev/shm # name: dshm + ingestReplayRecordings: + replicas: 1 + env: [] + resources: {} + affinity: {} + nodeSelector: {} + securityContext: {} + # tolerations: [] + # podLabels: [] + + # it's better to use prometheus adapter and scale based on + # the size of the rabbitmq queue + autoscaling: + enabled: false + minReplicas: 1 + maxReplicas: 3 + targetCPUUtilizationPercentage: 50 + sidecars: [] + volumes: [] + + # volumeMounts: + # - mountPath: /dev/shm + # name: dshm + billingMetricsConsumer: replicas: 1 # concurrency: 4 @@ -286,6 +310,20 @@ sentry: # noStrictOffsetReset: false # volumeMounts: [] + subscriptionConsumerSessions: + replicas: 1 + env: [] + resources: {} + affinity: {} + nodeSelector: {} + securityContext: {} + # tolerations: [] + # podLabels: [] + sidecars: [] + volumes: [] + # noStrictOffsetReset: false + # volumeMounts: [] + subscriptionConsumerTransactions: replicas: 1 env: [] @@ -310,7 +348,6 @@ sentry: securityContext: {} # tolerations: [] # podLabels: [] - # commitBatchSize: 1 sidecars: [] volumes: [] # volumeMounts: [] @@ -324,7 +361,6 @@ sentry: securityContext: {} # tolerations: [] # podLabels: [] - # commitBatchSize: 1 sidecars: [] volumes: [] # volumeMounts: [] @@ -440,7 +476,6 @@ snuba: # tolerations: [] # podLabels: [] autoOffsetReset: "earliest" - maxBatchSize: "3" # maxBatchTimeMs: "" # queuedMaxMessagesKbytes: "" # queuedMinMessages: "" @@ -473,6 +508,49 @@ snuba: # volumes: [] # volumeMounts: [] + subscriptionConsumerSessions: + replicas: 1 + env: [] + resources: {} + affinity: {} + nodeSelector: {} + securityContext: {} + # tolerations: [] + # podLabels: [] + # commitBatchSize: 1 + autoOffsetReset: "earliest" + sidecars: [] + volumes: [] + # noStrictOffsetReset: false + # volumeMounts: [] + + replaysConsumer: + replicas: 1 + env: [] + resources: {} + affinity: {} + nodeSelector: {} + securityContext: {} + # tolerations: [] + # podLabels: [] + autoOffsetReset: "earliest" + # noStrictOffsetReset: false + # maxBatchSize: "" + # processes: "" + # inputBlockSize: "" + # outputBlockSize: "" + # maxBatchTimeMs: "" + # queuedMaxMessagesKbytes: "" + # queuedMinMessages: "" + + # volumeMounts: + # - mountPath: /dev/shm + # name: dshm + # volumes: + # - name: dshm + # emptyDir: + # medium: Memory + sessionsConsumer: replicas: 1 env: [] @@ -533,33 +611,6 @@ snuba: migrateJob: env: [] - cleanupErrors: - successfulJobsHistoryLimit: 5 - activeDeadlineSeconds: 100 - concurrencyPolicy: Allow - enabled: true - schedule: "0 * * * *" - sidecars: [] - volumes: [] - # securityContext: {} - serviceAccount: {} - # volumes: [] - # volumeMounts: [] - - cleanupTransactions: - successfulJobsHistoryLimit: 5 - failedJobsHistoryLimit: 5 - activeDeadlineSeconds: 100 - concurrencyPolicy: Allow - enabled: true - schedule: "0 * * * *" - sidecars: [] - volumes: [] - # securityContext: {} - serviceAccount: {} - # volumes: [] - # volumeMounts: [] - hooks: enabled: true removeOnSuccess: true From 096c37d8430c02b249088d3eb52f815edaf16cbf Mon Sep 17 00:00:00 2001 From: Cong Nguyen Date: Wed, 3 May 2023 01:27:30 +0700 Subject: [PATCH 048/394] recent changes in snuba break clickhouse 20.8 (#832) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Since, https://github.com/getsentry/snuba/pull/3604, which is live in sentry 23.1.1 and 23.2, sentry won't process event because of clickhouse error: `QueryExecutionError: DB::Exception: Illegal column for DataTypeNullable.` Upgrading clickhouse to 20.12 seems to fix the problem, it's a minor version bump so I'm not sure if there's any side-effect. It's running fine on my end though Co-authored-by: Théo Mathieu --- sentry/Chart.yaml | 2 +- sentry/values.yaml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/sentry/Chart.yaml b/sentry/Chart.yaml index 05c306312..08766d0c8 100644 --- a/sentry/Chart.yaml +++ b/sentry/Chart.yaml @@ -2,7 +2,7 @@ apiVersion: v2 name: sentry description: A Helm chart for Kubernetes type: application -version: 17.12.0 +version: 18.0.0 appVersion: 23.3.1 dependencies: - name: memcached diff --git a/sentry/values.yaml b/sentry/values.yaml index 1470e071d..de2f92442 100644 --- a/sentry/values.yaml +++ b/sentry/values.yaml @@ -904,7 +904,7 @@ config: clickhouse: enabled: true clickhouse: - imageVersion: "20.8.19.4" + imageVersion: "20.12.8.5" configmap: remote_servers: internal_replication: true From 9baec0ec704c63eb3225bf50c395d30ac47463a5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Th=C3=A9o=20Mathieu?= Date: Thu, 4 May 2023 08:55:19 +0200 Subject: [PATCH 049/394] Update README.md --- README.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/README.md b/README.md index 42fd40fa1..ad99df15c 100644 --- a/README.md +++ b/README.md @@ -14,6 +14,14 @@ Big thanks to the maintainers of the [deprecated chart](https://github.com/helm/ For now the full list of values is not documented but you can get inspired by the values.yaml specific to each directory. + +## Upgrading from 17.x.x version of this Chart to 18.x.x + +If Kafka is complaining about unknown or missing topic, please connect to kafka-0 and run + +`/opt/bitnami/kafka/bin/kafka-topics.sh --create --topic ingest-replay-recordings --bootstrap-server localhost:9092` + + ## Upgrading from 16.x.x version of this Chart to 17.x.x Sentry version from 22.10.0 onwards should be using chart 17.x.x From f5e98e163049c29b97522e5776e9ce23e0f6d469 Mon Sep 17 00:00:00 2001 From: Daniel McAssey Date: Tue, 16 May 2023 15:25:39 +0100 Subject: [PATCH 050/394] Add new required service accounts (#816) --- sentry/Chart.yaml | 2 +- ...serviceaccount-sentry-billing-metrics-consumer.yaml | 10 ++++++++++ ...iceaccount-sentry-ingest-metrics-consumer-perf.yaml | 10 ++++++++++ ...rviceaccount-sentry-ingest-metrics-consumer-rh.yaml | 10 ++++++++++ 4 files changed, 31 insertions(+), 1 deletion(-) create mode 100644 sentry/templates/serviceaccount-sentry-billing-metrics-consumer.yaml create mode 100644 sentry/templates/serviceaccount-sentry-ingest-metrics-consumer-perf.yaml create mode 100644 sentry/templates/serviceaccount-sentry-ingest-metrics-consumer-rh.yaml diff --git a/sentry/Chart.yaml b/sentry/Chart.yaml index 08766d0c8..2b3cf5842 100644 --- a/sentry/Chart.yaml +++ b/sentry/Chart.yaml @@ -2,7 +2,7 @@ apiVersion: v2 name: sentry description: A Helm chart for Kubernetes type: application -version: 18.0.0 +version: 18.0.1 appVersion: 23.3.1 dependencies: - name: memcached diff --git a/sentry/templates/serviceaccount-sentry-billing-metrics-consumer.yaml b/sentry/templates/serviceaccount-sentry-billing-metrics-consumer.yaml new file mode 100644 index 000000000..10cc9b9b0 --- /dev/null +++ b/sentry/templates/serviceaccount-sentry-billing-metrics-consumer.yaml @@ -0,0 +1,10 @@ +{{- if .Values.serviceAccount.enabled }} +apiVersion: v1 +kind: ServiceAccount +metadata: + name: {{ .Values.serviceAccount.name }}-billing-metrics-consumer +{{- if .Values.serviceAccount.annotations }} + annotations: {{ toYaml .Values.serviceAccount.annotations | nindent 4 }} +{{- end }} +automountServiceAccountToken: {{ .Values.serviceAccount.automountServiceAccountToken }} +{{- end }} diff --git a/sentry/templates/serviceaccount-sentry-ingest-metrics-consumer-perf.yaml b/sentry/templates/serviceaccount-sentry-ingest-metrics-consumer-perf.yaml new file mode 100644 index 000000000..36504786e --- /dev/null +++ b/sentry/templates/serviceaccount-sentry-ingest-metrics-consumer-perf.yaml @@ -0,0 +1,10 @@ +{{- if .Values.serviceAccount.enabled }} +apiVersion: v1 +kind: ServiceAccount +metadata: + name: {{ .Values.serviceAccount.name }}-ingest-metrics-consumer-perf +{{- if .Values.serviceAccount.annotations }} + annotations: {{ toYaml .Values.serviceAccount.annotations | nindent 4 }} +{{- end }} +automountServiceAccountToken: {{ .Values.serviceAccount.automountServiceAccountToken }} +{{- end }} diff --git a/sentry/templates/serviceaccount-sentry-ingest-metrics-consumer-rh.yaml b/sentry/templates/serviceaccount-sentry-ingest-metrics-consumer-rh.yaml new file mode 100644 index 000000000..601a711d6 --- /dev/null +++ b/sentry/templates/serviceaccount-sentry-ingest-metrics-consumer-rh.yaml @@ -0,0 +1,10 @@ +{{- if .Values.serviceAccount.enabled }} +apiVersion: v1 +kind: ServiceAccount +metadata: + name: {{ .Values.serviceAccount.name }}-ingest-metrics-consumer-rh +{{- if .Values.serviceAccount.annotations }} + annotations: {{ toYaml .Values.serviceAccount.annotations | nindent 4 }} +{{- end }} +automountServiceAccountToken: {{ .Values.serviceAccount.automountServiceAccountToken }} +{{- end }} From 47bc4c1224b68c5fda4f486921356ca64ff0e75a Mon Sep 17 00:00:00 2001 From: Anton Donskoy Date: Thu, 18 May 2023 09:59:58 +0300 Subject: [PATCH 051/394] Upgrade Sentry to 23.5.0 (#882) --- README.md | 10 ++++++++ sentry/Chart.lock | 8 +++---- sentry/Chart.yaml | 8 +++---- sentry/charts/postgresql-10.16.2.tgz | Bin 53913 -> 0 bytes sentry/charts/postgresql-12.5.1.tgz | Bin 0 -> 56267 bytes sentry/templates/_helper.tpl | 13 ++++++++--- sentry/templates/configmap-sentry.yaml | 22 ++++++++++++++++-- sentry/templates/configmap-snuba.yaml | 1 + ...t-sentry-subscription-consumer-events.yaml | 2 -- ...ry-subscription-consumer-transactions.yaml | 2 -- sentry/values.yaml | 12 ++++++---- 11 files changed, 56 insertions(+), 22 deletions(-) delete mode 100644 sentry/charts/postgresql-10.16.2.tgz create mode 100644 sentry/charts/postgresql-12.5.1.tgz diff --git a/README.md b/README.md index ad99df15c..3116d17e8 100644 --- a/README.md +++ b/README.md @@ -15,6 +15,16 @@ Big thanks to the maintainers of the [deprecated chart](https://github.com/helm/ For now the full list of values is not documented but you can get inspired by the values.yaml specific to each directory. +## Upgrading from 18.x.x version of this Chart to 19.x.x + +Chart dependencies has been upgraded because of sentry requirements. +Changes: +- The minimum required version of Postgresql is 14.5 (works with 15.x too) + +Bumped dependencies: +- postgresql > 12.5.1 - latest wersion of chart with postgres 15 + + ## Upgrading from 17.x.x version of this Chart to 18.x.x If Kafka is complaining about unknown or missing topic, please connect to kafka-0 and run diff --git a/sentry/Chart.lock b/sentry/Chart.lock index c4c7fb1ca..809f3de9a 100644 --- a/sentry/Chart.lock +++ b/sentry/Chart.lock @@ -18,10 +18,10 @@ dependencies: repository: https://raw.githubusercontent.com/bitnami/charts/pre-2022/bitnami version: 8.32.2 - name: postgresql - repository: https://raw.githubusercontent.com/bitnami/charts/pre-2022/bitnami - version: 10.16.2 + repository: oci://registry-1.docker.io/bitnamicharts + version: 12.5.1 - name: nginx repository: https://charts.bitnami.com/bitnami version: 12.0.4 -digest: sha256:100e52b213962d99739dadb3d01800b811ef08340f23fd57ec7c0d2c71547f91 -generated: "2023-03-09T10:48:18.306934+11:00" +digest: sha256:1baaa6d1a512a64f46ce3325512d2606df366730c8256dc781812192da5595a0 +generated: "2023-05-15T18:18:28.638279+03:00" diff --git a/sentry/Chart.yaml b/sentry/Chart.yaml index 2b3cf5842..05c5ba1c9 100644 --- a/sentry/Chart.yaml +++ b/sentry/Chart.yaml @@ -2,8 +2,8 @@ apiVersion: v2 name: sentry description: A Helm chart for Kubernetes type: application -version: 18.0.1 -appVersion: 23.3.1 +version: 19.0.0 +appVersion: 23.5.0 dependencies: - name: memcached repository: https://charts.bitnami.com/bitnami @@ -31,8 +31,8 @@ dependencies: alias: rabbitmq condition: rabbitmq.enabled - name: postgresql - repository: https://raw.githubusercontent.com/bitnami/charts/pre-2022/bitnami - version: 10.16.2 + repository: oci://registry-1.docker.io/bitnamicharts + version: 12.5.1 condition: postgresql.enabled - name: nginx repository: https://charts.bitnami.com/bitnami diff --git a/sentry/charts/postgresql-10.16.2.tgz b/sentry/charts/postgresql-10.16.2.tgz deleted file mode 100644 index d3a6d0f8f51e3f5ef0fdfa10b3205e922b5fcea8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 53913 zcmV)UK(N0biwG0|00000|0w_~VMtOiV@ORlOnEsqVl!4SWK%V1T2nbTPgYhoO;>Dc zVQyr3R8em|NM&qo0PMZ{d)v0MDB7R(S70kyCw7mihvPV1x;y)B#dcGFwHq!qul8kq!U1_NL)7z}1&!uXUT_Iubpm_f=r z3pfwIyWgkR>-F~c_T<04UN8S|fA9J8@A`ZFm%GpVyZx8D-}U;>pTB(Z9q8RN9i>mg zIHce8?u;wnxNqcvQA9Z8m_%&Q0>FnHO$l8Lz#-&t3>j*{7{5o9VG<3%&29_Ear$S! z-|6pldaVG(C<;*IW5fn64@7W|2EZrtIf+^TP!tn}xdc1oJZ6J#*B670b;g)SaE?1Z znRoT?763OXg3iaz$5w!tPjSrUD>+KRgivs{R@1C0=CfpMH%GU$%PB(LIb148J#1e7r$uoK=mGFrcW71~1r+=L86YOW%^~GD>P%=_ z!THcq?<~R@NvN+zSPj4Rzg|H6YeYS#;ilT{?QJLf&>?i%ZDoV5*Xi$fc3WS1YCg(S zkpCg^ukRVh68YbI{(P?>|Mzz{^8YcO2Nd1?Ugvo$z*EHd0I(U{eX&14KTP_;i+@7& zL;pn&qW#`K|2f$WUhcwwqUX@xodkZ*|6vmRu>a5TZojv?yN`m&OaEmbp-I2LyZ^j3 zMG>NqqhJ8qyS?4M*WdM?_b+#QgWm37Z?E&u=ld^rf7sjI`@ikK#{|CPW6l2?7$%54 zfC5-M|NFap{k{GC{NLZ(%>PGuo;(5n$&fFWd+;VCV;F)MQaDE(QPz6$#JoI|t0};9 zI7PV<=OKa&?SP1I1o#Ycz-O3&TO5Xf+#pJEAl{=wDRP_�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 diff --git a/sentry/charts/postgresql-12.5.1.tgz b/sentry/charts/postgresql-12.5.1.tgz new file mode 100644 index 0000000000000000000000000000000000000000..20e4e62ae5004dfbf3d572a082f23e82b79becb8 GIT binary patch literal 56267 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 H06GQ$&occ2 literal 0 HcmV?d00001 diff --git a/sentry/templates/_helper.tpl b/sentry/templates/_helper.tpl index b2154084f..1c7c334b7 100644 --- a/sentry/templates/_helper.tpl +++ b/sentry/templates/_helper.tpl @@ -36,7 +36,7 @@ {{- define "symbolicator.image" -}} {{- default "getsentry/symbolicator" .Values.images.symbolicator.repository -}} : -{{- .Values.images.symbolicator.tag -}} +{{- default .Chart.AppVersion .Values.images.symbolicator.tag -}} {{- end -}} {{- define "dbCheck.image" -}} @@ -214,7 +214,7 @@ Set postgres port */}} {{- define "sentry.postgresql.port" -}} {{- if .Values.postgresql.enabled -}} -{{- default 5432 .Values.postgresql.service.port }} +{{- default 5432 .Values.postgresql.primary.service.ports.postgresql }} {{- else -}} {{- required "A valid .Values.externalPostgresql.port is required" .Values.externalPostgresql.port -}} {{- end -}} @@ -469,7 +469,7 @@ Common Sentry environment variables valueFrom: secretKeyRef: name: {{ default (include "sentry.postgresql.fullname" .) .Values.postgresql.existingSecret }} - key: {{ default "postgresql-password" .Values.postgresql.existingSecretKey }} + key: {{ default "postgres-password" .Values.postgresql.existingSecretKey }} {{- else if .Values.externalPostgresql.password }} - name: POSTGRES_PASSWORD value: {{ .Values.externalPostgresql.password | quote }} @@ -533,4 +533,11 @@ Common Sentry environment variables name: {{ .Values.github.existingSecret }} key: {{ default "client-secret" .Values.github.existingSecretClientSecretKey }} {{- end }} +{{- if .Values.openai.existingSecret }} +- name: OPENAI_API_KEY + valueFrom: + secretKeyRef: + name: {{ .Values.openai.existingSecret }} + key: {{ default "api-token" .Values.openai.existingSecretKey }} +{{- end }} {{- end -}} \ No newline at end of file diff --git a/sentry/templates/configmap-sentry.yaml b/sentry/templates/configmap-sentry.yaml index aeac36736..f34505350 100644 --- a/sentry/templates/configmap-sentry.yaml +++ b/sentry/templates/configmap-sentry.yaml @@ -135,6 +135,12 @@ data: from sentry.conf.server import * # NOQA from distutils.util import strtobool + BYTE_MULTIPLIER = 1024 + UNITS = ("K", "M", "G") + def unit_text_to_bytes(text): + unit = text[-1].upper() + power = UNITS.index(unit) + 1 + return float(text[:-1])*(BYTE_MULTIPLIER**power) {{- if .Values.sourcemaps.enabled }} CACHES = { @@ -142,7 +148,11 @@ data: "BACKEND": "django.core.cache.backends.memcached.MemcachedCache", "LOCATION": [ "{{ template "sentry.fullname" . }}-memcached:11211" - ] + ], + "TIMEOUT": 3600, + "OPTIONS": { + "server_max_value_length": unit_text_to_bytes(env("SENTRY_MAX_EXTERNAL_SOURCEMAP_SIZE", "1M")), + }, } } import memcache @@ -460,7 +470,7 @@ data: ######################### # Bitbucket Integration # - ######################## + ######################### # BITBUCKET_CONSUMER_KEY = 'YOUR_BITBUCKET_CONSUMER_KEY' # BITBUCKET_CONSUMER_SECRET = 'YOUR_BITBUCKET_CONSUMER_SECRET' @@ -471,6 +481,14 @@ data: SENTRY_RELAY_WHITELIST_PK = [] SENTRY_RELAY_OPEN_REGISTRATION = True + ####################### + # OpenAi Suggestions # + ####################### + + OPENAI_API_KEY = os.getenv("OPENAI_API_KEY", "") + if OPENAI_API_KEY: + SENTRY_FEATURES["organizations:open-ai-suggestion"] = True + {{- if .Values.metrics.enabled }} SENTRY_METRICS_BACKEND = 'sentry.metrics.statsd.StatsdMetricsBackend' SENTRY_METRICS_OPTIONS = { diff --git a/sentry/templates/configmap-snuba.yaml b/sentry/templates/configmap-snuba.yaml index 05b169c76..f4897c001 100644 --- a/sentry/templates/configmap-snuba.yaml +++ b/sentry/templates/configmap-snuba.yaml @@ -45,6 +45,7 @@ data: "generic_metrics_distributions", "search_issues", "generic_metrics_counters", + "spans", }, {{- /* The default clickhouse installation runs in distributed mode, while the external diff --git a/sentry/templates/deployment-sentry-subscription-consumer-events.yaml b/sentry/templates/deployment-sentry-subscription-consumer-events.yaml index b98c77d06..3f3eca3d3 100644 --- a/sentry/templates/deployment-sentry-subscription-consumer-events.yaml +++ b/sentry/templates/deployment-sentry-subscription-consumer-events.yaml @@ -71,8 +71,6 @@ spec: - "query-subscription-consumer" - "--topic" - "events-subscription-results" - - "--commit-batch-size" - - "{{ default "1" .Values.sentry.subscriptionConsumerEvents.commitBatchSize }}" env: {{ include "sentry.env" . | indent 8 }} {{- if .Values.sentry.subscriptionConsumerEvents.env }} diff --git a/sentry/templates/deployment-sentry-subscription-consumer-transactions.yaml b/sentry/templates/deployment-sentry-subscription-consumer-transactions.yaml index 45af3caee..2d10eec49 100644 --- a/sentry/templates/deployment-sentry-subscription-consumer-transactions.yaml +++ b/sentry/templates/deployment-sentry-subscription-consumer-transactions.yaml @@ -71,8 +71,6 @@ spec: - "query-subscription-consumer" - "--topic" - "transactions-subscription-results" - - "--commit-batch-size" - - "{{ default "1" .Values.sentry.subscriptionConsumerEvents.commitBatchSize }}" env: {{ include "sentry.env" . | indent 8 }} {{- if .Values.sentry.subscriptionConsumerTransactions.env }} diff --git a/sentry/values.yaml b/sentry/values.yaml index de2f92442..58c26e024 100644 --- a/sentry/values.yaml +++ b/sentry/values.yaml @@ -35,7 +35,7 @@ images: imagePullSecrets: [] symbolicator: # repository: getsentry/symbolicator - tag: 0.6.0 + # tag: Chart.AppVersion # pullPolicy: IfNotPresent imagePullSecrets: [] @@ -304,7 +304,6 @@ sentry: securityContext: {} # tolerations: [] # podLabels: [] - # commitBatchSize: 1 sidecars: [] volumes: [] # noStrictOffsetReset: false @@ -333,7 +332,6 @@ sentry: securityContext: {} # tolerations: [] # podLabels: [] - # commitBatchSize: 1 sidecars: [] volumes: [] # noStrictOffsetReset: false @@ -799,6 +797,10 @@ slack: {} # existingSecret: # Reference -> https://develop.sentry.dev/integrations/slack/ +openai: {} +# existingSecret: "xxxxx" +# existingSecretKey: "" # by default "api-token" + nginx: enabled: true containerPort: 8080 @@ -1043,8 +1045,8 @@ externalRedis: postgresql: enabled: true nameOverride: sentry-postgresql - postgresqlUsername: postgres - postgresqlDatabase: sentry + auth: + database: sentry replication: enabled: false readReplicas: 2 From a964753b6fc785292c448e2f8d7c3099c696039d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rados=C5=82aw=20Andrusiak?= Date: Thu, 18 May 2023 09:01:04 +0200 Subject: [PATCH 052/394] feat: Allow to set specified merge_tree settings in config.xml (#884) --- clickhouse/Chart.yaml | 2 +- clickhouse/templates/configmap-config.yaml | 8 ++++++++ clickhouse/values.yaml | 10 ++++++++++ 3 files changed, 19 insertions(+), 1 deletion(-) diff --git a/clickhouse/Chart.yaml b/clickhouse/Chart.yaml index b694ba3e0..907dd72f7 100755 --- a/clickhouse/Chart.yaml +++ b/clickhouse/Chart.yaml @@ -11,6 +11,6 @@ keywords: name: clickhouse sources: - https://github.com/sentry-kubernetes/charts -version: 3.2.1 +version: 3.3.0 maintainers: - name: sentry-kubernetes diff --git a/clickhouse/templates/configmap-config.yaml b/clickhouse/templates/configmap-config.yaml index 3b8fd4b27..3b406689e 100755 --- a/clickhouse/templates/configmap-config.yaml +++ b/clickhouse/templates/configmap-config.yaml @@ -115,5 +115,13 @@ data: {{- if .Values.clickhouse.configmap.interserver_http_host }} {{ .Values.clickhouse.configmap.interserver_http_host }} {{- end }} + + {{- if .Values.clickhouse.configmap.merge_tree.enabled }} + + {{ .Values.clickhouse.configmap.merge_tree.parts_to_delay_insert }} + {{ .Values.clickhouse.configmap.merge_tree.parts_to_throw_insert }} + {{ .Values.clickhouse.configmap.merge_tree.max_part_loading_threads }} + + {{- end }} {{- end }} diff --git a/clickhouse/values.yaml b/clickhouse/values.yaml index 3ae2043ea..4f9f8355f 100755 --- a/clickhouse/values.yaml +++ b/clickhouse/values.yaml @@ -369,6 +369,16 @@ clickhouse: result_rows: "0" read_rows: "0" execution_time: "0" + ## Allows to configure specified MergeTree tables settings in config.xml + ## More info: https://clickhouse.com/docs/en/operations/settings/merge-tree-settings + merge_tree: + enabled: false + # If the number of active parts in a single partition exceeds the parts_to_delay_insert value, an INSERT artificially slows down. + parts_to_delay_insert: 150 + # If the number of inactive parts in a single partition more than the inactive_parts_to_throw_insert value, INSERT is interrupted with the "Too many inactive parts (N). Parts cleaning are processing significantly slower than inserts" exception. + parts_to_throw_insert: 300 + # The maximum number of threads that read parts when ClickHouse starts. + max_part_loading_threads: auto ## ## Web interface for ClickHouse in the Tabix project. From 6bdcea8690d207b29e610f28363841cf0b0912c9 Mon Sep 17 00:00:00 2001 From: Theo Mathieu Date: Tue, 23 May 2023 15:50:15 +0200 Subject: [PATCH 053/394] feat: updated clickhouse chart version --- sentry/Chart.lock | 6 +++--- sentry/Chart.yaml | 4 ++-- sentry/charts/clickhouse-3.2.0.tgz | Bin 12890 -> 0 bytes sentry/charts/clickhouse-3.3.0.tgz | Bin 0 -> 13058 bytes 4 files changed, 5 insertions(+), 5 deletions(-) delete mode 100644 sentry/charts/clickhouse-3.2.0.tgz create mode 100644 sentry/charts/clickhouse-3.3.0.tgz diff --git a/sentry/Chart.lock b/sentry/Chart.lock index 809f3de9a..66e1a82cc 100644 --- a/sentry/Chart.lock +++ b/sentry/Chart.lock @@ -10,7 +10,7 @@ dependencies: version: 16.3.2 - name: clickhouse repository: https://sentry-kubernetes.github.io/charts - version: 3.2.0 + version: 3.3.0 - name: zookeeper repository: https://raw.githubusercontent.com/bitnami/charts/pre-2022/bitnami version: 9.0.0 @@ -23,5 +23,5 @@ dependencies: - name: nginx repository: https://charts.bitnami.com/bitnami version: 12.0.4 -digest: sha256:1baaa6d1a512a64f46ce3325512d2606df366730c8256dc781812192da5595a0 -generated: "2023-05-15T18:18:28.638279+03:00" +digest: sha256:f29298bb2da18cd25a6e17ed317381b5434a70f855592e154f0f8488d720cbad +generated: "2023-05-23T15:49:48.955958+02:00" diff --git a/sentry/Chart.yaml b/sentry/Chart.yaml index 05c5ba1c9..c8bf3479a 100644 --- a/sentry/Chart.yaml +++ b/sentry/Chart.yaml @@ -2,7 +2,7 @@ apiVersion: v2 name: sentry description: A Helm chart for Kubernetes type: application -version: 19.0.0 +version: 19.1.0 appVersion: 23.5.0 dependencies: - name: memcached @@ -19,7 +19,7 @@ dependencies: condition: kafka.enabled - name: clickhouse repository: https://sentry-kubernetes.github.io/charts - version: 3.2.0 + version: 3.3.0 condition: clickhouse.enabled - name: zookeeper repository: https://raw.githubusercontent.com/bitnami/charts/pre-2022/bitnami diff --git a/sentry/charts/clickhouse-3.2.0.tgz b/sentry/charts/clickhouse-3.2.0.tgz deleted file mode 100644 index de28088d3478ed677ad76f66fc227a956e2babf9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12890 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 Date: Tue, 30 May 2023 21:20:13 -0700 Subject: [PATCH 054/394] Add ingest-monitors to support CRON (#897) * Add ingest-monitors to support CRON * Bump chart version --- sentry/Chart.yaml | 2 +- .../deployment-sentry-ingest-monitors.yaml | 135 ++++++++++++++++++ ...serviceaccount-sentry-ingest-monitors.yaml | 10 ++ sentry/values.yaml | 24 ++++ 4 files changed, 170 insertions(+), 1 deletion(-) create mode 100644 sentry/templates/deployment-sentry-ingest-monitors.yaml create mode 100644 sentry/templates/serviceaccount-sentry-ingest-monitors.yaml diff --git a/sentry/Chart.yaml b/sentry/Chart.yaml index c8bf3479a..b11a77af6 100644 --- a/sentry/Chart.yaml +++ b/sentry/Chart.yaml @@ -2,7 +2,7 @@ apiVersion: v2 name: sentry description: A Helm chart for Kubernetes type: application -version: 19.1.0 +version: 19.1.1 appVersion: 23.5.0 dependencies: - name: memcached diff --git a/sentry/templates/deployment-sentry-ingest-monitors.yaml b/sentry/templates/deployment-sentry-ingest-monitors.yaml new file mode 100644 index 000000000..9ae5bb798 --- /dev/null +++ b/sentry/templates/deployment-sentry-ingest-monitors.yaml @@ -0,0 +1,135 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: {{ template "sentry.fullname" . }}-ingest-monitors + labels: + app: {{ template "sentry.fullname" . }} + chart: "{{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }}" + release: "{{ .Release.Name }}" + heritage: "{{ .Release.Service }}" + app.kubernetes.io/managed-by: "Helm" + {{- if .Values.asHook }} + {{- /* Add the Helm annotations so that deployment after asHook from true to false works */}} + annotations: + meta.helm.sh/release-name: "{{ .Release.Name }}" + meta.helm.sh/release-namespace: "{{ .Release.Namespace }}" + "helm.sh/hook": "post-install,post-upgrade" + "helm.sh/hook-weight": "10" + {{- end }} +spec: + revisionHistoryLimit: {{ .Values.revisionHistoryLimit }} + selector: + matchLabels: + app: {{ template "sentry.fullname" . }} + release: "{{ .Release.Name }}" + role: ingest-monitors +{{- if not .Values.sentry.ingestMonitors.autoscaling.enabled }} + replicas: {{ .Values.sentry.ingestMonitors.replicas }} +{{- end }} + template: + metadata: + annotations: + checksum/configYml: {{ .Values.config.configYml | toYaml | toString | sha256sum }} + checksum/sentryConfPy: {{ .Values.config.sentryConfPy | sha256sum }} + checksum/config.yaml: {{ include (print $.Template.BasePath "/configmap-sentry.yaml") . | sha256sum }} + {{- if .Values.sentry.ingestMonitors.annotations }} +{{ toYaml .Values.sentry.ingestMonitors.annotations | indent 8 }} + {{- end }} + labels: + app: {{ template "sentry.fullname" . }} + release: "{{ .Release.Name }}" + role: ingest-monitors + {{- if .Values.sentry.ingestMonitors.podLabels }} +{{ toYaml .Values.sentry.ingestMonitors.podLabels | indent 8 }} + {{- end }} + spec: + affinity: + {{- if .Values.sentry.ingestMonitors.affinity }} +{{ toYaml .Values.sentry.ingestMonitors.affinity | indent 8 }} + {{- end }} + {{- if .Values.sentry.ingestMonitors.nodeSelector }} + nodeSelector: +{{ toYaml .Values.sentry.ingestMonitors.nodeSelector | indent 8 }} + {{- end }} + {{- if .Values.sentry.ingestMonitors.tolerations }} + tolerations: +{{ toYaml .Values.sentry.ingestMonitors.tolerations | indent 8 }} + {{- end }} + {{- if .Values.images.sentry.imagePullSecrets }} + imagePullSecrets: +{{ toYaml .Values.images.sentry.imagePullSecrets | indent 8 }} + {{- end }} + {{- if .Values.dnsPolicy }} + dnsPolicy: {{ .Values.dnsPolicy | quote }} + {{- end }} + {{- if .Values.dnsConfig }} + dnsConfig: +{{ toYaml .Values.dnsConfig | indent 8 }} + {{- end }} + {{- if .Values.sentry.ingestMonitors.securityContext }} + securityContext: +{{ toYaml .Values.sentry.ingestMonitors.securityContext | indent 8 }} + {{- end }} + containers: + - name: {{ .Chart.Name }}-ingest-monitors + image: "{{ template "sentry.image" . }}" + imagePullPolicy: {{ default "IfNotPresent" .Values.images.sentry.pullPolicy }} + command: ["sentry"] + args: + - "run" + - "ingest-monitors" + env: + - name: C_FORCE_ROOT + value: "true" +{{ include "sentry.env" . | indent 8 }} +{{- if .Values.sentry.ingestMonitors.env }} +{{ toYaml .Values.sentry.ingestMonitors.env | indent 8 }} +{{- end }} + volumeMounts: + - mountPath: /etc/sentry + name: config + readOnly: true + - mountPath: {{ .Values.filestore.filesystem.path }} + name: sentry-data + {{- if and (eq .Values.filestore.backend "gcs") .Values.filestore.gcs.secretName }} + - name: sentry-google-cloud-key + mountPath: /var/run/secrets/google + {{ end }} +{{- if .Values.sentry.ingestMonitors.volumeMounts }} +{{ toYaml .Values.sentry.ingestMonitors.volumeMounts | indent 8 }} +{{- end }} + resources: +{{ toYaml .Values.sentry.ingestMonitors.resources | indent 12 }} +{{- if .Values.sentry.ingestMonitors.sidecars }} +{{ toYaml .Values.sentry.ingestMonitors.sidecars | indent 6 }} +{{- end }} + {{- if .Values.serviceAccount.enabled }} + serviceAccountName: {{ .Values.serviceAccount.name }}-ingest-monitors + {{- end }} + volumes: + - name: config + configMap: + name: {{ template "sentry.fullname" . }}-sentry + - name: sentry-data + {{- if and (eq .Values.filestore.backend "filesystem") .Values.filestore.filesystem.persistence.enabled (.Values.filestore.filesystem.persistence.persistentWorkers) }} + {{- if .Values.filestore.filesystem.persistence.existingClaim }} + persistentVolumeClaim: + claimName: {{ .Values.filestore.filesystem.persistence.existingClaim }} + {{- else }} + persistentVolumeClaim: + claimName: {{ template "sentry.fullname" . }}-data + {{- end }} + {{- else }} + emptyDir: {} + {{ end }} + {{- if and (eq .Values.filestore.backend "gcs") .Values.filestore.gcs.secretName }} + - name: sentry-google-cloud-key + secret: + secretName: {{ .Values.filestore.gcs.secretName }} + {{ end }} +{{- if .Values.sentry.ingestMonitors.volumes }} +{{ toYaml .Values.sentry.ingestMonitors.volumes | indent 6 }} +{{- end }} + {{- if .Values.sentry.ingestMonitors.priorityClassName }} + priorityClassName: "{{ .Values.sentry.ingestMonitors.priorityClassName }}" + {{- end }} diff --git a/sentry/templates/serviceaccount-sentry-ingest-monitors.yaml b/sentry/templates/serviceaccount-sentry-ingest-monitors.yaml new file mode 100644 index 000000000..772e47508 --- /dev/null +++ b/sentry/templates/serviceaccount-sentry-ingest-monitors.yaml @@ -0,0 +1,10 @@ +{{- if .Values.serviceAccount.enabled }} +apiVersion: v1 +kind: ServiceAccount +metadata: + name: {{ .Values.serviceAccount.name }}-ingest-monitors +{{- if .Values.serviceAccount.annotations }} + annotations: {{ toYaml .Values.serviceAccount.annotations | nindent 4 }} +{{- end }} +automountServiceAccountToken: {{ .Values.serviceAccount.automountServiceAccountToken }} +{{- end }} \ No newline at end of file diff --git a/sentry/values.yaml b/sentry/values.yaml index 58c26e024..a3cb00767 100644 --- a/sentry/values.yaml +++ b/sentry/values.yaml @@ -257,6 +257,30 @@ sentry: # - mountPath: /dev/shm # name: dshm + ingestMonitors: + replicas: 1 + env: [] + resources: {} + affinity: {} + nodeSelector: {} + securityContext: {} + # tolerations: [] + # podLabels: [] + + # it's better to use prometheus adapter and scale based on + # the size of the rabbitmq queue + autoscaling: + enabled: false + minReplicas: 1 + maxReplicas: 3 + targetCPUUtilizationPercentage: 50 + sidecars: [] + volumes: [] + + # volumeMounts: + # - mountPath: /dev/shm + # name: dshm + billingMetricsConsumer: replicas: 1 # concurrency: 4 From 1ffee543953a2220cb90b36b9e0d80bdffad2248 Mon Sep 17 00:00:00 2001 From: Anton Donskoy Date: Fri, 2 Jun 2023 07:52:42 +0300 Subject: [PATCH 055/394] [19.2.0] Dependency upgrade + 23.5.2 release (#895) * Dependency upgrade * version update * Update sentry to 23.5.2 --------- Co-authored-by: Anton Donskoy --- sentry/Chart.lock | 20 ++++++++++---------- sentry/Chart.yaml | 20 ++++++++++---------- sentry/charts/memcached-6.1.5.tgz | Bin 33934 -> 0 bytes sentry/charts/memcached-6.5.2.tgz | Bin 0 -> 32381 bytes sentry/charts/nginx-12.0.4.tgz | Bin 39486 -> 0 bytes sentry/charts/nginx-14.2.2.tgz | Bin 0 -> 37872 bytes sentry/charts/rabbitmq-11.15.3.tgz | Bin 0 -> 55665 bytes sentry/charts/rabbitmq-8.32.2.tgz | Bin 50217 -> 0 bytes sentry/charts/redis-16.12.1.tgz | Bin 88759 -> 0 bytes sentry/charts/redis-17.11.3.tgz | Bin 0 -> 91655 bytes 10 files changed, 20 insertions(+), 20 deletions(-) delete mode 100644 sentry/charts/memcached-6.1.5.tgz create mode 100644 sentry/charts/memcached-6.5.2.tgz delete mode 100644 sentry/charts/nginx-12.0.4.tgz create mode 100644 sentry/charts/nginx-14.2.2.tgz create mode 100644 sentry/charts/rabbitmq-11.15.3.tgz delete mode 100644 sentry/charts/rabbitmq-8.32.2.tgz delete mode 100644 sentry/charts/redis-16.12.1.tgz create mode 100644 sentry/charts/redis-17.11.3.tgz diff --git a/sentry/Chart.lock b/sentry/Chart.lock index 66e1a82cc..4af6f322c 100644 --- a/sentry/Chart.lock +++ b/sentry/Chart.lock @@ -1,10 +1,10 @@ dependencies: - name: memcached - repository: https://charts.bitnami.com/bitnami - version: 6.1.5 + repository: oci://registry-1.docker.io/bitnamicharts + version: 6.5.2 - name: redis - repository: https://charts.bitnami.com/bitnami - version: 16.12.1 + repository: oci://registry-1.docker.io/bitnamicharts + version: 17.11.3 - name: kafka repository: https://raw.githubusercontent.com/bitnami/charts/pre-2022/bitnami version: 16.3.2 @@ -15,13 +15,13 @@ dependencies: repository: https://raw.githubusercontent.com/bitnami/charts/pre-2022/bitnami version: 9.0.0 - name: rabbitmq - repository: https://raw.githubusercontent.com/bitnami/charts/pre-2022/bitnami - version: 8.32.2 + repository: oci://registry-1.docker.io/bitnamicharts + version: 11.15.3 - name: postgresql repository: oci://registry-1.docker.io/bitnamicharts version: 12.5.1 - name: nginx - repository: https://charts.bitnami.com/bitnami - version: 12.0.4 -digest: sha256:f29298bb2da18cd25a6e17ed317381b5434a70f855592e154f0f8488d720cbad -generated: "2023-05-23T15:49:48.955958+02:00" + repository: oci://registry-1.docker.io/bitnamicharts + version: 14.2.2 +digest: sha256:54168dcc798193ef587a9e7f63f35fad08c7030853bd79e20effccbcc652ff85 +generated: "2023-05-25T20:54:03.230343+03:00" diff --git a/sentry/Chart.yaml b/sentry/Chart.yaml index b11a77af6..696f996b6 100644 --- a/sentry/Chart.yaml +++ b/sentry/Chart.yaml @@ -2,16 +2,16 @@ apiVersion: v2 name: sentry description: A Helm chart for Kubernetes type: application -version: 19.1.1 -appVersion: 23.5.0 +version: 19.2.0 +appVersion: 23.5.2 dependencies: - name: memcached - repository: https://charts.bitnami.com/bitnami - version: 6.1.5 + repository: oci://registry-1.docker.io/bitnamicharts + version: 6.5.2 condition: sourcemaps.enabled - name: redis - repository: https://charts.bitnami.com/bitnami - version: 16.12.1 + repository: oci://registry-1.docker.io/bitnamicharts + version: 17.11.3 condition: redis.enabled - name: kafka repository: https://raw.githubusercontent.com/bitnami/charts/pre-2022/bitnami @@ -26,8 +26,8 @@ dependencies: version: 9.0.0 condition: zookeeper.enabled - name: rabbitmq - repository: https://raw.githubusercontent.com/bitnami/charts/pre-2022/bitnami - version: 8.32.2 + repository: oci://registry-1.docker.io/bitnamicharts + version: 11.15.3 alias: rabbitmq condition: rabbitmq.enabled - name: postgresql @@ -35,8 +35,8 @@ dependencies: version: 12.5.1 condition: postgresql.enabled - name: nginx - repository: https://charts.bitnami.com/bitnami - version: 12.0.4 + repository: oci://registry-1.docker.io/bitnamicharts + version: 14.2.2 condition: nginx.enabled maintainers: - name: sentry-kubernetes diff --git a/sentry/charts/memcached-6.1.5.tgz b/sentry/charts/memcached-6.1.5.tgz deleted file mode 100644 index 52d48e079c09acf29c450376b106d97964df8609..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 33934 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 vj@guOHBF*8bRse(sWyhS=J=n{n)BoH_&h!jDc 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 PZf-P0%?bcDM1cPREOZi1 diff --git a/sentry/charts/nginx-14.2.2.tgz b/sentry/charts/nginx-14.2.2.tgz new file mode 100644 index 0000000000000000000000000000000000000000..d669b94f49d07fa8f8a02cdbc6ff3aa7ebad09a6 GIT binary patch literal 37872 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 kp@~w4mF~FT(3Dc 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 literal 0 HcmV?d00001 diff --git a/sentry/charts/rabbitmq-8.32.2.tgz b/sentry/charts/rabbitmq-8.32.2.tgz deleted file mode 100644 index bf27e3d5d632b9885bc6c1c1e1dd047a72671c94..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 50217 zcmV(}K+wM*iwG0|00000|0w_~VMtOiV@ORlOnEsqVl!4SWK%V1T2nbTPgYhoO;>Dc zVQyr3R8em|NM&qo0POvHdmA^BC=Sox{1iB}XDwybBqiCh!yV6ASyCK5u`VOY$(c8s zM*_P+5~F6L1E3{y9KWCa_n>fTpf4nKv6Go~?@las1BF7NP$(1%RUD5-RL*|w?@ck6 zy*Zwxe|qd^Fc=JWo(F^aIod{)kMusS6vl+`e2yv1#K_$SRN|}pczaJ}}6TK0Y8J^Kz z%w~P_cLyPfCxB9f%)7|Jy0J}f_CEAJbP^(BPIC#b&VZqh{)VVPI72Ka84|4EF+mfO z5suR+FL=%bK{Fx*o)9$R?3!>Sr&y|52@!OXk)(srm~j-dOi&?7CO6QOPNwNR!Z($0IYnZg#Z%5QRwz6YguNH*z0Q;=>R3WdsGJrfp8$q7eaQ*w z&#;h$yH9q`c4(}6Y=QV>#6l1$`a4|(C*RSPCGM9Gl^+NI20!{Oj9-7_T_(j=yZ_bhBsz(^)J_i9v^_S zfFhO+5*A+*9(f4bO1HPSJ^LEkb&T?=x4qTd>ipib?T`0Vql>6iTodIZ$Gcd z|E-rh&%et5FY!FK)b>R4=5}whlh6qfa)`tfZ@t(VZVq1TBshMR;8(8(B>8sdCEomY zle|j4C3rk|{&Ht${PN`}!8<$n#mmhX&tL2$FOuZ>^KYNy=lI*_TOBRKB}s;;yEWL_ ziU!Z4t(O;DgW=%SaBHi#^J;7R)yr4kzWo1nzs~j*9ykAQa9R-YSrov9^M7-Du)Vce z)&I7(zs~OHAd-as^q(;`volP`xhlo~OnlY)~3Nrnoc>rXT)z^SU? zy@GR+NmQz1lZD6*^_w#?p+fTchW>e4r0F?{IgwgX6OwT}A$utns(T&P(tiUG1HKnP zX(SLgA6x4BO@`HNMI_)eh+}~;sIr)I+yK$X*Frn@-zg>bREcF!V$qK*EoNj*tgFsx z7)s3!IyFSyZU>=5P(idvb~L`l|baPlHePgzRiTI1>q%HdOEEz67N zIf?0bj;w}#2WHg35;7_#=$uG3Z6z-VqGL2?1-fNLnxK?k6ZJ(9g2)HSF{0U+@fqwt z5zA1@CNSp!+7R>)%aCULD642CwM`N19PO?&O2~-fEZQ7Ie9+MxD;|a(z&Mmh7CaN^ z&F=a4N^JBQN5{KIhX_ajJ3^Y3QqN8W_&P*moC;#lu|&t^Jkg`5Kkt(bBJV$XKd zTRa!f6xt=DP=TJMSP~(hZ6J~gVte@PaD2?q+@YNF*B;g16T6z8ORhLfGF4tuppRQ>-41wMq^YWg zB$?%kL(m#5%697xbmRnk0 z;z`DYq%oSYgxDFOfz8zXd-9}H7CK^yWm|(>_^n3(Y|;jP4Xf3Ivk@^$-AI)Yx{lJA zRO4!0Qh(b5h7l5yty}gt%~)Vv~uV=fXBQU0n%uV9fwT_ssI4HG(gIt8Q@Efdz);#!hdR8*Qt}5(YF^ z%%}H8L)3lV?Uc0*>77!zTgWNNB#lisf+YtRavDkt^`@uv0ubX43eNM?g0Np3mg3b7 zxlc%TLpjUT%!qCn3Rmcw%(dV}q&G3+*^I&v z_$XrI$bOGBE>3Q@R8wncy_-D6*<_EgYf8`o{6Mk(1?!z8d`2^ZZl^>}2}cPXj|uGJ zGnNp&%fV^NZuQn*$&n&cgGe-K2#%+Ssj8oGB>he-9!=fDmBun8#ww$!(TH@7#Y5`j zvGRb1mE3R|HGpI>pM%6v1L1A2s#LF@y7Yxeds8_}>tvIusA?M*@6M4Z@|?p({Y!mkYL^!4%?3%wkv_r$=rQ4vj)8|nGuSbvsoKAs62kWgm*}S{$^3od zh6cp4%xLRY&EZ5Xd1_ZOMsZ3NA1h$6MCP2`fDYkf(2Rf(sopJ#9|>0*rSmE5NPo@= z;Y!ohwJFPfSzAi>C#q89S6Wx78oK}AW(;DyS0ai0ztw8NIF)m>wzs>EMn#sS1UT32 z^lIH9{6K$#5s zGDO{-7caJVbZ=e9X7~f06*JF@FXAaliWFQjIKhdw%d;$1ibL&V551YAL|e%am0C1w zV-dop5XuQhd#CR~0a5aLqug_knNl~@3@sI5Fbc*vL$b(-0&1;Ly}E4~&uGHQKXD{_ zhWwQE_0rup$SOsj6P!kp&PYG!gv@eDZ%BVeCwec@-x_T0^aor0!MCPvdM>hh0nia|>PEX@ERvdYGEvv<;wQlx7@Y@>c;m z)9)ReEq7MrFf~KDQa51UI0QvxB%mh7A3k08>2z*IT8|Qi9SkuKKQeG zTh4~F-6LK5n5l(LmTYNzfItj_N1ED_>aC5o_i2&Y(;~BH*_ojjr*Q!`TiL+oy1l;} zA%#<+4@uSEhO`>}4YgJ14bj$%oufCFyv9Z_=sowBojffjN-cRug;f2sWU%igGwguY zgjP;jmd=$%f>TM%Ni8QccH>AW{tF0(lZ5J%00&GVdj%HGQ~l-&Otj{+8hbM_E@wEy z69Ox*d#99*%Y=%U-4H&%ynZD@Yp&ii%K2%fOMCW%!(;9J**meWFdq?=u-hzUI3Wp2 z^h9x%KSVRC)Is`ByLKyJBdQk%y)pHAqb*~?QA|$BtY^()K5A7%bO7W4ti?_Ar`beF zVd*2O{=^7QL?S^HIJGTFsQ~LYdJkvlR3Np0s})gcjt2IXHRxsJ*0$$N(5Lk=QEKqz z2*=kXOD@v{=eiHZo~CtOsdP2rS`@4%Sxn7m<3n&Xy{`cp}{3>6vq zkb}~s_SVxv!bEXBS)*B4O0S*kMkbel$p;b_k_hz7Vjs&?f4@}CJ%dxEvUS@)*<^r; zZT31-pP>Z3E2L{o!UX}+xVWr!?-FumU~ ztvcayekKG?I^aw|srcGrXHHm4Z31>WIN5ilLqQOJs|thk-pwvoVk#{ItYbVQcH>xW z$nghFm4ed8dEQqrF3W8oiPGY7sJ>zzvGy#2p zKr=N$@a_7QK)0AmVebbReAE*Cfl4$YW5x**BunhJ0SP+Ea0=VU-E5B3Mo@tyA7Ube z; z)}W@09Aq~?Vs4d@CPRpS9O$NK&h)16pr;S7d{~w9tM5)uDyLU(cF&ypVe3=|&;Pb} zUm(|Thb(~oG}&vLXb>Q*ea;OTCbwh zJPV=3o@KvN#-&pl;cu!Xa6xDgwr892BYC4{uOf6eB2FQ9DG~Zj)kDZ|;fSnAn{PSf-iMqT%(W zetl_Pqt|Fgvq-;$V-dR_ofJe!eJZc;V!0ZA;7`%h-(EZ2>*Gfx^VH#4pE{`5NQ&C& zArulKy);e{J$(?-Fe4hz*E9{mBU+&;L~6M#gkan<6c8n_>dlTZO)u&AGGm&@W5Q(% z617vt8n76v>M&ZbQJ>|q?x?H^h<=POy@R4&PG(g|tHIF+B1>RhllkhPuF2ehSjgE4 z&cmVfZ3?2dSxSzYv7uIY3%y1#v(?I_o8mZ|5cHI03Hh*ro@(6C@O6lQel0u%{MSm< zD7mkppiT7YlO9+Lu0Ekk7;u~&PD%H=QdCWp%OtzZu~dC%s8ub|PSV;837WYSA}wWD zZG74WYepoev8XK!r<~1*oRUHyQ^aj0-Itz>9WlOrzWMFarrHhJwpnAuy$Ecf9fTy4 zIK9*mE}eDu(ysQG+MWy4H7ZeQ(&|a}W-f{7I!vr(R#Z&0fW^(swlk%Z>7_Fz`>Ru{ zf!wmuqJkRN>c}*xeoflaA|*-dqoJCm)kK`b1)NZguc=UtX2dvDaAcdl2xkf>N3h0UB;2bzodTpa1!z-JrFbfH!QBvaoR&u^WJ#xmj;`Luy*Rhrh`je4O}gphu*zkd0o|N8U`?2g;10Ol_>1~qn8U9VWP z{H4v6+^njA0{I)%_Yuiqlh)mS^{p{motk9^ zJWap>3TMI{MH#QA#5rWDwU;>$HZ4q`s`aLTmPa&8>X=nmw$I%35`PVa5g17=d=cR+ ziIOaELiO++qBwi~^rJ2QX(NeW6Maua{mJ;m_ra<3-CwKCTqn*Y4ko#ELQo>Wi6b+c z%xnj5m6naBb7wHEH#q`TmlSD(Ly*@Y!&BQz#@-|y2ifqEVP7Esu$#T_EE zT+a6?H;&kypkk9@%ie)%MN^mpn&s`yDC3v_&K}xwp;oC_8;gB2X{^sK6TPO?wvuX2 z1s;{gn??Z_H4|6WP_A*(2dT|8a~G$8J{1e}&{D0*us%e;m7+XY4|=^``Lm?5yKWWS zKJY)Ca=3YHGz~E6!Tm)=x^app{#C(XaLg&VM}MH^U(6kzNO8hnQLe#jQgjwK985}k zFYH`msYXr-f!51m<`i*HF+MsjW+TEC7dt)9eE04gDFA-0A=>l-Iwu_<$a~{kkisTQ zdOkeb!2orIWc<2Y_l|14h=-FI&D8#zN5)9v-OZa7sib*IN*^eFUnRiGSwlj5E^qCGcCi>!E+kmy&Ez2*4EYh+A`=^+G18Ujr?jtSiH+kkZ`(YDl#7(e|f z?6_f-uG2+99g!H@i~O3>HAFm4$8gcrorD15EWis;{hr+twH2r1_Ws#^P~m)XEA1y* zdBC7h7My?%sXD2B^mW&ohFdc9>=bjHrX+o4nIA1sF+6*qIj|Q}@j^E7J#iXZI%Ns+ zTw&Z@?oLDDA@W(U6GDE6MnL*hFWm-f>df?HfvN`{sg^ zzIkSDhV^wzeS^5h1!QxGq<_~ez|@OYwh-NwuVgJo*K5w=T)oofJMQKQmc$pC9#Z$P2FZF~muaq7li0q+5a2)}Ufh+s*O36m} zx@&G;>0m%ZbS2nW8V4!NldHR3cXZCr5xJqD&GfMlbdtf1$BZSU{{#%T@Y`YodoG+w z>fYF?7j&!j`~! z*ywUg@zVYCQ8RBWc1s9VMbFTy3|gUa+pNCW3fzTj`&2h%7F~OL8);rq>d51)2%(Iu zapJ<+VqCIo!egUZTx@_nwP6&TB1#RZVJAW5GoUdT4^8>%Dx_eYla$1gac>aCUCDKa zxGgX@1+-~b4f0Vg8lxyK z@$NsVzl+8UmI|Q>)j|zNwm_YEhR#V`fI73sGD$wHq<1cko+AuIctt+Q{u4oDB&UiE z!!Lk2j!fi)a_P1>8I)Q*!rOb$4r?sla#rL>|Mzg;+wiAE%!MQ~r}^nnCN|#3Vz|7> zcEx)^I5_P1fQ{Dxn2QlFGG`~#{qEF(4I6yh4c`ross90^0WI1BpWRSQlj%gdPxI2>4RAe{W85b$}X;5+|Uy?UD~ zNHCELp3c#TV<5~}iS=i$rJ*+1I0I^U+z&UwN~)Td!Op!=Oq6gOTWCn|gCrizc3_#{Q-UE4Q&_+?dOhANQohWmwD(BzpdU?dpblr9fYbV57Fkm*x&KyABF#2 z;l>FNer>OIw<)kH)TNVPRX{6DgH=JTI1yF_x8hW&f$M~CR-X(HoD176bHUe6;Xckg zf3DWA_0*PuPD8co-c=Vl3wmA$U7uo|ri#tL&n4!v$Tev2sfLI?`ihazAHT@dHEp>m z3`gUn^1AGsk9W0aiV^n8sD`^q0LHYh2ZY*8n}Dk2#Sjw;+W#7S zIQ8Pm>QJ}#bMEe)=*Kpr-uv)T`}LCwx)qy(pb3ewA%^*JM|xNge|SnbL@fu@6#- zyIPa@!~3j^5piTE~o_usI-(-PXp~SURX|pICNoz zVSj0`q{0M-!$^A~3gl9gc)ocH!XO)*Gkcb|0AKLNQh$YnxM0^LL%W4!5qu47Pi7F1 zghIwgL`f|h-(UeuLqXsjmJ;*^3zDE+Smak>7;x_CV;wk7UsLV#5srZ))E^-qs5f@> zZ3H!7WnQGD!O==r9#MV0)^S3GOTeRpGka$m<`+bk6qO0_YeD$j4%iQ`1lm14Y~-k5 zuDOf~F{w_uy!=#=bLEFt3ul5Q_6r(jI{k64IR-{+13_Mh(;xS2QV3LLg$Ntfj*gD$ zwSJLo1bG_t$@5?QSATUiOu)o$)NQKN?QWR3Oh&j1l*}_cqp^1E6_jQ6lA(fDWCjDY z=J{W(BgSn*S&^n2C}Xw8z^;U-u!ajb+KH!(3D03sN4K#p6W&8;ZIW*xmZ9CB&Np<( zAIuYERvCoQ+aC@#)JOCm=p-lExy13c3vXRZXVE$^_BhC$3%P?voRyb}YbiT4KwH}x zYM`cZfpC@@g!6oeW^=U?mpkP)pK4*}X=IK0k%8Su-o3Fn|`p;aQh8fJH@$e4 z(0`IZY@KOK<8r|TZu8b3kqR3L3mp3BWGc}VY~#!tl3l>vUP8t7cbt%SbVlWsVx(J= zrVeZRPclTW-qLn{w!Y%Kb@%aGDyOWlnyV+#OBG%hy(|L_Rei_piM;1J-a3yx7dn5b zTFHa1!RTDc6AH+g*#yfz71xo*E7Bep=jZ!QFf{qh*>&{bL(W9OYm4ZUCw?LZtJNsj zo?6+cPin^!ukyKHIdBUxciRt7JB@(Up6bA?)4Q`@bJ%3{&>nOsNP_?~_NsbI8JsY# zU{7+@gPS}ALZfJp{IW8YQ*>3{MwW4oUZad*7tJogQW6 zyzoF4`ytvMsA07G5%;n3CD5N|LRu6c*kjwQw1r?UwBgz~E&Q58_|@LRQtnWNR^f~) zANasEBkcJ2E$0O7LeG6>@B%Eux6eIJbrcpcmREWKrXkoN+HB_luiSBv&cgz2<$y{} zO_@kYEXBg6mU2T0r-dil8KTmJ=85eJ#w)Oe4qp&b*@ZVCF1|rX@v_oT$2M37J0y4$ z{C47pP=+qz!lE{pQr?ui&s3~5p(+2og6?w4lYEvm&c=h&qkXh*0|o_zaa*#m?xJa= ziY}#wDs&%G_`o$CUic`kP6REL+dCd`gkNb0zgmDp5Z9*IVB`a2!ME4Pba|uu_a;3T zMbOqaFZ{q?;wBEZD|va&VBYAwZKvUT*iSpKa0=0cdg|!}=im@?rgn9(z2ZcOH6qrH zUC+xJbE|WAXtJq+YfvqgUrz*EhJTLHa7{5zS&>BMRyvQyl#^SWrhT~9#c3=f17^%P z1X?t~Sa}o>yX2&{4m-+k4to0k2mLKa%GO$~ge4zzw4B3JVJ^E8#T@pXH%9i=a#$A} zkH<7N_tmTsUq@Iso^pq$+QFaSlxH_^W9~u20T$ZGqM-v?T0%qeO29OmfIFf_C^Cr( zXkP7V&Cg4a!hba>h>3ygQT-LfvbT4kYoH=vrJ`qlso`Y|m5ww)1? zxEGEhz7^q^L^f8_5Dj|pfBiw5rC>>4z9%?=5Pt5D&(S%@T1h5)IL)WkF4_)7HY~@m zJom9Sl9S?OS1L;bjJC42;{}Ssp@E>yzMj3wmKdT# z#Se-AFg7~-FO8ewT847rXdyO|?R%BLwyg#>H2F!J+VEwAXSeiU+XfFS4ffE5i%Rb& zF2aRm<}?(-Wa?Z+Q^JY4WI?!$jCLMORgK_xaPb{-BiVQyITM2VOy$*5@WE&=$dUwv zC7)ZSjvWkmYha<=>!(B#P^E>iY)|wr- zi5+Ds{M2x@2w6Z)H!tiFA(rT>I%&cPI8UC`lEHad+$5*uh9oA)g0T>m@woMD`uH(I zIj5N%qwb$YBvUV5Ty4hMaCIh0hj-!by@`V05H`_Vu0qanL072o@F~HZffpsq!r4?- zq!NwhHWP!n*ur%*2^~|k&A z;$VLWRA~}PUZ6S0mV`@VuF!D27rqNnGlP}bm4RMdj2CZta4DobX3+cx;qR;@j9pUE z#qrlX_mI&X$ZN?`BD8SrgB{cN%w8#Ih*adFg4xUIY71%47aGtu;`T_bDJi`s={%fV zc*JhX6HAh@Vlv%8qe9v}Be_xQI0X8GG{dkDvw`S!gTm!}uWg%Mf4sTTxNISNsBPC^ ze-Ei4)V3!9)y}|=q=jnQ$;1RfOcI-%r%tWKdgOcW=r(2S+J$WQA_T%&u5pMdFUV-V zDHEZZuzEo+p$AKPd6DWqDhXN_n-Av`LCF2{9J_T&rnQp@i@nDO(||9upJN+W2$yKT z$~lp3%#u+x(n>@dRBKNkxz|<;ENt8@UH$mv;$VoLU6c7UIQf3&m3{_O!KFl@89F^U zG65cg+G-r0Sr;eBk5=S*ATWAX_Usub661n{b5vn6nIDdkPAla*sLfgN%teC?wF^5X zi_A_^Eb1xqJXxpq7=X+TPHEDRNp%qh$0rvJSRew~Pd3^Gr4=~VDNnbp(AnO3ff78o zZR?C$sbHmg=*jKOM$D<^)f9*oQqaVB|51UaYO#x*y9YXT`Xo9#*xf%m=*=_&AnLqO z`BhF9HnQ15f#%o}*!SAyzASlNJ#P-)9v-8!^Idd$cKGA&#R2-^;P3FoFWT$%YBdjz z_m|X*YneEk+TJ@jyEy#rP%Y3ax7%2!gB)dAXP^1E^x-=6Ug(XlWegjsMKVO~W-8d9 zta*q3o4w6f|7r3jUl{&(y0V&>)w1Rmp;6bV_9p?C5g2_r#Thuc1o+J`zt-!5zbQ3S zsJvC)Yf$b(Njgf|q`x)T8uSOx`-81Mo#mX}Ko=pcznqfD?p<(BBbr4efJk+~Ess@- zI)C9~lkm{k>hA34y-?7bKO+cHMfF|Qj(KU!YQgvipK4hPJtyE}zhHTfvc-JR-UOIW zthE#Ev+S9)!)@)AI?jek?qX6tdp>6dg&9jo3MQC5Pv^ZLX*3|Qp;P36lc`JV14?*o z1WnK$us1N8%}8l&JIpxma_RZ5QegtvJEuvO86>o4a+v;7!OErIAsbO{jy&@LTB~A; z5+bC@8Ur}2JDW&A$_BUV3gMjwqV+M)*bt7boyJ{-V7FAzAnwaClcgQZd{b-f$yr3K zrsC~&!#1s8j+(tDBk&gq_hu zqt^tj>CAHh&hDm)b(uOcr-i3Ak0~!CyD6mehr*xLoS|Vu_Vg zpxuhC2JnPT!6p2_1ncl7S&}oFH8~PIQaCzGjW8q~#Q62X?^D(nF~<-BNlnjgLje;2 zx*_X@e=h#%lRdHUh-=O5M=YZ{b;ttiTg*6NqF**1*=bTL2>{MOt42+>qZO8N47{iH zzVqNKI`fUsKnlnKX@<%8);o+&N`z2L#N?H5%3Qqqa}(jfIvne_G&8R7-pQ-Q*qO^K zda#d^gXGeqFGb1azVR_~FO_x$2suv#cj-d&Ptd%rHbmP4v0C#QioIv+<6!Qdng9(R zS)c~Ec4vue-^zBaZu>xeWOQoz@aw9C;slmsHP4+CJ=5>>>5On|J}gQ)jDk)2Mze`p zF4a=(Tep64mc|*o(Ryb_K1ejf|6si5W9>I@JbYJ28gO16Svwz^5V%|W`t_NI#RDkk zV^agXI!;rTF>c~k`hUYk5aP@0XTnD1Vi}5An!=S3tF(a!gDK#n=E1y^a46SzgV1}k znSm@_=ACnEa66Haow9JSM-pESSLD_`L~w8fvd`keoly00PJ6TDNm)tcB=!kW?T|UT zU4ayuwiPm56Oy9|y(!%|%JHF@8ILA$5GmfOoXwi^2ZyWQ;_7(jEV)>MYR-~JM6=T1 z9WcdmYOkqFd;i2nx2mj-Y7Qz1;HB?@7WS;@@7vV?42Y8nClj#9*w>7^BK@3jqo|aY zl7vW1!%36ddmma?Ft)amm6ghC^Kt95opRr`?5@uS5>5AfbhVW(`rKpUJkeHNyJ~xp z@STblbgoUS2}?PxrglV8TDZa*dXPMs!0xNdR4}QDD{tSHdcvyAGms#`YS>wA#wG!5 z*h1V#pj418Rjl%_TR3>G;^Wk;rt77P6)l^R1vZ}>y2n^JHnitEz12|GTiCn8ynqxw zYJq?|Ooriw*$~rAF&=LSDg;!|JH1uM*@B+KhzS?D(KA9=OKu(RkGt>QALz7YfUHg7)(t3G9e0-} ze!&zfQ@G!GD*g5Mm`QdN9p0a7C~FNpcvMabc{0`s2A9r8H$IRvc1C8GN@(A8h(ehC z2B;9Y?_prSL7RgC`YZbOf!tv7;NFoRP6}ArOajHv#0w@XWEpYAUK5@!D;YkxtT zgFmnTPqr#&IH|Gw=HT7=u!3_tBV90dgtPfxaD31MkR7#rW#E2l>))7XS7$Q z(P6h4I7cRE0&$CN-ik6RguZUQCf4-@eXuvHUy`9`WvpNmMfe#+ZpHBw#cYUMPdr-aXFa4KTd-P-56f3P2N%xog2`i95-DWJN4RqOuM z3de+Xgdx~MkCO=%lF#+fl?a>b?s-{3M`u8`!ivyyCMX16SRKBtvQi5YPgVvk@nj{K zxrGH6xBCN5gF37c!p+KcT?OFJUQRYf~9;fk+W#|Bw5W=&mZXn^!6Gw&@ihp2k7 zQ%rUE2c+mSM4N*sAtQ>jXmb$p=Yv;Pyjb*bHF%pXVBEL0AG(g`_6*T+Np#2@ro_CE z&o&TA!TSVw`Pt$4m`O-OkjZC_2EHZk`w%e%Zo)*0rZk&GE{aHLm+=D5`7PQ88&VNk zVuNd@?YAAVHS0|UIkX_ASyp(-1QY8+=yuratM+YiI5O1{6K*f(^aev*Z9VjT+k$uJ z1Acp~7HoBA^D|TR2Qoi*&RA8toqN75P`4uE7lsPI>u@#%3kMLNDO@UG^=?+cUI#xgik;WV6Mj36~YEm{ZxUXH>$l#k> zua2lcKZ3C1egh>)KlJ#$+6ZEh|LN;6AgqB}$%VOn-^A*b$Fb3J(9 zP#50YyxPHA4~~$WW)lZTf1@&mk8Zc9poC?{jL*8xT}?lq$`aii3vtVM^00Otl(x2m z_ul4LLGcwvj5y8`HdFeiT3B%m35wEuinC%yIE|6UNNJSD54&4-tmFS{y4eM9_#j_+ z(?C@^T6R)L5^!A&0lDH0eeH6RC4?&&YJa)Q2`6<5W|B-iE@{Nvb-v86Y||>YcA;Lh%)lI?=*4bZWy&~Y{Mc^s>ch}B<;?cDjq^v0 zr37cIv2@8TdcW^?aS`v=i(5afYD7$=qd|5XXR)CFyr1N#H*>B)t<>j|y+ulss^HP@ zj;QM9X44n^p$lqH!?*VtRlM7MOGB7bnj|EvbQGa3tmj>0=hz6pHVx1kU{j3~Z@dPq}ip zg+KJAY3pZ&-it`KfNV=i7n09-w>J2ERlIuYFe+5sv-iB}-awM$_`20O*0oq~qGckY z1p*2!5mLw(RMyF;K}exMP*s1mim;CQ-`Cw@x&O20Orn2$a&d6plON<`wXt~rw>8*$ zv0dB$4Yt1S|Gvbt_x4BevHslBVXY@!SFR=9IaKa9C&eV*U_5V&Davv;JWMRHv~72_`G&;0ivZ< zU)ngb(Wg%VIxaBWXGO^ci)}#5VW3d!eDjUHfI0&IO}HXZw~ zkOY16jixdkyCxEfCm9ox#z!nEeF{H)>RdQLQ>-A7tOP_eR91vrZjfzTCpi-OhMKNn z0~mu9SsxG1)ZY#!yCM9RQz=OXhTmbQgKQ}sPlIN0S|kK@)mxVJWS-twpBzx7(ON=d zX_tz&uGyBmCe3IUJynB|(JWEad#(>}F`tM>ZB_wX*k3zbJu%PQF7I-yfjUll{M^s_{uEQ#k$B2rO96H)t$+-D$1{*1*3JcYtjcPq#(-q2JzewJ#2kIDG$bEC zmJIK_NHhT3$g%S$K@mg$5G+%=*X!=bp4!m#Y^}&zwLW#xZ)!xz&T|w+35i)k*1MW` zS*8C6{2k6FXpgaLNvCbM;zHfSTI!>67Y6Y?swZyZo+p(| ztBS7Iuf(O!eh>2S!rgXNyLKB#!^3n#@vItz@GKSyNpeqwR>Nj_a?_MBtARjW+tF@a zb(-hIqUEh@j>GNX*-?G9y%E*h)~24@9-4Z)@0SwLhA#N`uJr3;PUYFbttX0 zXYgtZVJLv8Bs1~z;Fq3|SQes(br4$u@63-+-Srv@rzd9@m#QZfOzwk&nm?e=il6`Q z+JD1siPx{6;n}bGv-Mw`iu$SRGPbP3R_p#!clHkHv9Et$;dc&o$~}p%i4r{I7R_i@NK%G8tkkpz5Z2AKXRHc8LHZ`}po7uX z+Aew)EOa-kYEZYUko{S}t>*`4KOXKiFzm{$uFxckqS77Jct~>aSX@&|?+0Xg+mCi@ z=QtXyqfehy^ZFmHCUn*R+BvA~*3c7uM(nlok<07SMGxg7XD(B(qA}yQm?t(QhhG+< zQd*-N3n2|VA$__t8YUn$$qzN>uK2|gces*daWoDh9n^$q+^( z&TfVAw8fPH_r{}j)cp<9eHQPp%kt-3ma8bAU+i9-e>R-UTpka?d==Sz52fR7@~PT@ zagAwe0EqfvwdSkB@~@+?JcL7+Dm9P8r(rX-*gjrnp)a9I-A^I;11VLHG%P`fmk!Do z>;Ga*mg5?zj=mOI+3;7xj)g{rfUb2{fejE4ZG{w>M{|2?_e*Nzi{oZB5-%tb=EF@`QpJkYyP=88mObAzb_|-w)5+ghdUD_I3##DRVp|)(xjDy z2VhhVc+|`)GY??Om@`b9c)17JgWXxCh23qyGC0JH+UCACZTHOCg<~~QX{ba=quoVo zF#DGDZoLHyBaMDY2194j>?NUtiG07Txo~oo>@0Q-c*2~;4>i5+x>){wL>HPZrdLPC)UeLX;pf`QWJ!mD|b93)k z^$4o~3pAK;E9~tT+IGX$_m7Hc3(zGPhofPS!>Wsb&9{o<7-DGY^m-lCK2D~_uC8z# zin?)iXKRY}Oz6YN_!oWr=$3@Fg&XztHh?x)mot7ffbN<^|z)J=s0JfB9dM~yz$$W3H zRS4Fw-@Gfi0uaA1vC52Pizp>iQO2}bOeXMgHvPO8ks1KpjYLsQxO_B1*(DWnzKuwvqu&?&-PWqp@J*5`$MJuXK zxKQ@wsZHT9d|fVs=2e3T*QvfM-yMwC-XJ5zJnqZF`hI^Gn3wO-Ts2QcQ;R;cI{?3d zKQoRA>Z+ofuykY9XWN_G_XcVw8qJVd^ppc-%V50UHf?uef!IQ zuJ^uC`;zX{kDH&mPPuqmD2;vi8r7=lT5G*;*2`+1=0tuqb-O>%u0IoIMQTyn9Be%g z*7Km=(c*fGE5BW#@?r=Vt3p@|=JZZr7Q;HYJFLY3e`tp{7%Ui>h1C|?^e#{qgF3h~r~qD@_P)nvIZX*4m-++r&P*#349khWd+1Q0iMG<XYrYZ)u!75q@TL%iUnbdQj-@0#TZg67 zc5et|0O4?$>D-t=mmvCwNd)H-R{50MFuPD2cocR0E}6^SU58p%%L4rZRZ#1K(R7Bh z1WU%}J$rL8=j_JZ449dd_@_F}rn!$&J9kH)KDqddZpi<~>;|Gp5Q+Tpg3QuQ-%U4u z9{lpUo6hEudKu}L-KO%Yi?6%eufDB*t@QMDH_l!^{b=uMecDLk*EY>W62E4A(rxAK zyYjgSW;~^nDY~^1X?2Eg6laxfh~`D|tEcwXDrx_oE*=S%7Ls%w3$Ij-lN3vO1Jwfd zZL1QnbR!9nD%L|lJWDyneEy^Sv^itJIn`P2g55TGIpFhR^HnhYuem-tszCuw&GkD|aw#F9?|)~7jdSayg3fx@L{oe1%C@49KzitVc1vyu*Ww^! zwzdgtcuRPYegE`iAEo4mq&=H`2E4Q3wXT67sn~6XMkHmok0ulr3__EPXdi4xWfJprd=5#qm2{cqa$ZN>WJ0e<6R!s~DPoO^bt3!e zj;-IUyMZt&bo^il;YxKlT9fM&XLEaYP{!<^k$8$TDrUkaL&(;UiOV39B{Ny4S*0orPfT zU)_CbIs;>bb_+QLA{bU$eKwYxn}=CYaUt1Td*Qe>fJep5+FUBednNJO3Ta()<$^zu zd1WHn0<~GF$mj>lQuFIE=hl6u%&FmdoFPj?Ydkk+@|Jt6Gr=exS1n_3RciuvEh*fP zARpvnSiwkLZFpa5!(--leORu_xoU!!DOQTy<@LoF1Z;QJYn?>Dv;R+n|5vz?oa5O; zy}*{l|J~er`Ml!)wX-w$8vpl;JUFK&Ow$nEY<8|`mJCfO)gzpDW<=ryOROfmTGAnS z$)-bj^wbMVQuR z)nGuV(W9c?fagqs8Uhe`)>%u{^5BqV<01MjDi2}r>E{tDX^SHwRS$cU8=S=?31aCQ zs+ms){G(vn+}v`Ezd8gz+S4HaLFtWBD&%7b|K;+3u(|W1D*p%DU;Tf-$fKr{z7ZK5 zx9>wRI5o+lD7u%^*&@HP-@DUaANMrOf4dKSoXNj@{_hMntNP!I=U?@|FY|m{8js1> z5E}$RjB`AqDV5YWRk=D^AvAiWwa7JUmCG(#esOKGmj1AXR-Qr6p4x{Y8D%OW9II}2 zB`-)fa8PUZx@%EgS5~(kNnc%tW|L|1ZiqJG*#vg6Ru~{EauN?q<+jOuYyRC!u@GP* zUn9So(P_8bn)6d}=vB6khsHCn3U}BPp{3S%z_tO!z4Y5Hr1!$TbhNQTy=k1PEAvSW zcE~2qNfWLlJBQ62%c&T8!MEFF3;6S?!syedN^!~lj%VqjD&^2`4(jziR<*Vpg;wJ* zs1IRbhw>emL1A?<&$ahy1zK*twKjiY0w`2bsC5IO5st4(Thv?&(-d;^%7zLACara) zc7tf$)o2dc<6ZebuCT>A@<(Qo_z1PlV1&PCLW)OWikjr5ef@$9!Cp9qXi2tf;`yvA_Po6@7{rSuUoR{-hoRU zi64f_UjM%Q6y|E+>%<(CO*UjLRWkZmZg;q&Ibtd^hU4N)Lw78KL-RM=d^5UWR8AF~>Ps zG8L9aY5RROu!i+NPezYt`~TAl{vX>f8}ffW|GNHviKjAI)z}-~usfRmjk?%k`9EdJ zJ{7!xEQD{0WJ2Uu?clR%2MvQdquH+W1%!J3n?Ou87jLp~1U2x7_ZhA<5xlE6(oiL6 zMl4cs?x*2=-R_1@ll*rp94}Jx2us1T{oi1_>i_X_@HPMcmw6iOdrN~7IsQ=ERohYV zOsADq8^V}z!a%b1or~dV0Oa0l!N=zC4;2(MFRpKW0l8D%k6yBayDmk6Y@^L<@at&6!HMBhiP!_Zzt-d!Vld z;s2#i!}`zJqpbSnvuyvj`C?Gr|LuH@|N3Q~iqz#J9D5r;y;h&Gl-y}A2vBM}!F%2% zAXx$#Tq90!LipDW;DU9@xeG-I=k%>!ozTzS?k})}xXa1vou#WVA8!aB!G{Tv@M;wp zH>3f8=AZ5_Uzd_U{?j7=M-(oZKF%_*)c&{ivU>ivwf!~!{}*{0_J7SGSC_63Z#2t% zT`2w)779^7WJ|MF=s`RW#$AW~SU~-z0KPDMN`9P?u>x%ukRj3|UC1fp^q=}>sXiy} zAmnKo4;t{V%gx=N2KjHI8+@_*AKUf&zb~F|e%1fK$Ww`4wluPFQ!s&XV0UpW@?UhBgO_AT_u)F7JB~v%9tDeiEq)wn2)hIthZBcOpX_a6pUgtvk}9 z^5;|V8#QSiPC3a*mY9hIe%W4R=OrZ#K<(B4^qR~!yy(D9Fp#-ax~ga}BeD!*CmMiQ zPpc8IBK7i`%-gK^x>i`gk}(uGPajp{JZ+UYPd~fJS%|X@wXXoYf?XUXZmv}y|l5VA4kqdT=D=KuY8^^Dz zUAvgYg=8~DuaM>!?3!dvPKI^_7u5qpfL>6w9bk1W+{5gv82(p&+U37-;Q0LV|M~On z>iv(GgUzq@-!Jmq!~e(d$C2TW`}zNz2S6U%|EGfDo&0|m*Zt%B|5Wh*oc=${n)TCd%BpJ6!~`cA_Ioe@@ecVL3ot02?@ z=bl(iS;lzCzX*9RSHY+e#y#=j1g0qDPbuBA%9q2YU=}ODs$Iu=IF1!0b>XuIp}GuL z6DofRuo@Ro=PeV6saQ-iIR9BPX9w$GZ@>>V`Z?EQhQGix-&6pCLq(lh4s^}mv zGm=StK{vb!R{w6!!bqOd7>CN8dASE!rlDAoCs>km$+0Apxn2llHRx7Y$d8(2#slKN zon-qYCDNl_y`Bp>!x<<-@1evHWks6SNBeWEPsq{VK=mf4dhR`qYWJbToat5F`C-$j z1bDC8*|p$|4LG+3QM?2051mwtdx20qCGoW=W_=r0+Y_v75QYdn?OmAh?!Cc+oGM+i z+YqI{yAGo%rg-bcjwoggqxo6fJlYOuXU$|m#koD-bvu}nygX(j{ATZ%liA8jo^yjMA=j8i!;0}q#mtm>yw zMQ^XTv`wb;gaT@7{Oe1t2n%QevKf^NprEb+(?!2oW6`~cl4Qc)bg0L@3W(59a0S>p zwMhVb&uM!1XOj~0J=j7LKBE~-mbVB*|h@|5js$b^p-BZ@0EJ_?%ey>!tOj&}~F{*@zcz z3lzQ^L%4u(=18#uNFMlW~8>&l;c6ffc|2_u6=s6V1ve}u)(js@IO zQH|XhrK<1>uyr^L(ZKsq5fk-sa+fT_f${EMHk^kn0^?~zTOrJb%@Z6*tv>%FII)sa;1s$90-6E|_MPUC$x!!)aD-Tu&h ze{!zG$HC?K`|rLx{C_RTeI7jO=Gw=kT|-;-G%B^Gj*bt`4|gy356{}C%ra%T|8%X6 z`g-#ixPtHYcTX=5j(6X@Yo9_37(7jI?v~fZjNMpe8C?Lqi+AVu#?4RdzGU?X8&ynq zaMs>%(27p?t#(NNU^GMBjqbe~yF5KPYnL-YixBMmPHntDKRCPGKfXNOy|_3yJ6^4s zLJ)qLWS2RXiqcI(y9#^1J9)bTB^kKct=6UY?+%X+FD{QyzB_z(upD-g(ixSImJ)UZTI=nbMIo^GDd2sgba`$Wj6>PSc|2#*37Q;V_E?Sf9 z9Iiqx!DhXoB+F8o1!bap4&D3ngUfd($8Q(N!7yTcBNWyBy_1t44)36v=#$$Y$h<{8 zSsYhH)zyd5wG%}DxhC^r%Z2G>yx}d$oQ!aavzVZ@i7f4xfuG55h-PvfZ7yH4_ujof zzc@I%JUe)^`)>ERS)FU7`|9&?cmHz#;Jd?P;LrPsSB8^)qR;DCc4r~$wSKAQ@CxD~ zXiv@Ll^Z)h*n59=aCy3We*V+R*?tQ>RUem5hO_pGP`$XXglBW6s21>x@cUeI#5!W! zVV2nF3QIck?)}@t1+3NJ6_FMbYTY4LQ6x=fpvT@(efYG0 z(h<%Z*}G)!JZ;7H@dm7^lL|>akM4(|fq6G98(&s3hoI&YH9uF*fwijCy|g^7xple1 zvtRQ{hn>~*6mBrR*m=2i51LmoScE_%M7kJ>)w2IAz|I|3P$3sLwN>k|tt%v!VsYio z*2*NGC5!7m-`@Fl5k(jHr}+(qH_lqx`u6!|y{#1|(w+~hQ2eVLuy6S81NN9{h)(^5$cI{YZVsZ#k5(U=@rg;+P0=G37)|S(+>WR4rNs zHO4e8I9UZ$wde|mDTR=1_Rfd0h?O38ywcFtBObMIf)l!AVuWS>ATt9ziZ6MQWoqO6 zAOEqWV9H{gUg8wY+cb5L^Q>&8`8Y~DQln|V4l;IQhpEhfCS7xIbfPn?plwMwfY)ncS?Kkv% z9yVpG@GA6bsc&|AQSXbnrl;Hcu1M3psXj}uNqil?BF2}hlXOgDER|+DYsSO0-2z3Qqpl9=n#>nN zx+e1gLc?$_6Z*~u8B+ERA?7uNm50iKsjVhu_ZF3@@@H~`vzR1%e*fwNX&SesdksjJ z%`Yyse9kNv%PWiIRi=_>e66+|@OiTxc6oO^`MXT?1VvYoIiB@u&6wf@>MDJri`F!* z3&h&`dJW2=dkGB#P|;k-ESK|r%7^IVr%v-WEC6iiyO&}*TLHYQD>aRvUfrr4gos(G zJ@v%uWylqNX1o^Sm##uLB}(?Dv5VPNy+4nd`nSTR`u6nbg9QxelK?kgRd2lO{=ggT zZOyK98?-j9{L9SP}KN!fE+Y|6X5_0YvROrx!xvL3&(cD|Z^~sGL>}@#TN- zI5uCO`#nwZpKfC3!TTrypqAx-8EjVbzwB&(jsN;(o<(uJ?-%yTkNxwz#Pe=CH20Rc z?+tqEWvN;?7bCB03vYuHOJjhUhu*1ajV-e`7AkQTvl$mSC8CvWGb2vU4TJCg}eg_wsdmN(bwn8 zKh65zqo)5}qW^6Uc3y5)^MAkC{+j>gi#(67|NQ~Nei~7mK3>ev5aN9TelF2U|2J!+ zpGgaSxb|5KBkGhLcmLG%j{MqOru&ZJy!n<{|FxX`4Z01!uJT=1~zHCG*EK;-4 zv`-YT-Z>cC&Tuxd2JyD9jYs=SK`sv>Ud47zO`X*UyuP5|F-wTju)5Z;PCme~T6)3p zcueDlNEU84(NuCt-o*woTQG;GBE;bEbTKjgii_#z?T$XrHfDv5$h|f=-uB45P2D__ zdv;UU_3Wyd8D1|EZ+OOmvt$V?l^n7%zZvqi%wvnwdLy0<^syhy;tjjHKlCQAbn5^2 z8Ah3kzA1f(@#EiV+*GITJaB%c2acSzN31?_pU2>_TuUj3^p8EF zs!MksQNPjyNA!t7} z*s$J1m(dTB99K1WgH=WMI|S&95&Ia8*hfm_q@Ih|xB-#?8p8oovolI`u52Ja}wU9`RP zqAW$YH05;tJ@ujr-bRK)8BNhzN=18-bpWqgzt7CE@reE`BAJSAJ0gDsWBng+YW>^I zEMU+cFr}L~!KnK4OBepZpJYK-b$fl>RLk%(E{yT99!e*;|qkjwMM@B?Evf72`cm>eoK&yC5qR`GL&WYy8Q{uLb2K zLET++gHyV+eUeE&ch&w+!|j@|eEV#=0}Ay%E=QwQXZgHd851@2SH+-ROoaaT3l>vI zU7g|7UsX*7J7-n36_dd~<$4B}6L|Q#X5avWdd2@$={6Lc}90*NArb7mx_Bu&vIWh0&1lxC9+NP{ow z4T1ZH-g}%SohK+G6Mc(uE$3uRKafP<2>U<#bHp;J2_b89!cj^y((Cm0&o9p< zWc?D*2*=k&jv&5l z=bN6m%{$-pM)vEj^<6lv{ zxcPr}u)BYB(3>TX-^RlEzq#}B`Oa2l{%>u+7<`@oU*h@8|B0dq;XIE_yiMSTqragj z`fI22r2K89K!Qed^hU>c=ycpyDiF>P%SndxZ9Szl5RTI*FL=%bK{Fx*o)9$R?3!>S zr&y|52@%@jGG-jbEHhU~H_(($rs+JwHfXW|pahbLNv7tbKx-o=r%24Rc*(DQ2Qz>&X?DubPZ+qUQ?Ady!bHQ;!W|&`#p%Hm(EN?L< zpt&g=sA!@{4_!9-iH%eH1O?YJ6T1N@VQ#Mz` zKrB<>esFu+5@4|3UAOm7P$ASnsj>O_dy>w|@~W#nF52~&E@)4~rA?mXrv=Gm0_~o1HY0LM3ZaN6S#H=6{ru*K)3dM# zIcG_avc8&oPoAJtPGBP`s3fA(iBL&*wAtJI_CGt3?#Om;t2a=;PJcu>XE#)+`NFNf zVdqVeC4{GQn1$JxVf%N+D*(bBd*lv3E zNqZxRge24y!4jYytvdI!-ydcG5Pa!n*-6g{|7c?o1ZD< zMt0+KLtZgVBBrNindgRp1A^RiZb+}~A#>i%{{s3Q;JtKAFm}eqT&ip~z|jqYuRwlc zr8kn9Ce82;y4?Y(_v_U%AJqDFJ>nT5I${Y0J%VN#)rS4x!*7*-&9!_eL^~iQc+b68 zAURK6LJEQzDYoTK8D5-Fw<=En)x{IL`jocJaP9Zz8DD*_m+SyZi%I6PG7}V<-NN~A z;R)P-11<&?4BddKkX#8EvSC2`cIg4Da(GY~P|@+gYhM{q(J|TP(`l|i+f;NcK{3mi zmNG1fShQ0a@JaBGp#Q8Fu_32PufN~Ro)7#1ixP-U80xnq#ZdAkF+3T)6$+POe2BMn%=jw#$4h)vg%w8 zENtzV`dI4L%VBsY&)QgOOTZl3wtRj=eh^v6ObDc}wO!$NWE*u&unt0+(jkwz;!N86 zQ>k=dZd{cGD$$r40RicL3G-@ zP@cJB8<;g6v1APB3NT?uom2^jvmj%vjo8dP>4QX9^eL=>=`2&oQZuFdk+b@{3QKNS(tpAd@QY#5D25U;x~ zYf&txM{X&SYJ(r~#axGecGY4r3r3L{}S9k6npBpmJ!>)v9fu*e|w+fc_ zn~kBc48-elEMRGqliHGdXk`y<*T?3yHLXF_aj1tGi&&yf6-lCSYi_uJFIsA5d&(%G7|C8h-G@OfjSA`L7{Oh zuJPc(l;ndTH=q%t;e-hI^!~6klZEJ%W^(admT9oeY?ca>t}>;!!_vD3-eg}IJ@(@D zxjSAFNrC45J!|W+&4H$6J=XqAbekzvJOp=vWbvqH&Yd*{yo(2Sq#oQJ%Ms=A$>^;( zWf=GAaqKS>mS|Jh`rdXCDUl@RK*$;#8PggNi?sP1##}E`-7RQLaNwqOV4oVRW2whq zb0>kQQW?JkH=TUXGCrDlSe{S7mG~iLEF)L?t=Uf6PxAMqjDv}q##{QMp8wH~riWP{ z|M$vRLQk`gy4U59En`^0{62)+Mr|!@eDL}cc^r^)t z`;KD$s>EscgjN;e4Pp5ctEue{%QWLx8pBIA`^#ckPPRYryKdYsn`TytW|in`#nP3| z7@&*=Ek$JDcvKTcSOsyH;$OcU<#9|xD7<0Z2tG-+2PW)!uoIA9jC6*`5T1}UrXfW6 z3_=Qb;s#n?qht-%-$`OobAi+d2t|ZUV27J4OQd;L$G9E&N8&R11I`kjq)GQ z2ZSY8JQE3c9lUJvMo`e7fC$R+aHY;%g{}L@m%&> z`R}mB&?th!KQwlo<&v4RDO2KqP&ch_3RC=}7d+{H(>naeh|5r1v26D7@_RWbyv}*T z)$Ftl-2%%a+tz`${qxytxucO8G7^dFBo;I(;_ciigRMc!|3z;Tov^m_DN(Pb>ti_3 zYnnlxjP-V+e4HSnnZPBpo@6P-`=2qFw?C@&=Ta+eABQx&WJ&Zfj%eC;0OFm}@?_lR z6LB)OP*L4Cw*`B}XKgFm!;)fZ?~9Uz1)JoWt8n5YHx-d5UwMj>)#eD;uw?Z?S$&Ku zmKhsj4x&M&>ofa;OevhVYXR~{&T{6*N#i}Igk6)2fpeO0N$?8#rd-o&@0T8yBawyd zr4Xu$B}PvSg#Z~u6Ot$FQwkoQct+$TS0H&Dy4yS{w<02oShf><4Ol`jj~0Rdq)8O> zWNgDb4ac6^_rx|J=Ss_#@yyc>awR5=#>m4d%_Zwic>+!p|2IDB(KzmD>fq0KGi;H0 zhf7o7eVkVPBT8)S%W*+#y)c*q1fD?(?}J zgFTw2dm8AE1th`mvNc+%c`oaIkrt1LMp=J+pLnky)l?4(sda6m*ZjK*MyIiXF59_e zqdZ1Ai=kXtupC2R<;G&S){84>2nwlnJqJtu`8}a{8!YFRBsU!U${-in19zTi=7pl= zm)}crO}Ucxik?AV>w%xRB11M386%P6A6pLkfz8nz9vl?uYpga~>Uk45ZeT9k zQN5Xq9I|Q|Bb;xVrf~P9e0p*#)Ym^JX(~rOSRPCJ{as959pZJdj3b)1M@|r5TYvrP z@YID*e355;ZCzuDCp)eCrS)zhn%I_Dqy0V)O4gP>fTfc!=iMlL!9LMx8Z-S*k<~*(3oI8zHJ#w4Gv#a+?etNE` z(zd=9BP-uQ{i3%}>$gsqyHol_Zq{Iw4eSAt%x+uAf^LU$s)+i6RsP4Zph$FKu#J2 z!JO@TqqTC%O*3%!!6|JVl5sf6f)pn$a-@95V!t3EWJU4x_~ESV=-jQgO&E)6+6TCL zC$w4XZ$IF*BN^?`jkAY2l7duZ;JU@GhbGLT}V z%;`04xsbFH)QRGAAvaJbiudjt^c(w08R|qttPFA`$O<_`M660|6J~X{V7Jh^0qV!ys zpzbHC$9UFB}5NU}Uhtlw?Zm%Ce_cGRiB-V!xm5c6Ib zq)moo4D;#A04_E(3X&U}brxF^Y+2T?H_jVNLY=WcawePLwot=+7J2aBIp8f&$NY*V zOv=+t3>(wG_%fu_cypl5hq_6Il%Y1^#IIOPXGM(14LQNzNu*!6*bYtUJ4U1)(a`{P zT8l}+Pcc^IKEW-ZezL!aLlmDfk*f;WH{=3;zkjfA$l&opsLf7$G0B*mh&ZxwmOtR{ zaBl`)+!x$8WbnMfV^)S*=3&UBtU-N_zkd;^oBVuQ&EX4#h?61Z#&-i}4eBNtQh~Zr zh|H5AcZ>+^=uNv!3F<~6(kMgjhwd#hqylxL5NVbn_X2i{45>ifC`8(1$UVTVX}x$g zHVTn88FD{RH^~qTAbsu2u%=VsYGkSvdYFgqP5`!0H)&4@^;wB(^(d$s)Q-$|4E9{8 z&lSy7o;H&j<70UOxiK)dS7Q6SrgSURT0pzd!Pc{a!zhC5WxfurMEP>}on+Q(vC$=u zSlAk$>qBi?-Y?*7o`q;=>Qc7DZFlrNlk<^Ka1FoWGRyJ2_hlZ9nLnnX_ z7Bsqa4#QC7iCVBqid*b<4Tuq>NGWt^p%<8rU4<1 zl>S#4?hA3rAWO($u0#(Slw4la45oBDn-9baurh|(kcJDzO#!P-O9K3t8)8pXinBDD6c;LL-?0e ziSJVrM;m;r}W*3QGKWhJM@mb9h4r-~Y(lqMfSaU6tcOK@+S7cwTcg(PlC3A*IFF zsKLz}kCvltZc1`+snD7Q>j9sHK>*ngR_6mvi*ZSwU{36Bh34u7-v zV-VB5JvU@viU*vWR?j4SBvO&7TyY4<5iocuO+8#;ZAc!P}$lP<*=NmGh(?1%Mrj*x2EKi#!!ys|-`uvN{2F^r(StJ@J!$aar&4!tYo|Lt; z5+x)O5wYf}Fp)2q#Mk=QAPF%}v3{{j_{gGop#_&-)o)#wy76m4qnDUAWwm7B^EHd= zOuTKzV?Gi{ojXQkStKGZ)oG)cbvd$ilZ+2@*tw<219~s3WLXhwk!WJ4uK|h2Ei$$d ziTcWJN8;YrI8-5#jr&*)iRMMoz9z8aCDy|RkXUL>n4+-_%c7KT6B^z7ezEMD@Q|oU zr>_Bt{xWOAL!z=Q8j!f}P49*bCQ79}sc1DOs0oP%K5kzVe#ea~V^hmw={3Pr#=|E4 z$-l>83oA28%m??vS~q0ykEi{{>&9(Jw6jwa68FJcka81-s~?ayAh8lVxsLBz$}Y=J zES*MeYDZC@;`Gfc^2(;OEKkB+KFf+&jl`;(o&M&l+U)F1G^!nQCg5JIiW^I?MMyyA z&xW)!^}I9eQz|602NxElJ4T|-lUG6__Ei0I2p>J8$(TX7(jn%++-7nI4+Q;UG}l-& z12NHDbQ|mEmPoKqaNRRLIjv^^!kg1f&xmca8Q_+ERz>0>qoWZIz00D-!5@|!!7yKP za*9`vva7pH1LKe|&a?UZgwIZ8H(N0iuS;$26zm!jOG&4=_3rD9^IhKOeb*`yZ7%Z? z614RyY=OjmUVptU68~g0ikU0|{Ok{344Xwr@MNsT=bThXZeg3IE`%Sp?c(A%2}L5s zon*S4lh2`qMCu)!ReOM<7xtEl4NIE{sRHs}B8M=NgkjbkY4cbpK_2csdZ@QV$f2u$ z$R)#<;0r%|{nF7T6p6}29J5R|-Rrv{gS~l&WIhsYH>^+0P&RCM;v-`W(wt&zQ+&*|F@xR;>vVO6B3o$=WO$b{a9AEgoz)%<($8 zlk7|^wXh|NN9RzD#;Ln~mPNw+zaiI!+w3q#3QRj2W@FP^ zC_%X0jY?v7+dIhb2mSB=zE*&6)0TQE^u$k1vb%J&vG)HV>Zk8uLe z&j)MJHVYb@Wjq;s1=!5o;f^q-Y64rra8~%uS6Cix%eDmXG9{W$YXyBga4gLH)&<4< zqCKe_U{HZ~Ve+eTiGM9z0BB9Z6z4E-8qmeCor@EL@FA`Eb=$OC8Y0q`vuaY zMBoD6OU6<%=2yi5RY6;xSX!?AtOIWb6*u+tMccl4tablmf>3u-X-+OGQ5rJ%`>B7Z?&07 zaiF#oHPEfr_q)U>52GLMK2#ifgEFmPBL>$>(f7+2T$h4!A9M@RAwYS4xn9O9gk}QrWe8 znp$9o+G#sgQaDi?D8^ddIoH0kyCd)d={la^*K>}ejy zMeND)uj7@uWyWBlIY zi)?|tDMR5hba&gUNmsZT*jr9M7s6iTDO?G5``O*X-sxOS7@y8t4ayWaps$yfczjbGDRcQm6jtZ)a4)< z8{wI%hGa7XnpGKzFn0k3L8oI^1f$`^J6rZ@`1E>`DRRkXFCg9Whh6v2-v)$c;~Yohh&r9YU@)X|(s@AqW@I|+nPMd5*A5{#7~Gh&<&0j?Xv&ja_)Qz0 z*CLBv;DWV(;!6hCQ;vkV_`>g7mU{O)HLf`XQ!~vjiCD~(Cg`lL2uZSi`d;po^YH?%n$8*P znTjJ^?P}OCR;Y^FFz2!A@dT%kL%9TgrO6?*Jv|~WiA~Vy9GW5_Fju>TlK(n<^V(F1 zhNL|he`6FnlYHEUZ+KF~*k`T;*!6_R&L3jel_@y1>LTfl%)r5nPU9Ay{!jAg(FIQ* zJvxARD-Dk&kB!Fq;Pvv`w)e-5wn-{Q2Q|SBEcipj6y>o*^W}r72SKhRIhjs#1^Td} zV_68QNQ5#lz=F6c@=)zf#C1=Jy*!CnCKXMhUWOg^bRRvhOM;aK85Dg(|@ifRH%j0~SY^ae$j#<#EC?I^;1|nvo%kM_{TkF@;ISO{#h=8=ZWC z!)l01F4vWbjsI|2gcp=HuY$RX z76BK)YMQ-5mMZv1!N_}rid_?n$(jm`?6%eK0QPFA+~Cc+wEPv)n30Ld_`fvA#U}5UD;T=jjEkRH8acPgoAR8(j)ki#&3XZWnfOLbxk&Y$N z0qXKL(&_vHw=Y5pf;bY_=3b|u*+l}J-f;$aT3&7h4I zh4#d0l!+;hkCy;2u-69lPHB=uN7!69oa!yy&r$D=u=U)GL^fvXqv`Bp0vV3nOm)tD zbr=a#5(Ti>KGejDC@4~>bFNB)&v$b+szSKz@nn=ysj@s&dB%$TLcVSxl09IwUa^tv z?U)7Ng@Bq8x3BO7%LM9Rh>%;#*ya-_9!jgD^N5^ajqiGAhIEfS1?UlKe6788?6s9gF0spq^7v%* zR-7`H9kEP3@+>JO$RlvoJ%WQsy^Wd>*&>w7DibE!OLqrn6sb+OEjJ#&*p(Mvin9WjEn*EKg zdR)al70aFpv~=tKwV;vJl)#YyCZM#+tZ$=zh;>`)B>*eh8%snuO{1_-=Pcr)j3BOM zJwVUvRRj5wg;Xmv{$Nu&vznz>I>I**KS(7qTvPwg`Mb9mN9+ZI;<8*vO~WtuwqOE# zCW^L4We>`<^z`P_qgspG3CJ&8P24p~-SDA=tZBREM4eD5ZUu%rI^{*CZF0x~?j%ga zB%ECX`KvUCZ?}2C0y5AIJ{Apv-=#Q0-6- z^r}x;rgcG3KO0No!{GqPC0sQXxRF)hO!m5(`oHdpsCmjma*1%K)izP!1=L z1RPOkA|Fr4hkt6j8m0Yj+gpW>s+YmZ2s9YGQCT&=Qgv7f5*zu8vdWwwdpnVqS2K|t z`|_I3u)_$1Urk9e-*aW7Qi@%NS}Rd^#UyhPwH6U;$|HPcZ@ZP8 zEtAxjy0Mv`x_rBxcr8l=kXo?%om4$?QV{FSTaC*9%erFB$(`dkz7JR#Rqv204S%cec4*luX^M_SQ# zTLhE>hOm$irm-smAm?pU&=$8S_rZ?uPrw%c4SYez|&1k#CPArC~!Q7gYCW@Y;m|d}$ zC?WKo;0RGB54XhI7=0|7bLq1mJneR>2WtU-@S^+pM{a1R*T`WMnUe9Iv#>Y}>U2&L z5>g4*2FW$W(+@iTBeI=KHp*jjyXlH1p`L)$6)KGRC9^^lVhJ#sL++F}BUlPB&T(?} z9#a2XeIWo^Y7?g8H#q1J(gXeHfV_V9?~h-@fe4W1fUqnR8Dd}YfcpbeBRbyD zlxP&ldBsR;MB87J4*b9e@8}Jrn5*H1-8<|!vu>oHB_k#nA5U+rSM?Q~coocy2VQc* zQwcUDtN`<+7XHQ+9*~#r-@Cr+2^mm&!S;nNZ4P^iFnq?ck2c_H_VMz2IUtf7lXzB+ zk1QqlRf1d#6rn$TuTd-(A99lc*z?X|nh|>)p|CXFOxSyY7FVB5vG0JKB<_x#y&|}a z-G^d2&B2jZAHt73^IToj4f*rgYe}{x)1N3jw}F5#xr4WtkiRWpJ|%AD=E=*~Lrnjh z+)i`JdZt^qm!2`0Zr=}vju^ZJ%RKc;M+dkL3M;Y6LK$2Drsj|&!(8p+Nr~htH-g$;Q=nSco-of_I0R){p`X$Csqr9$PuXsX9#gIx zn#8yc8WxXw8B#AW#|#sirYw=x6_Peqz&9Ruzk0Yi=p3BVjK(pGab?0Xpc1zw-0`gQ z@tR7lh8HeZ-K5@eKu$(zFdE2q&H2t8@RT41D?-VH(O6Ap*eC9DCTm0I0kKYLa{%fi zbbfJoas0#2ug{M!KE6GCb4+@@kjjuo>;?Fd?BQT;yw_*Pua6JUkFjm_JkT6{wAJ` z)e1;j3NZ!xdrLXF7d9R9OGY!z`cn>EWSAQYXIMKHb2r)A?S+7+p|W0Y8qJLVF2sw; z7}J6_CNdh+yAs45pjkM~oSV@s9j#Q9xd=}7LmN6<=;#{EM4P#WOce*eHnuMj&TD2o zHn2FXA5e?*ltj4$!OAVzC)7kp1`3ZydUPe~wnHIQX?~gvD}xhH#sPf!QV8_|ubCFR z%Qngzpfmf#LamyAsGbvq?4urWFvphgz6icYlcM-=N6#)syNGC~x-Rc}Wwp}bi?6>o zm2LHad^mEzk{@#(u>*3(piUQ0#&gK;;Rv+P+(&lf{3!wJNy=Pn(>-!Dp~=`4FLseN z#%E)>`Jp5~p8)g0Mrg&b-o!|R!Tf%NL%DdH1bL2L7|=#DHf7TxGo?B%{X;i;t(UW9 zX?E>E3dqm)fZiXedR*Z!(8HnH)`SW0dHLWiW1cff3mpfwh6uGBICt0d!(nkrPU+0p zyQR~&YHtwR;T2^-#o>e1pzH4B)dS4HDO`!40#&BwMv_)_80?8u)ysBV(QGf~!{Ubl zdNghMA?r3Y>W@9a%@b{qk`J|NE6aJJO%0j7A|9z{;*s`t5MVAzEbKW+*>-T1Lb!A{ z8*tX5nMN+O@8M)ea*@EDxx+=}R7(Cn6N~7XLknuLbUOXO9+Vq1MgfL^$-5S8M+x8j1r3;covk6IdO&3E2=Tno^^tZs6ViF_C{IT1q7N~bd~ zL~J6i(ZNh(+-@vEzzcxoQOQ{AH*@?27{d_TSVjNy zo|b$)7@&tL4XQaNya;eQQ4cH9#d&i|`kQep)fBeMi9{(1s8m^ZucGxh{}Q^<;+Z+w z*G$HpICtyT2D28iNV`OeDa8JiZx*I8ow3M7C^*Z-3-$%AL<>;O#}L~IO&%T=YI~2p{d2B z<^vjwWUL3&@4t8NAyNj3`oS&6>Qb+nFNQb3cG+>PR|Hp?Z7UXYZ6IhAi?QiOFRW3X zL1oG66%02G`+62Wyi3SiafP-?|H&?Sy#IKA7p2(MW9P`brrxsvn>2IMY-}%p@(B3F zz@VreawM zIItrkjz#sjM}|zr^>C7AY{WmgT5+z^L77(|3fH+;;G2LP2jjr|BrL}l_5QQO6y>*u zE8MsCAI4wwRzwW*3znFq`juqrXE=s^D!}v3|qbCZkK`~ieVn_Q)BS=2P ze3)tL1RyB3JH1B*a)NF$B~l)0D+8K-G#5^`bekOv0F7A6l87bYEFj=hE+64~Td&@y za>Zk=X2qe#NaR}2ov@7E@~VsVQ{taJ12P(FJJ#aZMc=PP%buztaL8Wf^3I|yX1qus zg~t@=LY;Vy>O@VmN8~E%yh%AAG%xs#ht$LhX$uN032o(TMMFd^ z_+75!E#7+aUH@4x>wn*ae~7sET`%kZW5@GO+3*Q2&C(KAECUCEEHnB;X^lYVOT(-i zqT-FitTV|&Md)ax)kgjL$lZc6vj@(=DV=F<#BfkApChOoBPtc_GUoabM1-LSk;dlm zZ-OUg7!TkX>-x`U!T;1IrG z1eGX=BHb%T-NW`Vr8p#tV7y-TtxcX(z zMnQ(#5IH9S9!l?es0=#xirKZuE@=jWtLB9OTnqxTKuH;3k@C0)=vlQfb5u&W0_}Xt zmK$IK^rmkX(h7kEo@b*RP+(ngR=#*%-&elyE-tYC)N&^imVkeQ@k6W8G{>IW3EZ{i z5gxxWmhI3Xw2ie2?~Cftr5=SQZ{G~6I4FQPEKZY<6@CNLMbNR8NYGUVA=#;mFfy$ORUI(dH2TKRLjlS_WaGUU zTgkoGCr8I`&yRbLwfOlNg^HgK(Ih3%iz24i5I;H2jQfw{5fM+uyF`kSx~3WHxYL#r zfh<(qJB~paMHA9JJSQjTUGnnq{N#MM^UKM_Ki~a)L4G+rJ3D-PadLc4-kp)7cW+;v zT%5dndrsc{Kn~yj7y0Sr?Wm3?mto)-onnWG2^UR@d4V~cM{i_rq z&-VYV|Mc;b$4{PPyZ*DsPoMo8+26?M3!Ypmn*H1Ut;eb&_ZNA#$ZH0X7==KZrfP;t zWMOC=o#2V|Fz0b32^~|dMwLzlD}nQgpZO!`d}%ztJ#5z4PVR6c`PS0I=?)1ngPauY*)3dmCrj*;vS^9G}r93|H(rNv750VZsSL3W< zihr3QosXfnm=InYZ6^BIcGN6o2gJCbJ6Dx?{?Z)#?b+nhBL6pP0xq=wo z-{k*&JX>3&A_lj%Ojwlf5;{8BJ9=gEP(ngcyeq_HpxggPMvf7~yx|Hu2!pM2B*?&bOO&%H@IpsXT*gw_=3X@oW}FKif^`&p!z_8O*xKPJzcm z80)Be=#uS-hl+GB*{n;tKfHU_C0*Qjx?~&fXm?*8o^|zq|5tZshx9&w?f^J{{@JtH z9TtqBKS?1!b;hDsaAoj3oUka5c``m3C&K-FjA!FE~L-0eK#2>KJdA1yzPx`%TXvrvibf@M=_ zqwW4eb2(@BZZUCg&h%>Uk}j^6JDEY8Jj98Q2>XLTn35gSU=DAWlNy27A&Vs|_lo?o zO0W1usaHeqIkX26=w+VWt0bIVem>x;V@V!{Vw#GCCCbeO#M!;kOpEoFx+Hjy8hZ7O z{u;tmyX3*r^W=eG(SG27AP4Ts4e54CP`q$$Ye0CP08Trk4(R%#xuCjU)OO)P9E4r% z#cG@uLmt57Zdd0511N%NiM)o2JLHBWJc%^A{r&PXH4L2yMYi$Kq#)W(wJAw6o~RM& z(liaqH#*%%2jp+E>r=iqoG0I_a^}G$o9&VZuxd5^>yuK2=m82i5O(IfMsZXd*cHwy z$xSWK4Ap`&lXdK^E3sAUS&3A{Vm$jvi`z0mZ0OF4``G4IV`*3WGOMxJ_U>;ruD-$c znpfTC*4+0#D=xj@Zok|b7TcOjZRv$p8M3~}R$OAsEU-CCYGbSEepC${X#<*uw-;_s z(eRe^B0b}t?Z3tLe@IhTfnhxlzi>nlM|~)eFKi z#{{iwwZukR9GUZ@Vw2+|w~vlvF{E*6aaCXXefSOMwCZ`yU_E<(+YK@}^5Oic_&Tt? z*a2F5_7}AoWiulzWtu3gDwK&dgOu~d!JRGg5xILcL%3HHEH`JEH7qFlE6to_(<_$2 zRe+3Ki&miD?OBheykPs4NZ0b^=BRdfdU9@V#xF-ZnsWQW z@+92f1PM(|>eczL_1opiC<&w@H7S_k{v#$)DRRO*37-5t=p2%3I>Q`pEWB)KeN8dE z(A_(aNS-Jjy9Q5!C&516%qp93x*J2KU31&iMDJnNIhPxVbpQPPxl4$Ps&w~WHCSBw zW5ezAjE&hR@GJVaR{#7HHsdxJ$mh>wXi6kO&o=Fr#`}_CMCN;U%bxtlli-O-oMY;b zc6p*$HliU`(Su9wUCde*bRIprzy#H%wjSj7!VAQT#$x5PJ^K9lL6>Zo$U|<366XqTA{$4s?g!Xs9=CmI z=gd7ki~WC?t!~}epMP5%|MR5(v=;xf-+%ti|92nHa{fP%x)&xdFfc?luOFt)#8Vkp zc-!W8!^`!#bgA{BUC`H8?qUva*M~r0d5&LC8 zUYiOXMQgol@?xh#)g%+wcF)q|8YoH6rK9!7JEf4`%^t3` zZc>X#TAb}vNd?ESzYCtgv2C3S{>c?hqK5BlM}H^M)&%zb&kq1bL(_v7r2A`P(=wiu zMNSQN#S&9-KVyFS z$6X@gsFbR+oa_Wk7S8Oim*y^gJ>_u-$)z^}_75gCqMz~A)S7XbEU6-!Nzb~sRUqF( z_Ul2Fx1O69)85RCTm!|wRX#GO=cQ(KhP=US_FvU`=C^0HXR-c=`J3)g|9krMS@r(! zci%mK{7wJ6k7ot_&vRa2erA({%S4jY)DOcr@V_qECa7(|pJzg-B5KO&KWf6THRhUlt!II#4K%Z$7GY=DT4=r299y_cwU}fl#GpRk{G$?G7F2$#yg6!(}{U zhPh0Eyc1vuhqI~U2T@OCyU5ab0BLo~e37vvV%cdP$EF;v^`h*|Vb`>1USV3N7`O6m zf4BYJ_Q5*VA~f2NH{ ztngzjZLJR5t$PlW*H*^HS-oNuE@1Blcos9cd20=fvdz^9*$irx8Imf5|d^A#=DFRiX^{8>W(H%IyF8vqOS|Ni5u|F{3_ zoB#J-o>k&Me+0jUVo=jnuLzbXsF+So84XNd8k_uum6A+{rzbA8sPFo%?@@-~%qUKp znAF+E6KdX?zs$Q+k*VUH`K#)mJoUVhUZ2hp8NlvJ#E4L@(wS*#areL0WnQft@ly!Gf;}3=GjF2sx zjakjr`AQSc_j6vD6vO(pJrlHR-Ki5IX?K9uCdb)D-XZqEiv5gFNL zf0R0JidNaFw`vb9!2!IP$8Er8h2p)Q$kKb5*{U66-W|C7EDaqJlIp&ELr^cZ6G^%_ zmEGDH_8v$h0HsJ~Ln_-LPgJ?Lo#Ndn7F0cdT77Sa16HjMc%xaYVW*sL)t%yDKh(sx z2lZMGXqE9|mNEk88IYVA4}4j)gkZ3T!>6W~F7DxrShoI|$7tIP5fb0893fE)k${xN z^CKaUIO_#H7}SnpDkVspTha5R(%Xu3t$#j00A+RZ-Z^z0aYL4=9+u3`ibN=0vMi9E z7q8EW2XwUCv z@#N~hvD$BThJ~FAThHsM#T#ekw1@b7dv4CC_LLGu)r88Q*o>6A?p6t5GRWgmNT$X7 zQlGizp1k@N?9uov*8j~_&Aape_xn}-zyIBLPxrs+|M&5%;Q#k@d8ud;(JV5>2U^8} z;T_u?WkCH(uG4XYW}bOchC2~<$u4IX9f9x{3*5dMHAy7am8lZ9R|LP=@m`PRap2Iq={8O zb<1~GEX#Pr$cRQyCsJ#sZicW*dY|O`V+K%&U|I zf^-oAW<#kTdiMUNb!Q(D{I_*P+>nexkzCUKdzW-ScGpLWI>L?eIG&L|avJjy*M>=& z0ebtG-4;AyDGPUk&dI1; z=Eudnd$i|;gA3>mQSBOd1MPg8>xMN$((;LY>3F4j1+CU#DZ2Y60yj3x@c$O z@~|bgd2ceESnjDdUi#p44ov=H@dll>??vzAnqJC|&>l-Pj`gSU`6n4$2JK^$}U zn`pTo(Q?UV%~t~7dOj!J$Vv?Obnya**>qg0J2-fOIlfB^w_)9s6OYzbPWg*+SYy3M zJ>nahruL$M7kQ~+c|mv*u}|~9df9qSRFioG>$sXKW9F7L3{+mtntA(rd%y+k_MsY=qJY{y84=pR!g?&IBwv(C zhK=0vo~7Rk9C_7fJUTe8#_ z0lw;>NjjnCgPiSF@n&X?I-;6}jYvNU$Qdk+c;>B^3b_o%ha_Rwb|uv*YNpRDdsCVl zG#MlZzIa%Y9SBe{u*R(bZ{hY|-*()__`pGS@Pc%^cJq8-*JkDCLKIX}vAY+xsqNTE zF|U1pp9BVd*VyoY<*c7jMXBzix#F=5#!UUhWbUUWuB7mmEOLsuKr+7&T})rJ3*wo@a{Z% z9s4Sr2_N%c`*mK*>|m9#=GK2UWD&MHRzu2#i$cNvwfi^uYnMcVVah2Z-rQ!6?|)6Y z7Cjtw{&jm31>7>9-esx+yOy@zRn{9aeEyUrp`Tmc$J@JSSh+mK5;}}oR3fZfP%r#d z)OPFVfepJn^_FKfcS~2m`8J=j zjEAJZL$>oYt+%={c~m}j+tw|#mm%jh8Qk^(8?#Smcu;>B$FI2p?^O5KUw`pvLAw9F zOK!B%CRIkBE!%lvd4cU^C{eU1EjT&JN28cEF1==TN!)fj6hi=3xGk$(Z^K z+a8{NZPaW^(u`ekk;}TaKz+4SE@L%f%SE>07ccd7Hf57FpjNzh%Pv z_AGJ!r$k1_?C$P=_WRGD*6)9QJO8_vXZ8FqevX23pU zZT1Ho1C^TWRNTsT5BJ;PrN>{pzjpmR3%*{l=v!1|njve&=G$iS^*xK_f05l`-5p?o z{NI1RUyJ{E_V`=;_q{wT$^Rr`ne!&1v(~w0Eyv6Yq-;nOLduy!8nyy-N-P@}Ss$Vz z!E5JtSA~P5kbEkQ?HfO-OjGqJ|C8LKX=Iu8B)ofKPA0h#6l6Vod#FU z%bdp%VaXM_q8T2dVUP*M==+89SD^(?o}G~Ctmlq{7tctgE6*7UZy*pVjXC%}r2YqF zhSplILEHNRoP|eJvL9-ng3qy6&5%_c!`~`edn=M+wYAtL=(Y^VPJ>zue-<9h)?Qko zGgPqwk1{c}TPDun!kL?UeB%Np@UN9tR;}a0ccrm0hgseX2Hhh1#;ibd@YMA_hCN8V z8~zS;b}NSru9=xlH&QKX$Lpupa9opO@O{RvIKy~+mMET?pa?M{5C0|~8gC`x398@Ca0Wp%U z$$rv59=sstPt&T*Wq#A@B(HaD8Z;h1?UW8KJ$9%Bj0N=*w7GtKv*^gzp?`jRzU;GD z|G%bL!jthWOn`;{-~F2Z_sQdL^`GzMSwa8*1sQ?Rp~#gf_>ze@hRP6hJWuU+JY?Em z(D9t~-)BOod2+t7H{WMUlZb3P&qUV-9e0VB(0j+^6s>0OzQMELA9xaxZZG@w*XZvL zZsdeMe)jyJi|IyxIXruN^7h9Aa#mnZBBofVSVXq9O70~N|NQwt|DxM`{=BnGjIxoq z+83D650A{_8OfMNlO-m6j$R2K)v0Ytb)`@*3X-|;I#<|&Tg+jVQ9lLX^T)m z03YOO>6uY_dX%2mvg7$KzHJ`=n>-8UzZcQ6_c5eW(j?00N}Is~`TuOc|GXmqAAk4l z{@?vPE69Hn3B<^e<$@wJUQsfLW>___R^n@!SgC@)T!(GWA)ENs1#{UT{<5vGTnI?{ zc8O_+VIKvuHpP0zOzek^fp<_l$A|10XmMN{W!4m#9=O2tVkCQMj>_U&k!i99w+W z(vyuC^kWGNtEjlYP#Lov)&^>Y$WU>3P`&p98EC6_$l#21$G$WK!K9Ssn?kk7K3R2J ztr8VkL$@^~vVnQKivTM;VD)#+@r}g+%wib;IS$fVy*%4*LkOiGlh_!NI41)`{)xw& zW;5@C0Q$5cD+3=-ly$a=ta9UTu5eqpRBYyuIpXRIh>e9{mt1Q>0iwq-)llG~Ph4Bo zJ9gIJU5P}P*X7b3ZEE7p$}Lb?ZSJjfYo7GwC&Tu$#4Pwu!uA=lh|QsW$=j$UUrVTW zldt=>bhi=lINvML+}{eU2H|uClNR`^Uwu9j3+BAK%9^IL{N`Jj=eK7?`)^7!PNU(9 zuD}KM-*?X+Kdah*PoI3V|L)~k$Nqbxx!~2yjaz?~yS^IR&m!7t`N8ey+gW{fjJvV< z8c4d5#b>`a-O*f4);9VoeKnhWGz%wOu~6k%<8fLQAg_6~r(8|iO~*<mmnx(13>zWvd%@^8pAbN$mPIDzrtDxhMjtV`=*@`meO@1Z`2J@ zjkovF#{xpW^yzwQp*x2NEsLt1`x@FW!Gy(EcR;2lnC4UL{}e~gGCSbLd^sCb29|+) z4QGz+wxPdu963vNvtc)mMPh|{U(YnAt+j{!7kk0sev+^`&IfjQPKRSvTB@{vVNy#fJSq{r#tp zYv=z@pM9(UbT7|Z{vXW+uU`JQjE(<&^G+bcVqcFF$j7$b6NF&j(ih|pbw>`NI(b)f z2$}CU;t(qL)#4DE@5U*2(c;Eg=v1m8)$UaK+8jc!sG>tEtKUcF=lgOfoilsGqwY$= zcME$u%+=($;1#bQ#}_SbDERrfoy}J9m-tXDuto2{`-MITAB3;cEoMaB{{e0>{J>vi zw;9#-v)CD@Ije$l1(v(_$yIi=ugWJUnOednSBRxW&N$O@38u&PJ;_whrIg;F2hITU z&G)vfvavbe8z^7HjhKx~z`c%7z;yf9_PrS-R+#s7eQzzj+}8JIy8X(1Z%cb<+BE39 z^w4bB&S}MAk(y3N=JO=w}9DoH(?e4##&FwsZ-dK0z z|7#}jN-jXJi(6g;YUrua2k5L;*WNdB7x$_a0{g2hd~*xN@M0q7c$b<-YYd|b%Ddhd zjGd}CYou(u`=H*u-E?kP8ymV}REMJMGcpwNCUPY%^k=b{y|Q<;r#T#;kebBfLB=$3vlf3p4>uCba*xZ)JFsFioI<3Ib~^8ek>(^e5Tppzp0EyZ1Vx2$YWoP_ZPrvcl^TZ+xdKP zgu8L~)`+>BV-`PK&L`U%n_24QlFek0LfcA5kaUn{{9i13&obHKq$_pieG**ZH(ktw z+wR3yTF1<0WV=$0uYyOnDOh7?;aBw!*dL9kS?6Gz!~Is}SF7&g<}kB*3}?ip?|xi~ zRL+UGm`HxprO8u*@@L5obF8Gh+I$)oUJPR{+38APeiiNlb@%+*M`mXCmjwlqc^Y-fIO<^_nQ*$4; zw9T;7uhQv+J08{%u%;Mdzci)6Cu26wJG8PkriHX``|Z<=-}rMjpY%r)7G4&$W`W)S zKlJ!eT8c{4=d1w7HA%LO&OrY21?fNCS$ZZK)s9>6e`A0C#Rji|73$^fYkLKqYX|qj zZj0`v2QVce*4#U)(9Tysu(V;*@cxQ*g=xRVYTeDVn*HzZY|DEA7TEt!pFi2J#(zC| z`tAPby*%rf|Hc^BZNSVQvbv>@nme?IWql-)(f&SEu&ye6uG|a!)NQl$T`+@Dkb3+3 zMoDfNt-smP`fjvk6uve+4-4Kj(xwT8dhwgeG?3KW>MfSdE{=~EC>5>Vl;&~067hS>Cs;G}zZQ*;%?xe^n20LcJVblk!xCD3 zu~A{IpuqXYO6JmH?vXqh*NlaNhXXg!tyYn#j@D3EXgTH9ahWYPHg~lz#;FyTZZ$>S z!X;TMFz4&S-ao%Bn)_We6+@%eJL#3tvrVA@iie-)M%EanV1JB)RTgD=?NmLM>z3#$ zR$SZNO;o5YVxEVp+x5LpLANk{c5K2m@0a>%_f_qj+pkusmxI~LN=?R09pzcZlES6f ztrf$iN#rC)sh(nOq?O8Idf!*UC@dIqQ5ef1HbK@t_%-=8vC)WslfNbnc1}w<&tRt| z(5r0!WA{+huO`-9fgTz~Nf9XH_?)l?y`u}}ATjZ1~EvcZGFV48$b`mnoc^qje zp3?A=j+qQPTjXNGC6RfWicCo&CoGO3=7mhD3MV`n?~;tgRPigbZ5F@NBZQ?GKajp8k*hQ(h%|MMpy#Ugjy-KC<&Dkk@JFQ81*JokxM1rkzLs zUuTQFrx_QyBqy(qWhY28@jDAuC*TpId)O`$zjuNw8H$MQ{e^rIE$jd6`0&-6<6s(X zVvPCg|JirX`cJFtzyJ7~{eLgd7I}$v;p}R7&4-!RT8=b7bUKIR!#`O(E&u%6wyi9u zw~0Vbpu*gq5-AVmUW`pY8jjl1ZFa!>J{rZ2Q%8hN=41<%MI_C{ z6_1!C)Y9B~_B388%Ots;@NhyxnrIaWod0mq;flo~B?-GW^I=L50yos=f5&bTWJ(h{ zW?9hbyev&;X#kM;AAZV*jHan9db>2gz;qzXL@bTPY^s$*t*m1A@TV9N;LIcJpC=@Y zbE#M+1Kg(IEs|kEB^hcSQ%q_b1CDA^-NgqBriLay$e3CJselIXu&P5fMmDHt>tug^)yGQ~$cq>9O1&G%!dq?tfI1kIZIPmS+P zDGlnI?#42}VXDj>R?B zj~vEW&>0U%EGy6}%42wEEI+f94Ua(dODIwXmSMz4BL-T#WMKj77C9V^c)}IefZk}R z^ft~TmS_sFjQGzDdBtRyaWE6f($5V!{*+?5&66a})#492H@*4KqW7En?51-=24=}q zN2wqYk+xmMNDash!BX9X68!_w?+j6AXaMsja@~-DA7A~$yLVmVXekP9zdSta>i_<) z?#_VB1!Y3Bs051s;l4phMP!Lmqe?0w3(21TccOR`WDb;2OjD7tL^*&8C()qHDy^U( zQEF7VJ5XRj9nq8ydA#J3YFI35t+C~wrq#H3!QFl-ZDIg_wnLB3ffn>;Pajm#HM6fJ zq@tOY_MSMlhs)czVTLi+GSc2Z;v-l0*c*Xx2~G&f)J~xJBpBenMr<|sRye~GyDV zaPkB$>D*%8Z4avvb5%IAAq^XVTmjCrmxo6rV^ZW<$W{S&#dQ=lgSj-EM`y3rAm*xY zrXuFytO?X*;nX`B3-gStnd$5<;7pjh7TM)#9o%K%G(D^au?z-ohy{T885h3m95p5?mE~%#+~B-&cdN9Zpb9j+wQi&9oAwo;iXK@J)bcqPJ1mLU(4GdAW@Wiw)KI=rP*Cdqch(u{>v zvFJc=P^3IW#*&C-r^P^oCsHvQ?Nm^Ai=`F&{%-rb$2$dW%GpB(O^DZ^S|5Fzfu*=l zCY?W4ZXU@d34uEQYF>mdv1Q+%wAt9Rn#&@LmFPPBpNhK0r}Cy zL=kEireS$vz9KBq3lk4?^tLZ>86TdWI8AxAX}7CZq7h)D)r9D}-%bTYr44D;HNsdA z`N4u_#iAZN5sHVE0|)dh1zhY6V=>-)yx;%F-u`!c{qOf^%6s0|vd5ENzt?}h=ZW=M zqUa~*t`C_cO+>Z!#VJ*ji&@GB9)hPCPn5KmO^kt&nua!3%*6$;Xaj4h!Q}YLpLs+z z6MYm@DfP}iXd^1GG~6h0|2H9O$TIZ?j~UO{A32k%(5q@hb#{RMs%K6o2~85A%xxgO zPA*=b6UoPkX=hLB@WhKLdmLuhtN*!M{@#x*YMJ%e6%89i*u4-Hbb;4&$l|-Q7TShh zyVjyZfEcJ^?`B11Pmt&4w+#q>uo4aCyL}7<5IKc&q{RjPizoq#vq;DQ{o#R3 zSr|wbvrvhw{FSyT2J$K_w;9ZH=zyj=mnUw;5G&9BttNlbTw}-u3giMjO*OsR6E9%d z-GtP{AK2BcTfDnsS;iyQM%C(QHoyap5sxy4x{5s>(r;(vkDSJu<`JQ33UJgti_47$ z|4nHK;2p-XxHgw1F~-%sHYp+nA``Ld#4a})P-$R3z{WttG|uHJ%GDhHG&b0LsdY=4 z^%t}~R($4*+*=CVzo3<|;^T8Z#-RIB#4|#wV#EZj&z~EsP}H(&H|P}Agc3%MXeoZ4 zkKp2OcRF+b^gROL5;`t@|J(MK?NFMu6%EdzO>ke0e3xwIWUwQjxtVauRyh8-75QA^ zT`=OlB#q`_=#j5*grjOZXds`vP$M#uF_m$4#URX@j|h!3Mxz-CVIztH-A+lde>mNXA7bCoTWYFr|MNOuS3* z`(1+Hg2sbw53TWpTD)-AoSL`~W>gMJhiNvs03~V0t|0o`UAVHOwdBL^1G12O&2c_| zrN{2WN@R4*HW%UdWj5W-#RYzuU9ZHTaL`4H8C*A|%YDUK+lJJwuUN72`B0^?%RZMxEJIe*|B~)D zG2Hvq!jST$I0Gr2j^-__h_~m;yMVhA>#pJwIT3jr5d;A<+Sp-sol!B$*dIAdR6MgE zhb5z9@L-^KO>K=BuKii@#Xgg}Ju}%Dqc3q_afd9ov95jIYq*q(yZXzV#}Q%470*O6 z#k-~%hgf$|&@nK8qROyhuo1Fs)AjUKHu*XlmFum}X$;4r8QxHk?!JN5N$|S;%Dk{Z zak1E$Uty4*{jq$|SVg09u^LrWRmg%-CZ^7(G9Y63I}4SW5UwPqYNu+l5*nAKTp#$? zD#}+Q8b7g_M&dP>en7e;Bc4g+p`am#J1*4RSC0&;A~S7`JqXG&sNpe5MAEaZeKhJy z^(CA2%gBK$-GrWzTJMW%@@oW;fBB%TuXu02?`Ms``Y*3JeChGOqQ@633$j=EN3cue zW4TMFE9qrRzYi9<| zUa{)tJ?qMgr_SHI=X z=a=@s!|e}&{nFbXLUF&_9~kt%&@AD}c(FCVgynuK<9eYvx`gR>yBHsjtFH}Jf=t9Q zPsSH?toMFHEJBAOS0;~%X+abngOGQ3BL=JAmFR43k@J*=oW_I$1!Xv4Q!2e%Il8MN zUrc812OM+=QL~gC=ni=@?hq0c({*4k71-upK1jUd!6k_W+^6Ue!amVy8nXiu!B+tn zosO6KX2DQrt|c&XaSO%o*`&zXOU69;)afWXUeqo2qv+W0rXTd52mM~ehMXq7{(die z{-o1M^Ek%qqKi5OVvlBoV)v)+Lzko;+@cQ;<7+yT4+$R?aA=x6gbNqy;V!0|mrOzP zlhIqDPBSK1q8=hVCfuk1h-Mj`bqL{#VFJ`hP*S0LSDehE=tn!DL2l~KZzk;tYPb&koHq(4cRXC{ z6&x1Q$(B99_QX50416MJI(9ndWEBog7xCtg6Cp8IY5|}k??s$XS^4;Nmz<0&?{$0K zUE&Y(7Scp@yC(Hc#HEH)l4zz08e(E6$%PhdC5XGdZl^=TkV*MQL~IebhtQHtMO4%Z zY=yft&>5rAFBwrzSz~u$aiG)RW8YHIJPw z>)@nsm8JvfxV5?sBhTpGFI~WHUSzYl?)`FL}}i1j3I;ICF`OY0w;~Tf_%;ix8(( z>PEIE&QEOSNU3QF2y4J{EvbGnw|XHNGLbBi9P&`YS_BQ#&nCtbcVxCpq?j_I_>@WA z!8J`_QI7T37;v58>2NBfHlJ6N>!SB6ZuQ_#`q00Js zGGfA6uwL8A31aR=Ze|*^H1+o-YEVzWcd6kOF~y|{qyHe3F#<}3ygyx zFd2eba&^$LnxxI;cY1h!{>!_wSDix1yt2oK2OVGcL{dVfs8RXN9CG>bnl8t4TdZJf zLA3`a>9hY_vf11bFTJGF%MNIdFYYE^Lze5xRK4hScPrF<(d`1yKddxe zGL3e1fCqM|f7D%6Qfs%T2k*Fb$3CSZQ^f1$#e?n3e8@r-!^bw=ey_ObU~gI!+(3GQ z{4PbJ!F$pDGte?G@c8g^R|_~Q+4HBQ*Na#vBDT|MB1C^JLiBw?^fyC@{v8ma-%JRb zgY;*cNW+Bp3DOVtgZ)nD!@GpM6<2IJWEtr{`TyCwqTa@BAAZmN6hsUB|Cb<63g>P2 zFl4$Je2|*8%lI5!8xAQlv;JJ>QvxL#W)TxU~Vrf!dE0A?Od!0n}l zM*N}8CH@W9zF5z82xt2Gz`alvTE^aF5LExZhZqeON81Ib{Su)~tIuivJsf6GgB z0KsCoyy1Hx{5&2fNeaKmjOOrf%i@Tjsmw2xIt{~O8ckB_ zcfNcm7c?E_(*aqf_-l3@TBk%@8npahsPO}ChsptT z0*n2`DeNupg=6GBCc%>L9}{qSk8rC^$ak#Uz1X3XIT;j%yL;W}3Kja9KZ?`f*frwd zUSR5a6}$C{TA&Hlu7sS^L*|f?$g>);axKHLLx`dy0?v1BIqmBrxt=N#SP>#baIl*R z^~VXF>i-T(zkCUG0%>iB_Q!|hcs*EA&{LbE5=QDX1mn5RTG-*Y3yszf9~Z1>jY6IL zJoaStTyW;~(AF+lW1I10+t=tG3M2RvgC&}{OnuR1Dd_-`niV?l{4R%P?RDEZWM2>S zuZ^sDif7m7k7;Ky&4oof3RV(csfs5r^58Ta=3ZGIEtXvkwN!sv)`d8-A8`P-?K-E8 z6t$fhw7NcE>WRzf?>ud_b!krs&-3h}zaQb`ADR<<0=K}_^FZUJhb(nEe4Nk7o88MC zmETp~>h{EUdHyfg?dgN}URku3Bnj;b=u{DIqFl5h-(&1y0ud`No8G{C-{2~|x*B~* zyuLKzM5@P z+3a{cP6bgp)ux)&+{(`Gm$!GT&0Uº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%0DA zQ}Zjkryc^T3Iy_9FT+Kd2ENUFLu0N70vgOwm~lk%1vBm##{%(#!g)@~_$$^%*=ozg zCXPDb(mlB4+6e!P(^yF48=p-cj~@iXf`waWiX$XUshP02THlu$KL<2M%Cw>BU*)bd zl3YpmgBnLE?y=k>7SZv}u0;{MYA&<&$cV&PE~4!* zcsOEfgjy~-hxY~uz)SGK33;S?)la)lm`-@FFX2&w`` zeDV)mrgCl_iSP|d_x4`MgL0_{d8EYiQG{bO5~FQfe)Yq_KtqDC$Y8CptwKGf*Er#) zZFGZD$xkqe)vEDzy2gos)BIV4MhItr)kv(O1cZOvnG;JRu4=OwIfHYnGM9Ksga#Ze z*=%%;mf{*TzvFDt_!1gl2wjHrj_(O&I^h0X1>AGSXlVY+yj%=FllhAFE!C6rmeK7bYx7F+FOt}B^#xa5lw=-7AyXi2is6`J9ATRM9=Db$r5mAFgSp$E*(;`BQ`hR!Gwg`4kR8lvB^&HgJC4feEyCxp}AV9-PtDr_r6Fp@XE#08)^bcPUu>XROuTHjvOW%hnl0m~%1bakU47Nf8r3M{_6o_}Q@eE86 z_jjb3Kb-WgHgrWDRbjV z$U`p0x*F&z>SM)hv2yUy(n;ML0!bRa@67%~Ni=?d%tW+4r^1Ra8+Wh9R zbhC!R^0WP1pKWBPb24m}8C5Ze=lu2zUcaK?7E&ETCRK+kG>12sq{10Pzy}!J!ligt zQ1tS-f08VUcE3LO`p?@2|9Lk4vxd=ftSbLlZe}o`%2|-+omVJ;I(jloC`%Ds=s+~l zv8aWp14?E>mv!am!<-idQ5KqJFrwkz*$=q!yU4SPvf;Z?1m_rJ#5Q>G@9tOo* z3)xDM%oBloD&*ZA6S^ctQ~Xf}3{S+M6JZ96$!+;p?M<7E6*R}j>kuQ*TOdr*8H|Pf zOBzpv6ah0fH^aHrI1}wf&E@Q3v`RV4e8sHD3A2m1CSf3?J-}{>zBItZ2s)9`6=u9e z4h=13ad51jL5YDce*^BgPYKSKjK}MWKouXTF z7?sRTiRsGhw&PBHzN1q@i_6@6aZ7gqV!>F_H4H-(@~Mu6M4+;8sh?n?WH4z?lcK9B zg~{DWb?MfEk8nw9Oy^2&=Z!C~5M`H1%7vH!(OubN_mLiAB){0^u$T{Q7Kp(RGALMq z8zdE7s$4Ph0DX9mV7Nd)mE0oI^v+>#Vs;z|x|@owqnYkHnvzt=hMe_rW{rNyP#ka} zX7CLRu5V!)iXa6c$H{1Y<*}S)FoiKgf_D*+2|-d=>L!xsObY#4#tmoz&WyQ~Oin%L z;8ZE2+0~mOzBt0jEp)gfMK|KzYwjNVA8nyNFtr{*O+rTy9G|MSB3{U_ zi2%%W{I&_PG&@F|#tL6S)uQtA)+1$~5RZ-Im)n5KGT39`f7kcH*^kHaNed%jPNL9^ zeG_<-xDM+=1JZ*{+N?v?GZovZs9heAQt>h_4@lR@iC9y= zgiCvj%R=BcKdtCE`C}*X;;RzrB$K+RH%->V zC~-`^gS~;6sG3QkX8~^3_}!j3hXqyQ=A>l0hE{CM;go@aq)CA&P_L7`!DS zn8Y;7N-IMijxJnzYzYD#5HKZK95y(+{H-tg>X3hq6v)zyussH6>O?HyH3BqC)nk_2 zZK$6u8YW1M87?x+qK_!ZWZXl%)Ypi$8RC$9co&0Ha)U%=(*379;9&1yZ$}zVZVvMJ z27Z-Jb=LDKjxn91(76nJ!POe@o0?^GM5ZG)MhQVfws2dLgn<2WE`LW&zNe}1U#6;h1h$4jF6RGvzrLO-+zBxgdRmDVvZ zqbQnkwF0KO15q#8$-6h>!Qjc0znjS!g?N;cd7;u+i}2r1p74wHOmjB%HPvs%Onmtj zHGv8K|Ji%*u%^0hUo>4+kzU_?L! z8`!WTAkBs}1sfu$peX1INRfD-l>`Le_xtYN_w48HbI!B*LwOc+%{AwmV~+6~WB$fi z-U43%91RTyYtEg(@Ipgz{M0($O)%c{;B)VOK}W#K&Px>Sk3M04?~`{coJZc$(gU#F z!tL-+J92I(0wRE=Qv{RJB~ggs1g-f%D(T-u{`hXh{J4U_yn6w=@40wwfy+#OAeK7M z$=Sr4Cl4BK;xnG+{U=_$3UIW;=^=R7rm z81qBZzwHVMi|1Pwet7af{>b0e0>IHQf!NIZ!vd`O8$a`y9}Dg#(1=Xn@pJlPZgXI% zalj(~9>(uk2x91qM1SGb_#zApoB8j?z4&GPY3>&1>F}EUi_?UE66I)EP&7P9kQhp% z>TjI?RX2)B)Wu_&M5dNNXn&`V@)mDy4lEit8V(4H7r)R|IE5O<v}k>^^#c>lt6=`#V<^zyHWg{-HT8oJQ6cxDC3%9QeWRXqYaG zCioSu|J$BG`S!%;H;-{nGJgkm_@2Iia*qYi*Qw=^`xn;3n9pSt7*Jk}0?eR=^AK|g zmP%Ma2;_CcgYVdA8inv1LkY;}zkMtnL3l^N8{pT0pfCl`2Y?%y5={hpWzeF?b075p zo~;)f8ymaGL8nl`!3(_3-(fhj-%+@~k!R*L58o~j<~BBy2=vS%E=swkE%>J8f|>z@ zDB_$XhXY`i^(V;u=g$=ph{P4ulihoK~4CJgI;h}L5ZL1VO+HJgeUsUUSJByqlQ7Yr(R>5kxGNIbW5BAJ*i( z2irvpz99RCDae))Fj4_^i{%}N%xOMBM*5#B^LK88!1Vjk7`P1xwOcz;D2ZK6SE8q{oqqV z9rD@zbJ<|w{DUJbb3RLO;fnvu92QL~P2g=uEJ_?(K%LamS>ze>yCP8-Ox7QX9)jrR zzc}jNHU|I&L5%I18wKeLJh9OQ6z6=V>p~xDp_&!YFa@pVUJ6qnL%hRizG)5S9difs zcHwUjDiARKO9OP~0Z6if@jU8no$Y-9iRucC(b3wyL#L39|uU^ zT&^+Smj*UA&sQOUV`u`0m_Y=5aJ@efOBj(z7ZiWNvatO1;P)z66u~b39h#aa*kk7d zQuA@JxrJCzt!2UMHsHT*)bDdr0o^P(ib-@81Sa@N;)1{cpA`2yyt|-XFmG!xXyH6; z$fGqb&I4FPBou5op2stvvN&%``4n>A0umPT$oaHK9#{qQV%mRDY<0jPv>09*2fyOf z!fI23Z73kG@+x4?l}cKWLJzzHUI1_|Phvr37{12-JxB(H#xIv?q-UT94PGEVf6R4G z6Z|2e;<{iTL2@RrEBUNR=KMnAhznhpIjlMV_{GoQlW*s8AQl0Oxx+Ocd*L6Jmru^u z0aIy$6Ls+KTyny1X)y&RY5I@S^2Zmg1rj6B%=`*ZEG&8cbrTnVT$cw?V!*-CP`y~a z*x8UO6j|4SgS zkb}*WYzj`F%)pYcRBX_1@^ujZuK8!^g)(VWEnq@(p^o_kscnB?0sbKV^AKg@ydvWR zSA$ppvqEDRAQwSJtiK_HMJA7T%*X^|=hzj02Ut#j&$=ZL`P>>{uQ6$hG9r0l-8si4 zX5OyzxL|X z%>}h<=E}thLLN*okEp^I7aH}SmxD-P65}FhQ4D>0G+vj-1SSy~TKwDuDmWY)Ma74J zv0xH|$P8J)J6TW&f;UP6Fd98^aWEJh92^Y%_pdmd{}dGe*WvEX&PX4iYsA=6TIPb{gn~kNy1Miz2ALTAyZjjc*m~aJ@yTYt zgI51mdid+ki$DpEjCB6C-aJ{F&(#2yeUU%>`-tIhZ*cLD!J7qvTFbw^;`zV)!Frv0 zZ~r1hHJ{{8B8(81(|wkUX>aiGonJbGXhFe|_y04ioKCdId83mnwBble4rY@xsdg9_9w21jqiM)XGoa2UNf@6r`;r#rzxx*zMlZIclfCu;Z7kKwA@^pD0 zo&ki2&%M#))p6p3B|z=)LY04FN2b;y%GN&}w(}qQx4-@K^Z#tNU=YlIJBq(?`{(6# z4$Us8)QMkQh9&N|C$lK-#{9=*dz}Tz$+7fs3ZBB^We~Iep0v7{nJh440)F3rWP=Kz z5S3q&ebHwg7R-kJ`2X?{-MUA!0%-(E;Rwj``^7xuqHp_|L;zA1dTaw zj~DpPT65kAV{zdiCW~KaKu}(Y&v9SGq0kYW$PfkQLm)xH3qBvqw_pGA6H#0KSn36I zuleHoe7H!Rt47VYl7fPE%oqv_A3`MXpa#!FpvDRA_#-npcn-%iqKS-PaRF;aP{1J= zjH6Jo3<@9sXwn~T=OV+bzYPlM?CI|3>VkIm)LFp$<9|&+d`?%*m1`x;m71~s<2-bs z>cR4ou@-0n!375KH=oUmN&MT>cob#+9rKrf#Ux@0i%6`rxlb3c=IdP&sVqhuFO`o^ zbQbi?%MC+?W6Au2QGi3Yux1lKU2a|h&b=!hqfj7}HUg_2JcsppdHi$+Q4q!epdf?6 zuLre$0FUSSAI42*HcWM$zd^ z{b(qT$il*c^}uM>?-(kDiX}u787y9LK5V>hhv$H;gPXT5 z1ORI+eueWJY_W0B<5B0a;o)(-B0>MDF`62{0gcF8O`g*zSPTKNi$WC)VL{H7r$BY< z%~7rN!Uf-GWC{{Y`3QqQ4?(HKg%LQx1m~+s|AC7a3V`4^d)}j4z>^7!!V&ST@VQPF zMx^urxdH3y;;~FTmO$LX^WYbF4uVp7{0+e;zF1KSU?PFS`g1URV5P|;Q3?EM00Q!L zvetrS{fCj!c`>eqvDd#1f#1EZE-Q{s+yc19U|sqajcq$rX>?U{uquC(sp^1Lft?Cm z(FayTe@-Cu7wjqi%Bm)8*Z9v2U~W?X)kB!eki$^$L@MBn*wE;43<^1f1y;w?=y4Wc zm;nqnca|zHE@-!qJ8DJ8;zNjYJ?MZ12f$#Mo&i`BXrLDh>L>JY3NO4rZ*~P;=bED#;oB0O365wD}D-ST*Lltao<$?Cl5%)oR z+Pippf_<#q-L0HG(MS)li#yoH#n~3^iFR@J0K1^TR?dE4N3^r8&Rp6xF_zA+m&9|v z!g-c?uHNC?!{>rl0^^MbhhwSaD8O8j0TW6UxPbF05=$kB^9sNU&dL8a9X-(h{QO`3 z!{>`pBFOr4xRU2H>CXF1bSn9O^%({R1_s84hP?j`3=IDGA7%_QF#tggVMYeVMkdCF z#vlWzF&qX3ferp^rugrFqL?f!17z^O{H#AG_kYMwimS8TN^yB{5D2sqZEx!i0xgvW zftJWE7Xg7lx=+h`K_H4FLI_Vzaohk4)_WG|En*$V=*#(2h> znz(scN07baAuyDWiyJcxO$oK3k;DArv7TP!Pz^t7jS?&=?63v-J#xp$# zaECYyf#ej0hWWs3e36t$7mQmdiD*v_5AnA3cBHU;VyvJ>p>&d?2{0Ld1_XxkMLD>5 zMmo3|LtrR;h%Fofvvy|?ATX4dl`Dx6;p9Yzz)&QTft{fZ)rm~9GmU342;Ow8vlWF3 zb&2uvjCJ*mg?c(f*u?wekVa7~cN7#F8i|iIWYMjO(C`Rsw5K1;!^#)MG$GhIyAzEm zUe;kWI}bVwO18I0`4Rnbcvfhb0n05SE|!Jzu}5RjWG2bm)tE_kcK4-+`1sPC{bF2g zpb;KaH!CBWfeFeW%+!G%7j01aVA83s4JCb7!nbR_l=69qRgN!SSwpUqJg)Y4W4Wk z>S$*GhlNp)u~t-fhNGXCJ7=TI2a;5V%;Dx6w%lZ>SN#lfuUl&JZ(rG9w>JR z3(|sZ#Fl(4wG~OoO7ZABn`zUM25JNk%zcDs4%mi3CTO*t&${vdiag3lv zz}?-=urOD8lrPGJ6i$!zfg7WJDJ%vhEXoFMYzQYtMcKe@;tV5k#Q1O*4>M?_i+_}3 zRHS_fU!?tP*V|Ogbr*O*7&lMlcz!6){rxf-?DR^zHBZ!ZFKCI zobuMAYA_7OjTuJtKh|?Z$QXBKV1o@t+I8)^z2`p9)-P$x-W_$F(|h?ss|0&Ex+kMG z=5c_{iZ(;1Wr)dI$z7xSRDQlqUa2B~;J|?c@_X@n4;(lUUI(?ZwY4?w%Ll8fsvf6f zR!d18bTU;xaNt0*x}vnLtt~-1Q%qG=^^#bVkd%~EPvZYZw+Z>`tSc!i!_Q27IgpXj zFx+z)8a?bQA!`6qKP1NGatFJsHomwPk#(|xQSr5E_-`830VH!WC34_5Z@lC7lH#A_M6qp$te=KVlvfA3lrtO>` zd~$jk*POi}ABq>r$;rtsEY$sJVf}bo7xECo+i-k6^niv9WLWh^|&tlsMFq zIQ7@ZjSz@%4R`vi$4E;{OYITeZ3b-a&U}ozgo3fedH<`{bh?4%&rur!fnYkW%+Q&z z%jxEPewSbAhC~YI96EIN?&jykc9NJvbD5x>--Nk8|8g1nE0p!^9WwmI6|sxAzl-0D z8Ogk`{g$es;o9TI5jmC_pHgNIs!iDCnySkW9&)j)&E8-`Z{6|(tfnS}Mx(Dse>pbh zw~{gb$?IHDjdE>m?Nh^*Hp#0R$~e0=C9Lb(%ey(|UH+M54x202-Nd{17C( z=Mr*SExG%49K5cs?(NW!*yWz|D_0DM4lN(fB2*zNRyNrxo%6daawmSgt~kpw_4;+w zA!flQW8-yOc1+yIXKhKEoQxe}2CSLEvvaytX3nn2O!3zVye)fvTXkc175?C{W1A8( z&)6id+5m&C0WP+eI+nIZiVcsfoA|gB`1i*TQ}xhM?#xL4n;jz!S129y@lReuOxF7c zx!SQ`u0DTy3b{fj@V4)?q79B6)5KNGntiP_bIT$#C3MZ2HBZZ2RBnH3RCsXrXtQ5x zYN|oR3qv6h5mhMEZCcSLm>t!`9nPBVQkt33&J+VRWvSSWytyMKB~^~lJM+nc=pOBE;Vur3dJ`{OioQfX&ssH{oCvL|Y}0kN0@^C0YuDtL>fREUHlvA;vcngt-5mUN z23yZe9f!xaRpIRh1_taoIQyn7l_nd>Es0mdo;z?(IS#j0bq9Uv=HPFHvh_^VACcgX zNSDXt^stZep$Ae^b1ZFqx;cMU*3{tGPx?b=Z*=A_U%vd_wTPD`t#mCdEv><};^Z;8 zoAFOGsTlp^-LQg+O0u z=kzrtHsJQ$x@GbGufIxNA}Qg{Ax;h7GV3A>#1 zR~&4U?dNCbzcs0_?KxIP&5s}Nudc2hlUvom9ZQ=%s8&2dZiYe`1NMq$4BKgm3S@k| zd0kyyNh^K%L>U`+MirtyBgLe5r}T>TdWS9deG0DKE1YkcaC1y9x`EqS%eBvGn}&Dh zci-7zGClrTBSECA9^Sfn-^kq==V^&s!R$|1wpxq*tQ-mBd*1s>XjdxD)E(pJC->qC zWn)6p<8IEeZWT1lfxUZAG4>0BQVp{S+BCOd`&GatG_-xE^P%{gtnK6J$Ue-r1gyS1bH(s zlFr`3!^+Z7C^X-Yk~1bpu?SS;4w#U;;j->{~Uk&Kj-R6Ds-YzD48 zVVC3iX~g+KW=eazyJ6Tf%(Mh!cVmV^e`AJ1JGnD;R&M>wM)amJA8BIK{p#LbX=F}< zH_*m1VfyXNNKKw)vG;K6bznY4HODk9)IU5aOzXK!cI14kjvnq_;?%+YUe=MDo7*?_ zk&~R2C7GI2NdqoZRp?=NQ4#U{EIHO5nDE;kLMRQhjVA-d}3)^q8el@}X zS*}7%l$kupOleYKDdAOgpq=jm;af0@=2dR0|V@4}~%jLb|F zg`&0lcu@P;_wRd8Q)2&mY~mIWu=6E?bM&a#+Yc(i{r&y>*6I2O_go@gkL(w5aCH3k zBJ5%x;@6bq&Ye56j~(0eea2Nqbd};g50@>F1l0L%m6=2Lx!s&MnilHHyC$&(rjgeC zxuo~iC-8x0#&VR=tYN zozgILsz0%1M|NRh2KDt#EcfS>>8_uq$~%Uk_wV07dGaLa*X#(ph$3%Hdjlx<$;nAz z+j#xbbLyxJ?b;M@JJxM7W?)3gB3h!*BIXFNWLdLl9DCS>c34STSy{QcwKdPOpBC}z zx|I4MvE)@sdpR7H2M-?}%*_=>AP_%C*uT!kLklev;L_h&|;$@2MvQQX|gfqu- zrBlafmrqd9?c0hUTRBZVm&r?B{p=WNZ*K>INSEaw<`Ng$Jl2i#CCt5mntd^EucD5@uKR>^s#+Wtuv||0!H2u52d6Q}~8+@y*ED`&@a{NUP7t4=)^hW$}Z*&O7%&i`rq55)z4Bp$%h0 z9a1tf!YV2%iWbolWiFfx@zA4>Nwz4IcY^a@A0F3#fB(=eARrx1esc2mZN;WcrTT5O zJNw_<*#YdD>O1)ub!h+}9L~$D$5p+3b%O~ksm{7IhQ7MY5wiu;P2BYBapm_0PdB$c zSFRX_9P=K3f488ZpkjSTJ```j`~WC10*PeZVW{JGNysi!aZg^}dIpoZ1QfJu3UV{* zb5d$*YK6*o{8j&|(5_9Blap`j_OH;?)omDTE0$WjHZdn>&HF&irk^G@3$}%r*PF+; zqdq^YSl@9q>^UH3I@@oq1<~K#7mJOH>wA!^-F+)&BqHd`t|+orH+;U=Rv!}o?q~qWlv2_nZ|ro)LHj1;uq$9wTsuU8PCb@-9aVw^ezO@>Hf7(AQCkp7~ z37^96_@$u0*goO#m)D%8B`(!|czhhn8gyM`hX@Ctkv}IRC#R;+94q6|Z{KQL4r!FO zhOC|_vjm>>^#}nJH`chhxh*z_AsEo^va+&EBZ*O7>(YcH zUR*h7S+Cd4i3jYdJ3C2UddH8iNMQTQc}lt5 zpQ;UeC#j8Ne+p)+wS>&dQ8A#czP|bHh?+MtrKeACn%&ZM70aG(;@am(&A1y}i{FM7%uQ-S>WYeB6=K zw|3Zt4UCNez#1eHIR|TA-GHa2rIjv*HDVx5UETf1k1OZ}Tn8tlI$FehRWx*}AOHNk z)FpD$M42QY(2V_D34}Tb*z zIc`nD%mgwdMDxP-Tj~j!?y0G%!LXyFub8cUkB-9IKWe7T8Y#|PR+b6hP zauW38b&Ses=fc#wI_n`O3xYtXc$~)6&i?4lB0fBV=HTszN4|D*`m1Vg;n^`wP`5PV z!y`orGZV5~;tf|RZ`Mr6Jfp(?DJ3N(74rOo(h>b2y@X81V0LvS;v=42U0GAp1a%Wt zVgH1lhT=#MQhWhO_jI?aUmh0w=EhRTWjmRV`#k;07C;#hH#VZ z76O3)-n2DHP=7Sp#78HbEU;iva!K5;>AC)c(U3%XCYTf-5>4Qg)Y9*}OGkZ{H z!tQEce#psI%NdCc8#aV=o{>tDklTCzzAdr$il?vdfy6{1z|=+dH_BS>G&K(I1~2sJ zD);Gby9VC8S#kTVXyo$?+o6stJkan(Cn3nm+Lm7((k3pXlLi^7R3$`)G0BppAlfKiv8{xOo(+-(2on9+)}-skI{o!=HYIf^BaNU9ndqBm~b zXl`w_L!-q&Cre6%rlzKvA3sJqJFkMl;Xt$S*EeOfeJyWwk}aj zc5|#jU0vPk)vG~4K|!%QcGTC`FME941Q5z&CbU(Ol9Is1=g-$KS+ZpLiWT*5YxhaX z$n1}K6DRuZ+qdo;OpQyIF46lNR}Q)4vJL=CLdGaci)(6Y*Eb*B=muyU@f%>C`!8>* zzIOD@juF5kiv96ArqpG_dS0Z#V_8$;(ql$pB2FDo&-uZJJeq~85IOg`o%f(c%#k}k zl#dxlh&y#Wy+ZN0z+`OVb!Kj=&bq+J_1Q%)JOt;ru7wuiyL_e)+;5We&HPQ(S?4Gn zr$@)e6056C44rIlMSpo(;iYXD@xpW3kg5(I`q zrB0kUF**JDBBXWWK0I43WwtySZ!NVGrN)ayl(7}1Q{Tc>(Y!8Z`}19eI8taF&~8Yj zDN%JY-F^)qT`s>&)z{XNZF6{%G2H|$T5h>9hd1#KM5Y*WR1T2ioNf*`5~I1d^?(|0 zHe*@;^QixM)c^U9+Hen71>Ukn>18#|E<9X^)OsSL3g3jgw|j}fQOxL%A9hWdN^RF7 zwp|JDS@ZSl*U6e+Gl=WAZWR+B9tnAQP1ihn7%ey7|eIbzG$lWZr0QtjZL# zaCC8Lx7P z`o|MH07F(%q84x~+G+Zn$c^~%P0ua{WxahH9C9qF$R_z+hYKRtGA*>0ce6z#rn9~k z@hd&Dzp?h=!xj2>#@1X5?@>+2u?c^3TMmoG0(!P59OdtSYz!?lVRxxpr7H=4YSpuI ze)|IN#P_w?sUQOa3dYQwWfT|lPrW$8RYDf%rM`lGa`}C_lrLnD8+fZiNQi z0Pt&7Rn=g3)kX$`QQ`tE>2J#FFG^OfdvP_a^iQm-AWga~N4gB)YXj0FSz9C$%_-6z zZjI~i4XQ$XjJ(PX2*n5q2?f8r7ST?=e)#a=wPS;AHq#Q@gV|4-xKu3r$wvnOsaN{y zjE;_OC6P{#Y3XTg*`gE}7^tbQpJ#~_nmNP^N%;)5j^gWZRrg-MR+^fcYA?HfWyN~E zdygMKet&m7eRgOW;L!&ZA#Acz_U>IeIWyzPvFZXqI1-6m6df&UvMoks1Yh+pZ9N(K z;K75ZC1~j(c){M;A<3DIXw=u%O8lv)&(9|Nvk)b%C*=n|e5iZ*a@({-GLAhBIHzua zLnLd)P|H*_Q%w-*Qr)rz*!}HfQ=yp-1n`V*PG95wTdCvvA$YUM z-Me=maNllN=yBe^w`bY6_jy4M94ljcG}_A5HG52MWgWK@@cbUkdb#hy48N?F#5ZN; zTJ9Tu`#vwIanCZ*lGZcpC&-F`zuz4c^&m^^P)lM-iP{jndDR+eX(?r8y#&;qN<@D! zTMga7t?-D)96o&bWZYjL+R52UMwE6TB9XW_^68M3lAkY&IcA8Smbg^>t-lFB{;BJ4 zO)4u5O3KO{Iabk!j~z=raA5fm{8Qqr9I$Mg#$z;yO|}$@)-j_n^#l>Kt^JJ|kpO6f zhc8m5L2qnqT%6Zz&#;Db!Pc3HFK(WmYCB8M4Rw^^YxfGz z1#Fp$6F+`<4qjA$keMPTtsea2>+5!MXIcYpPfZQt*@f+Cr%tH`+}$Y$g+iYiu8fO| zGmU&Fbo=&gS65eXLdBWwx1xu*8N}h%>)jlDWz9`Deq>jf{WJ3CScgkHxzo|v*|}>) znL83Gtd7awT~JW)G7#f^Rwgns(rbmKxw(94X{qn6=r0in+~m84G{CVD7Z-O82uNrD zn(2LNxUv=TYxAW`m((nsjw_kcK`vXy5A$L$CRGTz;Su$TGL;9JDak6kWHp=%vMq}P zfz5J$o5_`swxtjA^qczXlihrMeaCN*Q}pEw+j{^f5d5Akzfa(ZxMVp39F=v7q<3x&YIKvOn%b81=|w#t`2`qnDoc5K@ar|i6^?}vpkz)f6} z`d6<4LXIUt9FG9L-?}v6UiPmohEDZgU*DqbfM&?SMd0KoiCv*c5{cA>5Pdbh=EP~r zt%0VEI=qt3XmFJo6k1t*S406i!K9&Fl zC5(3k-CbLaYY_MJ^z^)wpPHIl88h3)tO&t9p6o$+fWOdYBWN{if6Xt7>ljdNJJkt-JR% zJ7Pk^rUwe8z1jTen33bO1Y>t~?=FRryE7O53`bUxTb0MYyz~Luyt%Uj-+MRVZ)Y>( zpP#o~p?D0zo0ojO@ln~+)6@RX*eGbVvU28?D~3bx=1g}F4`^to=3+Hg+H^lvM%y6r zoh{Jh5ebgN({S<4>)w zc-+XFJIf^`4g;2QsEpIdot-Idtz0ot1{jC*PEJvy(8;fo=tv~$Cl)#Eq6C=7^N9Kk zG0^fAD{N4xq%k?qw9Zb?(wefH#=|bZx>e9H96L!-8ua$dmyB1h0*2scM95DHtddtL zm9)||C(43=F0LZ#GsQq5bLV|0LmeC(p5BgQEgU}_Q($Z2olUcui#rhJLNXo}2h5JrZuJ4+?Ii}^@z#ZGeJ05<@ z>1z@K9nQ3JpWx%0FHbl7Db58#v{@?@oR<0pnw9v?Sx7!aPDx+?ooHaXgcH(0W zekth5i7jb*+iwQ9okF&k$v&vtzoKtsB#Zg+37T^%Y`7KL9rU^q(L{gG4T#2greWBz{ijH2Zyz;|KiS6 zh4;XQm=Yz!{JsS1O`OIuYd z5jhRqGsb|s)kEfNP*W4ikT>1FY)E}2Tc0f1l(bTz zr1g}4CE$DyIx9*?R}vqtOH58K4tsuK@WoYab*E#At%zTWA6q$jmgiA%adCjYS9dNr zV5b}>v?YFQtF5h&ySsadOR-2W;DSosgJNUsG8L^b7>U50-;h@*9U?Z#tC05g%Rf9i zy3gsjabI^8-uaG(g@r;(OG`eSyvo|z8gQGhMZCn_KOp5>g%iGX>Cz$>)U-QAS|hul zAboH!L`YP$nECMuoypwSLa_eDot2W4OYyr*!gf`7b>EEAUZrB0{^${AU|;}jVzPc} zYD!Z}YYFJ^;lp4ALgmJd8_g{(RwR--(CqxSYTWw=x%p;Hb=8d<+iKYCbVai@844z- zJiYCJlR7vUqNbs-QA5LSGA6Nr7nJyDZmKSHI4`fi`QXOx8%&LN{r!Ncz~mb&*(WNA z^7WNnx^(H=&!1P&XtdbaSODWLmyodi>%-%|zP=?i8f|iVS``ciVX;`*&9MfjPMsQk zVle`2I*XXEw%*?BsIRVXm@Us)#fyier~LPG(mXT7`20Fi#AIz&(ypI~o5=Fhjijzj z5C{Z9Bb{w8SO@R@@8(Va-}3V(|Np;|_doaZ|HA)=nHU-U!T&b|{`(*P|Njp^f9L-% z@dANB-+2809TRFe5J*VlznuRMg}|-gh7h?dgnSMWSq-Fdjzk_AwrgBup&X*U^pP6b)m-uqJ+yPKI$dRxU($W|*^qol`Uf zh9Y1fFciiWZQxnFlsn2U8fR$lM=>?ECD@~hFt2!P z(+HZ4p`W*@ft5#uv8}%&%-bo#$eR@r=7CYry%Ve zjZKkAG6aUAGGP%o18f}HF~-l?1_MLeI9VH^;4~`58IMFlAuyC1E5eEC24mO~$^N)l zGRE7DL3QzET1SL3{E=QTjEfi4orHFbfa1(3j-JLLk;cAAA7C0rE-qGaEYm2KzZEIQ z1!Wiy!_b@}Ox=krOpE~u9}a<`Jp3UrYZ3%z9pV)0OE+;bbB*&N8`2>#6wAdFNACz%XBS^41ZExSN3aVcM0-1gn#MRqU_;}LiO#-}a0k<9 zlPIExRlJdLgohh3#tP%>Yv&*18y0~ywuU=LMKTRcT%tn!h>;E<_ADoIgu9(R9v4ZC z3M0cwC@&iu2+TSR$utUaVZhxe)+l@g(G5I>%#LdLk)B#Sihrq03;v7_NMcRLgjV6XyfQFFZL%U z3O(W=RNC6w0NgAgvTW(HWo?(qF07$;;V&<%ldG#u_U_#aIC~RcUKTs%=?(T=)>yi1 z8P-77fH7cy|Necjp57`kF|qEeVe1(ThU>O%+S8|Vj$_MnIud@({;)@*YhT@9N+~L) z2i}RVefd(Mudh#bOT1w^YU4V+fCDQPjDvrCeGQ<^UAruu3(fbpx4V0Kdfp2+UUogO zQAS2aQ&+d4+@ma;!^tWrP#k`9MAk#q%S( z$Hz_ZkMf}*uWuSz+t?h;$=O>`v8kH*Z$7w6rvk&uD(|V2x6W=iX8W-AmYd z5ea$2v&CjJj~O#`}m|#N=YdrJzb(L zGSNJKO!L&KQ%`R&$>#!YxU&@9HIHn1-T9JMld+9Ix21W3 z*0-X+RPLN&v_;xueJeUK3x$Qi}?))A`wDrJ&|$pBsje15|X9pzWm6h zB_Qz?E1-nt)wU?q_lw!#o*o|i4jfo6BrJU6r_uG2%{pFnuWm2_&vKv>u^Cf(X}ZQimXBK?m^iBRUI!Atnu--A{)_x4mdGOe8J+`B5D6k7Cuo zGfG-%U%~Fu3O8vD=lkFKn~+T>5eEwkGe$@0ZBToXj@Qcg@h+b#){uJ}^o;Nk9lyP1 z%nt`LtzfwF&_{O@W(;;t(%YcTB3YKxns=u^X}3Y`)pfj9R{81-c9u(X^4*W#ylFl; zJ)N3q1;dtyHXqjVn5_P=>FTc8cub+W7fT{%iKEv>adGk0t5<`~Ma=HCwq}W5Zv!2v zK&8tYiE|PrjtA3MJe6}>;Qx+9ju_P`nbM$JM80pPwQr>}KNig;n*(AUFe6ePo(!Sw)?p{^-y@G59Z}1@0y*)cAR#ae4iHtMz2|=Xu5mv-lb!opGyMz6N}v-BB`7{ zIT;H$`Zd31_0`aInMxMfxw*o30<$2FM|>|j=BS<9R=sMye&E`lN>gDP&IMaX-rPa* zU*b8N(bR@Vm`yd7*S9{usdE+Jvd_wV0a2To6fRm-RrU1qxM}1&A!m+d zgsxX{+krD@G(Si9UkQ=&z8IMC=~HNd8B=6@oYy9B#}^|BIhfGOl`9`RbOjr{eI3(_ zOi0-Bhy;I9Xpvl>ELk6JeD;Fpjq-~1j$RF&-}6H~%8iYURkgKOydC$C+* z*7JPJVx;gX51MKj|2|bXK9pd8K69&!cyC{CGF@k+WVP@5r=uMmw$@ztW#!^5)() z+8v0wNY9?q3Y_RF#e0?5dfO(jhAfP*yuG7CAdSN>u7+KIe`Fi*7r;o%D<}y5qNl1_ zH+{^hJt;k10&~m|&62nz?dbLX**U*`Lmg#+9)ihd*xTE$=IbZ3%RLe_8m$d#k2-PU z#N*5l$WL|dUArqQ4Z>gF1k|b(g8}PxK)&~_kf#qm-C&DEres>d@(n3#G8N5K%|*<1 zmsUu*Y#Co`IXmXj25nwq5j}jby9$qN0*h988l9@FT+QWjPvNtdjm2+qKCxNLT*T}^ zX~hO86l#ybtX0}KTp9hv|9)d5pxJ}VL({XeBspf@a+iA~f`WqhW+1~Xb`&g0JqOF$ z{C)WBnO<&Zzcbyp>rF$tMI+ch7!l+TX{C)SXO6u#IepyFc z9xy&Uk{cUrvtdavmL92SjEjpax^TgnC2`Zr$!X<_YZ2P!B4%QaUj3W2wWVZbHO)m{ zpNtuKbLPT@bxQjR5=%dcgocIn4GpENSg&^=^WC#2g%+ad9Qv0RMs04*DZUldQ+Mww zn-^v_1f-bMdwZ6hDn9cfFKAba@|O7E zwo}Mc#o1eRyq5A<#q~)mZG3%YD=I2%o7{3AJaCYe5ZTO~>^Eh8NFOv+lXc8J)^jsT zd+*-8qwmu6-+h1o@KnF1e_Wgy>G84sef7y3ArJvPdfjO;a(mxPT8+|W(qn5Ra{r)d zs=K#$(os11U8cp?dlg=1ZJRdi$CkHq{I7<}+>9B?Y&oQHYgVB>0oY&Z>9)@=Y_EzR z4{eLIFY>MER2`}LWvRS#)M{*`S0(KEh5ZdUDWw*Oyn;d%>9PFSmzV1$w~VdMIdlkV zr@9|sp5w$|FjgxltOyDU!W5WFsUJc!gy8Fw^YJ6Ry7yuehyKpjJy$WcnvWEbW zRub`Zbx~1KNLPhSW4hcv-EG&-OthR&O%+$u(Aa2dDyyulEQ{E+`C7zFbv~XYR53p~ z+uGWmbm3SIc9cny9_8=JvYcN2v6Zu4>C0&cN5`s&m&O>5rP7Z#JM={)WOp|=+n1D< zrevZvHMv82ln}cVzkT}_`{5}0?dQ*FRrn@VL&LQz*6C~w4c+8iVA|KdSy))u;3x)g z5Ug!%0KY?T`_16GL^0pXq?O;le-Aj8d?lmQ!P&>tQ|M4j;`QsMiHV7TY>tkNCDsPt zJ0P`jwT#UE!NCx~FFI~QLy<`83?|bpARs*_XU*Z<+@jN`MedCkf5^+tEh;GyYG`O^ ze*73oBB>kG-lWI<^#S|fu-1Xp)Vc#w8x11g*~Z4kg27-=QBl!>w6uLK1nbDis<$J{ zDRPdviGcC?*56b`ZdF!;K>AWNPV7!j7WJ>Du0-cNy%`l28y{cy@ZrPw_<@6V#}XcO zbX@Lvz9Tj^c%b>9y@NyDi7h*_^YW6Dl0@1}a$iX}=C193pBIE`%2Yc3_3$%~5ZPerr>Ej!P_O$J6a=mKz#7!IUPT{yg!A$3T%<_tx&s_o}RugqVyDf2ZW3(&(Wd2 zau8i9ueMV=LW_D)&E&`?GuxqU6vxONkQg2O@6b{+D?GR zMz>L41xl}31MKhM@-@}&qC^s@F2s)Qex!N5*DD;o>UZ7BC6P#}nFG(R-?=Gzq(UT8+sl%A@kN7s*MZaLJ#*Bk zrJL%$c*GQDpdPK;ma$QSG)hH|KgS4TOl4Z+zq9c-v8o- z^sNx@x{~{b{cHA>L%AIF;)6zauhrC2LYhLgPjOrG7q1Pz72?_1+4s&LR?NxHzQ?<; z_to`W`3w}bRBZ+I;=3x(?djXJZirX=Kz%Fp?wvnu`)=ZszmAv2J8uVv`Y&Bmz7;Tw z=waW>=XY<@(vqt7`G_rlFwl7ZumY%DtlB58%2Vmy`NLNdU!L9UTM_;Lu=nNhRaDpG zsC9c=bjt? z>d}oGF24DfFJ1TTiR(lEeQCqR$367uVfyl04x9N|rGC_?J6FBb`S|U#*IoWZREotS z&tJcA#*7*FeY0&VGIlR0nf|x-Do|DRgNe&OpK^(?@Tq%OEMK~O`I{f!_0gFtSMI6a z^+B!m&OdiYU)$TkzI*I8ZPlS?UwY|*4?gtJ5l0-c%UxX`OrA4mzr~%MQ(tWhUh!h} z$lG4&I^@`6kJZ0;rTc-GUOME1mu}nA^YV``TKm~dvt93hb^kSsmP}eb^MJLNUwP%ZbFZ5xzI^+Vw_muaWb)+6?NtZf zxb%~bKdfE*`pS`~>hf>jc%$R}m+v^>oDr30-rs)T?MvQ#YF+E-GtM{z>zi}tteUy? z{N-=<-2R&}GjF-+ru~n+=+Un_AN}bryH#~QSJCs$CyyZWV9FzRtvhE#WpLcMA64G{ z@vdKe@zHscR(u62D)wEsZrz&SU+}O#>A{w{>(qbWeNg1#U)8_&+=l%RKKPdxUp%aB z?%cCi!Aq{2e?!N6&u!Ri@4ZhiZ9MRpu8K)tzP8)bH_dox!pO&d_hn0>?!dF>T=T$R zo}6^fmB)1da@AYIj_G>;$4i$^=;`TcAA9fxzy9^8x*x6^vZWz4?Bw-_)GGJ=uKwpQ zf7)KU_uhLSI6()nsL%)9a)6I`ReTNyFGJSeUNlAls=+&zZ zpZLpbuPw7aeEFcG=3hVTu$9Apy7iNz)^1$car|c=-1h3j8*cmeFJJsi?9F$dy>88$ zWsm*(sQDlNb7tk$$PT-==Z?20ln&YQ=6U6bNoQQLn0JN@U4K`aGsM_s-op#{4)2=yX&xPaRW5b9pS^HYg?W>OZ&jatQ z-E^C_sOPJ9u9)*d* z_GzJGjya_6%Kbk3?6Wn$e`>Zq=|ST^JrmZpJrS+B`<{DFm^bgp_cmXc5Ek4%q^YUt z-qPvfgprTE_NQ&<-_!Q^va<5&@LsEjj=FI9Bq{VPb*KDh^Pgv&GHTSQx1ZZ^#oGs}=We}v zfw6I=vbJu?8&eKF?$iZm&UmZh#TQ@PYv|AshdmHlGU?)`>$jc1wr$ah&*oMvyz^hL zSH0CU^EVauuRhwG@`!%a>Y<;VADMKh@a&4OKNr9J`1SpM0iIv>->0X4^6dOYXRmsF z_=J(~zWH{~gf?W!Us;!YW4DjSw9cQuC)T>hp11YtIjc6VY*nM~5{$GhyVroB!VP!ou~t@4ow9d+l}Od&f5(^vyTlEFCg*^y@v>UUkn_v3uPr z>U4QxOUdRLGiNsF`i*ZNc=?0dnvYw)<$>#4W;ZoWx2&6=m_O~YtuLETzW(v+53GsA z16vx7dH=GZcOml;j2iXOAGe-gop|xjyYIjM{?6AcX5K=)Ft?05r2NuLE*bIeyYEhU z1G6bt7vpS=`feZ1f+OicPgG*RE^5rsLbMK3fxs@4BU7xpL*uD`t*6_Si#T zeDTH4rIKIR4w=jE+xFDqCvSP+k1ZQEY?yjQZQ}hWrUm}<`s=47Z6(}x?$)ap-ujP~ zv)A5v+W$^H_VX7atE2Pd@h8&rZ2PyYr@}-m#wh>j$ARV=^9*fe(7h!NxOdgjE6 z;iX3&dD3Yek396y)wkX{{E+dg()ISO=ZvWA_~y$`$|@_TCzIn&Iqlozj0?{geO1p7 zQ>j!?{o@1sjhytWl_O6*(b{+Jn>`D*e7IF?UH5PE$%$oS#u%knJpSyn&mxmL{`~ca z&AZ{0bN}&=S#51?Cmwg&n^*qloXUHDTG}|F=gX>3KmGKn8x|d>Y`S^xS9`X8->N$d zM~l*<8w(d6cKGu5!@oLsTwwRzcR%q~<)BTsbgtaG<;ipIyrb)wC2xFh*%u!Y1Wy?G z({tBuy1HS{xs%Rc@yQ!gzxn#r|D8GKn!kK^@s&rLN51>sdsn<7&$((6f?~*h&t5k_ zocdIH@R3J;zkYpS**%B9^Ugaro>;N;jk8C8{QAm~Yp%U^uM10GfB(h54EgC-UoHFQ z&5{3W-u(6Li|(}co-}FFn#i>WZ~6JwU0yhGeSLlXs<(c)=FU40zNB)|t>4{s_uYrC zTet4~(!JNMTld6=V~_jxzXv>g-bn49NF(;R40-;lGcFyk9WE@qQ~FkZ$+~9S2l4}F zet(U6eZ#-L{NHt@i@*79$)uC6U;DqmUjAy^ZR#t5(@s0>U(Y{3{_ESHjz9S6=Etvi zMgG;ak~M4A{OPtOPp_GJ;yug84FTiFk9g&-?njn?bkE8gZ>&18V)(FO!+w0tGp~QM zZR@qyUw`I{%EK3wOxHhoW9lWZ&Y8ZXHF+q4{r3AK>qm_mb$;pIN6q`wk7v*R{y(BM z_kQ7e&W{)yXxJ# zEBAZp*2Hc@4n3x8-wR8RIPSPbFMM#zh>>>dfBD~#kGE~P>VF^3KYv{3bHBUkrl*%( zv+hrSdhq_A?|H>N^FG>q$)Yn$8z(ILZ`lw~UcUFTd+vR)^YeSR{pX74C3nHcho3P1 znIn2We|5>~p&R#XkF0z6;fL3Mm|Qyh`h|C$X>Qs0`j)Fso0dp?F!I!e$>cbM%N2{R zUcY|*@P(iMVxJN1wO7E$-&?%=iw_^#`s8tym^Qxq^3Sixlaw*fPCaM1`0u+@tE7@& zEPM0Z@gF~TvUc{Ws~4{x`oW(e`o7zq`?bGtqlmsA%$zD5Bi_>ay#9FTwh0%WJ8XUO zz31YJGVHL1XD5u@1Rw8tq376V&pK-_3BnhzICofCNy%;(9Xb1lhcz59VdSRBdp$2K zSl{{FpYH$fJI{P@*0kf{*n=-P|9nt)=8^iOn;&^@+l_b7MdX7=rv)~@^Uk)rMx1uh z3cKcz9}FLU=7y7R+jRN4!^)06`Z8^8ux8`Rt`}-XcK!O@s~cAS;731#&!lEtcI52K z&nTI`>a0~)m#-fB!Huy=?~j=~Wa+!>u4zl%e9%|Vt~%_Ps;>7>d^$Y#?5$Uy`uWC{ zudF@k#1r>A?X=UbcyjtME1x{{x?jDhoO#0yH@tnIdivI@C#~AJ@`1I>K7Or!?%}JSzjETI ze=nI}y?s9aG4OHwp^N|a^HXm>d`rW`w=Ny}ljDChzMWkDbA35~r*mQkB>=_V8OCnR?{x%OC8XI`^QBE8n}lW72|__4j@D z#rOWYb>lH7G&jHY-}j8^+qP|cd($mP)h0HT)&*WXee3HBu3tU$l3$M*vU=k3;k)dz z%Zaxtm(9HX$%PdQ?;Lje>8DTV{&4l%Wp54HxYE3R*`x(0t)KnI8*lvX`S+H*cHb_S zoN~i+J=->4^7hle-*b5Aq|&;;qi1bBV(1B5kN88|F0Z}y=tT$CDhK}UZ+~l^J9qP^ z@6G><*X{Gx_f`-6`t08h71wT(kX9QA{Oz2|d(V3OlFEG^zj}|&n>SxNu5EH!y?pA|AD{wb#*CTr$O#w!`Onq=Sbg*X-7hcM zbKZuNM%C@N_kG*Gj2wT((1$Kwe9_$N=3Tw~iw`e7HudM1{(8hKx4nAmIe-8A4C{kU zKe}%I4Z|HJ_Ko9jdGza#{(9b?BYS@E?blyCvgwvi@um}}OgGMc_~B`P`pIARSn>7e z4>b&(c*a|ANl#zE)a2hRzG(I8Lmzzj;lDlq{D=ca&pG2!>7OqjcJ0+y@AA@Z+9PM| zeE>2PW?ePuusiO!V@>3OfIjKs>7T4!_Ip3a(EVR$ats}~rQx8qx$DPoy2BhD3I8EDm7)z!Lo?b;V^O&s#armI#h|LC3(yX~>>k0q(}pa1;l zl<6hkf1~HD-*0NU=jl)0d}RNTBhQQdHnqpS_uh-_h{+8NH?`lt>mUC3$2T54`vBpI z*5>9R7d?8$?)wY}W5*7=|Ni^m{^#0#j+}MrPsepW2P!L{T$@^TL(B6+hU}7ToKoNR z_j{I1S}^l~wO^e)b?Vfr%VwQ*&N&S;X6&`>ix0ow)YNp~zI*)Y!0@gooNxkKou1op z^2(-3+rD?%WtaW^i6^EmSrR_}_~V=B%{%k*%MTv%{CR;>=FL0v!V7;mY{ZC?@#9Ba zcG+cLzI9R4ja?s{boaLZT#?&j^z;oAMs8gDXv;m9ef8C{LytT4(B+@MU*FR5!{MQm z&XAw^E*Z8+qcZ@ziz zHf_-vD_6dWswhgucc0yG+7adDd!q(VIpy$!4?cJbvTm15dh5;FwZ~6+D^M{v7(D2v zwzJQY9&8yEym0@Szdmcmw4%L~LUVtMG>G56b@aC*pF8OGhyM4@`gew851J(Le>4+4 zxd*+{xu>}}F=pB0|Ej`O<7+(ef8)@r!T7%cctlmzX#VfI000ruf-%iV)qzGeYKW#~ zBqLVRfC2Yy^U6p5l z!k`4?2!fn7!QcBVY2B)#iIQ2VXfe%X-$Dt|=oEA{7U+bjZq1O)x5sOZoL zgzO7;0wEAhs`%c*K!}YsU|*qY;OeS~2Evl@1CTV7JjN9u)o9MGS z+jZS_z)I<`4k%Mt03WDIYrlueWlC>uY$`skOKyY$>OA!5gQn0)ngjTEw zU~rZ%50M^o_JFGB28=?(fYOwtA*-?0NE}K@MOI^tF;%l)PsNu4BK;-+KnRdZP>sMk ze9aIb*Q8G+*YGfPnLHuT2~%}o`Enq1!W3As!u|q)rb9!tGy^Hr+-ow-I_?bsXjBHi z?opsOVY*sE{h%&D4_K1aEa?4;szX&`ue+ffi(7Rd9AF?U6VZWFrp=N zO@*pu&jr5Ma<+53TM!8Ih?4I8f@Y_%0W7yy%)_6))7-P#=|!sGH!Rck-HPG4o_~GcP_}4iTs_Ic$656<)8 zd*w`NCrnjB@j_He1RNH2w4SdxO6yn^6VTMf2z1F!B+n?;gcfqKp)iM) zOmCSTG@gmXts5b6%|sRnEN~qw9yhvHwe7==&ayXf+*tSm8}jG6;_=)Bo)q(DxW2QS z53}`>)$(REPnYRTRv?Sz!(drhs%YFaFscUWsR)_|w-y#p(coA*m!2`e_FoSBKO*X4 zhphC?1CZVR4~MJAjrH39W54p7o#UZdnBL*!n(-tf2GV+YP>Y^khj_Cf8 zv&hL&dmW7_T8F5(n9KW-Z-XzGrBsM3hWVNMn=Oz+0}tm+r?$XaVI5>_nP+O+OL2P0 z%QQi=BkH=L>4q#?=r`NA!~1W#CP}hsB=J67M^cJGOUQ4|bWM>XDZy#aHFG9RbU~v* zOX#8jLGakHP#q3c1=Cml%yb}>+YRE?8w5$0>}K|$8?Bkj28)I(6)PT6KSmUK+;wRQrGfB6)Rdi^f>px z=ZPV%Lf%LUj~#HL5_R1yDxyqFv|u!;n0bpSzQ#bJiVl5yAW2qZ1~kn)5yVPoKn`1c zXt6AxxEAbEc@$xq^!6cG|BjFDbH{$-v?x+|5NiXycC}2dZvY0QK{R=CmC+$a3XnH_ zU++nWNh_`y@-iI2RS*iZRWBYY8(OC1i@=B>6@b6Klb)!{4%rukx(qdohqe0V##U%_ z$q|?*?nGT?74k=6RWVR#z?f`WM&b0Av2O9uI0KQkrdpx`nl%a3CoRp4hzd0F#A;j@ z3(!bw3Pq>w?c`Tjgt_W8Tv5nnHCEYGjf>bLXA)bx@9Zw zv8Yiq6w4K$J1$4!0HIoxRTGFR5G4tFE=2_dm#bhoFCI_pFA2`eemzQ;&TopQcVfmPoPg${W%!(DIK~UyG59k4w z)@m6D6Vz{y+QHV#stPD&=9aL3;x`}CfDo!Dj2G$6uV+9JhNqesef18Q7m~_#K3zjA@sH&=h zAZWsf0WJH-95DfdAQ+XQBH=2eXsD_x=&a9a5Qh5;!f*i)hHVJbK%vY_CJEZjo9U47 z!?O3`d}bsa1?BE7Zln{mu()B?A<#ubB*9l9;Oz~B09^_~fYlVhEChfSe&5d;^g&GoIV^P5_x zw1TNEEln+T;3ry=@S|>MU9tp0N=q6bk~A3SJlpaSnR zN3$Ri4zLTVK#W?@00u=i&$BoHy61XW8G6%!=H6e0i>LWwA5Rvf0-+fJw> zoe}6rNii)nnl4RACLo9?qMR^`0`|0|Va1^VWHqW82|}F_QAPc09r!4Z1Vqa|RwHQ< z({-*U232T?N@ZN@4p~~IWoXF`1)6b9vqEvGBuJ2aNH)zRG%HJ-!G{R>g}URi0z>w^ z(DHO<%w7y}l&2Dno^TaQC&(TU6=h||+Rq+*3VU+se{w>M^(pp$NN)Xa?AUSR)AYZp z>OuW)Af5vBKhEo-8=8&;AfgUHBZ<<~4@x`uzaS_BMBBiBwrHB=M9ne%$BIKz8U)Gi zJyR(%t;X&iY(0%SmQqM(LMxzP_bISXd|_QPWlPIYoPBgESYpgm3ccY>THc@IAILys z6G#gTA{GjkK7@%GYGjN$;C{|ohiGlZI3wMLD>8qpE_bNf9ix&DiMycUluYhDB1#M%!l{?mcnYNF5_pp0aTKy+ z64QE^2t-{+^X7Uh_!6S~uYjv-GALIy`b8fgK;$SWM&cqvk-Y2XB3^(Jw{;;^7erzH<8n?%&7pffD3EN+ ziHgDp2-i0^vfU?>cm1ZXQIzIrFSax>$rd;Dgwn6{FZ!)nGc4yD{mbj0Z05X?T${Ed zQoyS#(4s(80bDAZc!8xQ+1UBos2{s_Wus~d0KY;a29#+AP?L!cXq2NS(E?Aa382ve z-Lj&94hSqmR87Qm60kHN$x(dz*a9grp#TXYDU6`7-JK%!hXTz&V9KfmV=&FtIRzn( z_j9(zq5YX{LNa!@)d@|_>;O%h9NRA9cHiqJ=GY1Mi$U|<5Z4S)2A8-R_ls64PcM}@ zw1{-T%{*BKcv5h_qlt8V$204-gXlMW<~UP>0O+VK-Vj8r)@XttnaW^VAM6~EF95Dc zc8V(2psZT%*2c zm~u>oQUFzuqjChPO#lrMEvGUu=qO_N>VXy*b<%qAy&*{@X%VwBiRP`6BDu1}p3o5A zOzz1=ZO!=7nPrH6h5Q-=}3q$lS26YzN3-|ULGOXR|>>j-^c(OW30 z2Ic3@{^XGVghKiz{&V_&YHPgr|Bnw3#{Uh>Q-J)Rx>QFJ3Td<|b&%jdW1KBIqnP4l zOvouhk3!?RSeh{P6P0Z0f`%bW5cD9mO^txs8vIjEv?ilbc_|2n(sgqbh3u!8US5T(lIo_B?XowMMaLv$S~1$JXj$xAClH_c?kv;9S0Z2I}W2qz*A_m;~W)CGb94S~nk6>tubRVa^&sj|9n)wnS2~IZ?2Ct{75SZ$E zQE8t&Y0}B5P_jpgpdoq(9>1n4DYUwDLl76c&@j57Au3*+nn<$q*>U=NKif^CX(~)^ zvG3Zow%1S}1i6}?=v`l^s*_%?Kx;8Xk3@Uv-dW#qBvsnZv$MBG>Z`nt#b6fv7w&ZB zFJn<2PzM8S`2MPZSMGGeR9<2SXPE4R)FBxvJ0Xr^4i1Wzfe|g8Fy((Fa1Q5lLWP*b zz*TcIIG#KxK6G@JD7vuWyjXUvd8t1rcxWgLLTSPt17ImE+6yPE+5iApdtV(cc zwpyh&(3yiLbFv$2A~(0$hd4C@7|=3g*aZ=7;d6?L0YxbVB3N0M^5RP8$RycS;ljII z2VR-k?B+rcq$d`odG4IC-ZQjepL4aQFS*pKMwJ!O-n{y?H_edn zQB<1h1Ut&uEpzmgH15dF&4_rzXn7zEY_CIUR7wO?Sz{E4J|v9#(vqqKk}872-Wp)E z$FMuvq%|FCU`{<7R3-S2nxYXs1OSwl&2+~PqO9dSKSVK?KXbd1vJqik>LFhYDg zbO@u#htV$CK>%_(Mq_ip%enlgFFW?aSZYI7HxUGbZ1F5*yyVuu1H7h-LO zn#glerc*zqEbOwGV^44H6n~0isw6`nOPhkx7-V1sIf#6Sls|#y1qCNS=vDTY^ihS< z=VqQy>JXBW#UBvPN-0(fn9Q*F^0WK2mOwQz&*ZmShCPxpMeBwJC_`&Ry`slO5H2q# zf6hrJpdm*pD42yRiH2H`3s%2fg?oCNhZ?3%hIHO zFu%)W)Omu<9G>1y)oc;y2JDixq?xWQh`icq=3_OIlDTZf?PjPIsJQ1+R@i7m?q#xX zOJw@$IGB2G@X59RXK98QgZ+B`GaRlRn|}UtaQ|;Wp2G9L@Hq-v33&i~=EqllQ~HUZ z0?xq`J3SZP6!-DPa|QBE2IJ|a*YeFkD>I;EnaUfO$v}!jladq-Q&dU zm9lP;U|F4Bi+(DDOYk<3t4O)Wt<2VNz6?3^xFEP7$mdz$^@?0|i6Y|67-f%1yv z;D6%u>*w)X<)IbsYp0Z3@*nmZvmAchyGWrSP=w0 zphGla?N|`PN$$K(n#oC7kpNV?K$mEc?K2WyB9gfKoHOUa0+}{86^T^H-U!Y;7oMg# zHz@vsL!fj;#$FE-{lGb)k-kd@%+#n?2;jg#D}US z8#Ek3i-OUk%+b_O31k(pn~F=b@5neQz>^S61Z8X^$pOYqA>47t@I1|0Bn+WKiw3M65_@drP?%jr|;Jfiu?%J~C$iWjT zCZzA3W%b}wrUN^M<~jK62u}|Ezgsj^S&jA01jyO6mG+o%v3gu>U67<3onPNFr*Y2oI?&>b9!SuF5erJ7 z45{Q?;_wwK>d+fhX2pu~3P4p3)xP_JB=jR&=1K|}5DgQmG<;6%(qt(e+w^WQ9bZs} z1H+)&B^#Pbj!od;?94Y%P~1SnWS3Cj06v_jB}97(p60;l3(}L77*Mvs10i*KLyqf8RDS=e-w8SC?`B*~7Hge7{c=~jQwPCeFGl=3) z>OJ>^Gthd^kl{Vna`urTge0YOpA<@q>@&U2t3sk8(}tTdB+`d?gSh~6{9x(d{No#) z4Vc_A0OvT+)9%Y-?fQgJ@-d0NA&FTsFeI1CiYyu_?tlRCY2&O6ax88!mz!pIPW)vR zZaGWSUY*l0`Dr!JR@viS#a<2IU>oIA=KN?^8&;b_qLR@;+aiHPdjL#MHMobjV+pHWiTBL?o-g!t4}*<`DI}y zTpLOHI%oad=4v0k=F2IfGLR44y>RBRW_{Z0jUy+|W{T{_ zVS^}O-h1i7$<#_89XPDn9o&7xi_=1Q%%#-zqw}U8+08YCzVI2pA{D||8R`|;F^BlK zfSGmF?45E}9q@C^C@&@bW{iKoecf<{_L-U#I(iFp2+{gQaR|BF%HR;n?#6L9 zk-?3V)2ZYcRA#5rj^+@WB3fdHXnN~Q^z}eFlv*J>=aKG8BHwbhRG+lsQyp62+Og>( zgBuFJo|>7=3h|flP~@;h`@#D~d=NYcJEU8Tin{*;ZZT4UXR^NZYPXZy8HXs#Gh`1e z{qK|WtY|xwPtJr^9xgdYEah^>(UN%(Jt-eDp%t=IN*B=sM*$i1z2&QH6wmjDm9LJX zn2mYB-5Z|(ZFcAOz0pAwFz>zfy=7>nuf8|h><;dG%iBYfNrUcB4^5HnoQz}0<)+~n zsuymWeszgvGf8&dsp-34lucRx`$f06Yi2;6Li~R?)qgJzg64|<8t1+Lw>ms7Jb3H(o4RdcS zEZpeM?PJ12$a}VX>tFJ1qp#j2+~^MOTguysky&-?PZvi2uvecw7lf~N@^~(PHF~F; z&HP=2wlv(aJe|A+E3faSZt*xFGKk*F+!F!1%P}>mstPOS?R8e&uczNqhFzbQ~Qy z`rvG(EYU^&z4(t#F^I&^sjp%`^a`AM?>$_X9-4R3EFquK?E3D5$R?oojE1=9VB>S59ZmEOZNa9@EoQM)#dgewETo zsu@W;Z58tGu^%J}udMb?l(^O1otTP!$5TA%#v{5wN#|`fM^i-CXEks4tO(E^KG^pxR?c@UyO|-sg7Naq(v!YReKk$Cu3P+jfiKj2#yo zC&%}`^E<9{xuJ-F&9+wiFA9Y@pZweCqh&@K-6360WW^(QNisu>j6QEnV~-47IQ!AY zDw-COdD+iA&7=-LXW3ET5QmXY)82)__{Q+#7Dt;5qbAYkm;fg{3CgI>047ZY;j!g; z&xEhq(FgkXZI5$y@hcA#>h9&MtN@*>oUDbx47wNUfL;sQ%eBJ`ZFcoTj%Mnf=U7DE zIhb*K+fO_DQ-J-?FKh*Q0dm;?V{2=?_J4J4ZPlRtKM+rE%ztVQqcYgg?||vHKGEHA zdCb@ini{RDLc*oYtMb{G{^D1`Ot!uq%s^G7P*oLGlQZ-dE^cpOySIE)0TLJO=)O#v z9=Z0|7dL)GNWTKvGYvrJ7JD{IeuAH=&q1acSf=rq8fmSAkb8KnD82xf8z1LLMkCa*1riksVM;geczu?=y{O&cxJ-vD ziAv1|#`&m%LEi5q1Rdk2oE^gC-lXq#cctxfmv)KviBZH3bSZNci9xF&X&6v-oQlDq z*Ks4Nk}Wx?#PIk}SWlU-hAXvcQ`N3{qQM7AW&p#nVL+Q>E=NcaLfUl;)CDSwMjT}> zP<<>N(m8<~%^bymP@W;s%k2Rm&5s^sj!qYA_65zNB!SVP5K@bfxizsA6{k`FK_RM= zfUGcwG@RMz-Z2EGVPeOyYy9+oAr6&<98)y|7Nw6I`hV59YR~<@;c+!p)r0!~Ks+U& zS+tO(G7)W)Nk_|$3ObUqA|WZRi;+$-22CMQ0@~uT3CyIfYldY4GY%C6$Gm`qXhq_( z8mj;XR76YeqRXc9UR0$(2~c5-L`jzs*94751xJ(%ph;CyKvQu|1QO7p0Tfw&GUjlwW=vZb{;(ytTc&rlr!~Qh8)JmtJ4l&Z1 z)UoYj2F3_xw;mWHbcmgSF@lxQ17l7Nlz@4nA!|t!G)|dn1_a&E7Q=`Y5M&98m86`Z zEe;4>W<--<+~21F8pKs`8l22>L6*9*(ymZh6@m6d3v5X^X`q(#h1OVj0uS*ehsizrc* zpfcsy{~a^5q>e-iAvB<9F*yP{pw$hLz@dPUdO{#jQUcm$9W$jR5NL02N1Am&f;vSA7h-N%c z3K00f?l=XKI?_|^QW!2#m*=s5yTXA^S(WMlvf$;|Y*7y+pd}*h8G%dy_A!~z2UCb9 z6@|n?;vH>PE0H3q5eUwJilTw}nxRNR0z^p(XjCmjlahEFA`rkrnkXW=p>@d;G=a!) z&YXK_TskyN&>fc}aS#zzqyl00KR)Qt1r<#PD(t570g_0uCe)BN|K)6v00~hQW6%%+ zfyu7vbaj9w{>d|w9Z=MD(`l`fzQNN$NJfIXqNNf@IYi1TX&(QnMFFPF2GYK)f{2nd zEohhmS*Gw;f`+(gf(}Gu7BrEKfj4V()WpdQOazUgLJOLp*~TSkNvf8dfNl_VLz4tq zt1Jg)lV>)!lnY=Ah7zE^*e;Nmw6p{^Xxe7Af(SG$IVwj)3z`*(?qdj8r_0g!T z%9e}(?LknXWn7k^iZB2Tz&|};3N#~zjLk%l_tOKWF4bWKVYgA$lUD8ufu2zIC)f94 zRqF}#fOg9AqKzp*)g)xQYEi2l^neyB8+h?dYb z6{?mEkmDq3caus+PzX}eu+o2^V1{ZCb+JQM@?(n5b!$dvb2_;B z!bw{w490@t6m_{38eMV(_Es*{H#f2t`f=Xly4XkhoS_-=GEKEa1vG0Cs83p&84;CS z>O-OOlR5{HHR1-A!D*7X9+_+fVS^BxE?v%ASR>RNRTwTa!--X>sfM8$1u0Mct~C|w zDcBauuhjzdw|-aLiuLplpgb!;OlLw;j~Su_oue0II}*vhMhkSyiUOc&Ch-9i-}5su zxeKbq58n;(8`3298W5+302-s9-Pr&oB;L+cNwTph)84GOp>+dM1sFi=c);&XOVbG( z5{Q9_O?knwRlFT|Ls-}cE`Y^;6)p#E(}r?mV?vDOHf09NH_+=R7mo~-OQF{fPq{Ll z6Y`(0CW+P+NJuA|R1|~wf(dj&8d1SdDL zY75Isa2Z3>ta3Yo+O&)$&Vwibp8@DeMIi?)%y!=aOwl5p&>%DjT3}2zEh7c!nT$DN z0-B&qg1P}Cq6MWov_JuO7Y0-%Xf!(=0a-OIC`#p?q1()oarEJe%-^cZ9o)FHoV5E5 zJPoSe51(aY#BsHu% z#7HMprFNew0Mlvg77!U@Qj!O>7Jw>ZOtSHWmVJ$|aeZ^6ttl5a?Tl+pVyv*JI!z1O z@0v9nJ=Y-`K`M+%8tC}T8JR2j#1188?Wrw20Dyyr)M^{#juMAJ96m>bo z)iy)28VZNPwUwM$PpOu;)ZSKzKoj^OmDv}~q7`pT>9Cy}V6!2smdTFAPy<7!1zAj+ z9lrpjBJh%r$+3e!*^o*nxd(2#DmI3V%vv2(QLIdaezuRbwR_BC3jP~Xu=)D;`UND7?3DD zY%dHIOMxXxQ9%D`Kp8IH1-lQK?_@VWy zH5tW+vxAA0{gd~FU}xA=SN(-$C9FY{rWWyWixq?V($LolQ}#xVjXrvIq!SjfLDwhr z*{PAS`MN!Elx>6@`kXBQqSUwhpwB+?q#3|~mLbC~hy&r}C=e9`ic$(h@X8?xydCd4 zB^RP8G~E~iK^g)o&2xueF(k9T!@=}-)xmNQRG=EO;z1Cu0zuOq`m-h zqR&4PYiD}cI&5i%7=y)&!Q4KJZt)^Fx6i8QB4#orLPQZw-aXIz=jpTo>{@ZCRYz)? zX+bpt{RJggz-LRP+4;J#tb{9@VOs@LP@7J2>=sLx+kv&VBB@(Duwup2p`|N!hCo$< z1|dcC%e2pXcs$?Ebj+g_9Xbk(_UIuLAa=W&5x+FymTMkpKaKWF2DNRMj4s~m9|9qpy&T zoRk#_K($LYG&Mm^0~<0vjer$&5)vU2m7&0JFha6^2?PpRK%sX=sQtSEk_na4J~0ihuVSGu^2`yIw7)U zl4Sa#6)$KQovv&w>eCerTvCSrPe$rkwGs){I`F&+77(75A@TEqYv9( zbJ*Vf??4YPSaReS;WwZ2$e7cgMCa1W^2&52sC~(+(@s~j3cB@+?0P%@h1;HQR6#^E zv9B%VL^oD&M-NFbV$6w&h-=+!+2oc|0kk4xW*(m>YhhUl%N>KqSq^f{pF3$&yWjk= zBAGLtfkq1$bZrrV85fZPOJXbW1<5$%(#{H0$ov&2Rakp|sM;Z)T=VD27iH3|PkiQ= zC#Osiws?kSqgJL&_9UzC{j{cQXB5tm!*yBmwzfOGV@Faj1|lvqY%6s@5<8FJ!7e!2 zq7gzS&{Uc(Dy1a}0+J>K6bfoJu^m8yrhbw~x#rK67R$7K$_36Jz81Pzv*$a1IK|a= zo;?J^4m5Xux5u^@Ja^pv!9|(C^tt0MyxhJM$lYBtAhVcb{yY~#^pf|u>p%K5f9dl^ zlDTi+DdSQ}4-C)cF>evkG(}Z1MAzIEI&TfEl_JT_^!c;l+|F}o!!c0vm}||`)R@+H zodvZrWpWWX4`iD}3hee?`Un&QyZB*O%zV*MWi^)D50i(_rB7~=oQ{M%jP^d+^*mK~ zQ>+MvrYN!+YZGH=<)_F3VuzNrXpSIS0$5@U3wirIPkZ6#djcgTpjC$vSyX_GF=$5O zFd>@UNix)wlZ(lqXIkn409Yv<)}aPvH5LFsa;B?}9fV=Uxm>H{T#{@8MZ;%+0sz3J zVnSD79guJ>LDm8RF0E9Ku3GGpn2?>5Q+&%b{ZyqIlhvhxfF;IqHA~vD#2DX9SP0h& z;gAG7WKj);t3pO?O(38r6@?td&ebSJb~FV<(tNXB(Y^u#JG4jFE8Sws91Y~C0|&y{ zXnaV>8eKsyb1u+z&}Tw&>^$elQV5K%W=Y8fJs z)u?79$Vmy3=*;9NiQJ)qXuDn|VSZ`^(#ASqU7*A!OP=CNT$#+=^iqQGpJDb(05|=B zpNT*TAVa4R(R^YhfZH#2IE&tok`qttQV~)faJ$U{j|7CrK!EOvpfSp5FBl3|0KS_!I0aiUNYh$LvWeg{fs{fBjgX{irmP{s=7KmF z3I+mVBmzxywkE+`;MU`kAfZXlJ)9Zgc6HPOMQOevTd)aFfGID_*;%W+3>MJCgz0i1 zpo>;KSG&zL`E`dgk&>$=J8xb#a%QAMCcVTp9R#l>fJ3YY0VM!q00Uiucbd3vZJKpQ zfjMN0Gw$UWC7+y{1&^^ zU(Ur-P{qFobkvT8YJ}ZPj}wIRgO+r~8L=P;H2XGGyXpc=lVo`^o9kO!=Qp)X2{=k- z7u)!)3-G!pK_$M2E$aS~1zmikt(`wTQk3P0LUsP>gsH4Oc5(^Z^X-srK->5I ztyqEa7bxMg`D3(tILgiZxwr|qobZ&v<}|fUZ56DgL{3FC)zlQ&mwQvHss{Gvl&Wwq z?oP?`@|2wS<@Na%6+AbMQ6!O~nh`-Or)JvwJ!H8f88nd0!kIE4B%(}IpkbM=X`@ME z>3I#DWE3P)^fCmTLEbY}6NAAD4>l(TgP7(=dy3|nqTbs|l>W4Ird}#iphr@FoVA3rOY(938F*A^|6w zuy!m6N#y}Q6oh+)f-sMQaB)x&?gtcvy(nNgedn@-FEkia17V>`s0sv5Zc@P1Cr(w2}sDN|H$GSu)fbqC??U5GPWl7l-xOUC|K$*)pLLMP`*~ z*axf_%BD8W5(0rSW9H+SM+$g1G$4>^Vr57#L-8WvxG`e_fe>hB@#pllNzlQP5R>uZ z6LxNuq#cy8LtY3C9VyVES#eUS8V|3A;ht*<%`C}6jfd}UvpT&^k{B3hs*)-fz{xY9 z0kdcDW|_MY35dE(2StL(%CX%W5miJ}5=dwmOOCZm96<=X?R>g2615iyfw>3^L=U3b zh1=6$>Z%c3U`53xl_j)v2m=?QRGtGG)M1;On8<+xo!Gxj+a7}vi`V-x_#yx&W3*<_ z=u}0IiyhFCBbcGEiW}DwS`4ZX&3w0*a=BVrUTH2zH6pPFM5q!p=&5X+;mJwugqcLP z$%qhFBXu=U&6#Ct@{}b(dfZV6e13!w0!z6~`KAK5N5XH_(H4jz!6m9GAe&|qn)!E0 zbacu^lupeER7FG9?3AW4G5y zTs8i;CZubo6>cAu?m9qt)Q_r2qxFJHnvs-<~O#@ zXqwvw=GV8h)X!;aoZ1SST0le7oGFcMjZJe}LDMu)Kj$Z4X5*YG6#&Y_k+)RG`6M(0 z$O*ih3xQUe9ENpnd+)I;R*nEgRAWgo20={gf@G6Ghekp+$pR^=Qb3UtGRseqHXLCm exDc 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%0ATGLl1iu%|c>Zg$5$1(l0{~6B2Hz| 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

Rj3Rwt07wS$6(l}WBdt$OTDEOc67pzO- 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 Date: Sat, 17 Jun 2023 16:19:40 +0300 Subject: [PATCH 056/394] feat: sentry june release (#910) --- sentry/Chart.yaml | 4 +- sentry/templates/_helper.tpl | 2 +- ...nt-sentry-ingest-consumer-attachments.yaml | 144 ++++++++++++++++++ ...oyment-sentry-ingest-consumer-events.yaml} | 8 +- ...t-sentry-ingest-consumer-transactions.yaml | 144 ++++++++++++++++++ .../gke/backendconfig-sentry-web.yaml | 2 +- .../templates/hooks/sentry-secret-create.yaml | 2 +- sentry/templates/secret-snuba-env.yaml | 2 +- sentry/templates/service-metrics.yaml | 2 +- sentry/templates/serviceaccount-metrics.yaml | 2 +- sentry/templates/serviceaccount-relay.yaml | 2 +- .../templates/serviceaccount-sentry-cron.yaml | 2 +- ...nt-sentry-ingest-consumer-attachments.yaml | 10 ++ ...ccount-sentry-ingest-consumer-events.yaml} | 4 +- ...t-sentry-ingest-consumer-transactions.yaml | 10 ++ ...serviceaccount-sentry-ingest-monitors.yaml | 2 +- ...count-sentry-ingest-replay-recordings.yaml | 2 +- .../templates/serviceaccount-sentry-web.yaml | 2 +- .../serviceaccount-sentry-worker.yaml | 2 +- .../serviceaccount-symbolicator.yaml | 2 +- sentry/templates/servicemonitor-metrics.yaml | 2 +- sentry/values.yaml | 8 + 22 files changed, 338 insertions(+), 22 deletions(-) create mode 100644 sentry/templates/deployment-sentry-ingest-consumer-attachments.yaml rename sentry/templates/{deployment-sentry-ingest-consumer.yaml => deployment-sentry-ingest-consumer-events.yaml} (96%) create mode 100644 sentry/templates/deployment-sentry-ingest-consumer-transactions.yaml create mode 100644 sentry/templates/serviceaccount-sentry-ingest-consumer-attachments.yaml rename sentry/templates/{serviceaccount-sentry-ingest-consumer.yaml => serviceaccount-sentry-ingest-consumer-events.yaml} (80%) create mode 100644 sentry/templates/serviceaccount-sentry-ingest-consumer-transactions.yaml diff --git a/sentry/Chart.yaml b/sentry/Chart.yaml index 696f996b6..604f8de6d 100644 --- a/sentry/Chart.yaml +++ b/sentry/Chart.yaml @@ -2,8 +2,8 @@ apiVersion: v2 name: sentry description: A Helm chart for Kubernetes type: application -version: 19.2.0 -appVersion: 23.5.2 +version: 19.3.0 +appVersion: 23.6.1 dependencies: - name: memcached repository: oci://registry-1.docker.io/bitnamicharts diff --git a/sentry/templates/_helper.tpl b/sentry/templates/_helper.tpl index 1c7c334b7..19d495ec3 100644 --- a/sentry/templates/_helper.tpl +++ b/sentry/templates/_helper.tpl @@ -540,4 +540,4 @@ Common Sentry environment variables name: {{ .Values.openai.existingSecret }} key: {{ default "api-token" .Values.openai.existingSecretKey }} {{- end }} -{{- end -}} \ No newline at end of file +{{- end -}} diff --git a/sentry/templates/deployment-sentry-ingest-consumer-attachments.yaml b/sentry/templates/deployment-sentry-ingest-consumer-attachments.yaml new file mode 100644 index 000000000..aec7bf2cd --- /dev/null +++ b/sentry/templates/deployment-sentry-ingest-consumer-attachments.yaml @@ -0,0 +1,144 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: {{ template "sentry.fullname" . }}-ingest-consumer-attachments + labels: + app: {{ template "sentry.fullname" . }} + chart: "{{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }}" + release: "{{ .Release.Name }}" + heritage: "{{ .Release.Service }}" + app.kubernetes.io/managed-by: "Helm" + {{- if .Values.asHook }} + {{- /* Add the Helm annotations so that deployment after asHook from true to false works */}} + annotations: + meta.helm.sh/release-name: "{{ .Release.Name }}" + meta.helm.sh/release-namespace: "{{ .Release.Namespace }}" + "helm.sh/hook": "post-install,post-upgrade" + "helm.sh/hook-weight": "10" + {{- end }} +spec: + revisionHistoryLimit: {{ .Values.revisionHistoryLimit }} + selector: + matchLabels: + app: {{ template "sentry.fullname" . }} + release: "{{ .Release.Name }}" + role: ingest-consumer +{{- if not .Values.sentry.ingestConsumer.autoscaling.enabled }} + replicas: {{ .Values.sentry.ingestConsumer.replicas }} +{{- end }} + template: + metadata: + annotations: + checksum/configYml: {{ .Values.config.configYml | toYaml | toString | sha256sum }} + checksum/sentryConfPy: {{ .Values.config.sentryConfPy | sha256sum }} + checksum/config.yaml: {{ include (print $.Template.BasePath "/configmap-sentry.yaml") . | sha256sum }} + {{- if .Values.sentry.ingestConsumer.annotations }} +{{ toYaml .Values.sentry.ingestConsumer.annotations | indent 8 }} + {{- end }} + labels: + app: {{ template "sentry.fullname" . }} + release: "{{ .Release.Name }}" + role: ingest-consumer + {{- if .Values.sentry.ingestConsumer.podLabels }} +{{ toYaml .Values.sentry.ingestConsumer.podLabels | indent 8 }} + {{- end }} + spec: + affinity: + {{- if .Values.sentry.ingestConsumer.affinity }} +{{ toYaml .Values.sentry.ingestConsumer.affinity | indent 8 }} + {{- end }} + {{- if .Values.sentry.ingestConsumer.nodeSelector }} + nodeSelector: +{{ toYaml .Values.sentry.ingestConsumer.nodeSelector | indent 8 }} + {{- end }} + {{- if .Values.sentry.ingestConsumer.tolerations }} + tolerations: +{{ toYaml .Values.sentry.ingestConsumer.tolerations | indent 8 }} + {{- end }} + {{- if .Values.images.sentry.imagePullSecrets }} + imagePullSecrets: +{{ toYaml .Values.images.sentry.imagePullSecrets | indent 8 }} + {{- end }} + {{- if .Values.dnsPolicy }} + dnsPolicy: {{ .Values.dnsPolicy | quote }} + {{- end }} + {{- if .Values.dnsConfig }} + dnsConfig: +{{ toYaml .Values.dnsConfig | indent 8 }} + {{- end }} + {{- if .Values.sentry.ingestConsumer.securityContext }} + securityContext: +{{ toYaml .Values.sentry.ingestConsumer.securityContext | indent 8 }} + {{- end }} + containers: + - name: {{ .Chart.Name }}-ingest-consumer-attachments + image: "{{ template "sentry.image" . }}" + imagePullPolicy: {{ default "IfNotPresent" .Values.images.sentry.pullPolicy }} + command: ["sentry"] + args: + - "run" + - "ingest-consumer" + - "--consumer-type=attachments" + {{- if .Values.sentry.ingestConsumer.concurrency }} + - "--concurrency" + - "{{ .Values.sentry.ingestConsumer.concurrency }}" + {{- end }} + {{- if .Values.sentry.ingestConsumer.maxBatchSize }} + - "--max-batch-size" + - "{{ .Values.sentry.ingestConsumer.maxBatchSize }}" + {{- end }} + env: + - name: C_FORCE_ROOT + value: "true" +{{ include "sentry.env" . | indent 8 }} +{{- if .Values.sentry.ingestConsumer.env }} +{{ toYaml .Values.sentry.ingestConsumer.env | indent 8 }} +{{- end }} + volumeMounts: + - mountPath: /etc/sentry + name: config + readOnly: true + - mountPath: {{ .Values.filestore.filesystem.path }} + name: sentry-data + {{- if and (eq .Values.filestore.backend "gcs") .Values.filestore.gcs.secretName }} + - name: sentry-google-cloud-key + mountPath: /var/run/secrets/google + {{ end }} +{{- if .Values.sentry.ingestConsumer.volumeMounts }} +{{ toYaml .Values.sentry.ingestConsumer.volumeMounts | indent 8 }} +{{- end }} + resources: +{{ toYaml .Values.sentry.ingestConsumer.resources | indent 12 }} +{{- if .Values.sentry.ingestConsumer.sidecars }} +{{ toYaml .Values.sentry.ingestConsumer.sidecars | indent 6 }} +{{- end }} + {{- if .Values.serviceAccount.enabled }} + serviceAccountName: {{ .Values.serviceAccount.name }}-ingest-consumer-attachments + {{- end }} + volumes: + - name: config + configMap: + name: {{ template "sentry.fullname" . }}-sentry + - name: sentry-data + {{- if and (eq .Values.filestore.backend "filesystem") .Values.filestore.filesystem.persistence.enabled (.Values.filestore.filesystem.persistence.persistentWorkers) }} + {{- if .Values.filestore.filesystem.persistence.existingClaim }} + persistentVolumeClaim: + claimName: {{ .Values.filestore.filesystem.persistence.existingClaim }} + {{- else }} + persistentVolumeClaim: + claimName: {{ template "sentry.fullname" . }}-data + {{- end }} + {{- else }} + emptyDir: {} + {{ end }} + {{- if and (eq .Values.filestore.backend "gcs") .Values.filestore.gcs.secretName }} + - name: sentry-google-cloud-key + secret: + secretName: {{ .Values.filestore.gcs.secretName }} + {{ end }} +{{- if .Values.sentry.ingestConsumer.volumes }} +{{ toYaml .Values.sentry.ingestConsumer.volumes | indent 6 }} +{{- end }} + {{- if .Values.sentry.ingestConsumer.priorityClassName }} + priorityClassName: "{{ .Values.sentry.ingestConsumer.priorityClassName }}" + {{- end }} diff --git a/sentry/templates/deployment-sentry-ingest-consumer.yaml b/sentry/templates/deployment-sentry-ingest-consumer-events.yaml similarity index 96% rename from sentry/templates/deployment-sentry-ingest-consumer.yaml rename to sentry/templates/deployment-sentry-ingest-consumer-events.yaml index 5e56374cf..76be201aa 100644 --- a/sentry/templates/deployment-sentry-ingest-consumer.yaml +++ b/sentry/templates/deployment-sentry-ingest-consumer-events.yaml @@ -1,7 +1,7 @@ apiVersion: apps/v1 kind: Deployment metadata: - name: {{ template "sentry.fullname" . }}-ingest-consumer + name: {{ template "sentry.fullname" . }}-ingest-consumer-events labels: app: {{ template "sentry.fullname" . }} chart: "{{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }}" @@ -71,14 +71,14 @@ spec: {{ toYaml .Values.sentry.ingestConsumer.securityContext | indent 8 }} {{- end }} containers: - - name: {{ .Chart.Name }}-ingest-consumer + - name: {{ .Chart.Name }}-ingest-consumer-events image: "{{ template "sentry.image" . }}" imagePullPolicy: {{ default "IfNotPresent" .Values.images.sentry.pullPolicy }} command: ["sentry"] args: - "run" - "ingest-consumer" - - "--all-consumer-types" + - "--consumer-type=events" {{- if .Values.sentry.ingestConsumer.concurrency }} - "--concurrency" - "{{ .Values.sentry.ingestConsumer.concurrency }}" @@ -113,7 +113,7 @@ spec: {{ toYaml .Values.sentry.ingestConsumer.sidecars | indent 6 }} {{- end }} {{- if .Values.serviceAccount.enabled }} - serviceAccountName: {{ .Values.serviceAccount.name }}-ingest-consumer + serviceAccountName: {{ .Values.serviceAccount.name }}-ingest-consumer-events {{- end }} volumes: - name: config diff --git a/sentry/templates/deployment-sentry-ingest-consumer-transactions.yaml b/sentry/templates/deployment-sentry-ingest-consumer-transactions.yaml new file mode 100644 index 000000000..d7d3ba34c --- /dev/null +++ b/sentry/templates/deployment-sentry-ingest-consumer-transactions.yaml @@ -0,0 +1,144 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: {{ template "sentry.fullname" . }}-ingest-consumer-transactions + labels: + app: {{ template "sentry.fullname" . }} + chart: "{{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }}" + release: "{{ .Release.Name }}" + heritage: "{{ .Release.Service }}" + app.kubernetes.io/managed-by: "Helm" + {{- if .Values.asHook }} + {{- /* Add the Helm annotations so that deployment after asHook from true to false works */}} + annotations: + meta.helm.sh/release-name: "{{ .Release.Name }}" + meta.helm.sh/release-namespace: "{{ .Release.Namespace }}" + "helm.sh/hook": "post-install,post-upgrade" + "helm.sh/hook-weight": "10" + {{- end }} +spec: + revisionHistoryLimit: {{ .Values.revisionHistoryLimit }} + selector: + matchLabels: + app: {{ template "sentry.fullname" . }} + release: "{{ .Release.Name }}" + role: ingest-consumer +{{- if not .Values.sentry.ingestConsumer.autoscaling.enabled }} + replicas: {{ .Values.sentry.ingestConsumer.replicas }} +{{- end }} + template: + metadata: + annotations: + checksum/configYml: {{ .Values.config.configYml | toYaml | toString | sha256sum }} + checksum/sentryConfPy: {{ .Values.config.sentryConfPy | sha256sum }} + checksum/config.yaml: {{ include (print $.Template.BasePath "/configmap-sentry.yaml") . | sha256sum }} + {{- if .Values.sentry.ingestConsumer.annotations }} +{{ toYaml .Values.sentry.ingestConsumer.annotations | indent 8 }} + {{- end }} + labels: + app: {{ template "sentry.fullname" . }} + release: "{{ .Release.Name }}" + role: ingest-consumer + {{- if .Values.sentry.ingestConsumer.podLabels }} +{{ toYaml .Values.sentry.ingestConsumer.podLabels | indent 8 }} + {{- end }} + spec: + affinity: + {{- if .Values.sentry.ingestConsumer.affinity }} +{{ toYaml .Values.sentry.ingestConsumer.affinity | indent 8 }} + {{- end }} + {{- if .Values.sentry.ingestConsumer.nodeSelector }} + nodeSelector: +{{ toYaml .Values.sentry.ingestConsumer.nodeSelector | indent 8 }} + {{- end }} + {{- if .Values.sentry.ingestConsumer.tolerations }} + tolerations: +{{ toYaml .Values.sentry.ingestConsumer.tolerations | indent 8 }} + {{- end }} + {{- if .Values.images.sentry.imagePullSecrets }} + imagePullSecrets: +{{ toYaml .Values.images.sentry.imagePullSecrets | indent 8 }} + {{- end }} + {{- if .Values.dnsPolicy }} + dnsPolicy: {{ .Values.dnsPolicy | quote }} + {{- end }} + {{- if .Values.dnsConfig }} + dnsConfig: +{{ toYaml .Values.dnsConfig | indent 8 }} + {{- end }} + {{- if .Values.sentry.ingestConsumer.securityContext }} + securityContext: +{{ toYaml .Values.sentry.ingestConsumer.securityContext | indent 8 }} + {{- end }} + containers: + - name: {{ .Chart.Name }}-ingest-consumer-transactions + image: "{{ template "sentry.image" . }}" + imagePullPolicy: {{ default "IfNotPresent" .Values.images.sentry.pullPolicy }} + command: ["sentry"] + args: + - "run" + - "ingest-consumer" + - "--consumer-type=transactions" + {{- if .Values.sentry.ingestConsumer.concurrency }} + - "--concurrency" + - "{{ .Values.sentry.ingestConsumer.concurrency }}" + {{- end }} + {{- if .Values.sentry.ingestConsumer.maxBatchSize }} + - "--max-batch-size" + - "{{ .Values.sentry.ingestConsumer.maxBatchSize }}" + {{- end }} + env: + - name: C_FORCE_ROOT + value: "true" +{{ include "sentry.env" . | indent 8 }} +{{- if .Values.sentry.ingestConsumer.env }} +{{ toYaml .Values.sentry.ingestConsumer.env | indent 8 }} +{{- end }} + volumeMounts: + - mountPath: /etc/sentry + name: config + readOnly: true + - mountPath: {{ .Values.filestore.filesystem.path }} + name: sentry-data + {{- if and (eq .Values.filestore.backend "gcs") .Values.filestore.gcs.secretName }} + - name: sentry-google-cloud-key + mountPath: /var/run/secrets/google + {{ end }} +{{- if .Values.sentry.ingestConsumer.volumeMounts }} +{{ toYaml .Values.sentry.ingestConsumer.volumeMounts | indent 8 }} +{{- end }} + resources: +{{ toYaml .Values.sentry.ingestConsumer.resources | indent 12 }} +{{- if .Values.sentry.ingestConsumer.sidecars }} +{{ toYaml .Values.sentry.ingestConsumer.sidecars | indent 6 }} +{{- end }} + {{- if .Values.serviceAccount.enabled }} + serviceAccountName: {{ .Values.serviceAccount.name }}-ingest-consumer-transactions + {{- end }} + volumes: + - name: config + configMap: + name: {{ template "sentry.fullname" . }}-sentry + - name: sentry-data + {{- if and (eq .Values.filestore.backend "filesystem") .Values.filestore.filesystem.persistence.enabled (.Values.filestore.filesystem.persistence.persistentWorkers) }} + {{- if .Values.filestore.filesystem.persistence.existingClaim }} + persistentVolumeClaim: + claimName: {{ .Values.filestore.filesystem.persistence.existingClaim }} + {{- else }} + persistentVolumeClaim: + claimName: {{ template "sentry.fullname" . }}-data + {{- end }} + {{- else }} + emptyDir: {} + {{ end }} + {{- if and (eq .Values.filestore.backend "gcs") .Values.filestore.gcs.secretName }} + - name: sentry-google-cloud-key + secret: + secretName: {{ .Values.filestore.gcs.secretName }} + {{ end }} +{{- if .Values.sentry.ingestConsumer.volumes }} +{{ toYaml .Values.sentry.ingestConsumer.volumes | indent 6 }} +{{- end }} + {{- if .Values.sentry.ingestConsumer.priorityClassName }} + priorityClassName: "{{ .Values.sentry.ingestConsumer.priorityClassName }}" + {{- end }} diff --git a/sentry/templates/gke/backendconfig-sentry-web.yaml b/sentry/templates/gke/backendconfig-sentry-web.yaml index 143d1907c..c33d8cb54 100644 --- a/sentry/templates/gke/backendconfig-sentry-web.yaml +++ b/sentry/templates/gke/backendconfig-sentry-web.yaml @@ -18,4 +18,4 @@ spec: type: HTTP requestPath: {{ template "sentry.healthCheck.requestPath" }} port: {{ .Values.service.externalPort }} -{{- end }} \ No newline at end of file +{{- end }} diff --git a/sentry/templates/hooks/sentry-secret-create.yaml b/sentry/templates/hooks/sentry-secret-create.yaml index 287c1bd2e..267503217 100644 --- a/sentry/templates/hooks/sentry-secret-create.yaml +++ b/sentry/templates/hooks/sentry-secret-create.yaml @@ -14,4 +14,4 @@ metadata: type: Opaque data: key: {{ randAlphaNum 50 | b64enc | quote }} -{{- end -}} \ No newline at end of file +{{- end -}} diff --git a/sentry/templates/secret-snuba-env.yaml b/sentry/templates/secret-snuba-env.yaml index b9d08e1b9..1b40bca69 100644 --- a/sentry/templates/secret-snuba-env.yaml +++ b/sentry/templates/secret-snuba-env.yaml @@ -14,4 +14,4 @@ data: CLICKHOUSE_USER: {{ include "sentry.clickhouse.username" . | b64enc | quote }} {{- if not .Values.externalClickhouse.existingSecret }} CLICKHOUSE_PASSWORD: {{ include "sentry.clickhouse.password" . | b64enc | quote }} -{{- end }} \ No newline at end of file +{{- end }} diff --git a/sentry/templates/service-metrics.yaml b/sentry/templates/service-metrics.yaml index fc5eaf523..bf8087d35 100644 --- a/sentry/templates/service-metrics.yaml +++ b/sentry/templates/service-metrics.yaml @@ -30,4 +30,4 @@ spec: app: {{ template "sentry.fullname" . }}-metrics release: {{ .Release.Name }} role: metrics -{{- end }} \ No newline at end of file +{{- end }} diff --git a/sentry/templates/serviceaccount-metrics.yaml b/sentry/templates/serviceaccount-metrics.yaml index 302ca431d..f31772385 100644 --- a/sentry/templates/serviceaccount-metrics.yaml +++ b/sentry/templates/serviceaccount-metrics.yaml @@ -7,4 +7,4 @@ metadata: annotations: {{ toYaml .Values.serviceAccount.annotations | nindent 4 }} {{- end }} automountServiceAccountToken: {{ .Values.serviceAccount.automountServiceAccountToken }} -{{- end }} \ No newline at end of file +{{- end }} diff --git a/sentry/templates/serviceaccount-relay.yaml b/sentry/templates/serviceaccount-relay.yaml index 787415127..bad816ed2 100644 --- a/sentry/templates/serviceaccount-relay.yaml +++ b/sentry/templates/serviceaccount-relay.yaml @@ -7,4 +7,4 @@ metadata: annotations: {{ toYaml .Values.serviceAccount.annotations | nindent 4 }} {{- end }} automountServiceAccountToken: {{ .Values.serviceAccount.automountServiceAccountToken }} -{{- end }} \ No newline at end of file +{{- end }} diff --git a/sentry/templates/serviceaccount-sentry-cron.yaml b/sentry/templates/serviceaccount-sentry-cron.yaml index 82984cbe2..51f3f5ed7 100644 --- a/sentry/templates/serviceaccount-sentry-cron.yaml +++ b/sentry/templates/serviceaccount-sentry-cron.yaml @@ -7,4 +7,4 @@ metadata: annotations: {{ toYaml .Values.serviceAccount.annotations | nindent 4 }} {{- end }} automountServiceAccountToken: {{ .Values.serviceAccount.automountServiceAccountToken }} -{{- end }} \ No newline at end of file +{{- end }} diff --git a/sentry/templates/serviceaccount-sentry-ingest-consumer-attachments.yaml b/sentry/templates/serviceaccount-sentry-ingest-consumer-attachments.yaml new file mode 100644 index 000000000..9544283db --- /dev/null +++ b/sentry/templates/serviceaccount-sentry-ingest-consumer-attachments.yaml @@ -0,0 +1,10 @@ +{{- if .Values.serviceAccount.enabled }} +apiVersion: v1 +kind: ServiceAccount +metadata: + name: {{ .Values.serviceAccount.name }}-ingest-consumer-attachments +{{- if .Values.serviceAccount.annotations }} + annotations: {{ toYaml .Values.serviceAccount.annotations | nindent 4 }} +{{- end }} +automountServiceAccountToken: {{ .Values.serviceAccount.automountServiceAccountToken }} +{{- end }} diff --git a/sentry/templates/serviceaccount-sentry-ingest-consumer.yaml b/sentry/templates/serviceaccount-sentry-ingest-consumer-events.yaml similarity index 80% rename from sentry/templates/serviceaccount-sentry-ingest-consumer.yaml rename to sentry/templates/serviceaccount-sentry-ingest-consumer-events.yaml index a15ecf25e..40b9b6eab 100644 --- a/sentry/templates/serviceaccount-sentry-ingest-consumer.yaml +++ b/sentry/templates/serviceaccount-sentry-ingest-consumer-events.yaml @@ -2,9 +2,9 @@ apiVersion: v1 kind: ServiceAccount metadata: - name: {{ .Values.serviceAccount.name }}-ingest-consumer + name: {{ .Values.serviceAccount.name }}-ingest-consumer-events {{- if .Values.serviceAccount.annotations }} annotations: {{ toYaml .Values.serviceAccount.annotations | nindent 4 }} {{- end }} automountServiceAccountToken: {{ .Values.serviceAccount.automountServiceAccountToken }} -{{- end }} \ No newline at end of file +{{- end }} diff --git a/sentry/templates/serviceaccount-sentry-ingest-consumer-transactions.yaml b/sentry/templates/serviceaccount-sentry-ingest-consumer-transactions.yaml new file mode 100644 index 000000000..4a08d214b --- /dev/null +++ b/sentry/templates/serviceaccount-sentry-ingest-consumer-transactions.yaml @@ -0,0 +1,10 @@ +{{- if .Values.serviceAccount.enabled }} +apiVersion: v1 +kind: ServiceAccount +metadata: + name: {{ .Values.serviceAccount.name }}-ingest-consumer-transactions +{{- if .Values.serviceAccount.annotations }} + annotations: {{ toYaml .Values.serviceAccount.annotations | nindent 4 }} +{{- end }} +automountServiceAccountToken: {{ .Values.serviceAccount.automountServiceAccountToken }} +{{- end }} diff --git a/sentry/templates/serviceaccount-sentry-ingest-monitors.yaml b/sentry/templates/serviceaccount-sentry-ingest-monitors.yaml index 772e47508..6160cfc1e 100644 --- a/sentry/templates/serviceaccount-sentry-ingest-monitors.yaml +++ b/sentry/templates/serviceaccount-sentry-ingest-monitors.yaml @@ -7,4 +7,4 @@ metadata: annotations: {{ toYaml .Values.serviceAccount.annotations | nindent 4 }} {{- end }} automountServiceAccountToken: {{ .Values.serviceAccount.automountServiceAccountToken }} -{{- end }} \ No newline at end of file +{{- end }} diff --git a/sentry/templates/serviceaccount-sentry-ingest-replay-recordings.yaml b/sentry/templates/serviceaccount-sentry-ingest-replay-recordings.yaml index cd9cd9114..a29e44d45 100644 --- a/sentry/templates/serviceaccount-sentry-ingest-replay-recordings.yaml +++ b/sentry/templates/serviceaccount-sentry-ingest-replay-recordings.yaml @@ -7,4 +7,4 @@ metadata: annotations: {{ toYaml .Values.serviceAccount.annotations | nindent 4 }} {{- end }} automountServiceAccountToken: {{ .Values.serviceAccount.automountServiceAccountToken }} -{{- end }} \ No newline at end of file +{{- end }} diff --git a/sentry/templates/serviceaccount-sentry-web.yaml b/sentry/templates/serviceaccount-sentry-web.yaml index d1b192899..383ea192b 100644 --- a/sentry/templates/serviceaccount-sentry-web.yaml +++ b/sentry/templates/serviceaccount-sentry-web.yaml @@ -7,4 +7,4 @@ metadata: annotations: {{ toYaml .Values.serviceAccount.annotations | nindent 4 }} {{- end }} automountServiceAccountToken: {{ .Values.serviceAccount.automountServiceAccountToken }} -{{- end }} \ No newline at end of file +{{- end }} diff --git a/sentry/templates/serviceaccount-sentry-worker.yaml b/sentry/templates/serviceaccount-sentry-worker.yaml index 6bebecc25..1deb53bf6 100644 --- a/sentry/templates/serviceaccount-sentry-worker.yaml +++ b/sentry/templates/serviceaccount-sentry-worker.yaml @@ -7,4 +7,4 @@ metadata: annotations: {{ toYaml .Values.serviceAccount.annotations | nindent 4 }} {{- end }} automountServiceAccountToken: {{ .Values.serviceAccount.automountServiceAccountToken }} -{{- end }} \ No newline at end of file +{{- end }} diff --git a/sentry/templates/serviceaccount-symbolicator.yaml b/sentry/templates/serviceaccount-symbolicator.yaml index a9e16b6e3..974b22716 100644 --- a/sentry/templates/serviceaccount-symbolicator.yaml +++ b/sentry/templates/serviceaccount-symbolicator.yaml @@ -7,4 +7,4 @@ metadata: annotations: {{ toYaml .Values.serviceAccount.annotations | nindent 4 }} {{- end }} automountServiceAccountToken: {{ .Values.serviceAccount.automountServiceAccountToken }} -{{- end }} \ No newline at end of file +{{- end }} diff --git a/sentry/templates/servicemonitor-metrics.yaml b/sentry/templates/servicemonitor-metrics.yaml index c05d44711..ec1c91ced 100644 --- a/sentry/templates/servicemonitor-metrics.yaml +++ b/sentry/templates/servicemonitor-metrics.yaml @@ -34,4 +34,4 @@ spec: app: {{ template "sentry.fullname" . }}-metrics release: "{{ .Release.Name }}" role: metrics -{{- end }} \ No newline at end of file +{{- end }} diff --git a/sentry/values.yaml b/sentry/values.yaml index a3cb00767..4d02febd8 100644 --- a/sentry/values.yaml +++ b/sentry/values.yaml @@ -1012,6 +1012,14 @@ kafka: maxMessageBytes: "50000000" # 50 MB socketRequestMaxBytes: "50000000" + provisioning: + enabled: true + topics: + - name: ingest-attachments + - name: ingest-transactions + - name: ingest-events + - name: ingest-replay-recordings + - name: profiles service: ports: From 22f418958a08d75faa579c26d63c5d2e59164b45 Mon Sep 17 00:00:00 2001 From: fzyzcjy <5236035+fzyzcjy@users.noreply.github.com> Date: Thu, 29 Jun 2023 17:36:41 +0800 Subject: [PATCH 057/394] Update README.md (#921) --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 3116d17e8..b93987e01 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,8 @@ -# Sentry 10 helm charts +# Sentry helm charts Sentry is a cross-platform crash reporting and aggregation platform. -This repository aims to support Sentry 10 and move out from the deprecated Helm charts official repo. +This repository aims to support Sentry >=10 and move out from the deprecated Helm charts official repo. Big thanks to the maintainers of the [deprecated chart](https://github.com/helm/charts/tree/master/stable/sentry). This work has been partly inspired by it. From 30c0b31494babc3eb0859ae7b43f660c7e2249c4 Mon Sep 17 00:00:00 2001 From: pschwager Date: Tue, 4 Jul 2023 19:58:51 +0200 Subject: [PATCH 058/394] add container security context (#904) Co-authored-by: Patrick Schwager --- sentry/Chart.yaml | 2 +- sentry/templates/cronjob-sentry-cleanup.yaml | 4 +++ sentry/templates/deployment-metrics.yaml | 4 +++ sentry/templates/deployment-relay.yaml | 8 ++++++ ...yment-sentry-billing-metrics-consumer.yaml | 4 +++ sentry/templates/deployment-sentry-cron.yaml | 4 +++ ...nt-sentry-ingest-consumer-attachments.yaml | 4 +++ ...loyment-sentry-ingest-consumer-events.yaml | 4 +++ ...t-sentry-ingest-consumer-transactions.yaml | 4 +++ ...t-sentry-ingest-metrics-consumer-perf.yaml | 4 +++ ...ent-sentry-ingest-metrics-consumer-rh.yaml | 4 +++ .../deployment-sentry-ingest-monitors.yaml | 4 +++ ...yment-sentry-ingest-replay-recordings.yaml | 4 +++ ...-sentry-post-process-forwarder-errors.yaml | 4 +++ ...y-post-process-forwarder-transactions.yaml | 4 +++ ...t-sentry-subscription-consumer-events.yaml | 4 +++ ...ry-subscription-consumer-transactions.yaml | 4 +++ sentry/templates/deployment-sentry-web.yaml | 4 +++ .../templates/deployment-sentry-worker.yaml | 4 +++ sentry/templates/deployment-snuba-api.yaml | 4 +++ .../templates/deployment-snuba-consumer.yaml | 4 +++ .../deployment-snuba-outcomes-consumer.yaml | 4 +++ .../templates/deployment-snuba-replacer.yaml | 4 +++ .../deployment-snuba-replays-consumer.yaml | 4 +++ .../deployment-snuba-sessions-consumer.yaml | 4 +++ ...nt-snuba-subscription-consumer-events.yaml | 4 +++ ...-snuba-subscription-consumer-sessions.yaml | 4 +++ ...ba-subscription-consumer-transactions.yaml | 4 +++ ...eployment-snuba-transactions-consumer.yaml | 4 +++ sentry/templates/deployment-symbolicator.yaml | 4 +++ .../templates/hooks/sentry-db-check.job.yaml | 9 +++++++ .../templates/hooks/sentry-db-init.job.yaml | 9 +++++++ sentry/templates/hooks/snuba-db-init.job.yaml | 9 +++++++ sentry/templates/hooks/snuba-migrate.job.yaml | 9 +++++++ sentry/templates/hooks/user-create.yaml | 9 +++++++ sentry/values.yaml | 27 +++++++++++++++++++ 36 files changed, 193 insertions(+), 1 deletion(-) diff --git a/sentry/Chart.yaml b/sentry/Chart.yaml index 604f8de6d..b1175ec3f 100644 --- a/sentry/Chart.yaml +++ b/sentry/Chart.yaml @@ -2,7 +2,7 @@ apiVersion: v2 name: sentry description: A Helm chart for Kubernetes type: application -version: 19.3.0 +version: 19.4.0 appVersion: 23.6.1 dependencies: - name: memcached diff --git a/sentry/templates/cronjob-sentry-cleanup.yaml b/sentry/templates/cronjob-sentry-cleanup.yaml index ac7cf8a45..7569882eb 100644 --- a/sentry/templates/cronjob-sentry-cleanup.yaml +++ b/sentry/templates/cronjob-sentry-cleanup.yaml @@ -95,6 +95,10 @@ spec: {{- end }} resources: {{ toYaml .Values.sentry.cleanup.resources | indent 14 }} +{{- if .Values.sentry.cleanup.containerSecurityContext }} + securityContext: +{{ toYaml .Values.sentry.cleanup.containerSecurityContext | indent 14 }} +{{- end }} {{- if .Values.sentry.cleanup.sidecars }} {{ toYaml .Values.sentry.cleanup.sidecars | indent 10 }} {{- end }} diff --git a/sentry/templates/deployment-metrics.yaml b/sentry/templates/deployment-metrics.yaml index d97fbdd60..20d21fc29 100644 --- a/sentry/templates/deployment-metrics.yaml +++ b/sentry/templates/deployment-metrics.yaml @@ -98,6 +98,10 @@ spec: {{- end }} resources: {{ toYaml .Values.metrics.resources | indent 10 }} +{{- if .Values.metrics.containerSecurityContext }} + securityContext: +{{ toYaml .Values.metrics.containerSecurityContext | indent 10 }} +{{- end }} {{- if .Values.metrics.volumes }} volumes: {{ toYaml .Values.metrics.volumes | indent 6 }} diff --git a/sentry/templates/deployment-relay.yaml b/sentry/templates/deployment-relay.yaml index 16e0c25c4..91792309e 100644 --- a/sentry/templates/deployment-relay.yaml +++ b/sentry/templates/deployment-relay.yaml @@ -74,6 +74,10 @@ spec: {{- end }} resources: {{ toYaml .Values.relay.init.resources | indent 12 }} +{{- if .Values.relay.containerSecurityContext }} + securityContext: +{{ toYaml .Values.relay.containerSecurityContext | indent 12 }} +{{- end }} env: - name: RELAY_PORT value: '{{ template "relay.port" }}' @@ -149,6 +153,10 @@ spec: timeoutSeconds: {{ .Values.relay.probeTimeoutSeconds }} resources: {{ toYaml .Values.relay.resources | indent 12 }} +{{- if .Values.relay.containerSecurityContext }} + securityContext: +{{ toYaml .Values.relay.containerSecurityContext | indent 12 }} +{{- end }} {{- if .Values.relay.sidecars }} {{ toYaml .Values.relay.sidecars | indent 6 }} {{- end }} diff --git a/sentry/templates/deployment-sentry-billing-metrics-consumer.yaml b/sentry/templates/deployment-sentry-billing-metrics-consumer.yaml index 42a293bb8..1df7eb2fb 100644 --- a/sentry/templates/deployment-sentry-billing-metrics-consumer.yaml +++ b/sentry/templates/deployment-sentry-billing-metrics-consumer.yaml @@ -104,6 +104,10 @@ spec: {{- end }} resources: {{ toYaml .Values.sentry.billingMetricsConsumer.resources | indent 12 }} +{{- if .Values.sentry.billingMetricsConsumer.containerSecurityContext }} + securityContext: +{{ toYaml .Values.sentry.billingMetricsConsumer.containerSecurityContext | indent 12 }} +{{- end }} {{- if .Values.sentry.billingMetricsConsumer.sidecars }} {{ toYaml .Values.sentry.billingMetricsConsumer.sidecars | indent 6 }} {{- end }} diff --git a/sentry/templates/deployment-sentry-cron.yaml b/sentry/templates/deployment-sentry-cron.yaml index bd85f1041..6ad808c55 100644 --- a/sentry/templates/deployment-sentry-cron.yaml +++ b/sentry/templates/deployment-sentry-cron.yaml @@ -89,6 +89,10 @@ spec: {{- end }} resources: {{ toYaml .Values.sentry.cron.resources | indent 12 }} +{{- if .Values.sentry.cron.containerSecurityContext }} + securityContext: +{{ toYaml .Values.sentry.cron.containerSecurityContext | indent 12 }} +{{- end }} {{- if .Values.sentry.cron.sidecars }} {{ toYaml .Values.sentry.cron.sidecars | indent 6 }} {{- end }} diff --git a/sentry/templates/deployment-sentry-ingest-consumer-attachments.yaml b/sentry/templates/deployment-sentry-ingest-consumer-attachments.yaml index aec7bf2cd..c6cfd6902 100644 --- a/sentry/templates/deployment-sentry-ingest-consumer-attachments.yaml +++ b/sentry/templates/deployment-sentry-ingest-consumer-attachments.yaml @@ -109,6 +109,10 @@ spec: {{- end }} resources: {{ toYaml .Values.sentry.ingestConsumer.resources | indent 12 }} +{{- if .Values.sentry.ingestConsumer.containerSecurityContext }} + securityContext: +{{ toYaml .Values.sentry.ingestConsumer.containerSecurityContext | indent 12 }} +{{- end }} {{- if .Values.sentry.ingestConsumer.sidecars }} {{ toYaml .Values.sentry.ingestConsumer.sidecars | indent 6 }} {{- end }} diff --git a/sentry/templates/deployment-sentry-ingest-consumer-events.yaml b/sentry/templates/deployment-sentry-ingest-consumer-events.yaml index 76be201aa..2d86ad6ac 100644 --- a/sentry/templates/deployment-sentry-ingest-consumer-events.yaml +++ b/sentry/templates/deployment-sentry-ingest-consumer-events.yaml @@ -109,6 +109,10 @@ spec: {{- end }} resources: {{ toYaml .Values.sentry.ingestConsumer.resources | indent 12 }} +{{- if .Values.sentry.ingestConsumer.containerSecurityContext }} + securityContext: +{{ toYaml .Values.sentry.ingestConsumer.containerSecurityContext | indent 12 }} +{{- end }} {{- if .Values.sentry.ingestConsumer.sidecars }} {{ toYaml .Values.sentry.ingestConsumer.sidecars | indent 6 }} {{- end }} diff --git a/sentry/templates/deployment-sentry-ingest-consumer-transactions.yaml b/sentry/templates/deployment-sentry-ingest-consumer-transactions.yaml index d7d3ba34c..54e453b6f 100644 --- a/sentry/templates/deployment-sentry-ingest-consumer-transactions.yaml +++ b/sentry/templates/deployment-sentry-ingest-consumer-transactions.yaml @@ -109,6 +109,10 @@ spec: {{- end }} resources: {{ toYaml .Values.sentry.ingestConsumer.resources | indent 12 }} +{{- if .Values.sentry.ingestConsumer.containerSecurityContext }} + securityContext: +{{ toYaml .Values.sentry.ingestConsumer.containerSecurityContext | indent 12 }} +{{- end }} {{- if .Values.sentry.ingestConsumer.sidecars }} {{ toYaml .Values.sentry.ingestConsumer.sidecars | indent 6 }} {{- end }} diff --git a/sentry/templates/deployment-sentry-ingest-metrics-consumer-perf.yaml b/sentry/templates/deployment-sentry-ingest-metrics-consumer-perf.yaml index dda72e62d..53cab388d 100644 --- a/sentry/templates/deployment-sentry-ingest-metrics-consumer-perf.yaml +++ b/sentry/templates/deployment-sentry-ingest-metrics-consumer-perf.yaml @@ -106,6 +106,10 @@ spec: {{- end }} resources: {{ toYaml .Values.sentry.ingestMetricsConsumerPerf.resources | indent 12 }} +{{- if .Values.sentry.ingestMetricsConsumerPerf.containerSecurityContext }} + securityContext: +{{ toYaml .Values.sentry.ingestMetricsConsumerPerf.containerSecurityContext | indent 12 }} +{{- end }} {{- if .Values.sentry.ingestMetricsConsumerPerf.sidecars }} {{ toYaml .Values.sentry.ingestMetricsConsumerPerf.sidecars | indent 6 }} {{- end }} diff --git a/sentry/templates/deployment-sentry-ingest-metrics-consumer-rh.yaml b/sentry/templates/deployment-sentry-ingest-metrics-consumer-rh.yaml index e67b57c6d..d29616621 100644 --- a/sentry/templates/deployment-sentry-ingest-metrics-consumer-rh.yaml +++ b/sentry/templates/deployment-sentry-ingest-metrics-consumer-rh.yaml @@ -106,6 +106,10 @@ spec: {{- end }} resources: {{ toYaml .Values.sentry.ingestMetricsConsumerRh.resources | indent 12 }} +{{- if .Values.sentry.ingestMetricsConsumerRh.containerSecurityContext }} + securityContext: +{{ toYaml .Values.sentry.ingestMetricsConsumerRh.containerSecurityContext | indent 12 }} +{{- end }} {{- if .Values.sentry.ingestMetricsConsumerRh.sidecars }} {{ toYaml .Values.sentry.ingestMetricsConsumerRh.sidecars | indent 6 }} {{- end }} diff --git a/sentry/templates/deployment-sentry-ingest-monitors.yaml b/sentry/templates/deployment-sentry-ingest-monitors.yaml index 9ae5bb798..57b1abe69 100644 --- a/sentry/templates/deployment-sentry-ingest-monitors.yaml +++ b/sentry/templates/deployment-sentry-ingest-monitors.yaml @@ -100,6 +100,10 @@ spec: {{- end }} resources: {{ toYaml .Values.sentry.ingestMonitors.resources | indent 12 }} +{{- if .Values.sentry.ingestMonitors.containerSecurityContext }} + securityContext: +{{ toYaml .Values.sentry.ingestMonitors.containerSecurityContext | indent 12 }} +{{- end }} {{- if .Values.sentry.ingestMonitors.sidecars }} {{ toYaml .Values.sentry.ingestMonitors.sidecars | indent 6 }} {{- end }} diff --git a/sentry/templates/deployment-sentry-ingest-replay-recordings.yaml b/sentry/templates/deployment-sentry-ingest-replay-recordings.yaml index b65edc675..91eaa18c1 100644 --- a/sentry/templates/deployment-sentry-ingest-replay-recordings.yaml +++ b/sentry/templates/deployment-sentry-ingest-replay-recordings.yaml @@ -100,6 +100,10 @@ spec: {{- end }} resources: {{ toYaml .Values.sentry.ingestReplayRecordings.resources | indent 12 }} +{{- if .Values.sentry.ingestReplayRecordings.containerSecurityContext }} + securityContext: +{{ toYaml .Values.sentry.ingestReplayRecordings.containerSecurityContext | indent 12 }} +{{- end }} {{- if .Values.sentry.ingestReplayRecordings.sidecars }} {{ toYaml .Values.sentry.ingestReplayRecordings.sidecars | indent 6 }} {{- end }} diff --git a/sentry/templates/deployment-sentry-post-process-forwarder-errors.yaml b/sentry/templates/deployment-sentry-post-process-forwarder-errors.yaml index 38e88a125..1b7f67a6e 100644 --- a/sentry/templates/deployment-sentry-post-process-forwarder-errors.yaml +++ b/sentry/templates/deployment-sentry-post-process-forwarder-errors.yaml @@ -98,6 +98,10 @@ spec: {{- end }} resources: {{ toYaml .Values.sentry.postProcessForwardErrors.resources | indent 12 }} +{{- if .Values.sentry.postProcessForwardErrors.containerSecurityContext }} + securityContext: +{{ toYaml .Values.sentry.postProcessForwardErrors.containerSecurityContext | indent 12 }} +{{- end }} {{- if .Values.sentry.postProcessForwardErrors.sidecars }} {{ toYaml .Values.sentry.postProcessForwardErrors.sidecars | indent 6 }} {{- end }} diff --git a/sentry/templates/deployment-sentry-post-process-forwarder-transactions.yaml b/sentry/templates/deployment-sentry-post-process-forwarder-transactions.yaml index d7350f9de..4745b7e59 100644 --- a/sentry/templates/deployment-sentry-post-process-forwarder-transactions.yaml +++ b/sentry/templates/deployment-sentry-post-process-forwarder-transactions.yaml @@ -101,6 +101,10 @@ spec: {{- end }} resources: {{ toYaml .Values.sentry.postProcessForwardTransactions.resources | indent 12 }} +{{- if .Values.sentry.postProcessForwardTransactions.containerSecurityContext }} + securityContext: +{{ toYaml .Values.sentry.postProcessForwardTransactions.containerSecurityContext | indent 12 }} +{{- end }} {{- if .Values.sentry.postProcessForwardTransactions.sidecars }} {{ toYaml .Values.sentry.postProcessForwardTransactions.sidecars | indent 6 }} {{- end }} diff --git a/sentry/templates/deployment-sentry-subscription-consumer-events.yaml b/sentry/templates/deployment-sentry-subscription-consumer-events.yaml index 3f3eca3d3..6153ed82b 100644 --- a/sentry/templates/deployment-sentry-subscription-consumer-events.yaml +++ b/sentry/templates/deployment-sentry-subscription-consumer-events.yaml @@ -91,6 +91,10 @@ spec: {{- end }} resources: {{ toYaml .Values.sentry.subscriptionConsumerEvents.resources | indent 12 }} +{{- if .Values.sentry.subscriptionConsumerEvents.containerSecurityContext }} + securityContext: +{{ toYaml .Values.sentry.subscriptionConsumerEvents.containerSecurityContext | indent 12 }} +{{- end }} {{- if .Values.sentry.subscriptionConsumerEvents.sidecars }} {{ toYaml .Values.sentry.subscriptionConsumerEvents.sidecars | indent 6 }} {{- end }} diff --git a/sentry/templates/deployment-sentry-subscription-consumer-transactions.yaml b/sentry/templates/deployment-sentry-subscription-consumer-transactions.yaml index 2d10eec49..4f21eefc2 100644 --- a/sentry/templates/deployment-sentry-subscription-consumer-transactions.yaml +++ b/sentry/templates/deployment-sentry-subscription-consumer-transactions.yaml @@ -91,6 +91,10 @@ spec: {{- end }} resources: {{ toYaml .Values.sentry.subscriptionConsumerTransactions.resources | indent 12 }} +{{- if .Values.sentry.subscriptionConsumerTransactions.containerSecurityContext }} + securityContext: +{{ toYaml .Values.sentry.subscriptionConsumerTransactions.containerSecurityContext | indent 12 }} +{{- end }} {{- if .Values.sentry.subscriptionConsumerTransactions.sidecars }} {{ toYaml .Values.sentry.subscriptionConsumerTransactions.sidecars | indent 6 }} {{- end }} diff --git a/sentry/templates/deployment-sentry-web.yaml b/sentry/templates/deployment-sentry-web.yaml index 5b656876e..01739d344 100644 --- a/sentry/templates/deployment-sentry-web.yaml +++ b/sentry/templates/deployment-sentry-web.yaml @@ -122,6 +122,10 @@ spec: timeoutSeconds: {{ .Values.sentry.web.probeTimeoutSeconds }} resources: {{ toYaml .Values.sentry.web.resources | indent 12 }} +{{- if .Values.sentry.web.containerSecurityContext }} + securityContext: +{{ toYaml .Values.sentry.web.containerSecurityContext | indent 12 }} +{{- end }} {{- if .Values.sentry.web.sidecars }} {{ toYaml .Values.sentry.web.sidecars | indent 6 }} {{- end }} diff --git a/sentry/templates/deployment-sentry-worker.yaml b/sentry/templates/deployment-sentry-worker.yaml index ec7d027f6..6a0278a48 100644 --- a/sentry/templates/deployment-sentry-worker.yaml +++ b/sentry/templates/deployment-sentry-worker.yaml @@ -112,6 +112,10 @@ spec: {{- end }} resources: {{ toYaml .Values.sentry.worker.resources | indent 12 }} +{{- if .Values.sentry.worker.containerSecurityContext }} + securityContext: +{{ toYaml .Values.sentry.worker.containerSecurityContext | indent 12 }} +{{- end }} {{- if .Values.sentry.worker.sidecars }} {{ toYaml .Values.sentry.worker.sidecars | indent 6 }} {{- end }} diff --git a/sentry/templates/deployment-snuba-api.yaml b/sentry/templates/deployment-snuba-api.yaml index 7655e199a..c56de3429 100644 --- a/sentry/templates/deployment-snuba-api.yaml +++ b/sentry/templates/deployment-snuba-api.yaml @@ -107,6 +107,10 @@ spec: timeoutSeconds: {{ .Values.snuba.api.readiness.timeoutSeconds }} resources: {{ toYaml .Values.snuba.api.resources | indent 12 }} +{{- if .Values.snuba.api.containerSecurityContext }} + securityContext: +{{ toYaml .Values.snuba.api.containerSecurityContext | indent 12 }} +{{- end }} {{- if .Values.snuba.api.sidecars }} {{ toYaml .Values.snuba.api.sidecars | indent 6 }} {{- end }} diff --git a/sentry/templates/deployment-snuba-consumer.yaml b/sentry/templates/deployment-snuba-consumer.yaml index 741ce5d8a..710127158 100644 --- a/sentry/templates/deployment-snuba-consumer.yaml +++ b/sentry/templates/deployment-snuba-consumer.yaml @@ -130,6 +130,10 @@ spec: {{- end }} resources: {{ toYaml .Values.snuba.consumer.resources | indent 12 }} +{{- if .Values.snuba.consumer.containerSecurityContext }} + securityContext: +{{ toYaml .Values.snuba.consumer.containerSecurityContext | indent 12 }} +{{- end }} {{- if .Values.serviceAccount.enabled }} serviceAccountName: {{ .Values.serviceAccount.name }}-snuba {{- end }} diff --git a/sentry/templates/deployment-snuba-outcomes-consumer.yaml b/sentry/templates/deployment-snuba-outcomes-consumer.yaml index 4ad919808..e42a9a4b1 100644 --- a/sentry/templates/deployment-snuba-outcomes-consumer.yaml +++ b/sentry/templates/deployment-snuba-outcomes-consumer.yaml @@ -126,6 +126,10 @@ spec: {{- end }} resources: {{ toYaml .Values.snuba.outcomesConsumer.resources | indent 12 }} +{{- if .Values.snuba.outcomesConsumer.containerSecurityContext }} + securityContext: +{{ toYaml .Values.snuba.outcomesConsumer.containerSecurityContext | indent 12 }} +{{- end }} {{- if .Values.serviceAccount.enabled }} serviceAccountName: {{ .Values.serviceAccount.name }}-snuba {{- end }} diff --git a/sentry/templates/deployment-snuba-replacer.yaml b/sentry/templates/deployment-snuba-replacer.yaml index 7b451d095..9ed59c716 100644 --- a/sentry/templates/deployment-snuba-replacer.yaml +++ b/sentry/templates/deployment-snuba-replacer.yaml @@ -109,6 +109,10 @@ spec: {{- end }} resources: {{ toYaml .Values.snuba.replacer.resources | indent 12 }} +{{- if .Values.snuba.replacer.containerSecurityContext }} + securityContext: +{{ toYaml .Values.snuba.replacer.containerSecurityContext | indent 12 }} +{{- end }} {{- if .Values.serviceAccount.enabled }} serviceAccountName: {{ .Values.serviceAccount.name }}-snuba {{- end }} diff --git a/sentry/templates/deployment-snuba-replays-consumer.yaml b/sentry/templates/deployment-snuba-replays-consumer.yaml index a6308f3ad..3242e211f 100644 --- a/sentry/templates/deployment-snuba-replays-consumer.yaml +++ b/sentry/templates/deployment-snuba-replays-consumer.yaml @@ -132,6 +132,10 @@ spec: {{- end }} resources: {{ toYaml .Values.snuba.replaysConsumer.resources | indent 12 }} +{{- if .Values.snuba.replaysConsumer.containerSecurityContext }} + securityContext: +{{ toYaml .Values.snuba.replaysConsumer.containerSecurityContext | indent 12 }} +{{- end }} {{- if .Values.serviceAccount.enabled }} serviceAccountName: {{ .Values.serviceAccount.name }}-snuba {{- end }} diff --git a/sentry/templates/deployment-snuba-sessions-consumer.yaml b/sentry/templates/deployment-snuba-sessions-consumer.yaml index e2a9b5833..9765d4ae9 100644 --- a/sentry/templates/deployment-snuba-sessions-consumer.yaml +++ b/sentry/templates/deployment-snuba-sessions-consumer.yaml @@ -130,6 +130,10 @@ spec: {{- end }} resources: {{ toYaml .Values.snuba.sessionsConsumer.resources | indent 12 }} +{{- if .Values.snuba.sessionsConsumer.containerSecurityContext }} + securityContext: +{{ toYaml .Values.snuba.sessionsConsumer.containerSecurityContext | indent 12 }} +{{- end }} {{- if .Values.serviceAccount.enabled }} serviceAccountName: {{ .Values.serviceAccount.name }}-snuba {{- end }} diff --git a/sentry/templates/deployment-snuba-subscription-consumer-events.yaml b/sentry/templates/deployment-snuba-subscription-consumer-events.yaml index 494eabece..4a2a3badb 100644 --- a/sentry/templates/deployment-snuba-subscription-consumer-events.yaml +++ b/sentry/templates/deployment-snuba-subscription-consumer-events.yaml @@ -97,6 +97,10 @@ spec: {{- end }} resources: {{ toYaml .Values.snuba.subscriptionConsumerEvents.resources | indent 12 }} +{{- if .Values.snuba.subscriptionConsumerEvents.containerSecurityContext }} + securityContext: +{{ toYaml .Values.snuba.subscriptionConsumerEvents.containerSecurityContext | indent 12 }} +{{- end }} {{- if .Values.serviceAccount.enabled }} serviceAccountName: {{ .Values.serviceAccount.name }}-snuba {{- end }} diff --git a/sentry/templates/deployment-snuba-subscription-consumer-sessions.yaml b/sentry/templates/deployment-snuba-subscription-consumer-sessions.yaml index 3aa6f83cc..112e2f4f3 100644 --- a/sentry/templates/deployment-snuba-subscription-consumer-sessions.yaml +++ b/sentry/templates/deployment-snuba-subscription-consumer-sessions.yaml @@ -97,6 +97,10 @@ spec: {{- end }} resources: {{ toYaml .Values.snuba.subscriptionConsumerSessions.resources | indent 12 }} +{{- if .Values.snuba.subscriptionConsumerSessions.containerSecurityContext }} + securityContext: +{{ toYaml .Values.snuba.subscriptionConsumerSessions.containerSecurityContext | indent 12 }} +{{- end }} {{- if .Values.serviceAccount.enabled }} serviceAccountName: {{ .Values.serviceAccount.name }}-snuba {{- end }} diff --git a/sentry/templates/deployment-snuba-subscription-consumer-transactions.yaml b/sentry/templates/deployment-snuba-subscription-consumer-transactions.yaml index 828da0a03..b3a04c92c 100644 --- a/sentry/templates/deployment-snuba-subscription-consumer-transactions.yaml +++ b/sentry/templates/deployment-snuba-subscription-consumer-transactions.yaml @@ -97,6 +97,10 @@ spec: {{- end }} resources: {{ toYaml .Values.snuba.subscriptionConsumerTransactions.resources | indent 12 }} +{{- if .Values.snuba.subscriptionConsumerTransactions.containerSecurityContext }} + securityContext: +{{ toYaml .Values.snuba.subscriptionConsumerTransactions.containerSecurityContext | indent 12 }} +{{- end }} {{- if .Values.serviceAccount.enabled }} serviceAccountName: {{ .Values.serviceAccount.name }}-snuba {{- end }} diff --git a/sentry/templates/deployment-snuba-transactions-consumer.yaml b/sentry/templates/deployment-snuba-transactions-consumer.yaml index d38e4287e..d87d89bd3 100644 --- a/sentry/templates/deployment-snuba-transactions-consumer.yaml +++ b/sentry/templates/deployment-snuba-transactions-consumer.yaml @@ -132,6 +132,10 @@ spec: {{- end }} resources: {{ toYaml .Values.snuba.transactionsConsumer.resources | indent 12 }} +{{- if .Values.snuba.transactionsConsumer.containerSecurityContext }} + securityContext: +{{ toYaml .Values.snuba.transactionsConsumer.containerSecurityContext | indent 12 }} +{{- end }} {{- if .Values.serviceAccount.enabled }} serviceAccountName: {{ .Values.serviceAccount.name }}-snuba {{- end }} diff --git a/sentry/templates/deployment-symbolicator.yaml b/sentry/templates/deployment-symbolicator.yaml index 74c92a17b..a0ccacb38 100644 --- a/sentry/templates/deployment-symbolicator.yaml +++ b/sentry/templates/deployment-symbolicator.yaml @@ -110,6 +110,10 @@ spec: timeoutSeconds: 2 resources: {{ toYaml .Values.symbolicator.api.resources | indent 12 }} +{{- if .Values.symbolicator.api.containerSecurityContext }} + securityContext: +{{ toYaml .Values.symbolicator.api.containerSecurityContext | indent 12 }} +{{- end }} {{- if .Values.serviceAccount.enabled }} serviceAccountName: {{ .Values.serviceAccount.name }}-symbolicator-api {{- end }} diff --git a/sentry/templates/hooks/sentry-db-check.job.yaml b/sentry/templates/hooks/sentry-db-check.job.yaml index 32da1541a..56773e44d 100644 --- a/sentry/templates/hooks/sentry-db-check.job.yaml +++ b/sentry/templates/hooks/sentry-db-check.job.yaml @@ -59,9 +59,14 @@ spec: imagePullSecrets: {{ toYaml .Values.hooks.dbCheck.image.imagePullSecrets | indent 8 }} {{- end }} + {{- if .Values.hooks.dbCheck.securityContext }} + securityContext: +{{ toYaml .Values.hooks.dbCheck.securityContext | indent 8 }} + {{- else }} {{- if .Values.hooks.securityContext }} securityContext: {{ toYaml .Values.hooks.securityContext | indent 8 }} + {{- end }} {{- end }} containers: - name: db-check @@ -147,6 +152,10 @@ spec: {{- end }} resources: {{ toYaml .Values.hooks.dbCheck.resources | indent 10 }} +{{- if .Values.hooks.dbCheck.containerSecurityContext }} + securityContext: +{{ toYaml .Values.hooks.dbCheck.containerSecurityContext | indent 10 }} +{{- end }} {{- if .Values.hooks.dbCheck.volumes }} volumes: {{ toYaml .Values.hooks.dbCheck.volumes | indent 6 }} diff --git a/sentry/templates/hooks/sentry-db-init.job.yaml b/sentry/templates/hooks/sentry-db-init.job.yaml index aaecae300..4c7eb44ab 100644 --- a/sentry/templates/hooks/sentry-db-init.job.yaml +++ b/sentry/templates/hooks/sentry-db-init.job.yaml @@ -63,9 +63,14 @@ spec: dnsConfig: {{ toYaml .Values.dnsConfig | indent 8 }} {{- end }} + {{- if .Values.hooks.dbInit.securityContext }} + securityContext: +{{ toYaml .Values.hooks.dbInit.securityContext | indent 8 }} + {{- else }} {{- if .Values.hooks.securityContext }} securityContext: {{ toYaml .Values.hooks.securityContext | indent 8 }} + {{- end }} {{- end }} containers: - name: db-init-job @@ -86,6 +91,10 @@ spec: {{- end }} resources: {{ toYaml .Values.hooks.dbInit.resources | indent 10 }} +{{- if .Values.hooks.dbInit.containerSecurityContext }} + securityContext: +{{ toYaml .Values.hooks.dbInit.containerSecurityContext | indent 10 }} +{{- end }} {{- if .Values.hooks.dbInit.sidecars }} {{ toYaml .Values.hooks.dbInit.sidecars | indent 6 }} {{- end }} diff --git a/sentry/templates/hooks/snuba-db-init.job.yaml b/sentry/templates/hooks/snuba-db-init.job.yaml index c4b9d7a48..89da9cd97 100644 --- a/sentry/templates/hooks/snuba-db-init.job.yaml +++ b/sentry/templates/hooks/snuba-db-init.job.yaml @@ -65,9 +65,14 @@ spec: dnsConfig: {{ toYaml .Values.dnsConfig | indent 8 }} {{- end }} + {{- if .Values.hooks.snubaInit.securityContext }} + securityContext: +{{ toYaml .Values.hooks.snubaInit.securityContext | indent 8 }} + {{- else }} {{- if .Values.hooks.securityContext }} securityContext: {{ toYaml .Values.hooks.securityContext | indent 8 }} + {{- end }} {{- end }} containers: - name: snuba-init @@ -92,6 +97,10 @@ spec: {{- end }} resources: {{ toYaml .Values.hooks.snubaInit.resources | indent 10 }} +{{- if .Values.hooks.snubaInit.containerSecurityContext }} + securityContext: +{{ toYaml .Values.hooks.snubaInit.containerSecurityContext | indent 10 }} +{{- end }} volumes: - name: config configMap: diff --git a/sentry/templates/hooks/snuba-migrate.job.yaml b/sentry/templates/hooks/snuba-migrate.job.yaml index a43c63683..9299d3cd6 100644 --- a/sentry/templates/hooks/snuba-migrate.job.yaml +++ b/sentry/templates/hooks/snuba-migrate.job.yaml @@ -65,9 +65,14 @@ spec: dnsConfig: {{ toYaml .Values.dnsConfig | indent 8 }} {{- end }} + {{- if .Values.hooks.snubaMigrate.securityContext }} + securityContext: +{{ toYaml .Values.hooks.snubaMigrate.securityContext | indent 8 }} + {{- else }} {{- if .Values.hooks.securityContext }} securityContext: {{ toYaml .Values.hooks.securityContext | indent 8 }} + {{- end }} {{- end }} containers: - name: snuba-migrate @@ -92,6 +97,10 @@ spec: {{- end }} resources: {{ toYaml .Values.hooks.snubaInit.resources | indent 10 }} +{{- if .Values.hooks.snubaMigrate.containerSecurityContext }} + securityContext: +{{ toYaml .Values.hooks.snubaMigrate.containerSecurityContext | indent 10 }} +{{- end }} volumes: - name: config configMap: diff --git a/sentry/templates/hooks/user-create.yaml b/sentry/templates/hooks/user-create.yaml index b19fbab24..fda1247f9 100644 --- a/sentry/templates/hooks/user-create.yaml +++ b/sentry/templates/hooks/user-create.yaml @@ -58,9 +58,14 @@ spec: dnsConfig: {{ toYaml .Values.dnsConfig | indent 8 }} {{- end }} + {{- if .Values.hooks.dbInit.securityContext }} + securityContext: +{{ toYaml .Values.hooks.dbInit.securityContext | indent 8 }} + {{- else }} {{- if .Values.hooks.securityContext }} securityContext: {{ toYaml .Values.hooks.securityContext | indent 8 }} + {{- end }} {{- end }} containers: - name: user-create-job @@ -105,6 +110,10 @@ spec: {{- end }} resources: {{ toYaml .Values.hooks.dbInit.resources | indent 10 }} +{{- if .Values.hooks.dbInit.containerSecurityContext }} + securityContext: +{{ toYaml .Values.hooks.dbInit.containerSecurityContext | indent 10 }} +{{- end }} volumes: - name: config configMap: diff --git a/sentry/values.yaml b/sentry/values.yaml index 4d02febd8..5ee4b5b52 100644 --- a/sentry/values.yaml +++ b/sentry/values.yaml @@ -63,6 +63,7 @@ relay: affinity: {} nodeSelector: {} securityContext: {} + containerSecurityContext: {} service: annotations: {} # tolerations: [] @@ -107,6 +108,7 @@ sentry: affinity: {} nodeSelector: {} securityContext: {} + containerSecurityContext: {} service: annotations: {} # tolerations: [] @@ -163,6 +165,7 @@ sentry: affinity: {} nodeSelector: {} securityContext: {} + containerSecurityContext: {} # tolerations: [] # podLabels: [] # maxBatchSize: "" @@ -189,6 +192,7 @@ sentry: affinity: {} nodeSelector: {} securityContext: {} + containerSecurityContext: {} # tolerations: [] # podLabels: [] # maxBatchSize: "" @@ -215,6 +219,7 @@ sentry: affinity: {} nodeSelector: {} securityContext: {} + containerSecurityContext: {} # tolerations: [] # podLabels: [] # maxBatchSize: "" @@ -240,6 +245,7 @@ sentry: affinity: {} nodeSelector: {} securityContext: {} + containerSecurityContext: {} # tolerations: [] # podLabels: [] @@ -264,6 +270,7 @@ sentry: affinity: {} nodeSelector: {} securityContext: {} + containerSecurityContext: {} # tolerations: [] # podLabels: [] @@ -289,6 +296,7 @@ sentry: affinity: {} nodeSelector: {} securityContext: {} + containerSecurityContext: {} # tolerations: [] # podLabels: [] # maxBatchSize: "" @@ -326,6 +334,7 @@ sentry: affinity: {} nodeSelector: {} securityContext: {} + containerSecurityContext: {} # tolerations: [] # podLabels: [] sidecars: [] @@ -340,6 +349,7 @@ sentry: affinity: {} nodeSelector: {} securityContext: {} + containerSecurityContext: {} # tolerations: [] # podLabels: [] sidecars: [] @@ -354,6 +364,7 @@ sentry: affinity: {} nodeSelector: {} securityContext: {} + containerSecurityContext: {} # tolerations: [] # podLabels: [] sidecars: [] @@ -368,6 +379,7 @@ sentry: affinity: {} nodeSelector: {} securityContext: {} + containerSecurityContext: {} # tolerations: [] # podLabels: [] sidecars: [] @@ -381,6 +393,7 @@ sentry: affinity: {} nodeSelector: {} securityContext: {} + containerSecurityContext: {} # tolerations: [] # podLabels: [] sidecars: [] @@ -397,6 +410,7 @@ sentry: schedule: "0 0 * * *" days: 90 # securityContext: {} + # containerSecurityContext: {} sidecars: [] volumes: [] # volumeMounts: [] @@ -420,6 +434,7 @@ snuba: affinity: {} nodeSelector: {} securityContext: {} + containerSecurityContext: {} service: annotations: {} # tolerations: [] @@ -441,6 +456,7 @@ snuba: affinity: {} nodeSelector: {} securityContext: {} + containerSecurityContext: {} # tolerations: [] # podLabels: [] autoOffsetReset: "earliest" @@ -468,6 +484,7 @@ snuba: affinity: {} nodeSelector: {} securityContext: {} + containerSecurityContext: {} # tolerations: [] # podLabels: [] autoOffsetReset: "earliest" @@ -495,6 +512,7 @@ snuba: affinity: {} nodeSelector: {} securityContext: {} + containerSecurityContext: {} # tolerations: [] # podLabels: [] autoOffsetReset: "earliest" @@ -511,6 +529,7 @@ snuba: affinity: {} nodeSelector: {} securityContext: {} + containerSecurityContext: {} # tolerations: [] # podLabels: [] autoOffsetReset: "earliest" @@ -524,6 +543,7 @@ snuba: affinity: {} nodeSelector: {} securityContext: {} + containerSecurityContext: {} # tolerations: [] # podLabels: [] autoOffsetReset: "earliest" @@ -537,6 +557,7 @@ snuba: affinity: {} nodeSelector: {} securityContext: {} + containerSecurityContext: {} # tolerations: [] # podLabels: [] # commitBatchSize: 1 @@ -553,6 +574,7 @@ snuba: affinity: {} nodeSelector: {} securityContext: {} + containerSecurityContext: {} # tolerations: [] # podLabels: [] autoOffsetReset: "earliest" @@ -580,6 +602,7 @@ snuba: affinity: {} nodeSelector: {} securityContext: {} + containerSecurityContext: {} # tolerations: [] # podLabels: [] autoOffsetReset: "earliest" @@ -607,6 +630,7 @@ snuba: affinity: {} nodeSelector: {} securityContext: {} + containerSecurityContext: {} # tolerations: [] # podLabels: [] autoOffsetReset: "earliest" @@ -656,6 +680,7 @@ hooks: affinity: {} nodeSelector: {} securityContext: {} + containerSecurityContext: {} # tolerations: [] # volumes: [] # volumeMounts: [] @@ -729,6 +754,7 @@ symbolicator: affinity: {} nodeSelector: {} securityContext: {} + containerSecurityContext: {} # tolerations: [] # podLabels: [] # priorityClassName: "xxx" @@ -1221,6 +1247,7 @@ metrics: tolerations: [] affinity: {} securityContext: {} + containerSecurityContext: {} # schedulerName: # Optional extra labels for pod, i.e. redis-client: "true" # podLabels: [] From 9aa6622fcc6dbbc2c5023b42d878abba8cadaeeb Mon Sep 17 00:00:00 2001 From: pschwager Date: Tue, 18 Jul 2023 12:32:13 +0200 Subject: [PATCH 059/394] Upgrade clickhouse (#931) Co-authored-by: Patrick Schwager --- clickhouse/Chart.yaml | 2 +- clickhouse/templates/configmap-config.yaml | 46 +++++++++++++++++++++- sentry/Chart.yaml | 2 +- sentry/values.yaml | 4 +- 4 files changed, 50 insertions(+), 4 deletions(-) diff --git a/clickhouse/Chart.yaml b/clickhouse/Chart.yaml index 907dd72f7..a360c86c9 100755 --- a/clickhouse/Chart.yaml +++ b/clickhouse/Chart.yaml @@ -11,6 +11,6 @@ keywords: name: clickhouse sources: - https://github.com/sentry-kubernetes/charts -version: 3.3.0 +version: 3.4.0 maintainers: - name: sentry-kubernetes diff --git a/clickhouse/templates/configmap-config.yaml b/clickhouse/templates/configmap-config.yaml index 3b406689e..15c136499 100755 --- a/clickhouse/templates/configmap-config.yaml +++ b/clickhouse/templates/configmap-config.yaml @@ -33,7 +33,51 @@ data: {{ .Values.timezone | default "Asia/Shanghai" }} {{ .Values.clickhouse.configmap.umask | default "027" }} {{ .Values.clickhouse.configmap.mlock_executable | default "false" }} - + {{- if .Values.clickhouse.configmap.remote_servers.enabled }} + + <{{ include "clickhouse.fullname" . }}> + {{- range untilStep 0 (int .Values.clickhouse.replicas) 1 }} + + + {{ $.Values.clickhouse.configmap.remote_servers.internal_replication | default "false" }} + {{ include "clickhouse.fullname" $ }}-{{ . }}.{{ include "clickhouse.fullname" $ }}-headless.{{ $.Release.Namespace }}.svc.{{ $.Values.clusterDomain }} + {{ $.Values.clickhouse.tcp_port}} + {{- if $.Values.clickhouse.configmap.remote_servers.replica.user }} + {{ $.Values.clickhouse.configmap.remote_servers.replica.user }} + {{- end }} + {{- if $.Values.clickhouse.configmap.remote_servers.replica.password }} + {{ $.Values.clickhouse.configmap.remote_servers.replica.password }} + {{- end }} + {{- if $.Values.clickhouse.configmap.remote_servers.replica.secure }} + {{ $.Values.clickhouse.configmap.remote_servers.replica.secure }} + {{- end }} + {{- if $.Values.clickhouse.configmap.remote_servers.replica.compression }} + {{ $.Values.clickhouse.configmap.remote_servers.replica.compression }} + {{- end }} + + {{- if $.Values.clickhouse.configmap.remote_servers.replica.backup.enabled }} + + {{ include "clickhouse.fullname" $ }}-replica-{{ . }}.{{ include "clickhouse.fullname" $ }}-replica-headless.{{ $.Release.Namespace }}.svc.{{ $.Values.clusterDomain }} + {{ $.Values.clickhouse.tcp_port}} + {{- if $.Values.clickhouse.configmap.remote_servers.replica.user }} + {{ $.Values.clickhouse.configmap.remote_servers.replica.user }} + {{- end }} + {{- if $.Values.clickhouse.configmap.remote_servers.replica.password }} + {{ $.Values.clickhouse.configmap.remote_servers.replica.password }} + {{- end }} + {{- if $.Values.clickhouse.configmap.remote_servers.replica.secure }} + {{ $.Values.clickhouse.configmap.remote_servers.replica.secure }} + {{- end }} + {{- if $.Values.clickhouse.configmap.remote_servers.replica.compression }} + {{ $.Values.clickhouse.configmap.remote_servers.replica.compression }} + {{- end }} + + {{- end }} + + {{- end }} + + + {{- end }} {{ .Values.clickhouse.configmap.builtin_dictionaries_reload_interval | default "3600" }} diff --git a/sentry/Chart.yaml b/sentry/Chart.yaml index b1175ec3f..775e1b961 100644 --- a/sentry/Chart.yaml +++ b/sentry/Chart.yaml @@ -2,7 +2,7 @@ apiVersion: v2 name: sentry description: A Helm chart for Kubernetes type: application -version: 19.4.0 +version: 19.5.0 appVersion: 23.6.1 dependencies: - name: memcached diff --git a/sentry/values.yaml b/sentry/values.yaml index 5ee4b5b52..46dcaa021 100644 --- a/sentry/values.yaml +++ b/sentry/values.yaml @@ -956,7 +956,7 @@ config: clickhouse: enabled: true clickhouse: - imageVersion: "20.12.8.5" + imageVersion: "21.8.13.6" configmap: remote_servers: internal_replication: true @@ -1045,6 +1045,8 @@ kafka: - name: ingest-transactions - name: ingest-events - name: ingest-replay-recordings + - name: ingest-metrics + - name: ingest-performance-metrics - name: profiles service: From b12bb769be9ec140c9649b0bd38121f374197dc2 Mon Sep 17 00:00:00 2001 From: pschwager Date: Wed, 19 Jul 2023 08:49:25 +0200 Subject: [PATCH 060/394] Drop useless clickhouse init container (#930) Co-authored-by: Patrick Schwager --- clickhouse/Chart.yaml | 2 +- .../templates/statefulset-clickhouse-replica.yaml | 13 ------------- clickhouse/templates/statefulset-clickhouse.yaml | 13 ------------- clickhouse/values.yaml | 8 -------- 4 files changed, 1 insertion(+), 35 deletions(-) diff --git a/clickhouse/Chart.yaml b/clickhouse/Chart.yaml index a360c86c9..79e5d6b33 100755 --- a/clickhouse/Chart.yaml +++ b/clickhouse/Chart.yaml @@ -11,6 +11,6 @@ keywords: name: clickhouse sources: - https://github.com/sentry-kubernetes/charts -version: 3.4.0 +version: 3.5.0 maintainers: - name: sentry-kubernetes diff --git a/clickhouse/templates/statefulset-clickhouse-replica.yaml b/clickhouse/templates/statefulset-clickhouse-replica.yaml index 2a7a7fc7c..acfc836bd 100755 --- a/clickhouse/templates/statefulset-clickhouse-replica.yaml +++ b/clickhouse/templates/statefulset-clickhouse-replica.yaml @@ -65,19 +65,6 @@ spec: - name: {{ . | quote }} {{- end }} {{- end }} - initContainers: - - name: init - image: {{ .Values.clickhouse.init.image }}:{{ .Values.clickhouse.init.imageVersion }} - imagePullPolicy: {{ .Values.clickhouse.init.imagePullPolicy }} - args: - - /bin/sh - - -c - - | - mkdir -p /etc/clickhouse-server/metrica.d - {{- if .Values.clickhouse.init.resources }} - resources: -{{ toYaml .Values.clickhouse.init.resources | indent 10 }} - {{- end }} containers: - name: {{ include "clickhouse.fullname" . }}-replica image: {{ .Values.clickhouse.image }}:{{ .Values.clickhouse.imageVersion }} diff --git a/clickhouse/templates/statefulset-clickhouse.yaml b/clickhouse/templates/statefulset-clickhouse.yaml index 3e84b8884..54f441fdb 100755 --- a/clickhouse/templates/statefulset-clickhouse.yaml +++ b/clickhouse/templates/statefulset-clickhouse.yaml @@ -64,19 +64,6 @@ spec: - name: {{ . | quote }} {{- end }} {{- end }} - initContainers: - - name: init - image: {{ .Values.clickhouse.init.image }}:{{ .Values.clickhouse.init.imageVersion }} - imagePullPolicy: {{ .Values.clickhouse.init.imagePullPolicy }} - args: - - /bin/sh - - -c - - | - mkdir -p /etc/clickhouse-server/metrica.d - {{- if .Values.clickhouse.init.resources }} - resources: -{{ toYaml .Values.clickhouse.init.resources | indent 10 }} - {{- end }} containers: - name: {{ include "clickhouse.fullname" . }} image: {{ .Values.clickhouse.image }}:{{ .Values.clickhouse.imageVersion }} diff --git a/clickhouse/values.yaml b/clickhouse/values.yaml index 4f9f8355f..6a9092175 100755 --- a/clickhouse/values.yaml +++ b/clickhouse/values.yaml @@ -137,14 +137,6 @@ clickhouse: ## The resource limits and requests used by clickhouse resources: {} - init: - image: "busybox" - imageVersion: "1.31.0" - imagePullPolicy: "IfNotPresent" - # imagePullSecrets: - ## Periodic probe of container liveness. Container will be restarted if the probe fails. Cannot be updated. - ## More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes - resources: {} livenessProbe: enabled: true initialDelaySeconds: "30" From 38ba55ea2c7e02b4fbf6c7e817b74a67b667281a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Gonz=C3=A1lez?= Date: Wed, 19 Jul 2023 08:50:08 +0200 Subject: [PATCH 061/394] Set Helm chart version of Clickhouse to 3.4.0 (#934) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Christian González --- sentry/Chart.lock | 6 +++--- sentry/Chart.yaml | 4 ++-- sentry/charts/clickhouse-3.3.0.tgz | Bin 13058 -> 0 bytes sentry/charts/clickhouse-3.4.0.tgz | Bin 0 -> 13114 bytes 4 files changed, 5 insertions(+), 5 deletions(-) delete mode 100644 sentry/charts/clickhouse-3.3.0.tgz create mode 100644 sentry/charts/clickhouse-3.4.0.tgz diff --git a/sentry/Chart.lock b/sentry/Chart.lock index 4af6f322c..f79db809d 100644 --- a/sentry/Chart.lock +++ b/sentry/Chart.lock @@ -10,7 +10,7 @@ dependencies: version: 16.3.2 - name: clickhouse repository: https://sentry-kubernetes.github.io/charts - version: 3.3.0 + version: 3.4.0 - name: zookeeper repository: https://raw.githubusercontent.com/bitnami/charts/pre-2022/bitnami version: 9.0.0 @@ -23,5 +23,5 @@ dependencies: - name: nginx repository: oci://registry-1.docker.io/bitnamicharts version: 14.2.2 -digest: sha256:54168dcc798193ef587a9e7f63f35fad08c7030853bd79e20effccbcc652ff85 -generated: "2023-05-25T20:54:03.230343+03:00" +digest: sha256:b486ae353591f960def7fe3cec97f5c9d767d8e4db5c4f3cb9af7daf88c97a9a +generated: "2023-07-18T16:39:56.901315+02:00" diff --git a/sentry/Chart.yaml b/sentry/Chart.yaml index 775e1b961..5be900338 100644 --- a/sentry/Chart.yaml +++ b/sentry/Chart.yaml @@ -2,7 +2,7 @@ apiVersion: v2 name: sentry description: A Helm chart for Kubernetes type: application -version: 19.5.0 +version: 19.5.1 appVersion: 23.6.1 dependencies: - name: memcached @@ -19,7 +19,7 @@ dependencies: condition: kafka.enabled - name: clickhouse repository: https://sentry-kubernetes.github.io/charts - version: 3.3.0 + version: 3.4.0 condition: clickhouse.enabled - name: zookeeper repository: https://raw.githubusercontent.com/bitnami/charts/pre-2022/bitnami diff --git a/sentry/charts/clickhouse-3.3.0.tgz b/sentry/charts/clickhouse-3.3.0.tgz deleted file mode 100644 index bf741258b575ab6805568dddd8493ff4dc916cdd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13058 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 Date: Wed, 19 Jul 2023 11:01:46 +0200 Subject: [PATCH 062/394] feat: updated kafka helm chart and supports kafka without zookeeper (#888) --- README.md | 13 +++++++++++++ sentry/Chart.lock | 10 +++++----- sentry/Chart.yaml | 8 ++++---- sentry/charts/clickhouse-3.4.0.tgz | Bin 13114 -> 0 bytes sentry/charts/clickhouse-3.5.0.tgz | Bin 0 -> 13016 bytes sentry/charts/kafka-16.3.2.tgz | Bin 110859 -> 0 bytes sentry/charts/kafka-22.1.3.tgz | Bin 0 -> 113854 bytes 7 files changed, 22 insertions(+), 9 deletions(-) delete mode 100644 sentry/charts/clickhouse-3.4.0.tgz create mode 100644 sentry/charts/clickhouse-3.5.0.tgz delete mode 100644 sentry/charts/kafka-16.3.2.tgz create mode 100644 sentry/charts/kafka-22.1.3.tgz diff --git a/README.md b/README.md index b93987e01..2edde0cf9 100644 --- a/README.md +++ b/README.md @@ -14,6 +14,19 @@ Big thanks to the maintainers of the [deprecated chart](https://github.com/helm/ For now the full list of values is not documented but you can get inspired by the values.yaml specific to each directory. +## Upgrading from 19.x.x version of this Chart to 20.x.x + +Bumped dependencies: +- kafka > 22.1.3 - now supports Kraft. Note that the upgrade is breaking and that you have to start a new kafka from scratch to use it. + +Example: + +``` +kafka: + zookeeper: + enabled: false +``` + ## Upgrading from 18.x.x version of this Chart to 19.x.x diff --git a/sentry/Chart.lock b/sentry/Chart.lock index f79db809d..3091435b6 100644 --- a/sentry/Chart.lock +++ b/sentry/Chart.lock @@ -6,11 +6,11 @@ dependencies: repository: oci://registry-1.docker.io/bitnamicharts version: 17.11.3 - name: kafka - repository: https://raw.githubusercontent.com/bitnami/charts/pre-2022/bitnami - version: 16.3.2 + repository: oci://registry-1.docker.io/bitnamicharts + version: 22.1.3 - name: clickhouse repository: https://sentry-kubernetes.github.io/charts - version: 3.4.0 + version: 3.5.0 - name: zookeeper repository: https://raw.githubusercontent.com/bitnami/charts/pre-2022/bitnami version: 9.0.0 @@ -23,5 +23,5 @@ dependencies: - name: nginx repository: oci://registry-1.docker.io/bitnamicharts version: 14.2.2 -digest: sha256:b486ae353591f960def7fe3cec97f5c9d767d8e4db5c4f3cb9af7daf88c97a9a -generated: "2023-07-18T16:39:56.901315+02:00" +digest: sha256:e5e8a8f0fca2c7298669bb86198f806cd770f8ce77ee41882a50eb40e4bd6672 +generated: "2023-07-19T08:53:14.343715+02:00" diff --git a/sentry/Chart.yaml b/sentry/Chart.yaml index 5be900338..0fb18e80a 100644 --- a/sentry/Chart.yaml +++ b/sentry/Chart.yaml @@ -2,7 +2,7 @@ apiVersion: v2 name: sentry description: A Helm chart for Kubernetes type: application -version: 19.5.1 +version: 20.0.0 appVersion: 23.6.1 dependencies: - name: memcached @@ -14,12 +14,12 @@ dependencies: version: 17.11.3 condition: redis.enabled - name: kafka - repository: https://raw.githubusercontent.com/bitnami/charts/pre-2022/bitnami - version: 16.3.2 + repository: oci://registry-1.docker.io/bitnamicharts + version: 22.1.3 condition: kafka.enabled - name: clickhouse repository: https://sentry-kubernetes.github.io/charts - version: 3.4.0 + version: 3.5.0 condition: clickhouse.enabled - name: zookeeper repository: https://raw.githubusercontent.com/bitnami/charts/pre-2022/bitnami diff --git a/sentry/charts/clickhouse-3.4.0.tgz b/sentry/charts/clickhouse-3.4.0.tgz deleted file mode 100644 index c88acef9ed3d58ad5ef0c7750384a6f366a77789..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13114 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 QeqsUri&swqtb+mmA5n8DW&i*H literal 0 HcmV?d00001 diff --git a/sentry/charts/kafka-16.3.2.tgz b/sentry/charts/kafka-16.3.2.tgz deleted file mode 100644 index c1af0bd17ddcbbe9f05a3c8d3ba084dabd063aa7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 110859 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 Re*gdg|NrnlSn2@63IK}x&65BC diff --git a/sentry/charts/kafka-22.1.3.tgz b/sentry/charts/kafka-22.1.3.tgz new file mode 100644 index 0000000000000000000000000000000000000000..3b3c7c36c4d51c3cce5b7ae677b423125ff60070 GIT binary patch literal 113854 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

sfmLKPD88(JIe>_xpRr`d?cwp6>s8m}mL>zsy@) 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

gkWh4+J{s)*-tJbh{%>!0yZ2=OKg6>J&S1@XC7b z#?#1p{{O5s@CH&$5(bW69x=;}DER|F4FY|6*_V>HOD&JZs=*9EWg4^CEn35#oDn;@Y2*?0)sHXFE$idQkKD4hd=#P3N1=z2vflaHI#BS$Ih1JHLrxu0~_ z4PiJYbUpyY!-H;@qA_MMojZNkC*BpJE+*Zf>|b`zyA=I;BxEE&79Ryj`=5g(;^u1F zOrQrN{6=>_>swbi^ap@D@_76^jI1e&AvdBq<`VA;&xyZa?kEWYnGz{Bw)I!jxwMdg z{VNIr0^SlD__jo1Z4DfUF(rN?b|WlH=xS+?M3l_1j~IZO^g5&mCMbvyW#D>(y$SGO z$SonU3n0!r%uqlg5Ta`}Eg<3cwPcDC8+7zq0j4m7V?0rMtk3dNf>a6E-$bWTW| zF@feSK40-XLIc2rH)H|eBj!;oT%rMZDHspv=7z6_IZ*EY1jOSmkp%$y1gBAe1|Vfu z%QD!yp{w(>rJ$aK&)Lg_tk}OBj&b(<)e=$2vb(1 z1~)DA?5<^+ysKy>es>(F+8$I?xxFz6Kmdm*P%9LSqV}K4DLjqfp9xBh%4{}1e+KD! z2OWj|0)~4#DD={kls7k4ZqR-dWFvN6S4IC&I2)vAinX17c5rd=_VoN^`U1$1-!GI* z2gZ*;5nAMdjq-06kW0^w9I=YumM$l#KKNJMGRSv%h2{%;yfOmDZ97!Qpt5|!n;Stt zYt7tE5M(V#R9^U-qzSw+_Z5|Zot$1CUAXb5IOpWtVc)jbd)S@ZUjG(*w{5SYZOYfX z^DeHKo8uAJNFzc$zH$nt1u!nPBt3!I~nj`dF1U-}<@y&PvI0XE`NXXIKw?B)rNUp(!H#S#qkfFUD;P@S@iUj>zk)Usq zpuZXt^zVTL{UQl;DB*Q9rqJh>icle!1oYjW+q0~9ry)2YGc+9{3i{idV5_&)+mtT! zY)i+6!8K$+xFFm;8sQML3Gy=+e~jZvGITvM6|n;qZ(L(Bj1%UNkrPjlqr$A6O%P8o z15@}1p*p_9T|Jrj$M}Gi0h8{xdlMLr5#y_4fMqO$zt18CO2&kP5EHHx2#pAZu{2_R zJQ^V}Eh7ZugmO^6kHnU!9O|~Tpac{yhsxv?F^#ko6HNe|4-0VfQBk9mvaBiK+{L(pM3 z2SXB1ffP}%kA%E0TR+|PC`2fXG~kY+pUL+yXYm$!jDaqLs@YsaA4B>hVMqG8la1JnI31aQLls3AOBgLr9 zLm{M?a0S72wwfswbTPm731Yl^t+KQ{!f?(fGD9O9h42#!!e$Ol3Jph_Ey6ob47HX} zG(uD>s&`~G!XoG>n)$>_xMw5gY_agnwm!_ZKTPphPH=ZE{il;Kh zd3p>n0kdtzEw33GB>@OcK0W-ti8e>3b{jhNTRt+(*F;S zMDri{GPbRy#-;|SuZSk+zY0-;>zI?5&E zvDgCv495u^BQPd2L_@Kijp!6JxlF>)w*oxHu~LSm;ke(>R_@dD^gKOJ&r;9-4*&rF M|AVgOX8=4402-V&s{jB1 literal 0 HcmV?d00001 From acced4807b7869a2257eaff940884e4fdf6d3df5 Mon Sep 17 00:00:00 2001 From: Anton Donskoy Date: Mon, 31 Jul 2023 16:50:45 +0300 Subject: [PATCH 063/394] Sentry July release (#939) Co-authored-by: Anton Donskoy --- sentry/Chart.yaml | 4 ++-- .../deployment-sentry-ingest-consumer-attachments.yaml | 4 +++- .../deployment-sentry-ingest-consumer-events.yaml | 4 +++- .../deployment-sentry-ingest-consumer-transactions.yaml | 4 +++- .../deployment-sentry-ingest-replay-recordings.yaml | 3 +++ .../deployment-sentry-post-process-forwarder-errors.yaml | 7 +++++-- ...loyment-sentry-post-process-forwarder-transactions.yaml | 7 ++++--- .../deployment-sentry-subscription-consumer-events.yaml | 5 +++-- ...ployment-sentry-subscription-consumer-transactions.yaml | 5 +++-- sentry/templates/deployment-snuba-api.yaml | 4 ++-- 10 files changed, 31 insertions(+), 16 deletions(-) diff --git a/sentry/Chart.yaml b/sentry/Chart.yaml index 0fb18e80a..4fce48a6c 100644 --- a/sentry/Chart.yaml +++ b/sentry/Chart.yaml @@ -2,8 +2,8 @@ apiVersion: v2 name: sentry description: A Helm chart for Kubernetes type: application -version: 20.0.0 -appVersion: 23.6.1 +version: 20.1.0 +appVersion: 23.7.1 dependencies: - name: memcached repository: oci://registry-1.docker.io/bitnamicharts diff --git a/sentry/templates/deployment-sentry-ingest-consumer-attachments.yaml b/sentry/templates/deployment-sentry-ingest-consumer-attachments.yaml index c6cfd6902..65268839f 100644 --- a/sentry/templates/deployment-sentry-ingest-consumer-attachments.yaml +++ b/sentry/templates/deployment-sentry-ingest-consumer-attachments.yaml @@ -77,8 +77,10 @@ spec: command: ["sentry"] args: - "run" + - "consumer" + - "ingest-attachments" + - "--consumer-group" - "ingest-consumer" - - "--consumer-type=attachments" {{- if .Values.sentry.ingestConsumer.concurrency }} - "--concurrency" - "{{ .Values.sentry.ingestConsumer.concurrency }}" diff --git a/sentry/templates/deployment-sentry-ingest-consumer-events.yaml b/sentry/templates/deployment-sentry-ingest-consumer-events.yaml index 2d86ad6ac..92edc534a 100644 --- a/sentry/templates/deployment-sentry-ingest-consumer-events.yaml +++ b/sentry/templates/deployment-sentry-ingest-consumer-events.yaml @@ -77,8 +77,10 @@ spec: command: ["sentry"] args: - "run" + - "consumer" + - "ingest-events" + - "--consumer-group" - "ingest-consumer" - - "--consumer-type=events" {{- if .Values.sentry.ingestConsumer.concurrency }} - "--concurrency" - "{{ .Values.sentry.ingestConsumer.concurrency }}" diff --git a/sentry/templates/deployment-sentry-ingest-consumer-transactions.yaml b/sentry/templates/deployment-sentry-ingest-consumer-transactions.yaml index 54e453b6f..4e9f9edc6 100644 --- a/sentry/templates/deployment-sentry-ingest-consumer-transactions.yaml +++ b/sentry/templates/deployment-sentry-ingest-consumer-transactions.yaml @@ -77,8 +77,10 @@ spec: command: ["sentry"] args: - "run" + - "consumer" + - "ingest-transactions" + - "--consumer-group" - "ingest-consumer" - - "--consumer-type=transactions" {{- if .Values.sentry.ingestConsumer.concurrency }} - "--concurrency" - "{{ .Values.sentry.ingestConsumer.concurrency }}" diff --git a/sentry/templates/deployment-sentry-ingest-replay-recordings.yaml b/sentry/templates/deployment-sentry-ingest-replay-recordings.yaml index 91eaa18c1..8f2caeda7 100644 --- a/sentry/templates/deployment-sentry-ingest-replay-recordings.yaml +++ b/sentry/templates/deployment-sentry-ingest-replay-recordings.yaml @@ -77,6 +77,9 @@ spec: command: ["sentry"] args: - "run" + - "consumer" + - "ingest-replay-recordings" + - "--consumer-group" - "ingest-replay-recordings" env: - name: C_FORCE_ROOT diff --git a/sentry/templates/deployment-sentry-post-process-forwarder-errors.yaml b/sentry/templates/deployment-sentry-post-process-forwarder-errors.yaml index 1b7f67a6e..05dda19ef 100644 --- a/sentry/templates/deployment-sentry-post-process-forwarder-errors.yaml +++ b/sentry/templates/deployment-sentry-post-process-forwarder-errors.yaml @@ -75,9 +75,12 @@ spec: command: ["sentry"] args: - "run" + - "consumer" + - "post-process-forwarder-errors" + - "--consumer-group" - "post-process-forwarder" - - "--entity" - - "errors" + - "--synchronize-commit-log-topic=snuba-commit-log" + - "--synchronize-commit-group=snuba-consumers" env: {{ include "sentry.env" . | indent 8 }} {{- if .Values.sentry.postProcessForwardErrors.env }} diff --git a/sentry/templates/deployment-sentry-post-process-forwarder-transactions.yaml b/sentry/templates/deployment-sentry-post-process-forwarder-transactions.yaml index 4745b7e59..44c017b7d 100644 --- a/sentry/templates/deployment-sentry-post-process-forwarder-transactions.yaml +++ b/sentry/templates/deployment-sentry-post-process-forwarder-transactions.yaml @@ -75,10 +75,11 @@ spec: command: ["sentry"] args: - "run" + - "consumer" + - "post-process-forwarder-transactions" + - "--consumer-group" - "post-process-forwarder" - - "--entity" - - "transactions" - - "--commit-log-topic=snuba-transactions-commit-log" + - "--synchronize-commit-log-topic=snuba-transactions-commit-log" - "--synchronize-commit-group" - "transactions_group" env: diff --git a/sentry/templates/deployment-sentry-subscription-consumer-events.yaml b/sentry/templates/deployment-sentry-subscription-consumer-events.yaml index 6153ed82b..0383f0d7c 100644 --- a/sentry/templates/deployment-sentry-subscription-consumer-events.yaml +++ b/sentry/templates/deployment-sentry-subscription-consumer-events.yaml @@ -68,9 +68,10 @@ spec: command: ["sentry"] args: - "run" - - "query-subscription-consumer" - - "--topic" + - "consumer" - "events-subscription-results" + - "--consumer-group" + - "query-subscription-consumer" env: {{ include "sentry.env" . | indent 8 }} {{- if .Values.sentry.subscriptionConsumerEvents.env }} diff --git a/sentry/templates/deployment-sentry-subscription-consumer-transactions.yaml b/sentry/templates/deployment-sentry-subscription-consumer-transactions.yaml index 4f21eefc2..dc7860490 100644 --- a/sentry/templates/deployment-sentry-subscription-consumer-transactions.yaml +++ b/sentry/templates/deployment-sentry-subscription-consumer-transactions.yaml @@ -68,9 +68,10 @@ spec: command: ["sentry"] args: - "run" - - "query-subscription-consumer" - - "--topic" + - "consumer" - "transactions-subscription-results" + - "--consumer-group" + - "query-subscription-consumer" env: {{ include "sentry.env" . | indent 8 }} {{- if .Values.sentry.subscriptionConsumerTransactions.env }} diff --git a/sentry/templates/deployment-snuba-api.yaml b/sentry/templates/deployment-snuba-api.yaml index c56de3429..a77cd03b1 100644 --- a/sentry/templates/deployment-snuba-api.yaml +++ b/sentry/templates/deployment-snuba-api.yaml @@ -88,7 +88,7 @@ spec: livenessProbe: failureThreshold: 5 httpGet: - path: / + path: /health port: {{ template "snuba.port" }} scheme: HTTP initialDelaySeconds: {{ .Values.snuba.api.probeInitialDelaySeconds }} @@ -98,7 +98,7 @@ spec: readinessProbe: failureThreshold: 10 httpGet: - path: / + path: /health port: {{ template "snuba.port" }} scheme: HTTP initialDelaySeconds: {{ .Values.snuba.api.probeInitialDelaySeconds }} From ca18057666d14159d968d9d0a10ee5a6b406f723 Mon Sep 17 00:00:00 2001 From: Theo Mathieu Date: Mon, 31 Jul 2023 15:57:08 +0200 Subject: [PATCH 064/394] fix: zookeeper enabled per default --- sentry/Chart.yaml | 2 +- sentry/values.yaml | 5 ++++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/sentry/Chart.yaml b/sentry/Chart.yaml index 4fce48a6c..34950ffd1 100644 --- a/sentry/Chart.yaml +++ b/sentry/Chart.yaml @@ -2,7 +2,7 @@ apiVersion: v2 name: sentry description: A Helm chart for Kubernetes type: application -version: 20.1.0 +version: 20.1.1 appVersion: 23.7.1 dependencies: - name: memcached diff --git a/sentry/values.yaml b/sentry/values.yaml index 46dcaa021..25b438db4 100644 --- a/sentry/values.yaml +++ b/sentry/values.yaml @@ -1048,7 +1048,10 @@ kafka: - name: ingest-metrics - name: ingest-performance-metrics - name: profiles - + zookeeper: + enabled: true + kraft: + enabled: false service: ports: client: 9092 From dd88a4e2cda57c9a5836f21fccd4882409f4f8c4 Mon Sep 17 00:00:00 2001 From: Theo Mathieu Date: Mon, 31 Jul 2023 15:58:43 +0200 Subject: [PATCH 065/394] chore: fix readme --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 2edde0cf9..44bf8c495 100644 --- a/README.md +++ b/README.md @@ -25,6 +25,8 @@ Example: kafka: zookeeper: enabled: false + kraft: + enabled: true ``` From becf6b5bcb7774e63c5c250ca0a99a4da289667f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Gonz=C3=A1lez?= Date: Wed, 2 Aug 2023 15:39:04 +0200 Subject: [PATCH 066/394] fix: Missing config for snuba migration (#948) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Christian González --- sentry/Chart.yaml | 2 +- sentry/templates/configmap-snuba.yaml | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/sentry/Chart.yaml b/sentry/Chart.yaml index 34950ffd1..82432586d 100644 --- a/sentry/Chart.yaml +++ b/sentry/Chart.yaml @@ -2,7 +2,7 @@ apiVersion: v2 name: sentry description: A Helm chart for Kubernetes type: application -version: 20.1.1 +version: 20.1.2 appVersion: 23.7.1 dependencies: - name: memcached diff --git a/sentry/templates/configmap-snuba.yaml b/sentry/templates/configmap-snuba.yaml index f4897c001..92996537a 100644 --- a/sentry/templates/configmap-snuba.yaml +++ b/sentry/templates/configmap-snuba.yaml @@ -46,6 +46,7 @@ data: "search_issues", "generic_metrics_counters", "spans", + "group_attributes", }, {{- /* The default clickhouse installation runs in distributed mode, while the external From 9ef4ad145642f10297091508bde5bb16e2314b50 Mon Sep 17 00:00:00 2001 From: lazy-slackoth <137988972+lazy-slackoth@users.noreply.github.com> Date: Thu, 3 Aug 2023 15:06:48 +0300 Subject: [PATCH 067/394] Add existing secret configuration for Google SSO (#920) --- sentry/Chart.yaml | 2 +- sentry/templates/_helper.tpl | 12 ++++++++++++ sentry/templates/configmap-sentry.yaml | 12 ++++++++++-- sentry/values.yaml | 7 +++++-- 4 files changed, 28 insertions(+), 5 deletions(-) diff --git a/sentry/Chart.yaml b/sentry/Chart.yaml index 82432586d..3a634f099 100644 --- a/sentry/Chart.yaml +++ b/sentry/Chart.yaml @@ -2,7 +2,7 @@ apiVersion: v2 name: sentry description: A Helm chart for Kubernetes type: application -version: 20.1.2 +version: 20.2.0 appVersion: 23.7.1 dependencies: - name: memcached diff --git a/sentry/templates/_helper.tpl b/sentry/templates/_helper.tpl index 19d495ec3..f225fb446 100644 --- a/sentry/templates/_helper.tpl +++ b/sentry/templates/_helper.tpl @@ -533,6 +533,18 @@ Common Sentry environment variables name: {{ .Values.github.existingSecret }} key: {{ default "client-secret" .Values.github.existingSecretClientSecretKey }} {{- end }} +{{- if .Values.google.existingSecret }} +- name: GOOGLE_AUTH_CLIENT_ID + valueFrom: + secretKeyRef: + name: {{ .Values.google.existingSecret }} + key: {{ default "client-id" .Values.google.existingSecretClientIdKey }} +- name: GOOGLE_AUTH_CLIENT_SECRET + valueFrom: + secretKeyRef: + name: {{ .Values.google.existingSecret }} + key: {{ default "client-secret" .Values.google.existingSecretClientSecretKey }} +{{- end }} {{- if .Values.openai.existingSecret }} - name: OPENAI_API_KEY valueFrom: diff --git a/sentry/templates/configmap-sentry.yaml b/sentry/templates/configmap-sentry.yaml index f34505350..0c1674e07 100644 --- a/sentry/templates/configmap-sentry.yaml +++ b/sentry/templates/configmap-sentry.yaml @@ -55,10 +55,10 @@ data: ########## # Google # ########## - {{- if .Values.google.clientId }} + {{- if and (.Values.google.clientId) (.Values.google.clientSecret) (not .Values.google.existingSecret) }} auth-google.client-id: {{ .Values.google.clientId | quote }} auth-google.client-secret: {{ .Values.google.clientSecret | quote }} - {{ end }} + {{- end }} ######### # Slack # @@ -506,6 +506,14 @@ data: SENTRY_OPTIONS['slack.signing-secret'] = os.environ.get("SLACK_SIGNING_SECRET") {{- end }} +{{- if .Values.google.existingSecret }} + ######### + # GOOGLE # + ######### + SENTRY_OPTIONS['auth-google.client-id'] = os.environ.get("GOOGLE_AUTH_CLIENT_ID") + SENTRY_OPTIONS['auth-google.client-secret'] = os.environ.get("GOOGLE_AUTH_CLIENT_SECRET") +{{- end }} + {{- if .Values.github.existingSecret }} ########## # Github # diff --git a/sentry/values.yaml b/sentry/values.yaml index 25b438db4..5625cefc1 100644 --- a/sentry/values.yaml +++ b/sentry/values.yaml @@ -836,8 +836,11 @@ github: {} # https://developers.google.com/identity/sign-in/web/server-side-flow#step_1_create_a_client_id_and_client_secret google: {} # google: -# clientId: -# clientSecret: +# clientId: "" +# clientSecret: "" +# existingSecret: "" +# existingSecretClientIdKey: "" # by default "client-id" +# existingSecretClientSecretKey: "" # by default "client-secret" slack: {} # slack: From d8be166ac6b4d744f65121208969ae59d9151659 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nikolai=20Nerg=C3=A5rd?= <6673208+nikonet@users.noreply.github.com> Date: Tue, 8 Aug 2023 15:19:36 +0200 Subject: [PATCH 068/394] Add "ingest-monitors" to Kafka topics provisioning (#951) --- sentry/Chart.yaml | 2 +- sentry/values.yaml | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/sentry/Chart.yaml b/sentry/Chart.yaml index 3a634f099..668aea76c 100644 --- a/sentry/Chart.yaml +++ b/sentry/Chart.yaml @@ -2,7 +2,7 @@ apiVersion: v2 name: sentry description: A Helm chart for Kubernetes type: application -version: 20.2.0 +version: 20.2.1 appVersion: 23.7.1 dependencies: - name: memcached diff --git a/sentry/values.yaml b/sentry/values.yaml index 5625cefc1..9df1d8b85 100644 --- a/sentry/values.yaml +++ b/sentry/values.yaml @@ -1050,6 +1050,7 @@ kafka: - name: ingest-replay-recordings - name: ingest-metrics - name: ingest-performance-metrics + - name: ingest-monitors - name: profiles zookeeper: enabled: true From b58f8a34bbfab27ab0ff10bddcd8c23033b230fc Mon Sep 17 00:00:00 2001 From: radubontila Date: Wed, 9 Aug 2023 15:11:13 +0300 Subject: [PATCH 069/394] feat: profiling support (#938) --- sentry/Chart.yaml | 2 +- sentry/templates/_helper.tpl | 20 +++ sentry/templates/configmap-sentry.yaml | 11 ++ .../deployment-sentry-ingest-profiles.yaml | 141 ++++++++++++++++ ...nt-snuba-profiling-functions-consumer.yaml | 150 ++++++++++++++++++ ...ent-snuba-profiling-profiles-consumer.yaml | 150 ++++++++++++++++++ sentry/templates/deployment-vroom.yaml | 123 ++++++++++++++ sentry/templates/service-vroom.yaml | 28 ++++ ...serviceaccount-sentry-ingest-profiles.yaml | 10 ++ sentry/values.yaml | 120 ++++++++++++++ 10 files changed, 754 insertions(+), 1 deletion(-) create mode 100644 sentry/templates/deployment-sentry-ingest-profiles.yaml create mode 100644 sentry/templates/deployment-snuba-profiling-functions-consumer.yaml create mode 100644 sentry/templates/deployment-snuba-profiling-profiles-consumer.yaml create mode 100644 sentry/templates/deployment-vroom.yaml create mode 100644 sentry/templates/service-vroom.yaml create mode 100644 sentry/templates/serviceaccount-sentry-ingest-profiles.yaml diff --git a/sentry/Chart.yaml b/sentry/Chart.yaml index 668aea76c..e9a5b61c1 100644 --- a/sentry/Chart.yaml +++ b/sentry/Chart.yaml @@ -2,7 +2,7 @@ apiVersion: v2 name: sentry description: A Helm chart for Kubernetes type: application -version: 20.2.1 +version: 20.3.0 appVersion: 23.7.1 dependencies: - name: memcached diff --git a/sentry/templates/_helper.tpl b/sentry/templates/_helper.tpl index f225fb446..017a8bee3 100644 --- a/sentry/templates/_helper.tpl +++ b/sentry/templates/_helper.tpl @@ -16,6 +16,7 @@ {{- define "relay.healthCheck.requestPath" -}}/api/relay/healthcheck/live/{{- end -}} {{- define "snuba.port" -}}1218{{- end -}} {{- define "symbolicator.port" -}}3021{{- end -}} +{{- define "vroom.port" -}}8085{{- end -}} {{- define "relay.image" -}} {{- default "getsentry/relay" .Values.images.relay.repository -}} @@ -45,6 +46,12 @@ {{- default "latest" .Values.hooks.dbCheck.image.tag -}} {{- end -}} +{{- define "vroom.image" -}} +{{- default "getsentry/vroom" .Values.images.vroom.repository -}} +: +{{- default .Chart.AppVersion .Values.images.vroom.tag -}} +{{- end -}} + {{/* Expand the name of the chart. */}} @@ -445,12 +452,25 @@ Common Snuba environment variables {{- end }} {{- end -}} +{{- define "vroom.env" -}} +- name: SENTRY_KAFKA_BROKERS_PROFILING + value: {{ include "sentry.kafka.bootstrap_servers_string" . | quote }} +- name: SENTRY_KAFKA_BROKERS_OCCURRENCES + value: {{ include "sentry.kafka.bootstrap_servers_string" . | quote }} +- name: SENTRY_BUCKET_PROFILES + value: file://localhost//var/lib/sentry-profiles +- name: SENTRY_SNUBA_HOST + value: http://{{ template "sentry.fullname" . }}-snuba:{{ template "snuba.port" . }} +{{- end -}} + {{/* Common Sentry environment variables */}} {{- define "sentry.env" -}} - name: SNUBA value: http://{{ template "sentry.fullname" . }}-snuba:{{ template "snuba.port" . }} +- name: VROOM + value: http://{{ template "sentry.fullname" . }}-vroom:{{ template "vroom.port" . }} {{- if .Values.sentry.existingSecret }} - name: SENTRY_SECRET_KEY valueFrom: diff --git a/sentry/templates/configmap-sentry.yaml b/sentry/templates/configmap-sentry.yaml index 0c1674e07..bb02dc23b 100644 --- a/sentry/templates/configmap-sentry.yaml +++ b/sentry/templates/configmap-sentry.yaml @@ -437,6 +437,17 @@ data: "organizations:transaction-metrics-extraction", "organizations:session-replay", + {{- if .Values.sentry.features.enableProfiling }} + "organizations:profiling", + "organizations:profiling-ui-frames", + "organizations:profiling-using-transactions", + "organizations:profiling-beta", + "organizations:profiling-stacktrace-links", + "organizations:profiling-global-suspect-functions", + "organizations:profiling-cpu-chart", + "organizations:profiling-memory-chart", + {{ end -}} + "projects:alert-filters", "projects:custom-inbound-filters", "projects:data-forwarding", diff --git a/sentry/templates/deployment-sentry-ingest-profiles.yaml b/sentry/templates/deployment-sentry-ingest-profiles.yaml new file mode 100644 index 000000000..babeca852 --- /dev/null +++ b/sentry/templates/deployment-sentry-ingest-profiles.yaml @@ -0,0 +1,141 @@ +{{- if .Values.sentry.features.enableProfiling }} +apiVersion: apps/v1 +kind: Deployment +metadata: + name: {{ template "sentry.fullname" . }}-ingest-profiles + labels: + app: {{ template "sentry.fullname" . }} + chart: "{{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }}" + release: "{{ .Release.Name }}" + heritage: "{{ .Release.Service }}" + app.kubernetes.io/managed-by: "Helm" + {{- if .Values.asHook }} + {{- /* Add the Helm annotations so that deployment after asHook from true to false works */}} + annotations: + meta.helm.sh/release-name: "{{ .Release.Name }}" + meta.helm.sh/release-namespace: "{{ .Release.Namespace }}" + "helm.sh/hook": "post-install,post-upgrade" + "helm.sh/hook-weight": "10" + {{- end }} +spec: + revisionHistoryLimit: {{ .Values.revisionHistoryLimit }} + selector: + matchLabels: + app: {{ template "sentry.fullname" . }} + release: "{{ .Release.Name }}" + role: ingest-profiles +{{- if not .Values.sentry.ingestProfiles.autoscaling.enabled }} + replicas: {{ .Values.sentry.ingestProfiles.replicas }} +{{- end }} + template: + metadata: + annotations: + checksum/configYml: {{ .Values.config.configYml | toYaml | toString | sha256sum }} + checksum/sentryConfPy: {{ .Values.config.sentryConfPy | sha256sum }} + checksum/config.yaml: {{ include (print $.Template.BasePath "/configmap-sentry.yaml") . | sha256sum }} + {{- if .Values.sentry.ingestProfiles.annotations }} +{{ toYaml .Values.sentry.ingestProfiles.annotations | indent 8 }} + {{- end }} + labels: + app: {{ template "sentry.fullname" . }} + release: "{{ .Release.Name }}" + role: ingest-profiles + {{- if .Values.sentry.ingestProfiles.podLabels }} +{{ toYaml .Values.sentry.ingestProfiles.podLabels | indent 8 }} + {{- end }} + spec: + affinity: + {{- if .Values.sentry.ingestProfiles.affinity }} +{{ toYaml .Values.sentry.ingestProfiles.affinity | indent 8 }} + {{- end }} + {{- if .Values.sentry.ingestProfiles.nodeSelector }} + nodeSelector: +{{ toYaml .Values.sentry.ingestProfiles.nodeSelector | indent 8 }} + {{- end }} + {{- if .Values.sentry.ingestProfiles.tolerations }} + tolerations: +{{ toYaml .Values.sentry.ingestProfiles.tolerations | indent 8 }} + {{- end }} + {{- if .Values.images.sentry.imagePullSecrets }} + imagePullSecrets: +{{ toYaml .Values.images.sentry.imagePullSecrets | indent 8 }} + {{- end }} + {{- if .Values.dnsPolicy }} + dnsPolicy: {{ .Values.dnsPolicy | quote }} + {{- end }} + {{- if .Values.dnsConfig }} + dnsConfig: +{{ toYaml .Values.dnsConfig | indent 8 }} + {{- end }} + {{- if .Values.sentry.ingestProfiles.securityContext }} + securityContext: +{{ toYaml .Values.sentry.ingestProfiles.securityContext | indent 8 }} + {{- end }} + containers: + - name: {{ .Chart.Name }}-ingest-profiles + image: "{{ template "sentry.image" . }}" + imagePullPolicy: {{ default "IfNotPresent" .Values.images.sentry.pullPolicy }} + command: ["sentry"] + args: + - "run" + - "ingest-profiles" + env: + - name: C_FORCE_ROOT + value: "true" +{{ include "sentry.env" . | indent 8 }} +{{- if .Values.sentry.ingestProfiles.env }} +{{ toYaml .Values.sentry.ingestProfiles.env | indent 8 }} +{{- end }} + volumeMounts: + - mountPath: /etc/sentry + name: config + readOnly: true + - mountPath: {{ .Values.filestore.filesystem.path }} + name: sentry-data + {{- if and (eq .Values.filestore.backend "gcs") .Values.filestore.gcs.secretName }} + - name: sentry-google-cloud-key + mountPath: /var/run/secrets/google + {{ end }} +{{- if .Values.sentry.ingestProfiles.volumeMounts }} +{{ toYaml .Values.sentry.ingestProfiles.volumeMounts | indent 8 }} +{{- end }} + resources: +{{ toYaml .Values.sentry.ingestProfiles.resources | indent 12 }} +{{- if .Values.sentry.ingestProfiles.containerSecurityContext }} + securityContext: +{{ toYaml .Values.sentry.ingestProfiles.containerSecurityContext | indent 12 }} +{{- end }} +{{- if .Values.sentry.ingestProfiles.sidecars }} +{{ toYaml .Values.sentry.ingestProfiles.sidecars | indent 6 }} +{{- end }} + {{- if .Values.serviceAccount.enabled }} + serviceAccountName: {{ .Values.serviceAccount.name }}-ingest-replay-recordings + {{- end }} + volumes: + - name: config + configMap: + name: {{ template "sentry.fullname" . }}-sentry + - name: sentry-data + {{- if and (eq .Values.filestore.backend "filesystem") .Values.filestore.filesystem.persistence.enabled (.Values.filestore.filesystem.persistence.persistentWorkers) }} + {{- if .Values.filestore.filesystem.persistence.existingClaim }} + persistentVolumeClaim: + claimName: {{ .Values.filestore.filesystem.persistence.existingClaim }} + {{- else }} + persistentVolumeClaim: + claimName: {{ template "sentry.fullname" . }}-data + {{- end }} + {{- else }} + emptyDir: {} + {{ end }} + {{- if and (eq .Values.filestore.backend "gcs") .Values.filestore.gcs.secretName }} + - name: sentry-google-cloud-key + secret: + secretName: {{ .Values.filestore.gcs.secretName }} + {{ end }} +{{- if .Values.sentry.ingestProfiles.volumes }} +{{ toYaml .Values.sentry.ingestProfiles.volumes | indent 6 }} +{{- end }} + {{- if .Values.sentry.ingestProfiles.priorityClassName }} + priorityClassName: "{{ .Values.sentry.ingestProfiles.priorityClassName }}" + {{- end }} +{{- end }} diff --git a/sentry/templates/deployment-snuba-profiling-functions-consumer.yaml b/sentry/templates/deployment-snuba-profiling-functions-consumer.yaml new file mode 100644 index 000000000..8111428df --- /dev/null +++ b/sentry/templates/deployment-snuba-profiling-functions-consumer.yaml @@ -0,0 +1,150 @@ +{{- if .Values.sentry.features.enableProfiling }} +apiVersion: apps/v1 +kind: Deployment +metadata: + name: {{ template "sentry.fullname" . }}-snuba-profiling-functions-consumer + labels: + app: {{ template "sentry.fullname" . }} + chart: "{{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }}" + release: "{{ .Release.Name }}" + heritage: "{{ .Release.Service }}" + app.kubernetes.io/managed-by: "Helm" + {{- if .Values.asHook }} + {{- /* Add the Helm annotations so that deployment after asHook from true to false works */}} + annotations: + meta.helm.sh/release-name: "{{ .Release.Name }}" + meta.helm.sh/release-namespace: "{{ .Release.Namespace }}" + "helm.sh/hook": "post-install,post-upgrade" + "helm.sh/hook-weight": "12" + {{- end }} +spec: + revisionHistoryLimit: {{ .Values.revisionHistoryLimit }} + selector: + matchLabels: + app: {{ template "sentry.fullname" . }} + release: "{{ .Release.Name }}" + role: snuba-profiling-functions-consumer + replicas: {{ .Values.snuba.profilingFunctionsConsumer.replicas }} + template: + metadata: + annotations: + checksum/snubaSettingsPy: {{ .Values.config.snubaSettingsPy | sha256sum }} + checksum/config.yaml: {{ include (print $.Template.BasePath "/configmap-snuba.yaml") . | sha256sum }} + {{- if .Values.snuba.profilingFunctionsConsumer.annotations }} +{{ toYaml .Values.snuba.profilingFunctionsConsumer.annotations | indent 8 }} + {{- end }} + labels: + app: {{ template "sentry.fullname" . }} + release: "{{ .Release.Name }}" + role: snuba-profiling-functions-consumer + {{- if .Values.snuba.profilingFunctionsConsumer.podLabels }} +{{ toYaml .Values.snuba.profilingFunctionsConsumer.podLabels | indent 8 }} + {{- end }} + spec: + affinity: + {{- if .Values.snuba.profilingFunctionsConsumer.affinity }} +{{ toYaml .Values.snuba.profilingFunctionsConsumer.affinity | indent 8 }} + {{- end }} + {{- if .Values.snuba.profilingFunctionsConsumer.nodeSelector }} + nodeSelector: +{{ toYaml .Values.snuba.profilingFunctionsConsumer.nodeSelector | indent 8 }} + {{- end }} + {{- if .Values.snuba.profilingFunctionsConsumer.tolerations }} + tolerations: +{{ toYaml .Values.snuba.profilingFunctionsConsumer.tolerations | indent 8 }} + {{- end }} + {{- if .Values.images.snuba.imagePullSecrets }} + imagePullSecrets: +{{ toYaml .Values.images.snuba.imagePullSecrets | indent 8 }} + {{- end }} + {{- if .Values.dnsPolicy }} + dnsPolicy: {{ .Values.dnsPolicy | quote }} + {{- end }} + {{- if .Values.dnsConfig }} + dnsConfig: +{{ toYaml .Values.dnsConfig | indent 8 }} + {{- end }} + {{- if .Values.snuba.profilingFunctionsConsumer.securityContext }} + securityContext: +{{ toYaml .Values.snuba.profilingFunctionsConsumer.securityContext | indent 8 }} + {{- end }} + containers: + - name: {{ .Chart.Name }}-snuba + image: "{{ template "snuba.image" . }}" + imagePullPolicy: {{ default "IfNotPresent" .Values.images.snuba.pullPolicy }} + command: + - "snuba" + - "consumer" + - "--storage" + - "functions_raw" + - "--consumer-group" + - "functions_raw_group" + - "--auto-offset-reset" + - "{{ .Values.snuba.profilingFunctionsConsumer.autoOffsetReset }}" + - "--max-batch-time-ms" + - "750" + {{- if .Values.snuba.profilingFunctionsConsumer.maxBatchSize }} + - "--max-batch-size" + - "{{ .Values.snuba.profilingFunctionsConsumer.maxBatchSize }}" + {{- end }} + {{- if .Values.snuba.profilingFunctionsConsumer.processes }} + - "--processes" + - "{{ .Values.snuba.profilingFunctionsConsumer.processes }}" + {{- end }} + {{- if .Values.snuba.profilingFunctionsConsumer.inputBlockSize }} + - "--input-block-size" + - "{{ .Values.snuba.profilingFunctionsConsumer.inputBlockSize }}" + {{- end }} + {{- if .Values.snuba.profilingFunctionsConsumer.outputBlockSize }} + - "--output-block-size" + - "{{ .Values.snuba.profilingFunctionsConsumer.outputBlockSize }}" + {{- end }} + {{- if .Values.snuba.profilingFunctionsConsumer.maxBatchTimeMs }} + - "--max-batch-time-ms" + - "{{ .Values.snuba.profilingFunctionsConsumer.maxBatchTimeMs }}" + {{- end }} + {{- if .Values.snuba.profilingFunctionsConsumer.queuedMaxMessagesKbytes }} + - "--queued-max-messages-kbytes" + - "{{ .Values.snuba.profilingFunctionsConsumer.queuedMaxMessagesKbytes }}" + {{- end }} + {{- if .Values.snuba.profilingFunctionsConsumer.queuedMinMessages }} + - "--queued-min-messages" + - "{{ .Values.snuba.profilingFunctionsConsumer.queuedMinMessages }}" + {{- end }} + {{- if .Values.snuba.profilingFunctionsConsumer.noStrictOffsetReset }} + - "--no-strict-offset-reset" + {{- end }} + ports: + - containerPort: {{ template "snuba.port" }} + env: +{{ include "sentry.snuba.env" . | indent 8 }} +{{- if .Values.snuba.profilingFunctionsConsumer.env }} +{{ toYaml .Values.snuba.profilingFunctionsConsumer.env | indent 8 }} +{{- end }} + envFrom: + - secretRef: + name: {{ template "sentry.fullname" . }}-snuba-env + volumeMounts: + - mountPath: /etc/snuba + name: config + readOnly: true +{{- if .Values.snuba.profilingFunctionsConsumer.volumeMounts }} +{{ toYaml .Values.snuba.profilingFunctionsConsumer.volumeMounts | indent 8 }} +{{- end }} + resources: +{{ toYaml .Values.snuba.profilingFunctionsConsumer.resources | indent 12 }} +{{- if .Values.snuba.profilingFunctionsConsumer.containerSecurityContext }} + securityContext: +{{ toYaml .Values.snuba.profilingFunctionsConsumer.containerSecurityContext | indent 12 }} +{{- end }} + {{- if .Values.serviceAccount.enabled }} + serviceAccountName: {{ .Values.serviceAccount.name }}-snuba + {{- end }} + volumes: + - name: config + configMap: + name: {{ template "sentry.fullname" . }}-snuba +{{- if .Values.snuba.profilingFunctionsConsumer.volumes }} +{{ toYaml .Values.snuba.profilingFunctionsConsumer.volumes | indent 8 }} +{{- end }} +{{- end }} diff --git a/sentry/templates/deployment-snuba-profiling-profiles-consumer.yaml b/sentry/templates/deployment-snuba-profiling-profiles-consumer.yaml new file mode 100644 index 000000000..fb09d4e68 --- /dev/null +++ b/sentry/templates/deployment-snuba-profiling-profiles-consumer.yaml @@ -0,0 +1,150 @@ +{{- if .Values.sentry.features.enableProfiling }} +apiVersion: apps/v1 +kind: Deployment +metadata: + name: {{ template "sentry.fullname" . }}-snuba-profiling-profiles-consumer + labels: + app: {{ template "sentry.fullname" . }} + chart: "{{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }}" + release: "{{ .Release.Name }}" + heritage: "{{ .Release.Service }}" + app.kubernetes.io/managed-by: "Helm" + {{- if .Values.asHook }} + {{- /* Add the Helm annotations so that deployment after asHook from true to false works */}} + annotations: + meta.helm.sh/release-name: "{{ .Release.Name }}" + meta.helm.sh/release-namespace: "{{ .Release.Namespace }}" + "helm.sh/hook": "post-install,post-upgrade" + "helm.sh/hook-weight": "12" + {{- end }} +spec: + revisionHistoryLimit: {{ .Values.revisionHistoryLimit }} + selector: + matchLabels: + app: {{ template "sentry.fullname" . }} + release: "{{ .Release.Name }}" + role: snuba-profiling-profiles-consumer + replicas: {{ .Values.snuba.profilingProfilesConsumer.replicas }} + template: + metadata: + annotations: + checksum/snubaSettingsPy: {{ .Values.config.snubaSettingsPy | sha256sum }} + checksum/config.yaml: {{ include (print $.Template.BasePath "/configmap-snuba.yaml") . | sha256sum }} + {{- if .Values.snuba.profilingProfilesConsumer.annotations }} +{{ toYaml .Values.snuba.profilingProfilesConsumer.annotations | indent 8 }} + {{- end }} + labels: + app: {{ template "sentry.fullname" . }} + release: "{{ .Release.Name }}" + role: snuba-profiling-profiles-consumer + {{- if .Values.snuba.profilingProfilesConsumer.podLabels }} +{{ toYaml .Values.snuba.profilingProfilesConsumer.podLabels | indent 8 }} + {{- end }} + spec: + affinity: + {{- if .Values.snuba.profilingProfilesConsumer.affinity }} +{{ toYaml .Values.snuba.profilingProfilesConsumer.affinity | indent 8 }} + {{- end }} + {{- if .Values.snuba.profilingProfilesConsumer.nodeSelector }} + nodeSelector: +{{ toYaml .Values.snuba.profilingProfilesConsumer.nodeSelector | indent 8 }} + {{- end }} + {{- if .Values.snuba.profilingProfilesConsumer.tolerations }} + tolerations: +{{ toYaml .Values.snuba.profilingProfilesConsumer.tolerations | indent 8 }} + {{- end }} + {{- if .Values.images.snuba.imagePullSecrets }} + imagePullSecrets: +{{ toYaml .Values.images.snuba.imagePullSecrets | indent 8 }} + {{- end }} + {{- if .Values.dnsPolicy }} + dnsPolicy: {{ .Values.dnsPolicy | quote }} + {{- end }} + {{- if .Values.dnsConfig }} + dnsConfig: +{{ toYaml .Values.dnsConfig | indent 8 }} + {{- end }} + {{- if .Values.snuba.profilingProfilesConsumer.securityContext }} + securityContext: +{{ toYaml .Values.snuba.profilingProfilesConsumer.securityContext | indent 8 }} + {{- end }} + containers: + - name: {{ .Chart.Name }}-snuba + image: "{{ template "snuba.image" . }}" + imagePullPolicy: {{ default "IfNotPresent" .Values.images.snuba.pullPolicy }} + command: + - "snuba" + - "consumer" + - "--storage" + - "profiles" + - "--consumer-group" + - "profiles_group" + - "--auto-offset-reset" + - "{{ .Values.snuba.profilingProfilesConsumer.autoOffsetReset }}" + - "--max-batch-time-ms" + - "750" + {{- if .Values.snuba.profilingProfilesConsumer.maxBatchSize }} + - "--max-batch-size" + - "{{ .Values.snuba.profilingProfilesConsumer.maxBatchSize }}" + {{- end }} + {{- if .Values.snuba.profilingProfilesConsumer.processes }} + - "--processes" + - "{{ .Values.snuba.profilingProfilesConsumer.processes }}" + {{- end }} + {{- if .Values.snuba.profilingProfilesConsumer.inputBlockSize }} + - "--input-block-size" + - "{{ .Values.snuba.profilingProfilesConsumer.inputBlockSize }}" + {{- end }} + {{- if .Values.snuba.profilingProfilesConsumer.outputBlockSize }} + - "--output-block-size" + - "{{ .Values.snuba.profilingProfilesConsumer.outputBlockSize }}" + {{- end }} + {{- if .Values.snuba.profilingProfilesConsumer.maxBatchTimeMs }} + - "--max-batch-time-ms" + - "{{ .Values.snuba.profilingProfilesConsumer.maxBatchTimeMs }}" + {{- end }} + {{- if .Values.snuba.profilingProfilesConsumer.queuedMaxMessagesKbytes }} + - "--queued-max-messages-kbytes" + - "{{ .Values.snuba.profilingProfilesConsumer.queuedMaxMessagesKbytes }}" + {{- end }} + {{- if .Values.snuba.profilingProfilesConsumer.queuedMinMessages }} + - "--queued-min-messages" + - "{{ .Values.snuba.profilingProfilesConsumer.queuedMinMessages }}" + {{- end }} + {{- if .Values.snuba.profilingProfilesConsumer.noStrictOffsetReset }} + - "--no-strict-offset-reset" + {{- end }} + ports: + - containerPort: {{ template "snuba.port" }} + env: +{{ include "sentry.snuba.env" . | indent 8 }} +{{- if .Values.snuba.profilingProfilesConsumer.env }} +{{ toYaml .Values.snuba.profilingProfilesConsumer.env | indent 8 }} +{{- end }} + envFrom: + - secretRef: + name: {{ template "sentry.fullname" . }}-snuba-env + volumeMounts: + - mountPath: /etc/snuba + name: config + readOnly: true +{{- if .Values.snuba.profilingProfilesConsumer.volumeMounts }} +{{ toYaml .Values.snuba.profilingProfilesConsumer.volumeMounts | indent 8 }} +{{- end }} + resources: +{{ toYaml .Values.snuba.profilingProfilesConsumer.resources | indent 12 }} +{{- if .Values.snuba.profilingProfilesConsumer.containerSecurityContext }} + securityContext: +{{ toYaml .Values.snuba.profilingProfilesConsumer.containerSecurityContext | indent 12 }} +{{- end }} + {{- if .Values.serviceAccount.enabled }} + serviceAccountName: {{ .Values.serviceAccount.name }}-snuba + {{- end }} + volumes: + - name: config + configMap: + name: {{ template "sentry.fullname" . }}-snuba +{{- if .Values.snuba.profilingProfilesConsumer.volumes }} +{{ toYaml .Values.snuba.profilingProfilesConsumer.volumes | indent 8 }} +{{- end }} +{{- end }} diff --git a/sentry/templates/deployment-vroom.yaml b/sentry/templates/deployment-vroom.yaml new file mode 100644 index 000000000..c13a31ae2 --- /dev/null +++ b/sentry/templates/deployment-vroom.yaml @@ -0,0 +1,123 @@ +{{- if .Values.sentry.features.enableProfiling }} +apiVersion: apps/v1 +kind: Deployment +metadata: + name: {{ template "sentry.fullname" . }}-vroom + labels: + app: {{ template "sentry.fullname" . }} + chart: "{{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }}" + release: "{{ .Release.Name }}" + heritage: "{{ .Release.Service }}" + app.kubernetes.io/managed-by: "Helm" + {{- if .Values.asHook }} + {{- /* Add the Helm annotations so that deployment after asHook from true to false works */}} + annotations: + meta.helm.sh/release-name: "{{ .Release.Name }}" + meta.helm.sh/release-namespace: "{{ .Release.Namespace }}" + "helm.sh/hook": "post-install,post-upgrade" + "helm.sh/hook-weight": "25" + {{- end }} +spec: + selector: + matchLabels: + app: {{ template "sentry.fullname" . }} + release: "{{ .Release.Name }}" + role: vroom +{{- if not .Values.vroom.autoscaling.enabled }} + replicas: {{ .Values.vroom.replicas }} +{{- end }} + revisionHistoryLimit: {{ .Values.revisionHistoryLimit }} + template: + metadata: + annotations: + {{- if .Values.vroom.annotations }} +{{ toYaml .Values.vroom.annotations | indent 8 }} + {{- end }} + labels: + app: {{ template "sentry.fullname" . }} + release: "{{ .Release.Name }}" + role: vroom + {{- if .Values.vroom.podLabels }} +{{ toYaml .Values.vroom.podLabels | indent 8 }} + {{- end }} + spec: + affinity: + {{- if .Values.vroom.affinity }} +{{ toYaml .Values.vroom.affinity | indent 8 }} + {{- end }} + {{- if .Values.vroom.nodeSelector }} + nodeSelector: +{{ toYaml .Values.vroom.nodeSelector | indent 8 }} + {{- end }} + {{- if .Values.vroom.tolerations }} + tolerations: +{{ toYaml .Values.vroom.tolerations | indent 8 }} + {{- end }} + {{- if .Values.images.vroom.imagePullSecrets }} + imagePullSecrets: +{{ toYaml .Values.images.vroom.imagePullSecrets | indent 8 }} + {{- end }} + {{- if .Values.vroom.securityContext }} + securityContext: +{{ toYaml .Values.vroom.securityContext | indent 8 }} + {{- end }} + containers: + - name: {{ .Chart.Name }}-vroom +{{- if .Values.vroom.args }} + args: +{{ toYaml .Values.vroom.args | indent 10 }} +{{- end }} + image: "{{ template "vroom.image" . }}" + imagePullPolicy: {{ default "IfNotPresent" .Values.images.vroom.pullPolicy }} + ports: + - containerPort: {{ template "vroom.port" }} + env: + - name: VROOM_PORT + value: '{{ template "vroom.port" }}' +{{- if .Values.vroom.env }} +{{ toYaml .Values.vroom.env | indent 8 }} +{{- end }} +{{- if .Values.vroom.volumeMounts }} + volumeMounts: +{{ toYaml .Values.vroom.volumeMounts | indent 10 }} +{{- end }} + livenessProbe: + failureThreshold: {{ .Values.vroom.probeFailureThreshold }} + httpGet: + path: /health + port: {{ template "vroom.port" }} + scheme: HTTP + initialDelaySeconds: {{ .Values.vroom.probeInitialDelaySeconds }} + periodSeconds: {{ .Values.vroom.probePeriodSeconds }} + successThreshold: {{ .Values.vroom.probeSuccessThreshold }} + timeoutSeconds: {{ .Values.vroom.probeTimeoutSeconds }} + readinessProbe: + failureThreshold: {{ .Values.vroom.probeFailureThreshold }} + httpGet: + path: /health + port: {{ template "vroom.port" }} + scheme: HTTP + initialDelaySeconds: {{ .Values.vroom.probeInitialDelaySeconds }} + periodSeconds: {{ .Values.vroom.probePeriodSeconds }} + successThreshold: {{ .Values.vroom.probeSuccessThreshold }} + timeoutSeconds: {{ .Values.vroom.probeTimeoutSeconds }} + resources: +{{ toYaml .Values.vroom.resources | indent 12 }} +{{- if .Values.vroom.containerSecurityContext }} + securityContext: +{{ toYaml .Values.vroom.containerSecurityContext | indent 12 }} +{{- end }} +{{- if .Values.vroom.sidecars }} +{{ toYaml .Values.vroom.sidecars | indent 6 }} +{{- end }} + {{- if .Values.serviceAccount.enabled }} + serviceAccountName: {{ .Values.serviceAccount.name }}-vroom + {{- end }} +{{- if .Values.vroom.volumes }} + volumes: +{{ toYaml .Values.vroom.volumes | indent 6 }} +{{- end }} + {{- if .Values.vroom.priorityClassName }} + priorityClassName: "{{ .Values.vroom.priorityClassName }}" + {{- end }} +{{- end }} diff --git a/sentry/templates/service-vroom.yaml b/sentry/templates/service-vroom.yaml new file mode 100644 index 000000000..3161085df --- /dev/null +++ b/sentry/templates/service-vroom.yaml @@ -0,0 +1,28 @@ +{{- if .Values.sentry.features.enableProfiling }} +apiVersion: v1 +kind: Service +metadata: + name: {{ template "sentry.fullname" . }}-vroom + annotations: + {{- range $key, $value := .Values.vroom.service.annotations }} + {{ $key }}: {{ $value | quote }} + {{- end }} + {{- if and (.Values.ingress.enabled) (eq (default "nginx" .Values.ingress.regexPathStyle) "gke") }} + cloud.google.com/backend-config: '{"ports": {"{{ template "vroom.port" . }}":"{{ include "sentry.fullname" . }}-vroom"}}' + {{- end }} + labels: + app: {{ template "sentry.fullname" . }} + chart: "{{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }}" + release: "{{ .Release.Name }}" + heritage: "{{ .Release.Service }}" +spec: + type: {{ .Values.service.type }} + ports: + - port: {{ template "vroom.port" . }} + targetPort: {{ template "vroom.port" }} + protocol: TCP + name: {{ .Values.service.name }}-vroom + selector: + app: {{ template "sentry.fullname" . }} + role: vroom +{{- end }} diff --git a/sentry/templates/serviceaccount-sentry-ingest-profiles.yaml b/sentry/templates/serviceaccount-sentry-ingest-profiles.yaml new file mode 100644 index 000000000..725e5f863 --- /dev/null +++ b/sentry/templates/serviceaccount-sentry-ingest-profiles.yaml @@ -0,0 +1,10 @@ +{{- if and .Values.serviceAccount.enabled .Values.sentry.features.enableProfiling }} +apiVersion: v1 +kind: ServiceAccount +metadata: + name: {{ .Values.serviceAccount.name }}-ingest-profiles +{{- if .Values.serviceAccount.annotations }} + annotations: {{ toYaml .Values.serviceAccount.annotations | nindent 4 }} +{{- end }} +automountServiceAccountToken: {{ .Values.serviceAccount.automountServiceAccountToken }} +{{- end }} diff --git a/sentry/values.yaml b/sentry/values.yaml index 9df1d8b85..5a9e34f52 100644 --- a/sentry/values.yaml +++ b/sentry/values.yaml @@ -38,6 +38,11 @@ images: # tag: Chart.AppVersion # pullPolicy: IfNotPresent imagePullSecrets: [] + vroom: + # repository: getsentry/vroom + # tag: Chart.AppVersion + # pullPolicy: IfNotPresent + imagePullSecrets: [] serviceAccount: # serviceAccount.annotations -- Additional Service Account annotations. @@ -49,6 +54,39 @@ serviceAccount: # serviceAccount.automountServiceAccountToken -- Automount API credentials for a Service Account. automountServiceAccountToken: true +vroom: + replicas: 1 + env: [] + probeFailureThreshold: 5 + probeInitialDelaySeconds: 10 + probePeriodSeconds: 10 + probeSuccessThreshold: 1 + probeTimeoutSeconds: 2 + resources: {} + affinity: {} + nodeSelector: {} + securityContext: {} + containerSecurityContext: {} + service: + annotations: {} + # tolerations: [] + # podLabels: [] + + autoscaling: + enabled: false + minReplicas: 2 + maxReplicas: 5 + targetCPUUtilizationPercentage: 50 + sidecars: [] + volumes: [] + volumeMounts: [] + init: + resources: {} + # additionalArgs: [] + # env: [] + # volumes: [] + # volumeMounts: [] + relay: replicas: 1 # args: [] @@ -130,6 +168,7 @@ sentry: features: orgSubdomains: false vstsLimitedScopes: true + enableProfiling: false worker: replicas: 3 @@ -263,6 +302,31 @@ sentry: # - mountPath: /dev/shm # name: dshm + ingestProfiles: + replicas: 1 + env: [] + resources: {} + affinity: {} + nodeSelector: {} + securityContext: {} + containerSecurityContext: {} + # tolerations: [] + # podLabels: [] + + # it's better to use prometheus adapter and scale based on + # the size of the rabbitmq queue + autoscaling: + enabled: false + minReplicas: 1 + maxReplicas: 3 + targetCPUUtilizationPercentage: 50 + sidecars: [] + volumes: [] + + # volumeMounts: + # - mountPath: /dev/shm + # name: dshm + ingestMonitors: replicas: 1 env: [] @@ -651,6 +715,62 @@ snuba: # emptyDir: # medium: Memory + profilingProfilesConsumer: + replicas: 1 + env: [] + resources: {} + affinity: {} + nodeSelector: {} + securityContext: {} + containerSecurityContext: {} + # tolerations: [] + # podLabels: [] + autoOffsetReset: "earliest" + # noStrictOffsetReset: false + # maxBatchSize: "" + # processes: "" + # inputBlockSize: "" + # outputBlockSize: "" + # maxBatchTimeMs: "" + # queuedMaxMessagesKbytes: "" + # queuedMinMessages: "" + + # volumeMounts: + # - mountPath: /dev/shm + # name: dshm + # volumes: + # - name: dshm + # emptyDir: + # medium: Memory + + profilingFunctionsConsumer: + replicas: 1 + env: [] + resources: {} + affinity: {} + nodeSelector: {} + securityContext: {} + containerSecurityContext: {} + # tolerations: [] + # podLabels: [] + autoOffsetReset: "earliest" + # noStrictOffsetReset: false + # maxBatchSize: "" + # processes: "" + # inputBlockSize: "" + # outputBlockSize: "" + # maxBatchTimeMs: "" + # queuedMaxMessagesKbytes: "" + # queuedMinMessages: "" + + # volumeMounts: + # - mountPath: /dev/shm + # name: dshm + # volumes: + # - name: dshm + # emptyDir: + # medium: Memory + dbInitJob: env: [] From 805d3f48de8a09d8542f9da4c3323e7ee57bc8c5 Mon Sep 17 00:00:00 2001 From: Anton Donskoy Date: Thu, 10 Aug 2023 10:51:59 +0300 Subject: [PATCH 070/394] Sentry version upgrade to 23.7.2 (#952) Co-authored-by: Anton Donskoy --- sentry/Chart.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sentry/Chart.yaml b/sentry/Chart.yaml index e9a5b61c1..6cd4ebd8c 100644 --- a/sentry/Chart.yaml +++ b/sentry/Chart.yaml @@ -2,8 +2,8 @@ apiVersion: v2 name: sentry description: A Helm chart for Kubernetes type: application -version: 20.3.0 -appVersion: 23.7.1 +version: 20.3.1 +appVersion: 23.7.2 dependencies: - name: memcached repository: oci://registry-1.docker.io/bitnamicharts From 265949ffe84f47afb1ec6587a5de3ef6504e5183 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Gonz=C3=A1lez?= Date: Mon, 14 Aug 2023 13:45:52 +0200 Subject: [PATCH 071/394] Create missing service accounts (#958) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Christian González --- sentry/Chart.yaml | 2 +- sentry/templates/cronjob-sentry-cleanup.yaml | 4 ++-- sentry/templates/serviceaccount-sentry-cleanup.yaml | 10 ++++++++++ sentry/templates/serviceaccount-sentry-vroom.yaml | 10 ++++++++++ 4 files changed, 23 insertions(+), 3 deletions(-) create mode 100644 sentry/templates/serviceaccount-sentry-cleanup.yaml create mode 100644 sentry/templates/serviceaccount-sentry-vroom.yaml diff --git a/sentry/Chart.yaml b/sentry/Chart.yaml index 6cd4ebd8c..b53b93422 100644 --- a/sentry/Chart.yaml +++ b/sentry/Chart.yaml @@ -2,7 +2,7 @@ apiVersion: v2 name: sentry description: A Helm chart for Kubernetes type: application -version: 20.3.1 +version: 20.3.2 appVersion: 23.7.2 dependencies: - name: memcached diff --git a/sentry/templates/cronjob-sentry-cleanup.yaml b/sentry/templates/cronjob-sentry-cleanup.yaml index 7569882eb..3c26abae0 100644 --- a/sentry/templates/cronjob-sentry-cleanup.yaml +++ b/sentry/templates/cronjob-sentry-cleanup.yaml @@ -130,7 +130,7 @@ spec: {{- if .Values.sentry.cleanup.priorityClassName }} priorityClassName: "{{ .Values.sentry.cleanup.priorityClassName }}" {{- end }} - {{- if .Values.sentry.cleanup.serviceAccount }} - serviceAccountName: {{ .Values.sentry.cleanup.serviceAccount.name }} + {{- if .Values.serviceAccount.enabled }} + serviceAccountName: {{ .Values.serviceAccount.name }}-cleanup {{- end }} {{- end }} diff --git a/sentry/templates/serviceaccount-sentry-cleanup.yaml b/sentry/templates/serviceaccount-sentry-cleanup.yaml new file mode 100644 index 000000000..422f64746 --- /dev/null +++ b/sentry/templates/serviceaccount-sentry-cleanup.yaml @@ -0,0 +1,10 @@ +{{- if .Values.serviceAccount.enabled }} +apiVersion: v1 +kind: ServiceAccount +metadata: + name: {{ .Values.serviceAccount.name }}-cleanup +{{- if .Values.serviceAccount.annotations }} + annotations: {{ toYaml .Values.serviceAccount.annotations | nindent 4 }} +{{- end }} +automountServiceAccountToken: {{ .Values.serviceAccount.automountServiceAccountToken }} +{{- end }} diff --git a/sentry/templates/serviceaccount-sentry-vroom.yaml b/sentry/templates/serviceaccount-sentry-vroom.yaml new file mode 100644 index 000000000..814f93984 --- /dev/null +++ b/sentry/templates/serviceaccount-sentry-vroom.yaml @@ -0,0 +1,10 @@ +{{- if and .Values.serviceAccount.enabled .Values.sentry.features.enableProfiling }} +apiVersion: v1 +kind: ServiceAccount +metadata: + name: {{ .Values.serviceAccount.name }}-vroom +{{- if .Values.serviceAccount.annotations }} + annotations: {{ toYaml .Values.serviceAccount.annotations | nindent 4 }} +{{- end }} +automountServiceAccountToken: {{ .Values.serviceAccount.automountServiceAccountToken }} +{{- end }} From 48cce3689be4da3ffad9855ad49c0f803cc0fda2 Mon Sep 17 00:00:00 2001 From: Taehyun Kim Date: Wed, 16 Aug 2023 21:37:32 +0900 Subject: [PATCH 072/394] Provision kafka topics in kafka-provisioning hook (#954) --- sentry/Chart.yaml | 2 +- sentry/templates/hooks/snuba-db-init.job.yaml | 11 ++- sentry/values.yaml | 73 +++++++++++++++++++ 3 files changed, 84 insertions(+), 2 deletions(-) diff --git a/sentry/Chart.yaml b/sentry/Chart.yaml index b53b93422..cbe6581dd 100644 --- a/sentry/Chart.yaml +++ b/sentry/Chart.yaml @@ -2,7 +2,7 @@ apiVersion: v2 name: sentry description: A Helm chart for Kubernetes type: application -version: 20.3.2 +version: 20.4.0 appVersion: 23.7.2 dependencies: - name: memcached diff --git a/sentry/templates/hooks/snuba-db-init.job.yaml b/sentry/templates/hooks/snuba-db-init.job.yaml index 89da9cd97..9bbc5b930 100644 --- a/sentry/templates/hooks/snuba-db-init.job.yaml +++ b/sentry/templates/hooks/snuba-db-init.job.yaml @@ -77,7 +77,16 @@ spec: containers: - name: snuba-init image: "{{ template "snuba.image" . }}" - command: [snuba, bootstrap, --no-migrate, --force] + command: + - snuba + - bootstrap + - --no-migrate + {{- if .Values.hooks.snubaInit.kafka.enabled }} + - --kafka + {{- else }} + - --no-kafka + {{- end }} + - --force env: - name: LOG_LEVEL value: debug diff --git a/sentry/values.yaml b/sentry/values.yaml index 5a9e34f52..8d6428b4f 100644 --- a/sentry/values.yaml +++ b/sentry/values.yaml @@ -822,6 +822,11 @@ hooks: # volumes: [] # volumeMounts: [] snubaInit: + # As snubaInit doesn't support configuring partition and replication factor, you can disable snubaInit's kafka topic creation by setting `kafka.enabled` to `false`, + # and create the topics using `kafka.provisioning.topics` with the desired partition and replication factor. + # Note that when you set `kafka.enabled` to `false`, snuba component might fail to start if newly added topics are not created by `kafka.provisioning`. + kafka: + enabled: true # podLabels: [] podAnnotations: {} resources: @@ -1163,7 +1168,75 @@ kafka: socketRequestMaxBytes: "50000000" provisioning: enabled: true + # Topic list is based on files below. + # - https://github.com/getsentry/snuba/blob/master/snuba/utils/streams/topics.py + # - https://github.com/getsentry/self-hosted/blob/master/install/create-kafka-topics.sh#L6 + # Note that snuba component might fail if you set `hooks.snubaInit.kafka.enabled` to `false` and remove the topics from this default topic list. topics: + - name: events + config: + "message.timestamp.type": LogAppendTime + - name: event-replacements + - name: snuba-commit-log + - name: cdc + - name: transactions + config: + "message.timestamp.type": LogAppendTime + - name: snuba-transactions-commit-log + - name: snuba-metrics + config: + "message.timestamp.type": LogAppendTime + - name: outcomes + - name: ingest-sessions + - name: snuba-sessions-commit-log + - name: snuba-metrics-commit-log + - name: scheduled-subscriptions-events + - name: scheduled-subscriptions-transactions + - name: scheduled-subscriptions-sessions + - name: scheduled-subscriptions-metrics + - name: scheduled-subscriptions-generic-metrics-sets + - name: scheduled-subscriptions-generic-metrics-distributions + - name: scheduled-subscriptions-generic-metrics-counters + - name: events-subscription-results + - name: transactions-subscription-results + - name: sessions-subscription-results + - name: metrics-subscription-results + - name: generic-metrics-subscription-results + - name: snuba-queries + config: + "message.timestamp.type": LogAppendTime + - name: processed-profiles + config: + "message.timestamp.type": LogAppendTime + - name: profiles-call-tree + - name: ingest-replay-events + config: + "message.timestamp.type": LogAppendTime + "max.message.bytes": "15000000" + - name: snuba-generic-metrics + config: + "message.timestamp.type": LogAppendTime + - name: snuba-generic-metrics-sets-commit-log + - name: snuba-generic-metrics-distributions-commit-log + - name: snuba-generic-metrics-counters-commit-log + - name: generic-events + config: + "message.timestamp.type": LogAppendTime + - name: snuba-generic-events-commit-log + - name: group-attributes + config: + "message.timestamp.type": LogAppendTime + - name: snuba-attribution + - name: snuba-dead-letter-metrics + - name: snuba-dead-letter-metrics-sets + - name: snuba-dead-letter-metrics-counters + - name: snuba-dead-letter-metrics-distributions + - name: snuba-dead-letter-sessions + - name: snuba-dead-letter-generic-metrics + - name: snuba-dead-letter-replays + - name: snuba-dead-letter-generic-events + - name: snuba-dead-letter-querylog + - name: snuba-dead-letter-group-attributes - name: ingest-attachments - name: ingest-transactions - name: ingest-events From 9f13ed1ec6188a6818b268f188a8c27d0918cd02 Mon Sep 17 00:00:00 2001 From: Anton Donskoy Date: Mon, 28 Aug 2023 11:18:46 +0300 Subject: [PATCH 073/394] Upgrade sentry to 23.8.0 (#965) --- sentry/Chart.yaml | 4 +- sentry/templates/configmap-sentry.yaml | 1 + .../deployment-sentry-ingest-occurrences.yaml | 142 +++++++++++++++++ ...post-process-forwarder-issue-platform.yaml | 141 +++++++++++++++++ ...yment-snuba-issue-occurrence-consumer.yaml | 148 ++++++++++++++++++ ...viceaccount-sentry-ingest-occurrences.yaml | 10 ++ ...post-process-forwarder-issue-platform.yaml | 10 ++ sentry/values.yaml | 65 ++++++++ 8 files changed, 519 insertions(+), 2 deletions(-) create mode 100644 sentry/templates/deployment-sentry-ingest-occurrences.yaml create mode 100644 sentry/templates/deployment-sentry-post-process-forwarder-issue-platform.yaml create mode 100644 sentry/templates/deployment-snuba-issue-occurrence-consumer.yaml create mode 100644 sentry/templates/serviceaccount-sentry-ingest-occurrences.yaml create mode 100644 sentry/templates/serviceaccount-sentry-post-process-forwarder-issue-platform.yaml diff --git a/sentry/Chart.yaml b/sentry/Chart.yaml index cbe6581dd..a3b2e794b 100644 --- a/sentry/Chart.yaml +++ b/sentry/Chart.yaml @@ -2,8 +2,8 @@ apiVersion: v2 name: sentry description: A Helm chart for Kubernetes type: application -version: 20.4.0 -appVersion: 23.7.2 +version: 20.5.0 +appVersion: 23.8.0 dependencies: - name: memcached repository: oci://registry-1.docker.io/bitnamicharts diff --git a/sentry/templates/configmap-sentry.yaml b/sentry/templates/configmap-sentry.yaml index bb02dc23b..b2632c7d6 100644 --- a/sentry/templates/configmap-sentry.yaml +++ b/sentry/templates/configmap-sentry.yaml @@ -436,6 +436,7 @@ data: "organizations:metrics-extraction", "organizations:transaction-metrics-extraction", "organizations:session-replay", + "organizations:issue-platform", {{- if .Values.sentry.features.enableProfiling }} "organizations:profiling", diff --git a/sentry/templates/deployment-sentry-ingest-occurrences.yaml b/sentry/templates/deployment-sentry-ingest-occurrences.yaml new file mode 100644 index 000000000..153672ca2 --- /dev/null +++ b/sentry/templates/deployment-sentry-ingest-occurrences.yaml @@ -0,0 +1,142 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: {{ template "sentry.fullname" . }}-ingest-occurrences + labels: + app: {{ template "sentry.fullname" . }} + chart: "{{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }}" + release: "{{ .Release.Name }}" + heritage: "{{ .Release.Service }}" + app.kubernetes.io/managed-by: "Helm" + {{- if .Values.asHook }} + {{- /* Add the Helm annotations so that deployment after asHook from true to false works */}} + annotations: + meta.helm.sh/release-name: "{{ .Release.Name }}" + meta.helm.sh/release-namespace: "{{ .Release.Namespace }}" + "helm.sh/hook": "post-install,post-upgrade" + "helm.sh/hook-weight": "10" + {{- end }} +spec: + revisionHistoryLimit: {{ .Values.revisionHistoryLimit }} + selector: + matchLabels: + app: {{ template "sentry.fullname" . }} + release: "{{ .Release.Name }}" + role: ingest-occurrences +{{- if not .Values.sentry.ingestOccurrences.autoscaling.enabled }} + replicas: {{ .Values.sentry.ingestOccurrences.replicas }} +{{- end }} + template: + metadata: + annotations: + checksum/configYml: {{ .Values.config.configYml | toYaml | toString | sha256sum }} + checksum/sentryConfPy: {{ .Values.config.sentryConfPy | sha256sum }} + checksum/config.yaml: {{ include (print $.Template.BasePath "/configmap-sentry.yaml") . | sha256sum }} + {{- if .Values.sentry.ingestOccurrences.annotations }} +{{ toYaml .Values.sentry.ingestOccurrences.annotations | indent 8 }} + {{- end }} + labels: + app: {{ template "sentry.fullname" . }} + release: "{{ .Release.Name }}" + role: ingest-occurrences + {{- if .Values.sentry.ingestOccurrences.podLabels }} +{{ toYaml .Values.sentry.ingestOccurrences.podLabels | indent 8 }} + {{- end }} + spec: + affinity: + {{- if .Values.sentry.ingestOccurrences.affinity }} +{{ toYaml .Values.sentry.ingestOccurrences.affinity | indent 8 }} + {{- end }} + {{- if .Values.sentry.ingestOccurrences.nodeSelector }} + nodeSelector: +{{ toYaml .Values.sentry.ingestOccurrences.nodeSelector | indent 8 }} + {{- end }} + {{- if .Values.sentry.ingestOccurrences.tolerations }} + tolerations: +{{ toYaml .Values.sentry.ingestOccurrences.tolerations | indent 8 }} + {{- end }} + {{- if .Values.images.sentry.imagePullSecrets }} + imagePullSecrets: +{{ toYaml .Values.images.sentry.imagePullSecrets | indent 8 }} + {{- end }} + {{- if .Values.dnsPolicy }} + dnsPolicy: {{ .Values.dnsPolicy | quote }} + {{- end }} + {{- if .Values.dnsConfig }} + dnsConfig: +{{ toYaml .Values.dnsConfig | indent 8 }} + {{- end }} + {{- if .Values.sentry.ingestOccurrences.securityContext }} + securityContext: +{{ toYaml .Values.sentry.ingestOccurrences.securityContext | indent 8 }} + {{- end }} + containers: + - name: {{ .Chart.Name }}-ingest-occurrences + image: "{{ template "sentry.image" . }}" + imagePullPolicy: {{ default "IfNotPresent" .Values.images.sentry.pullPolicy }} + command: ["sentry"] + args: + - "run" + - "consumer" + - "ingest-occurrences" + - "--consumer-group" + - "ingest-occurrences" + env: + - name: C_FORCE_ROOT + value: "true" +{{ include "sentry.env" . | indent 8 }} +{{- if .Values.sentry.ingestOccurrences.env }} +{{ toYaml .Values.sentry.ingestOccurrences.env | indent 8 }} +{{- end }} + volumeMounts: + - mountPath: /etc/sentry + name: config + readOnly: true + - mountPath: {{ .Values.filestore.filesystem.path }} + name: sentry-data + {{- if and (eq .Values.filestore.backend "gcs") .Values.filestore.gcs.secretName }} + - name: sentry-google-cloud-key + mountPath: /var/run/secrets/google + {{ end }} +{{- if .Values.sentry.ingestOccurrences.volumeMounts }} +{{ toYaml .Values.sentry.ingestOccurrences.volumeMounts | indent 8 }} +{{- end }} + resources: +{{ toYaml .Values.sentry.ingestOccurrences.resources | indent 12 }} +{{- if .Values.sentry.ingestOccurrences.containerSecurityContext }} + securityContext: +{{ toYaml .Values.sentry.ingestOccurrences.containerSecurityContext | indent 12 }} +{{- end }} +{{- if .Values.sentry.ingestOccurrences.sidecars }} +{{ toYaml .Values.sentry.ingestOccurrences.sidecars | indent 6 }} +{{- end }} + {{- if .Values.serviceAccount.enabled }} + serviceAccountName: {{ .Values.serviceAccount.name }}-ingest-replay-recordings + {{- end }} + volumes: + - name: config + configMap: + name: {{ template "sentry.fullname" . }}-sentry + - name: sentry-data + {{- if and (eq .Values.filestore.backend "filesystem") .Values.filestore.filesystem.persistence.enabled (.Values.filestore.filesystem.persistence.persistentWorkers) }} + {{- if .Values.filestore.filesystem.persistence.existingClaim }} + persistentVolumeClaim: + claimName: {{ .Values.filestore.filesystem.persistence.existingClaim }} + {{- else }} + persistentVolumeClaim: + claimName: {{ template "sentry.fullname" . }}-data + {{- end }} + {{- else }} + emptyDir: {} + {{ end }} + {{- if and (eq .Values.filestore.backend "gcs") .Values.filestore.gcs.secretName }} + - name: sentry-google-cloud-key + secret: + secretName: {{ .Values.filestore.gcs.secretName }} + {{ end }} +{{- if .Values.sentry.ingestOccurrences.volumes }} +{{ toYaml .Values.sentry.ingestOccurrences.volumes | indent 6 }} +{{- end }} + {{- if .Values.sentry.ingestOccurrences.priorityClassName }} + priorityClassName: "{{ .Values.sentry.ingestOccurrences.priorityClassName }}" + {{- end }} diff --git a/sentry/templates/deployment-sentry-post-process-forwarder-issue-platform.yaml b/sentry/templates/deployment-sentry-post-process-forwarder-issue-platform.yaml new file mode 100644 index 000000000..453fb3a37 --- /dev/null +++ b/sentry/templates/deployment-sentry-post-process-forwarder-issue-platform.yaml @@ -0,0 +1,141 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: {{ template "sentry.fullname" . }}-post-process-forward-issue-platform + labels: + app: sentry + chart: "{{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }}" + release: "{{ .Release.Name }}" + heritage: "{{ .Release.Service }}" + app.kubernetes.io/managed-by: "Helm" + {{- if .Values.asHook }} + {{- /* Add the Helm annotations so that deployment after asHook from true to false works */}} + annotations: + meta.helm.sh/release-name: "{{ .Release.Name }}" + meta.helm.sh/release-namespace: "{{ .Release.Namespace }}" + "helm.sh/hook": "post-install,post-upgrade" + "helm.sh/hook-weight": "10" + {{- end }} +spec: + revisionHistoryLimit: {{ .Values.revisionHistoryLimit }} + selector: + matchLabels: + app: sentry + release: "{{ .Release.Name }}" + role: sentry-post-process-forward-issue-platform + replicas: {{ .Values.sentry.postProcessForwardIssuePlatform.replicas }} + template: + metadata: + annotations: + checksum/configYml: {{ .Values.config.configYml | toYaml | toString | sha256sum }} + checksum/sentryConfPy: {{ .Values.config.sentryConfPy | sha256sum }} + checksum/config.yaml: {{ include (print $.Template.BasePath "/configmap-sentry.yaml") . | sha256sum }} + {{- if .Values.sentry.postProcessForwardIssuePlatform.annotations }} +{{ toYaml .Values.sentry.postProcessForwardIssuePlatform.annotations | indent 8 }} + {{- end }} + labels: + app: sentry + release: "{{ .Release.Name }}" + role: sentry-post-process-forward-issue-platform + {{- if .Values.sentry.postProcessForwardIssuePlatform.podLabels }} +{{ toYaml .Values.sentry.postProcessForwardIssuePlatform.podLabels | indent 8 }} + {{- end }} + spec: + affinity: + {{- if .Values.sentry.postProcessForwardIssuePlatform.affinity }} +{{ toYaml .Values.sentry.postProcessForwardIssuePlatform.affinity | indent 8 }} + {{- end }} + {{- if .Values.sentry.postProcessForwardIssuePlatform.nodeSelector }} + nodeSelector: +{{ toYaml .Values.sentry.postProcessForwardIssuePlatform.nodeSelector | indent 8 }} + {{- end }} + {{- if .Values.sentry.postProcessForwardIssuePlatform.tolerations }} + tolerations: +{{ toYaml .Values.sentry.postProcessForwardIssuePlatform.tolerations | indent 8 }} + {{- end }} + {{- if .Values.images.sentry.imagePullSecrets }} + imagePullSecrets: +{{ toYaml .Values.images.sentry.imagePullSecrets | indent 8 }} + {{- end }} + {{- if .Values.dnsPolicy }} + dnsPolicy: {{ .Values.dnsPolicy | quote }} + {{- end }} + {{- if .Values.dnsConfig }} + dnsConfig: +{{ toYaml .Values.dnsConfig | indent 8 }} + {{- end }} + {{- if .Values.sentry.postProcessForwardIssuePlatform.securityContext }} + securityContext: +{{ toYaml .Values.sentry.postProcessForwardIssuePlatform.securityContext | indent 8 }} + {{- end }} + containers: + - name: {{ .Chart.Name }}-post-process-forward-issue-platform + image: "{{ template "sentry.image" . }}" + imagePullPolicy: {{ default "IfNotPresent" .Values.images.sentry.pullPolicy }} + command: ["sentry"] + args: + - "run" + - "consumer" + - "post-process-forwarder-issue-platform" + - "--consumer-group" + - "post-process-forwarder" + - "--synchronize-commit-log-topic=snuba-generic-events-commit-log" + - "--synchronize-commit-group" + - "generic_events_group" + env: +{{ include "sentry.env" . | indent 8 }} +{{- if .Values.sentry.postProcessForwardIssuePlatform.env }} +{{ toYaml .Values.sentry.postProcessForwardIssuePlatform.env | indent 8 }} +{{- end }} + volumeMounts: + - mountPath: /etc/sentry + name: config + readOnly: true + - mountPath: {{ .Values.filestore.filesystem.path }} + name: sentry-data + {{- if and (eq .Values.filestore.backend "gcs") .Values.filestore.gcs.secretName }} + - name: sentry-google-cloud-key + mountPath: /var/run/secrets/google + {{ end }} +{{- if .Values.sentry.postProcessForwardIssuePlatform.volumeMounts }} +{{ toYaml .Values.sentry.postProcessForwardIssuePlatform.volumeMounts | indent 8 }} +{{- end }} + resources: +{{ toYaml .Values.sentry.postProcessForwardIssuePlatform.resources | indent 12 }} +{{- if .Values.sentry.postProcessForwardIssuePlatform.containerSecurityContext }} + securityContext: +{{ toYaml .Values.sentry.postProcessForwardIssuePlatform.containerSecurityContext | indent 12 }} +{{- end }} +{{- if .Values.sentry.postProcessForwardIssuePlatform.sidecars }} +{{ toYaml .Values.sentry.postProcessForwardIssuePlatform.sidecars | indent 6 }} +{{- end }} + {{- if .Values.serviceAccount.enabled }} + serviceAccountName: {{ .Values.serviceAccount.name }}-post-process-forwarder-issue-platform + {{- end }} + volumes: + - name: config + configMap: + name: {{ template "sentry.fullname" . }}-sentry + - name: sentry-data + {{- if and (eq .Values.filestore.backend "filesystem") .Values.filestore.filesystem.persistence.enabled (.Values.filestore.filesystem.persistence.persistentWorkers) }} + {{- if .Values.filestore.filesystem.persistence.existingClaim }} + persistentVolumeClaim: + claimName: {{ .Values.filestore.filesystem.persistence.existingClaim }} + {{- else }} + persistentVolumeClaim: + claimName: {{ template "sentry.fullname" . }}-data + {{- end }} + {{- else }} + emptyDir: {} + {{ end }} + {{- if and (eq .Values.filestore.backend "gcs") .Values.filestore.gcs.secretName }} + - name: sentry-google-cloud-key + secret: + secretName: {{ .Values.filestore.gcs.secretName }} + {{ end }} +{{- if .Values.sentry.postProcessForwardIssuePlatform.volumes }} +{{ toYaml .Values.sentry.postProcessForwardIssuePlatform.volumes | indent 6 }} +{{- end }} + {{- if .Values.sentry.postProcessForwardIssuePlatform.priorityClassName }} + priorityClassName: "{{ .Values.sentry.postProcessForwardIssuePlatform.priorityClassName }}" + {{- end }} diff --git a/sentry/templates/deployment-snuba-issue-occurrence-consumer.yaml b/sentry/templates/deployment-snuba-issue-occurrence-consumer.yaml new file mode 100644 index 000000000..aff5d74db --- /dev/null +++ b/sentry/templates/deployment-snuba-issue-occurrence-consumer.yaml @@ -0,0 +1,148 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: {{ template "sentry.fullname" . }}-issue-occurrence-consumer + labels: + app: {{ template "sentry.fullname" . }} + chart: "{{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }}" + release: "{{ .Release.Name }}" + heritage: "{{ .Release.Service }}" + app.kubernetes.io/managed-by: "Helm" + {{- if .Values.asHook }} + {{- /* Add the Helm annotations so that deployment after asHook from true to false works */}} + annotations: + meta.helm.sh/release-name: "{{ .Release.Name }}" + meta.helm.sh/release-namespace: "{{ .Release.Namespace }}" + "helm.sh/hook": "post-install,post-upgrade" + "helm.sh/hook-weight": "16" + {{- end }} +spec: + revisionHistoryLimit: {{ .Values.revisionHistoryLimit }} + selector: + matchLabels: + app: {{ template "sentry.fullname" . }} + release: "{{ .Release.Name }}" + role: issue-occurrence-consumer + replicas: {{ .Values.snuba.issueOccurrenceConsumer.replicas }} + template: + metadata: + annotations: + checksum/snubaSettingsPy: {{ .Values.config.snubaSettingsPy | sha256sum }} + checksum/config.yaml: {{ include (print $.Template.BasePath "/configmap-snuba.yaml") . | sha256sum }} + {{- if .Values.snuba.issueOccurrenceConsumer.annotations }} +{{ toYaml .Values.snuba.issueOccurrenceConsumer.annotations | indent 8 }} + {{- end }} + labels: + app: {{ template "sentry.fullname" . }} + release: "{{ .Release.Name }}" + role: issue-occurrence-consumer + {{- if .Values.snuba.issueOccurrenceConsumer.podLabels }} +{{ toYaml .Values.snuba.issueOccurrenceConsumer.podLabels | indent 8 }} + {{- end }} + spec: + affinity: + {{- if .Values.snuba.issueOccurrenceConsumer.affinity }} +{{ toYaml .Values.snuba.issueOccurrenceConsumer.affinity | indent 8 }} + {{- end }} + {{- if .Values.snuba.issueOccurrenceConsumer.nodeSelector }} + nodeSelector: +{{ toYaml .Values.snuba.issueOccurrenceConsumer.nodeSelector | indent 8 }} + {{- end }} + {{- if .Values.snuba.issueOccurrenceConsumer.tolerations }} + tolerations: +{{ toYaml .Values.snuba.issueOccurrenceConsumer.tolerations | indent 8 }} + {{- end }} + {{- if .Values.images.snuba.imagePullSecrets }} + imagePullSecrets: +{{ toYaml .Values.images.snuba.imagePullSecrets | indent 8 }} + {{- end }} + {{- if .Values.dnsPolicy }} + dnsPolicy: {{ .Values.dnsPolicy | quote }} + {{- end }} + {{- if .Values.dnsConfig }} + dnsConfig: +{{ toYaml .Values.dnsConfig | indent 8 }} + {{- end }} + {{- if .Values.snuba.issueOccurrenceConsumer.securityContext }} + securityContext: +{{ toYaml .Values.snuba.issueOccurrenceConsumer.securityContext | indent 8 }} + {{- end }} + containers: + - name: {{ .Chart.Name }}-snuba + image: "{{ template "snuba.image" . }}" + imagePullPolicy: {{ default "IfNotPresent" .Values.images.snuba.pullPolicy }} + command: + - "snuba" + - "consumer" + - "--storage" + - "search_issues" + - "--consumer-group" + - "generic_events_group" + - "--auto-offset-reset" + - "{{ .Values.snuba.issueOccurrenceConsumer.autoOffsetReset }}" + - "--max-batch-time-ms" + - "750" + {{- if .Values.snuba.issueOccurrenceConsumer.maxBatchSize }} + - "--max-batch-size" + - "{{ .Values.snuba.issueOccurrenceConsumer.maxBatchSize }}" + {{- end }} + {{- if .Values.snuba.issueOccurrenceConsumer.processes }} + - "--processes" + - "{{ .Values.snuba.issueOccurrenceConsumer.processes }}" + {{- end }} + {{- if .Values.snuba.issueOccurrenceConsumer.inputBlockSize }} + - "--input-block-size" + - "{{ .Values.snuba.issueOccurrenceConsumer.inputBlockSize }}" + {{- end }} + {{- if .Values.snuba.issueOccurrenceConsumer.outputBlockSize }} + - "--output-block-size" + - "{{ .Values.snuba.issueOccurrenceConsumer.outputBlockSize }}" + {{- end }} + {{- if .Values.snuba.issueOccurrenceConsumer.maxBatchTimeMs }} + - "--max-batch-time-ms" + - "{{ .Values.snuba.issueOccurrenceConsumer.maxBatchTimeMs }}" + {{- end }} + {{- if .Values.snuba.issueOccurrenceConsumer.queuedMaxMessagesKbytes }} + - "--queued-max-messages-kbytes" + - "{{ .Values.snuba.issueOccurrenceConsumer.queuedMaxMessagesKbytes }}" + {{- end }} + {{- if .Values.snuba.issueOccurrenceConsumer.queuedMinMessages }} + - "--queued-min-messages" + - "{{ .Values.snuba.issueOccurrenceConsumer.queuedMinMessages }}" + {{- end }} + {{- if .Values.snuba.issueOccurrenceConsumer.noStrictOffsetReset }} + - "--no-strict-offset-reset" + {{- end }} + ports: + - containerPort: {{ template "snuba.port" }} + env: +{{ include "sentry.snuba.env" . | indent 8 }} +{{- if .Values.snuba.issueOccurrenceConsumer.env }} +{{ toYaml .Values.snuba.issueOccurrenceConsumer.env | indent 8 }} +{{- end }} + envFrom: + - secretRef: + name: {{ template "sentry.fullname" . }}-snuba-env + volumeMounts: + - mountPath: /etc/snuba + name: config + readOnly: true +{{- if .Values.snuba.issueOccurrenceConsumer.volumeMounts }} +{{ toYaml .Values.snuba.issueOccurrenceConsumer.volumeMounts | indent 8 }} +{{- end }} + resources: +{{ toYaml .Values.snuba.issueOccurrenceConsumer.resources | indent 12 }} +{{- if .Values.snuba.issueOccurrenceConsumer.containerSecurityContext }} + securityContext: +{{ toYaml .Values.snuba.issueOccurrenceConsumer.containerSecurityContext | indent 12 }} +{{- end }} + {{- if .Values.serviceAccount.enabled }} + serviceAccountName: {{ .Values.serviceAccount.name }}-snuba + {{- end }} + volumes: + - name: config + configMap: + name: {{ template "sentry.fullname" . }}-snuba +{{- if .Values.snuba.issueOccurrenceConsumer.volumes }} +{{ toYaml .Values.snuba.issueOccurrenceConsumer.volumes | indent 8 }} +{{- end }} diff --git a/sentry/templates/serviceaccount-sentry-ingest-occurrences.yaml b/sentry/templates/serviceaccount-sentry-ingest-occurrences.yaml new file mode 100644 index 000000000..457ca66ec --- /dev/null +++ b/sentry/templates/serviceaccount-sentry-ingest-occurrences.yaml @@ -0,0 +1,10 @@ +{{- if .Values.serviceAccount.enabled }} +apiVersion: v1 +kind: ServiceAccount +metadata: + name: {{ .Values.serviceAccount.name }}-ingest-occurrences +{{- if .Values.serviceAccount.annotations }} + annotations: {{ toYaml .Values.serviceAccount.annotations | nindent 4 }} +{{- end }} +automountServiceAccountToken: {{ .Values.serviceAccount.automountServiceAccountToken }} +{{- end }} diff --git a/sentry/templates/serviceaccount-sentry-post-process-forwarder-issue-platform.yaml b/sentry/templates/serviceaccount-sentry-post-process-forwarder-issue-platform.yaml new file mode 100644 index 000000000..31bc330d6 --- /dev/null +++ b/sentry/templates/serviceaccount-sentry-post-process-forwarder-issue-platform.yaml @@ -0,0 +1,10 @@ +{{- if .Values.serviceAccount.enabled }} +apiVersion: v1 +kind: ServiceAccount +metadata: + name: {{ .Values.serviceAccount.name }}-post-process-forwarder-issue-platform +{{- if .Values.serviceAccount.annotations }} + annotations: {{ toYaml .Values.serviceAccount.annotations | nindent 4 }} +{{- end }} +automountServiceAccountToken: {{ .Values.serviceAccount.automountServiceAccountToken }} +{{- end }} diff --git a/sentry/values.yaml b/sentry/values.yaml index 8d6428b4f..ecc2329de 100644 --- a/sentry/values.yaml +++ b/sentry/values.yaml @@ -323,6 +323,30 @@ sentry: sidecars: [] volumes: [] + # volumeMounts: + # - mountPath: /dev/shm + # name: dshm + ingestOccurrences: + replicas: 1 + env: [] + resources: {} + affinity: {} + nodeSelector: {} + securityContext: {} + containerSecurityContext: {} + # tolerations: [] + # podLabels: [] + + # it's better to use prometheus adapter and scale based on + # the size of the rabbitmq queue + autoscaling: + enabled: false + minReplicas: 1 + maxReplicas: 3 + targetCPUUtilizationPercentage: 50 + sidecars: [] + volumes: [] + # volumeMounts: # - mountPath: /dev/shm # name: dshm @@ -463,6 +487,19 @@ sentry: sidecars: [] volumes: [] # volumeMounts: [] + postProcessForwardIssuePlatform: + replicas: 1 + env: [] + resources: {} + affinity: {} + nodeSelector: {} + securityContext: {} + containerSecurityContext: {} + # tolerations: [] + # podLabels: [] + sidecars: [] + volumes: [] + # volumeMounts: [] cleanup: successfulJobsHistoryLimit: 5 @@ -763,6 +800,33 @@ snuba: # queuedMaxMessagesKbytes: "" # queuedMinMessages: "" + # volumeMounts: + # - mountPath: /dev/shm + # name: dshm + # volumes: + # - name: dshm + # emptyDir: + # medium: Memory + issueOccurrenceConsumer: + replicas: 1 + env: [] + resources: {} + affinity: {} + nodeSelector: {} + securityContext: {} + containerSecurityContext: {} + # tolerations: [] + # podLabels: [] + autoOffsetReset: "earliest" + # noStrictOffsetReset: false + # maxBatchSize: "" + # processes: "" + # inputBlockSize: "" + # outputBlockSize: "" + # maxBatchTimeMs: "" + # queuedMaxMessagesKbytes: "" + # queuedMinMessages: "" + # volumeMounts: # - mountPath: /dev/shm # name: dshm @@ -1245,6 +1309,7 @@ kafka: - name: ingest-performance-metrics - name: ingest-monitors - name: profiles + - name: ingest-occurrences zookeeper: enabled: true kraft: From cead469eb418e8ae110f60c173ab0bb9f74e4cc3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Gonz=C3=A1lez?= Date: Mon, 28 Aug 2023 12:41:36 +0200 Subject: [PATCH 074/394] fix: Fix wrong service account for ingest-profiles deployment (#966) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Christian González --- sentry/Chart.yaml | 2 +- sentry/templates/deployment-sentry-ingest-profiles.yaml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/sentry/Chart.yaml b/sentry/Chart.yaml index a3b2e794b..594965bdf 100644 --- a/sentry/Chart.yaml +++ b/sentry/Chart.yaml @@ -2,7 +2,7 @@ apiVersion: v2 name: sentry description: A Helm chart for Kubernetes type: application -version: 20.5.0 +version: 20.5.1 appVersion: 23.8.0 dependencies: - name: memcached diff --git a/sentry/templates/deployment-sentry-ingest-profiles.yaml b/sentry/templates/deployment-sentry-ingest-profiles.yaml index babeca852..0a18ef77f 100644 --- a/sentry/templates/deployment-sentry-ingest-profiles.yaml +++ b/sentry/templates/deployment-sentry-ingest-profiles.yaml @@ -109,7 +109,7 @@ spec: {{ toYaml .Values.sentry.ingestProfiles.sidecars | indent 6 }} {{- end }} {{- if .Values.serviceAccount.enabled }} - serviceAccountName: {{ .Values.serviceAccount.name }}-ingest-replay-recordings + serviceAccountName: {{ .Values.serviceAccount.name }}-ingest-profiles {{- end }} volumes: - name: config From 1cbd47348fc32003c33e8bf908540b8f7205d973 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 28 Aug 2023 14:49:10 +0200 Subject: [PATCH 075/394] Configure Renovate (#964) --- renovate.json | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 renovate.json diff --git a/renovate.json b/renovate.json new file mode 100644 index 000000000..fac613adf --- /dev/null +++ b/renovate.json @@ -0,0 +1,14 @@ +{ + "$schema": "https://docs.renovatebot.com/renovate-schema.json", + "extends": ["config:base"], + "enabledManagers": ["helmv3", "github-actions"], + "baseBranches": ["develop"], + "labels": ["renovate"], + "packageRules": [ + { + "matchManagers": ["helmv3", "github-actions"], + "stabilityDays": 7, + "enabled": true + } + ] +} \ No newline at end of file From a7d8390d46537dd904d2a9745358a894e304a6df Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Gonz=C3=A1lez?= Date: Tue, 29 Aug 2023 12:54:36 +0200 Subject: [PATCH 076/394] fix: Set the right service account for ingest occurrences deployment (#988) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Christian González --- sentry/Chart.yaml | 2 +- sentry/templates/deployment-sentry-ingest-occurrences.yaml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/sentry/Chart.yaml b/sentry/Chart.yaml index 594965bdf..724950489 100644 --- a/sentry/Chart.yaml +++ b/sentry/Chart.yaml @@ -2,7 +2,7 @@ apiVersion: v2 name: sentry description: A Helm chart for Kubernetes type: application -version: 20.5.1 +version: 20.5.2 appVersion: 23.8.0 dependencies: - name: memcached diff --git a/sentry/templates/deployment-sentry-ingest-occurrences.yaml b/sentry/templates/deployment-sentry-ingest-occurrences.yaml index 153672ca2..c2d3d1289 100644 --- a/sentry/templates/deployment-sentry-ingest-occurrences.yaml +++ b/sentry/templates/deployment-sentry-ingest-occurrences.yaml @@ -111,7 +111,7 @@ spec: {{ toYaml .Values.sentry.ingestOccurrences.sidecars | indent 6 }} {{- end }} {{- if .Values.serviceAccount.enabled }} - serviceAccountName: {{ .Values.serviceAccount.name }}-ingest-replay-recordings + serviceAccountName: {{ .Values.serviceAccount.name }}-ingest-occurrences {{- end }} volumes: - name: config From 48c447b8ce4e279770cc70113391f375b5183656 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 31 Aug 2023 07:11:04 +0200 Subject: [PATCH 077/394] chore(deps): update actions/stale action to v8 (#996) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- .github/workflows/stale.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/stale.yaml b/.github/workflows/stale.yaml index 64c2f7ffb..a1bcf3669 100644 --- a/.github/workflows/stale.yaml +++ b/.github/workflows/stale.yaml @@ -10,7 +10,7 @@ jobs: issues: write pull-requests: write steps: - - uses: actions/stale@v5 + - uses: actions/stale@v8 with: days-before-issue-stale: 30 days-before-issue-close: 14 From 20e087130100733eebf6e46af27c6ca34c48559c Mon Sep 17 00:00:00 2001 From: Anton Donskoy Date: Thu, 31 Aug 2023 08:12:52 +0300 Subject: [PATCH 078/394] fix: renovate should only update chart versions (#984) Co-authored-by: Anton Donskoy --- renovate.json | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/renovate.json b/renovate.json index fac613adf..64bb8c515 100644 --- a/renovate.json +++ b/renovate.json @@ -6,9 +6,15 @@ "labels": ["renovate"], "packageRules": [ { - "matchManagers": ["helmv3", "github-actions"], + "matchManagers": ["helmv3"], + "matchDatasources": ["helm"], + "stabilityDays": 7, + "enabled": true + }, + { + "matchManagers": ["github-actions"], "stabilityDays": 7, "enabled": true } ] -} \ No newline at end of file +} From 68614e1691e1d3a0f3ad6d80ca675e395fc439f7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Manuel=20Morej=C3=B3n?= Date: Thu, 31 Aug 2023 16:27:50 +0200 Subject: [PATCH 079/394] fix: postgresql existing secret path (#1004) Signed-off-by: Manuel Morejon --- sentry/Chart.yaml | 2 +- sentry/templates/_helper.tpl | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/sentry/Chart.yaml b/sentry/Chart.yaml index 724950489..88face877 100644 --- a/sentry/Chart.yaml +++ b/sentry/Chart.yaml @@ -2,7 +2,7 @@ apiVersion: v2 name: sentry description: A Helm chart for Kubernetes type: application -version: 20.5.2 +version: 20.5.3 appVersion: 23.8.0 dependencies: - name: memcached diff --git a/sentry/templates/_helper.tpl b/sentry/templates/_helper.tpl index 017a8bee3..8ae32f31b 100644 --- a/sentry/templates/_helper.tpl +++ b/sentry/templates/_helper.tpl @@ -488,8 +488,8 @@ Common Sentry environment variables - name: POSTGRES_PASSWORD valueFrom: secretKeyRef: - name: {{ default (include "sentry.postgresql.fullname" .) .Values.postgresql.existingSecret }} - key: {{ default "postgres-password" .Values.postgresql.existingSecretKey }} + name: {{ default (include "sentry.postgresql.fullname" .) .Values.postgresql.auth.existingSecret }} + key: {{ default "postgres-password" .Values.postgresql.auth.secretKeys.adminPasswordKey }} {{- else if .Values.externalPostgresql.password }} - name: POSTGRES_PASSWORD value: {{ .Values.externalPostgresql.password | quote }} From 3b131f11da55ca8d829fae6d8c427521752f737a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Manuel=20Morej=C3=B3n?= Date: Wed, 20 Sep 2023 16:07:44 +0200 Subject: [PATCH 080/394] fix hpa vroom configuration (#1019) Signed-off-by: Manuel Morejon --- sentry/Chart.yaml | 2 +- sentry/templates/hpa-vroom.yaml | 14 ++++++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) create mode 100644 sentry/templates/hpa-vroom.yaml diff --git a/sentry/Chart.yaml b/sentry/Chart.yaml index 88face877..7b95899f8 100644 --- a/sentry/Chart.yaml +++ b/sentry/Chart.yaml @@ -2,7 +2,7 @@ apiVersion: v2 name: sentry description: A Helm chart for Kubernetes type: application -version: 20.5.3 +version: 20.5.4 appVersion: 23.8.0 dependencies: - name: memcached diff --git a/sentry/templates/hpa-vroom.yaml b/sentry/templates/hpa-vroom.yaml new file mode 100644 index 000000000..a91a8af4a --- /dev/null +++ b/sentry/templates/hpa-vroom.yaml @@ -0,0 +1,14 @@ +{{- if .Values.vroom.autoscaling.enabled }} +apiVersion: autoscaling/v1 +kind: HorizontalPodAutoscaler +metadata: + name: {{ template "sentry.fullname" . }}-vroom +spec: + scaleTargetRef: + apiVersion: apps/v1 + kind: Deployment + name: {{ template "sentry.fullname" . }}-vroom + minReplicas: {{ .Values.vroom.autoscaling.minReplicas }} + maxReplicas: {{ .Values.vroom.autoscaling.maxReplicas }} + targetCPUUtilizationPercentage: {{ .Values.vroom.autoscaling.targetCPUUtilizationPercentage }} +{{- end }} From 4e1e8f1f9aee75348d9312993b0270d1258e5e9e Mon Sep 17 00:00:00 2001 From: Glenn Eggen <83582518+Glaaj@users.noreply.github.com> Date: Thu, 21 Sep 2023 15:28:26 +0200 Subject: [PATCH 081/394] Add proxy buffer size config to fix Bad Gateway (#1022) --- sentry/Chart.yaml | 2 +- sentry/templates/configmap-nginx.yaml | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/sentry/Chart.yaml b/sentry/Chart.yaml index 7b95899f8..a1e7827be 100644 --- a/sentry/Chart.yaml +++ b/sentry/Chart.yaml @@ -2,7 +2,7 @@ apiVersion: v2 name: sentry description: A Helm chart for Kubernetes type: application -version: 20.5.4 +version: 20.5.5 appVersion: 23.8.0 dependencies: - name: memcached diff --git a/sentry/templates/configmap-nginx.yaml b/sentry/templates/configmap-nginx.yaml index d795ce207..e87e2d39d 100644 --- a/sentry/templates/configmap-nginx.yaml +++ b/sentry/templates/configmap-nginx.yaml @@ -17,6 +17,9 @@ data: listen {{ template "nginx.port" }}; proxy_redirect off; + proxy_buffer_size 128k; + proxy_buffers 4 256k; + proxy_busy_buffers_size 256k; proxy_set_header Host $host; location /api/store/ { From fa0b52d533ef281348f2b453b1e1617b2e53c286 Mon Sep 17 00:00:00 2001 From: Anton Donskoy Date: Thu, 12 Oct 2023 12:14:32 +0300 Subject: [PATCH 082/394] September release (#1032) Co-authored-by: Anton Donskoy --- sentry/Chart.yaml | 4 +- sentry/templates/configmap-sentry.yaml | 13 ++ ...yment-sentry-billing-metrics-consumer.yaml | 7 + ...yment-sentry-generic-metrics-consumer.yaml | 148 +++++++++++++++++ .../deployment-sentry-metrics-consumer.yaml | 148 +++++++++++++++++ ...subscription-consumer-generic-metrics.yaml | 148 +++++++++++++++++ ...-sentry-subscription-consumer-metrics.yaml | 148 +++++++++++++++++ ...uba-generic-metrics-counters-consumer.yaml | 148 +++++++++++++++++ ...eneric-metrics-distributions-consumer.yaml | 148 +++++++++++++++++ ...t-snuba-generic-metrics-sets-consumer.yaml | 148 +++++++++++++++++ .../deployment-snuba-metrics-consumer.yaml | 148 +++++++++++++++++ ...t-snuba-subscription-consumer-metrics.yaml | 114 +++++++++++++ ...count-sentry-generic-metrics-consumer.yaml | 10 ++ ...erviceaccount-sentry-metrics-consumer.yaml | 10 ++ ...subscription-consumer-generic-metrics.yaml | 10 ++ ...-sentry-subscription-consumer-metrics.yaml | 10 ++ sentry/values.yaml | 153 ++++++++++++++++++ 17 files changed, 1513 insertions(+), 2 deletions(-) create mode 100644 sentry/templates/deployment-sentry-generic-metrics-consumer.yaml create mode 100644 sentry/templates/deployment-sentry-metrics-consumer.yaml create mode 100644 sentry/templates/deployment-sentry-subscription-consumer-generic-metrics.yaml create mode 100644 sentry/templates/deployment-sentry-subscription-consumer-metrics.yaml create mode 100644 sentry/templates/deployment-snuba-generic-metrics-counters-consumer.yaml create mode 100644 sentry/templates/deployment-snuba-generic-metrics-distributions-consumer.yaml create mode 100644 sentry/templates/deployment-snuba-generic-metrics-sets-consumer.yaml create mode 100644 sentry/templates/deployment-snuba-metrics-consumer.yaml create mode 100644 sentry/templates/deployment-snuba-subscription-consumer-metrics.yaml create mode 100644 sentry/templates/serviceaccount-sentry-generic-metrics-consumer.yaml create mode 100644 sentry/templates/serviceaccount-sentry-metrics-consumer.yaml create mode 100644 sentry/templates/serviceaccount-sentry-subscription-consumer-generic-metrics.yaml create mode 100644 sentry/templates/serviceaccount-sentry-subscription-consumer-metrics.yaml diff --git a/sentry/Chart.yaml b/sentry/Chart.yaml index a1e7827be..97a3270b8 100644 --- a/sentry/Chart.yaml +++ b/sentry/Chart.yaml @@ -2,8 +2,8 @@ apiVersion: v2 name: sentry description: A Helm chart for Kubernetes type: application -version: 20.5.5 -appVersion: 23.8.0 +version: 20.6.0 +appVersion: 23.9.1 dependencies: - name: memcached repository: oci://registry-1.docker.io/bitnamicharts diff --git a/sentry/templates/configmap-sentry.yaml b/sentry/templates/configmap-sentry.yaml index b2632c7d6..097c1b325 100644 --- a/sentry/templates/configmap-sentry.yaml +++ b/sentry/templates/configmap-sentry.yaml @@ -299,6 +299,13 @@ data: SENTRY_DIGESTS = "sentry.digests.backends.redis.RedisBackend" + ################### + # Metrics Backend # + ################### + + SENTRY_RELEASE_HEALTH = "sentry.release_health.metrics.MetricsReleaseHealthBackend" + SENTRY_RELEASE_MONITOR = "sentry.release_health.release_monitor.metrics.MetricReleaseMonitorBackend" + ############## # Web Server # ############## @@ -449,6 +456,12 @@ data: "organizations:profiling-memory-chart", {{ end -}} + "organizations:dashboards-mep", + "organizations:mep-rollout-flag", + "organizations:dashboards-rh-widget", + "organizations:metrics-extraction", + "organizations:transaction-metrics-extraction", + "projects:alert-filters", "projects:custom-inbound-filters", "projects:data-forwarding", diff --git a/sentry/templates/deployment-sentry-billing-metrics-consumer.yaml b/sentry/templates/deployment-sentry-billing-metrics-consumer.yaml index 1df7eb2fb..1836f565b 100644 --- a/sentry/templates/deployment-sentry-billing-metrics-consumer.yaml +++ b/sentry/templates/deployment-sentry-billing-metrics-consumer.yaml @@ -77,7 +77,14 @@ spec: command: ["sentry"] args: - "run" + - "consumer" - "billing-metrics-consumer" + - "--consumer-group" + - "billing-metrics-consumer" + {{- if .Values.sentry.billingMetricsConsumer.concurrency }} + - "--concurrency" + - "{{ .Values.sentry.billingMetricsConsumer.concurrency }}" + {{- end }} {{- if .Values.sentry.billingMetricsConsumer.maxBatchSize }} - "--max-batch-size" - "{{ .Values.sentry.billingMetricsConsumer.maxBatchSize }}" diff --git a/sentry/templates/deployment-sentry-generic-metrics-consumer.yaml b/sentry/templates/deployment-sentry-generic-metrics-consumer.yaml new file mode 100644 index 000000000..4b7fb36c6 --- /dev/null +++ b/sentry/templates/deployment-sentry-generic-metrics-consumer.yaml @@ -0,0 +1,148 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: {{ template "sentry.fullname" . }}-generic-metrics-consumer + labels: + app: {{ template "sentry.fullname" . }} + chart: "{{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }}" + release: "{{ .Release.Name }}" + heritage: "{{ .Release.Service }}" + app.kubernetes.io/managed-by: "Helm" + {{- if .Values.asHook }} + {{- /* Add the Helm annotations so that deployment after asHook from true to false works */}} + annotations: + meta.helm.sh/release-name: "{{ .Release.Name }}" + meta.helm.sh/release-namespace: "{{ .Release.Namespace }}" + "helm.sh/hook": "post-install,post-upgrade" + "helm.sh/hook-weight": "10" + {{- end }} +spec: + revisionHistoryLimit: {{ .Values.revisionHistoryLimit }} + selector: + matchLabels: + app: {{ template "sentry.fullname" . }} + release: "{{ .Release.Name }}" + role: generic-metrics-consumer + replicas: {{ .Values.sentry.genericMetricsConsumer.replicas }} + template: + metadata: + annotations: + checksum/configYml: {{ .Values.config.configYml | toYaml | toString | sha256sum }} + checksum/sentryConfPy: {{ .Values.config.sentryConfPy | sha256sum }} + checksum/config.yaml: {{ include (print $.Template.BasePath "/configmap-sentry.yaml") . | sha256sum }} + {{- if .Values.sentry.genericMetricsConsumer.annotations }} +{{ toYaml .Values.sentry.genericMetricsConsumer.annotations | indent 8 }} + {{- end }} + labels: + app: {{ template "sentry.fullname" . }} + release: "{{ .Release.Name }}" + role: generic-metrics-consumer + {{- if .Values.sentry.genericMetricsConsumer.podLabels }} +{{ toYaml .Values.sentry.genericMetricsConsumer.podLabels | indent 8 }} + {{- end }} + spec: + affinity: + {{- if .Values.sentry.genericMetricsConsumer.affinity }} +{{ toYaml .Values.sentry.genericMetricsConsumer.affinity | indent 8 }} + {{- end }} + {{- if .Values.sentry.genericMetricsConsumer.nodeSelector }} + nodeSelector: +{{ toYaml .Values.sentry.genericMetricsConsumer.nodeSelector | indent 8 }} + {{- end }} + {{- if .Values.sentry.genericMetricsConsumer.tolerations }} + tolerations: +{{ toYaml .Values.sentry.genericMetricsConsumer.tolerations | indent 8 }} + {{- end }} + {{- if .Values.images.sentry.imagePullSecrets }} + imagePullSecrets: +{{ toYaml .Values.images.sentry.imagePullSecrets | indent 8 }} + {{- end }} + {{- if .Values.dnsPolicy }} + dnsPolicy: {{ .Values.dnsPolicy | quote }} + {{- end }} + {{- if .Values.dnsConfig }} + dnsConfig: +{{ toYaml .Values.dnsConfig | indent 8 }} + {{- end }} + {{- if .Values.sentry.genericMetricsConsumer.securityContext }} + securityContext: +{{ toYaml .Values.sentry.genericMetricsConsumer.securityContext | indent 8 }} + {{- end }} + containers: + - name: {{ .Chart.Name }}-generic-metrics-consumer + image: "{{ template "sentry.image" . }}" + imagePullPolicy: {{ default "IfNotPresent" .Values.images.sentry.pullPolicy }} + command: ["sentry"] + args: + - "run" + - "consumer" + - "ingest-generic-metrics" + - "--consumer-group" + - "generic-metrics-consumer" + {{- if .Values.sentry.genericMetricsConsumer.concurrency }} + - "--concurrency" + - "{{ .Values.sentry.genericMetricsConsumer.concurrency }}" + {{- end }} + {{- if .Values.sentry.genericMetricsConsumer.maxBatchSize }} + - "--max-batch-size" + - "{{ .Values.sentry.genericMetricsConsumer.maxBatchSize }}" + {{- end }} + env: + - name: C_FORCE_ROOT + value: "true" +{{ include "sentry.env" . | indent 8 }} +{{- if .Values.sentry.genericMetricsConsumer.env }} +{{ toYaml .Values.sentry.genericMetricsConsumer.env | indent 8 }} +{{- end }} + volumeMounts: + - mountPath: /etc/sentry + name: config + readOnly: true + - mountPath: {{ .Values.filestore.filesystem.path }} + name: sentry-data + {{- if and (eq .Values.filestore.backend "gcs") .Values.filestore.gcs.secretName }} + - name: sentry-google-cloud-key + mountPath: /var/run/secrets/google + {{ end }} +{{- if .Values.sentry.genericMetricsConsumer.volumeMounts }} +{{ toYaml .Values.sentry.genericMetricsConsumer.volumeMounts | indent 8 }} +{{- end }} + resources: +{{ toYaml .Values.sentry.genericMetricsConsumer.resources | indent 12 }} +{{- if .Values.sentry.genericMetricsConsumer.containerSecurityContext }} + securityContext: +{{ toYaml .Values.sentry.genericMetricsConsumer.containerSecurityContext | indent 12 }} +{{- end }} +{{- if .Values.sentry.genericMetricsConsumer.sidecars }} +{{ toYaml .Values.sentry.genericMetricsConsumer.sidecars | indent 6 }} +{{- end }} + {{- if .Values.serviceAccount.enabled }} + serviceAccountName: {{ .Values.serviceAccount.name }}-generic-metrics-consumer + {{- end }} + volumes: + - name: config + configMap: + name: {{ template "sentry.fullname" . }}-sentry + - name: sentry-data + {{- if and (eq .Values.filestore.backend "filesystem") .Values.filestore.filesystem.persistence.enabled (.Values.filestore.filesystem.persistence.persistentWorkers) }} + {{- if .Values.filestore.filesystem.persistence.existingClaim }} + persistentVolumeClaim: + claimName: {{ .Values.filestore.filesystem.persistence.existingClaim }} + {{- else }} + persistentVolumeClaim: + claimName: {{ template "sentry.fullname" . }}-data + {{- end }} + {{- else }} + emptyDir: {} + {{ end }} + {{- if and (eq .Values.filestore.backend "gcs") .Values.filestore.gcs.secretName }} + - name: sentry-google-cloud-key + secret: + secretName: {{ .Values.filestore.gcs.secretName }} + {{ end }} +{{- if .Values.sentry.genericMetricsConsumer.volumes }} +{{ toYaml .Values.sentry.genericMetricsConsumer.volumes | indent 6 }} +{{- end }} + {{- if .Values.sentry.genericMetricsConsumer.priorityClassName }} + priorityClassName: "{{ .Values.sentry.genericMetricsConsumer.priorityClassName }}" + {{- end }} diff --git a/sentry/templates/deployment-sentry-metrics-consumer.yaml b/sentry/templates/deployment-sentry-metrics-consumer.yaml new file mode 100644 index 000000000..069aca02f --- /dev/null +++ b/sentry/templates/deployment-sentry-metrics-consumer.yaml @@ -0,0 +1,148 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: {{ template "sentry.fullname" . }}-metrics-consumer + labels: + app: {{ template "sentry.fullname" . }} + chart: "{{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }}" + release: "{{ .Release.Name }}" + heritage: "{{ .Release.Service }}" + app.kubernetes.io/managed-by: "Helm" + {{- if .Values.asHook }} + {{- /* Add the Helm annotations so that deployment after asHook from true to false works */}} + annotations: + meta.helm.sh/release-name: "{{ .Release.Name }}" + meta.helm.sh/release-namespace: "{{ .Release.Namespace }}" + "helm.sh/hook": "post-install,post-upgrade" + "helm.sh/hook-weight": "10" + {{- end }} +spec: + revisionHistoryLimit: {{ .Values.revisionHistoryLimit }} + selector: + matchLabels: + app: {{ template "sentry.fullname" . }} + release: "{{ .Release.Name }}" + role: metrics-consumer + replicas: {{ .Values.sentry.metricsConsumer.replicas }} + template: + metadata: + annotations: + checksum/configYml: {{ .Values.config.configYml | toYaml | toString | sha256sum }} + checksum/sentryConfPy: {{ .Values.config.sentryConfPy | sha256sum }} + checksum/config.yaml: {{ include (print $.Template.BasePath "/configmap-sentry.yaml") . | sha256sum }} + {{- if .Values.sentry.metricsConsumer.annotations }} +{{ toYaml .Values.sentry.metricsConsumer.annotations | indent 8 }} + {{- end }} + labels: + app: {{ template "sentry.fullname" . }} + release: "{{ .Release.Name }}" + role: metrics-consumer + {{- if .Values.sentry.metricsConsumer.podLabels }} +{{ toYaml .Values.sentry.metricsConsumer.podLabels | indent 8 }} + {{- end }} + spec: + affinity: + {{- if .Values.sentry.metricsConsumer.affinity }} +{{ toYaml .Values.sentry.metricsConsumer.affinity | indent 8 }} + {{- end }} + {{- if .Values.sentry.metricsConsumer.nodeSelector }} + nodeSelector: +{{ toYaml .Values.sentry.metricsConsumer.nodeSelector | indent 8 }} + {{- end }} + {{- if .Values.sentry.metricsConsumer.tolerations }} + tolerations: +{{ toYaml .Values.sentry.metricsConsumer.tolerations | indent 8 }} + {{- end }} + {{- if .Values.images.sentry.imagePullSecrets }} + imagePullSecrets: +{{ toYaml .Values.images.sentry.imagePullSecrets | indent 8 }} + {{- end }} + {{- if .Values.dnsPolicy }} + dnsPolicy: {{ .Values.dnsPolicy | quote }} + {{- end }} + {{- if .Values.dnsConfig }} + dnsConfig: +{{ toYaml .Values.dnsConfig | indent 8 }} + {{- end }} + {{- if .Values.sentry.metricsConsumer.securityContext }} + securityContext: +{{ toYaml .Values.sentry.metricsConsumer.securityContext | indent 8 }} + {{- end }} + containers: + - name: {{ .Chart.Name }}-metrics-consumer + image: "{{ template "sentry.image" . }}" + imagePullPolicy: {{ default "IfNotPresent" .Values.images.sentry.pullPolicy }} + command: ["sentry"] + args: + - "run" + - "consumer" + - "ingest-metrics" + - "--consumer-group" + - "metrics-consumer" + {{- if .Values.sentry.metricsConsumer.concurrency }} + - "--concurrency" + - "{{ .Values.sentry.metricsConsumer.concurrency }}" + {{- end }} + {{- if .Values.sentry.metricsConsumer.maxBatchSize }} + - "--max-batch-size" + - "{{ .Values.sentry.metricsConsumer.maxBatchSize }}" + {{- end }} + env: + - name: C_FORCE_ROOT + value: "true" +{{ include "sentry.env" . | indent 8 }} +{{- if .Values.sentry.metricsConsumer.env }} +{{ toYaml .Values.sentry.metricsConsumer.env | indent 8 }} +{{- end }} + volumeMounts: + - mountPath: /etc/sentry + name: config + readOnly: true + - mountPath: {{ .Values.filestore.filesystem.path }} + name: sentry-data + {{- if and (eq .Values.filestore.backend "gcs") .Values.filestore.gcs.secretName }} + - name: sentry-google-cloud-key + mountPath: /var/run/secrets/google + {{ end }} +{{- if .Values.sentry.metricsConsumer.volumeMounts }} +{{ toYaml .Values.sentry.metricsConsumer.volumeMounts | indent 8 }} +{{- end }} + resources: +{{ toYaml .Values.sentry.metricsConsumer.resources | indent 12 }} +{{- if .Values.sentry.metricsConsumer.containerSecurityContext }} + securityContext: +{{ toYaml .Values.sentry.metricsConsumer.containerSecurityContext | indent 12 }} +{{- end }} +{{- if .Values.sentry.metricsConsumer.sidecars }} +{{ toYaml .Values.sentry.metricsConsumer.sidecars | indent 6 }} +{{- end }} + {{- if .Values.serviceAccount.enabled }} + serviceAccountName: {{ .Values.serviceAccount.name }}-metrics-consumer + {{- end }} + volumes: + - name: config + configMap: + name: {{ template "sentry.fullname" . }}-sentry + - name: sentry-data + {{- if and (eq .Values.filestore.backend "filesystem") .Values.filestore.filesystem.persistence.enabled (.Values.filestore.filesystem.persistence.persistentWorkers) }} + {{- if .Values.filestore.filesystem.persistence.existingClaim }} + persistentVolumeClaim: + claimName: {{ .Values.filestore.filesystem.persistence.existingClaim }} + {{- else }} + persistentVolumeClaim: + claimName: {{ template "sentry.fullname" . }}-data + {{- end }} + {{- else }} + emptyDir: {} + {{ end }} + {{- if and (eq .Values.filestore.backend "gcs") .Values.filestore.gcs.secretName }} + - name: sentry-google-cloud-key + secret: + secretName: {{ .Values.filestore.gcs.secretName }} + {{ end }} +{{- if .Values.sentry.metricsConsumer.volumes }} +{{ toYaml .Values.sentry.metricsConsumer.volumes | indent 6 }} +{{- end }} + {{- if .Values.sentry.metricsConsumer.priorityClassName }} + priorityClassName: "{{ .Values.sentry.metricsConsumer.priorityClassName }}" + {{- end }} diff --git a/sentry/templates/deployment-sentry-subscription-consumer-generic-metrics.yaml b/sentry/templates/deployment-sentry-subscription-consumer-generic-metrics.yaml new file mode 100644 index 000000000..17ee32beb --- /dev/null +++ b/sentry/templates/deployment-sentry-subscription-consumer-generic-metrics.yaml @@ -0,0 +1,148 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: {{ template "sentry.fullname" . }}-subscription-consumer-generic-metrics + labels: + app: {{ template "sentry.fullname" . }} + chart: "{{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }}" + release: "{{ .Release.Name }}" + heritage: "{{ .Release.Service }}" + app.kubernetes.io/managed-by: "Helm" + {{- if .Values.asHook }} + {{- /* Add the Helm annotations so that deployment after asHook from true to false works */}} + annotations: + meta.helm.sh/release-name: "{{ .Release.Name }}" + meta.helm.sh/release-namespace: "{{ .Release.Namespace }}" + "helm.sh/hook": "post-install,post-upgrade" + "helm.sh/hook-weight": "10" + {{- end }} +spec: + revisionHistoryLimit: {{ .Values.revisionHistoryLimit }} + selector: + matchLabels: + app: {{ template "sentry.fullname" . }} + release: "{{ .Release.Name }}" + role: subscription-consumer-generic-metrics + replicas: {{ .Values.sentry.subscriptionConsumerGenericMetrics.replicas }} + template: + metadata: + annotations: + checksum/configYml: {{ .Values.config.configYml | toYaml | toString | sha256sum }} + checksum/sentryConfPy: {{ .Values.config.sentryConfPy | sha256sum }} + checksum/config.yaml: {{ include (print $.Template.BasePath "/configmap-sentry.yaml") . | sha256sum }} + {{- if .Values.sentry.subscriptionConsumerGenericMetrics.annotations }} +{{ toYaml .Values.sentry.subscriptionConsumerGenericMetrics.annotations | indent 8 }} + {{- end }} + labels: + app: {{ template "sentry.fullname" . }} + release: "{{ .Release.Name }}" + role: subscription-consumer-generic-metrics + {{- if .Values.sentry.subscriptionConsumerGenericMetrics.podLabels }} +{{ toYaml .Values.sentry.subscriptionConsumerGenericMetrics.podLabels | indent 8 }} + {{- end }} + spec: + affinity: + {{- if .Values.sentry.subscriptionConsumerGenericMetrics.affinity }} +{{ toYaml .Values.sentry.subscriptionConsumerGenericMetrics.affinity | indent 8 }} + {{- end }} + {{- if .Values.sentry.subscriptionConsumerGenericMetrics.nodeSelector }} + nodeSelector: +{{ toYaml .Values.sentry.subscriptionConsumerGenericMetrics.nodeSelector | indent 8 }} + {{- end }} + {{- if .Values.sentry.subscriptionConsumerGenericMetrics.tolerations }} + tolerations: +{{ toYaml .Values.sentry.subscriptionConsumerGenericMetrics.tolerations | indent 8 }} + {{- end }} + {{- if .Values.images.sentry.imagePullSecrets }} + imagePullSecrets: +{{ toYaml .Values.images.sentry.imagePullSecrets | indent 8 }} + {{- end }} + {{- if .Values.dnsPolicy }} + dnsPolicy: {{ .Values.dnsPolicy | quote }} + {{- end }} + {{- if .Values.dnsConfig }} + dnsConfig: +{{ toYaml .Values.dnsConfig | indent 8 }} + {{- end }} + {{- if .Values.sentry.subscriptionConsumerGenericMetrics.securityContext }} + securityContext: +{{ toYaml .Values.sentry.subscriptionConsumerGenericMetrics.securityContext | indent 8 }} + {{- end }} + containers: + - name: {{ .Chart.Name }}-subscription-consumer-generic-metrics + image: "{{ template "sentry.image" . }}" + imagePullPolicy: {{ default "IfNotPresent" .Values.images.sentry.pullPolicy }} + command: ["sentry"] + args: + - "run" + - "consumer" + - "generic-metrics-subscription-results" + - "--consumer-group" + - "query-subscription-consumer" + {{- if .Values.sentry.subscriptionConsumerGenericMetrics.concurrency }} + - "--concurrency" + - "{{ .Values.sentry.subscriptionConsumerGenericMetrics.concurrency }}" + {{- end }} + {{- if .Values.sentry.subscriptionConsumerGenericMetrics.maxBatchSize }} + - "--max-batch-size" + - "{{ .Values.sentry.subscriptionConsumerGenericMetrics.maxBatchSize }}" + {{- end }} + env: + - name: C_FORCE_ROOT + value: "true" +{{ include "sentry.env" . | indent 8 }} +{{- if .Values.sentry.subscriptionConsumerGenericMetrics.env }} +{{ toYaml .Values.sentry.subscriptionConsumerGenericMetrics.env | indent 8 }} +{{- end }} + volumeMounts: + - mountPath: /etc/sentry + name: config + readOnly: true + - mountPath: {{ .Values.filestore.filesystem.path }} + name: sentry-data + {{- if and (eq .Values.filestore.backend "gcs") .Values.filestore.gcs.secretName }} + - name: sentry-google-cloud-key + mountPath: /var/run/secrets/google + {{ end }} +{{- if .Values.sentry.subscriptionConsumerGenericMetrics.volumeMounts }} +{{ toYaml .Values.sentry.subscriptionConsumerGenericMetrics.volumeMounts | indent 8 }} +{{- end }} + resources: +{{ toYaml .Values.sentry.subscriptionConsumerGenericMetrics.resources | indent 12 }} +{{- if .Values.sentry.subscriptionConsumerGenericMetrics.containerSecurityContext }} + securityContext: +{{ toYaml .Values.sentry.subscriptionConsumerGenericMetrics.containerSecurityContext | indent 12 }} +{{- end }} +{{- if .Values.sentry.subscriptionConsumerGenericMetrics.sidecars }} +{{ toYaml .Values.sentry.subscriptionConsumerGenericMetrics.sidecars | indent 6 }} +{{- end }} + {{- if .Values.serviceAccount.enabled }} + serviceAccountName: {{ .Values.serviceAccount.name }}-subscription-consumer-generic-metrics + {{- end }} + volumes: + - name: config + configMap: + name: {{ template "sentry.fullname" . }}-sentry + - name: sentry-data + {{- if and (eq .Values.filestore.backend "filesystem") .Values.filestore.filesystem.persistence.enabled (.Values.filestore.filesystem.persistence.persistentWorkers) }} + {{- if .Values.filestore.filesystem.persistence.existingClaim }} + persistentVolumeClaim: + claimName: {{ .Values.filestore.filesystem.persistence.existingClaim }} + {{- else }} + persistentVolumeClaim: + claimName: {{ template "sentry.fullname" . }}-data + {{- end }} + {{- else }} + emptyDir: {} + {{ end }} + {{- if and (eq .Values.filestore.backend "gcs") .Values.filestore.gcs.secretName }} + - name: sentry-google-cloud-key + secret: + secretName: {{ .Values.filestore.gcs.secretName }} + {{ end }} +{{- if .Values.sentry.subscriptionConsumerGenericMetrics.volumes }} +{{ toYaml .Values.sentry.subscriptionConsumerGenericMetrics.volumes | indent 6 }} +{{- end }} + {{- if .Values.sentry.subscriptionConsumerGenericMetrics.priorityClassName }} + priorityClassName: "{{ .Values.sentry.subscriptionConsumerGenericMetrics.priorityClassName }}" + {{- end }} diff --git a/sentry/templates/deployment-sentry-subscription-consumer-metrics.yaml b/sentry/templates/deployment-sentry-subscription-consumer-metrics.yaml new file mode 100644 index 000000000..fe39c89a3 --- /dev/null +++ b/sentry/templates/deployment-sentry-subscription-consumer-metrics.yaml @@ -0,0 +1,148 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: {{ template "sentry.fullname" . }}-subscription-consumer-metrics + labels: + app: {{ template "sentry.fullname" . }} + chart: "{{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }}" + release: "{{ .Release.Name }}" + heritage: "{{ .Release.Service }}" + app.kubernetes.io/managed-by: "Helm" + {{- if .Values.asHook }} + {{- /* Add the Helm annotations so that deployment after asHook from true to false works */}} + annotations: + meta.helm.sh/release-name: "{{ .Release.Name }}" + meta.helm.sh/release-namespace: "{{ .Release.Namespace }}" + "helm.sh/hook": "post-install,post-upgrade" + "helm.sh/hook-weight": "10" + {{- end }} +spec: + revisionHistoryLimit: {{ .Values.revisionHistoryLimit }} + selector: + matchLabels: + app: {{ template "sentry.fullname" . }} + release: "{{ .Release.Name }}" + role: subscription-consumer-metrics + replicas: {{ .Values.sentry.subscriptionConsumerMetrics.replicas }} + template: + metadata: + annotations: + checksum/configYml: {{ .Values.config.configYml | toYaml | toString | sha256sum }} + checksum/sentryConfPy: {{ .Values.config.sentryConfPy | sha256sum }} + checksum/config.yaml: {{ include (print $.Template.BasePath "/configmap-sentry.yaml") . | sha256sum }} + {{- if .Values.sentry.subscriptionConsumerMetrics.annotations }} +{{ toYaml .Values.sentry.subscriptionConsumerMetrics.annotations | indent 8 }} + {{- end }} + labels: + app: {{ template "sentry.fullname" . }} + release: "{{ .Release.Name }}" + role: subscription-consumer-metrics + {{- if .Values.sentry.subscriptionConsumerMetrics.podLabels }} +{{ toYaml .Values.sentry.subscriptionConsumerMetrics.podLabels | indent 8 }} + {{- end }} + spec: + affinity: + {{- if .Values.sentry.subscriptionConsumerMetrics.affinity }} +{{ toYaml .Values.sentry.subscriptionConsumerMetrics.affinity | indent 8 }} + {{- end }} + {{- if .Values.sentry.subscriptionConsumerMetrics.nodeSelector }} + nodeSelector: +{{ toYaml .Values.sentry.subscriptionConsumerMetrics.nodeSelector | indent 8 }} + {{- end }} + {{- if .Values.sentry.subscriptionConsumerMetrics.tolerations }} + tolerations: +{{ toYaml .Values.sentry.subscriptionConsumerMetrics.tolerations | indent 8 }} + {{- end }} + {{- if .Values.images.sentry.imagePullSecrets }} + imagePullSecrets: +{{ toYaml .Values.images.sentry.imagePullSecrets | indent 8 }} + {{- end }} + {{- if .Values.dnsPolicy }} + dnsPolicy: {{ .Values.dnsPolicy | quote }} + {{- end }} + {{- if .Values.dnsConfig }} + dnsConfig: +{{ toYaml .Values.dnsConfig | indent 8 }} + {{- end }} + {{- if .Values.sentry.subscriptionConsumerMetrics.securityContext }} + securityContext: +{{ toYaml .Values.sentry.subscriptionConsumerMetrics.securityContext | indent 8 }} + {{- end }} + containers: + - name: {{ .Chart.Name }}-subscription-consumer-metrics + image: "{{ template "sentry.image" . }}" + imagePullPolicy: {{ default "IfNotPresent" .Values.images.sentry.pullPolicy }} + command: ["sentry"] + args: + - "run" + - "consumer" + - "metrics-subscription-results" + - "--consumer-group" + - "query-subscription-consumer" + {{- if .Values.sentry.subscriptionConsumerMetrics.concurrency }} + - "--concurrency" + - "{{ .Values.sentry.subscriptionConsumerMetrics.concurrency }}" + {{- end }} + {{- if .Values.sentry.subscriptionConsumerMetrics.maxBatchSize }} + - "--max-batch-size" + - "{{ .Values.sentry.subscriptionConsumerMetrics.maxBatchSize }}" + {{- end }} + env: + - name: C_FORCE_ROOT + value: "true" +{{ include "sentry.env" . | indent 8 }} +{{- if .Values.sentry.subscriptionConsumerMetrics.env }} +{{ toYaml .Values.sentry.subscriptionConsumerMetrics.env | indent 8 }} +{{- end }} + volumeMounts: + - mountPath: /etc/sentry + name: config + readOnly: true + - mountPath: {{ .Values.filestore.filesystem.path }} + name: sentry-data + {{- if and (eq .Values.filestore.backend "gcs") .Values.filestore.gcs.secretName }} + - name: sentry-google-cloud-key + mountPath: /var/run/secrets/google + {{ end }} +{{- if .Values.sentry.subscriptionConsumerMetrics.volumeMounts }} +{{ toYaml .Values.sentry.subscriptionConsumerMetrics.volumeMounts | indent 8 }} +{{- end }} + resources: +{{ toYaml .Values.sentry.subscriptionConsumerMetrics.resources | indent 12 }} +{{- if .Values.sentry.subscriptionConsumerMetrics.containerSecurityContext }} + securityContext: +{{ toYaml .Values.sentry.subscriptionConsumerMetrics.containerSecurityContext | indent 12 }} +{{- end }} +{{- if .Values.sentry.subscriptionConsumerMetrics.sidecars }} +{{ toYaml .Values.sentry.subscriptionConsumerMetrics.sidecars | indent 6 }} +{{- end }} + {{- if .Values.serviceAccount.enabled }} + serviceAccountName: {{ .Values.serviceAccount.name }}-subscription-consumer-metrics + {{- end }} + volumes: + - name: config + configMap: + name: {{ template "sentry.fullname" . }}-sentry + - name: sentry-data + {{- if and (eq .Values.filestore.backend "filesystem") .Values.filestore.filesystem.persistence.enabled (.Values.filestore.filesystem.persistence.persistentWorkers) }} + {{- if .Values.filestore.filesystem.persistence.existingClaim }} + persistentVolumeClaim: + claimName: {{ .Values.filestore.filesystem.persistence.existingClaim }} + {{- else }} + persistentVolumeClaim: + claimName: {{ template "sentry.fullname" . }}-data + {{- end }} + {{- else }} + emptyDir: {} + {{ end }} + {{- if and (eq .Values.filestore.backend "gcs") .Values.filestore.gcs.secretName }} + - name: sentry-google-cloud-key + secret: + secretName: {{ .Values.filestore.gcs.secretName }} + {{ end }} +{{- if .Values.sentry.subscriptionConsumerMetrics.volumes }} +{{ toYaml .Values.sentry.subscriptionConsumerMetrics.volumes | indent 6 }} +{{- end }} + {{- if .Values.sentry.subscriptionConsumerMetrics.priorityClassName }} + priorityClassName: "{{ .Values.sentry.subscriptionConsumerMetrics.priorityClassName }}" + {{- end }} diff --git a/sentry/templates/deployment-snuba-generic-metrics-counters-consumer.yaml b/sentry/templates/deployment-snuba-generic-metrics-counters-consumer.yaml new file mode 100644 index 000000000..bdd420c58 --- /dev/null +++ b/sentry/templates/deployment-snuba-generic-metrics-counters-consumer.yaml @@ -0,0 +1,148 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: {{ template "sentry.fullname" . }}-snuba-generic-metrics-counters-consumer + labels: + app: {{ template "sentry.fullname" . }} + chart: "{{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }}" + release: "{{ .Release.Name }}" + heritage: "{{ .Release.Service }}" + app.kubernetes.io/managed-by: "Helm" + {{- if .Values.asHook }} + {{- /* Add the Helm annotations so that deployment after asHook from true to false works */}} + annotations: + meta.helm.sh/release-name: "{{ .Release.Name }}" + meta.helm.sh/release-namespace: "{{ .Release.Namespace }}" + "helm.sh/hook": "post-install,post-upgrade" + "helm.sh/hook-weight": "12" + {{- end }} +spec: + revisionHistoryLimit: {{ .Values.revisionHistoryLimit }} + selector: + matchLabels: + app: {{ template "sentry.fullname" . }} + release: "{{ .Release.Name }}" + role: snuba-generic-metrics-counters-consumer + replicas: {{ .Values.snuba.genericMetricsCountersConsumer.replicas }} + template: + metadata: + annotations: + checksum/snubaSettingsPy: {{ .Values.config.snubaSettingsPy | sha256sum }} + checksum/config.yaml: {{ include (print $.Template.BasePath "/configmap-snuba.yaml") . | sha256sum }} + {{- if .Values.snuba.genericMetricsCountersConsumer.annotations }} +{{ toYaml .Values.snuba.genericMetricsCountersConsumer.annotations | indent 8 }} + {{- end }} + labels: + app: {{ template "sentry.fullname" . }} + release: "{{ .Release.Name }}" + role: snuba-generic-metrics-counters-consumer + {{- if .Values.snuba.genericMetricsCountersConsumer.podLabels }} +{{ toYaml .Values.snuba.genericMetricsCountersConsumer.podLabels | indent 8 }} + {{- end }} + spec: + affinity: + {{- if .Values.snuba.genericMetricsCountersConsumer.affinity }} +{{ toYaml .Values.snuba.genericMetricsCountersConsumer.affinity | indent 8 }} + {{- end }} + {{- if .Values.snuba.genericMetricsCountersConsumer.nodeSelector }} + nodeSelector: +{{ toYaml .Values.snuba.genericMetricsCountersConsumer.nodeSelector | indent 8 }} + {{- end }} + {{- if .Values.snuba.genericMetricsCountersConsumer.tolerations }} + tolerations: +{{ toYaml .Values.snuba.genericMetricsCountersConsumer.tolerations | indent 8 }} + {{- end }} + {{- if .Values.images.snuba.imagePullSecrets }} + imagePullSecrets: +{{ toYaml .Values.images.snuba.imagePullSecrets | indent 8 }} + {{- end }} + {{- if .Values.dnsPolicy }} + dnsPolicy: {{ .Values.dnsPolicy | quote }} + {{- end }} + {{- if .Values.dnsConfig }} + dnsConfig: +{{ toYaml .Values.dnsConfig | indent 8 }} + {{- end }} + {{- if .Values.snuba.genericMetricsCountersConsumer.securityContext }} + securityContext: +{{ toYaml .Values.snuba.genericMetricsCountersConsumer.securityContext | indent 8 }} + {{- end }} + containers: + - name: {{ .Chart.Name }}-snuba + image: "{{ template "snuba.image" . }}" + imagePullPolicy: {{ default "IfNotPresent" .Values.images.snuba.pullPolicy }} + command: + - "snuba" + - "consumer" + - "--storage" + - "generic_metrics_counters_raw" + - "--consumer-group" + - "snuba-gen-metrics-counters-consumers" + - "--auto-offset-reset" + - "{{ .Values.snuba.genericMetricsCountersConsumer.autoOffsetReset }}" + - "--max-batch-time-ms" + - "750" + {{- if .Values.snuba.genericMetricsCountersConsumer.maxBatchSize }} + - "--max-batch-size" + - "{{ .Values.snuba.genericMetricsCountersConsumer.maxBatchSize }}" + {{- end }} + {{- if .Values.snuba.genericMetricsCountersConsumer.processes }} + - "--processes" + - "{{ .Values.snuba.genericMetricsCountersConsumer.processes }}" + {{- end }} + {{- if .Values.snuba.genericMetricsCountersConsumer.inputBlockSize }} + - "--input-block-size" + - "{{ .Values.snuba.genericMetricsCountersConsumer.inputBlockSize }}" + {{- end }} + {{- if .Values.snuba.genericMetricsCountersConsumer.outputBlockSize }} + - "--output-block-size" + - "{{ .Values.snuba.genericMetricsCountersConsumer.outputBlockSize }}" + {{- end }} + {{- if .Values.snuba.genericMetricsCountersConsumer.maxBatchTimeMs }} + - "--max-batch-time-ms" + - "{{ .Values.snuba.genericMetricsCountersConsumer.maxBatchTimeMs }}" + {{- end }} + {{- if .Values.snuba.genericMetricsCountersConsumer.queuedMaxMessagesKbytes }} + - "--queued-max-messages-kbytes" + - "{{ .Values.snuba.genericMetricsCountersConsumer.queuedMaxMessagesKbytes }}" + {{- end }} + {{- if .Values.snuba.genericMetricsCountersConsumer.queuedMinMessages }} + - "--queued-min-messages" + - "{{ .Values.snuba.genericMetricsCountersConsumer.queuedMinMessages }}" + {{- end }} + {{- if .Values.snuba.genericMetricsCountersConsumer.noStrictOffsetReset }} + - "--no-strict-offset-reset" + {{- end }} + ports: + - containerPort: {{ template "snuba.port" }} + env: +{{ include "sentry.snuba.env" . | indent 8 }} +{{- if .Values.snuba.genericMetricsCountersConsumer.env }} +{{ toYaml .Values.snuba.genericMetricsCountersConsumer.env | indent 8 }} +{{- end }} + envFrom: + - secretRef: + name: {{ template "sentry.fullname" . }}-snuba-env + volumeMounts: + - mountPath: /etc/snuba + name: config + readOnly: true +{{- if .Values.snuba.genericMetricsCountersConsumer.volumeMounts }} +{{ toYaml .Values.snuba.genericMetricsCountersConsumer.volumeMounts | indent 8 }} +{{- end }} + resources: +{{ toYaml .Values.snuba.genericMetricsCountersConsumer.resources | indent 12 }} +{{- if .Values.snuba.genericMetricsCountersConsumer.containerSecurityContext }} + securityContext: +{{ toYaml .Values.snuba.genericMetricsCountersConsumer.containerSecurityContext | indent 12 }} +{{- end }} + {{- if .Values.serviceAccount.enabled }} + serviceAccountName: {{ .Values.serviceAccount.name }}-snuba + {{- end }} + volumes: + - name: config + configMap: + name: {{ template "sentry.fullname" . }}-snuba +{{- if .Values.snuba.genericMetricsCountersConsumer.volumes }} +{{ toYaml .Values.snuba.genericMetricsCountersConsumer.volumes | indent 8 }} +{{- end }} diff --git a/sentry/templates/deployment-snuba-generic-metrics-distributions-consumer.yaml b/sentry/templates/deployment-snuba-generic-metrics-distributions-consumer.yaml new file mode 100644 index 000000000..00d83c6bd --- /dev/null +++ b/sentry/templates/deployment-snuba-generic-metrics-distributions-consumer.yaml @@ -0,0 +1,148 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: {{ template "sentry.fullname" . }}-snuba-generic-metrics-distributions-consumer + labels: + app: {{ template "sentry.fullname" . }} + chart: "{{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }}" + release: "{{ .Release.Name }}" + heritage: "{{ .Release.Service }}" + app.kubernetes.io/managed-by: "Helm" + {{- if .Values.asHook }} + {{- /* Add the Helm annotations so that deployment after asHook from true to false works */}} + annotations: + meta.helm.sh/release-name: "{{ .Release.Name }}" + meta.helm.sh/release-namespace: "{{ .Release.Namespace }}" + "helm.sh/hook": "post-install,post-upgrade" + "helm.sh/hook-weight": "12" + {{- end }} +spec: + revisionHistoryLimit: {{ .Values.revisionHistoryLimit }} + selector: + matchLabels: + app: {{ template "sentry.fullname" . }} + release: "{{ .Release.Name }}" + role: snuba-generic-metrics-distributions-consumer + replicas: {{ .Values.snuba.genericMetricsDistributionConsumer.replicas }} + template: + metadata: + annotations: + checksum/snubaSettingsPy: {{ .Values.config.snubaSettingsPy | sha256sum }} + checksum/config.yaml: {{ include (print $.Template.BasePath "/configmap-snuba.yaml") . | sha256sum }} + {{- if .Values.snuba.genericMetricsDistributionConsumer.annotations }} +{{ toYaml .Values.snuba.genericMetricsDistributionConsumer.annotations | indent 8 }} + {{- end }} + labels: + app: {{ template "sentry.fullname" . }} + release: "{{ .Release.Name }}" + role: snuba-generic-metrics-distributions-consumer + {{- if .Values.snuba.genericMetricsDistributionConsumer.podLabels }} +{{ toYaml .Values.snuba.genericMetricsDistributionConsumer.podLabels | indent 8 }} + {{- end }} + spec: + affinity: + {{- if .Values.snuba.genericMetricsDistributionConsumer.affinity }} +{{ toYaml .Values.snuba.genericMetricsDistributionConsumer.affinity | indent 8 }} + {{- end }} + {{- if .Values.snuba.genericMetricsDistributionConsumer.nodeSelector }} + nodeSelector: +{{ toYaml .Values.snuba.genericMetricsDistributionConsumer.nodeSelector | indent 8 }} + {{- end }} + {{- if .Values.snuba.genericMetricsDistributionConsumer.tolerations }} + tolerations: +{{ toYaml .Values.snuba.genericMetricsDistributionConsumer.tolerations | indent 8 }} + {{- end }} + {{- if .Values.images.snuba.imagePullSecrets }} + imagePullSecrets: +{{ toYaml .Values.images.snuba.imagePullSecrets | indent 8 }} + {{- end }} + {{- if .Values.dnsPolicy }} + dnsPolicy: {{ .Values.dnsPolicy | quote }} + {{- end }} + {{- if .Values.dnsConfig }} + dnsConfig: +{{ toYaml .Values.dnsConfig | indent 8 }} + {{- end }} + {{- if .Values.snuba.genericMetricsDistributionConsumer.securityContext }} + securityContext: +{{ toYaml .Values.snuba.genericMetricsDistributionConsumer.securityContext | indent 8 }} + {{- end }} + containers: + - name: {{ .Chart.Name }}-snuba + image: "{{ template "snuba.image" . }}" + imagePullPolicy: {{ default "IfNotPresent" .Values.images.snuba.pullPolicy }} + command: + - "snuba" + - "consumer" + - "--storage" + - "generic_metrics_distributions_raw" + - "--consumer-group" + - "snuba-gen-metrics-distributions-consumers" + - "--auto-offset-reset" + - "{{ .Values.snuba.genericMetricsDistributionConsumer.autoOffsetReset }}" + - "--max-batch-time-ms" + - "750" + {{- if .Values.snuba.genericMetricsDistributionConsumer.maxBatchSize }} + - "--max-batch-size" + - "{{ .Values.snuba.genericMetricsDistributionConsumer.maxBatchSize }}" + {{- end }} + {{- if .Values.snuba.genericMetricsDistributionConsumer.processes }} + - "--processes" + - "{{ .Values.snuba.genericMetricsDistributionConsumer.processes }}" + {{- end }} + {{- if .Values.snuba.genericMetricsDistributionConsumer.inputBlockSize }} + - "--input-block-size" + - "{{ .Values.snuba.genericMetricsDistributionConsumer.inputBlockSize }}" + {{- end }} + {{- if .Values.snuba.genericMetricsDistributionConsumer.outputBlockSize }} + - "--output-block-size" + - "{{ .Values.snuba.genericMetricsDistributionConsumer.outputBlockSize }}" + {{- end }} + {{- if .Values.snuba.genericMetricsDistributionConsumer.maxBatchTimeMs }} + - "--max-batch-time-ms" + - "{{ .Values.snuba.genericMetricsDistributionConsumer.maxBatchTimeMs }}" + {{- end }} + {{- if .Values.snuba.genericMetricsDistributionConsumer.queuedMaxMessagesKbytes }} + - "--queued-max-messages-kbytes" + - "{{ .Values.snuba.genericMetricsDistributionConsumer.queuedMaxMessagesKbytes }}" + {{- end }} + {{- if .Values.snuba.genericMetricsDistributionConsumer.queuedMinMessages }} + - "--queued-min-messages" + - "{{ .Values.snuba.genericMetricsDistributionConsumer.queuedMinMessages }}" + {{- end }} + {{- if .Values.snuba.genericMetricsDistributionConsumer.noStrictOffsetReset }} + - "--no-strict-offset-reset" + {{- end }} + ports: + - containerPort: {{ template "snuba.port" }} + env: +{{ include "sentry.snuba.env" . | indent 8 }} +{{- if .Values.snuba.genericMetricsDistributionConsumer.env }} +{{ toYaml .Values.snuba.genericMetricsDistributionConsumer.env | indent 8 }} +{{- end }} + envFrom: + - secretRef: + name: {{ template "sentry.fullname" . }}-snuba-env + volumeMounts: + - mountPath: /etc/snuba + name: config + readOnly: true +{{- if .Values.snuba.genericMetricsDistributionConsumer.volumeMounts }} +{{ toYaml .Values.snuba.genericMetricsDistributionConsumer.volumeMounts | indent 8 }} +{{- end }} + resources: +{{ toYaml .Values.snuba.genericMetricsDistributionConsumer.resources | indent 12 }} +{{- if .Values.snuba.genericMetricsDistributionConsumer.containerSecurityContext }} + securityContext: +{{ toYaml .Values.snuba.genericMetricsDistributionConsumer.containerSecurityContext | indent 12 }} +{{- end }} + {{- if .Values.serviceAccount.enabled }} + serviceAccountName: {{ .Values.serviceAccount.name }}-snuba + {{- end }} + volumes: + - name: config + configMap: + name: {{ template "sentry.fullname" . }}-snuba +{{- if .Values.snuba.genericMetricsDistributionConsumer.volumes }} +{{ toYaml .Values.snuba.genericMetricsDistributionConsumer.volumes | indent 8 }} +{{- end }} diff --git a/sentry/templates/deployment-snuba-generic-metrics-sets-consumer.yaml b/sentry/templates/deployment-snuba-generic-metrics-sets-consumer.yaml new file mode 100644 index 000000000..7a5a2f7b3 --- /dev/null +++ b/sentry/templates/deployment-snuba-generic-metrics-sets-consumer.yaml @@ -0,0 +1,148 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: {{ template "sentry.fullname" . }}-snuba-generic-metrics-sets-consumer + labels: + app: {{ template "sentry.fullname" . }} + chart: "{{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }}" + release: "{{ .Release.Name }}" + heritage: "{{ .Release.Service }}" + app.kubernetes.io/managed-by: "Helm" + {{- if .Values.asHook }} + {{- /* Add the Helm annotations so that deployment after asHook from true to false works */}} + annotations: + meta.helm.sh/release-name: "{{ .Release.Name }}" + meta.helm.sh/release-namespace: "{{ .Release.Namespace }}" + "helm.sh/hook": "post-install,post-upgrade" + "helm.sh/hook-weight": "12" + {{- end }} +spec: + revisionHistoryLimit: {{ .Values.revisionHistoryLimit }} + selector: + matchLabels: + app: {{ template "sentry.fullname" . }} + release: "{{ .Release.Name }}" + role: snuba-generic-metrics-sets-consumer + replicas: {{ .Values.snuba.genericMetricsSetsConsumer.replicas }} + template: + metadata: + annotations: + checksum/snubaSettingsPy: {{ .Values.config.snubaSettingsPy | sha256sum }} + checksum/config.yaml: {{ include (print $.Template.BasePath "/configmap-snuba.yaml") . | sha256sum }} + {{- if .Values.snuba.genericMetricsSetsConsumer.annotations }} +{{ toYaml .Values.snuba.genericMetricsSetsConsumer.annotations | indent 8 }} + {{- end }} + labels: + app: {{ template "sentry.fullname" . }} + release: "{{ .Release.Name }}" + role: snuba-generic-metrics-sets-consumer + {{- if .Values.snuba.genericMetricsSetsConsumer.podLabels }} +{{ toYaml .Values.snuba.genericMetricsSetsConsumer.podLabels | indent 8 }} + {{- end }} + spec: + affinity: + {{- if .Values.snuba.genericMetricsSetsConsumer.affinity }} +{{ toYaml .Values.snuba.genericMetricsSetsConsumer.affinity | indent 8 }} + {{- end }} + {{- if .Values.snuba.genericMetricsSetsConsumer.nodeSelector }} + nodeSelector: +{{ toYaml .Values.snuba.genericMetricsSetsConsumer.nodeSelector | indent 8 }} + {{- end }} + {{- if .Values.snuba.genericMetricsSetsConsumer.tolerations }} + tolerations: +{{ toYaml .Values.snuba.genericMetricsSetsConsumer.tolerations | indent 8 }} + {{- end }} + {{- if .Values.images.snuba.imagePullSecrets }} + imagePullSecrets: +{{ toYaml .Values.images.snuba.imagePullSecrets | indent 8 }} + {{- end }} + {{- if .Values.dnsPolicy }} + dnsPolicy: {{ .Values.dnsPolicy | quote }} + {{- end }} + {{- if .Values.dnsConfig }} + dnsConfig: +{{ toYaml .Values.dnsConfig | indent 8 }} + {{- end }} + {{- if .Values.snuba.genericMetricsSetsConsumer.securityContext }} + securityContext: +{{ toYaml .Values.snuba.genericMetricsSetsConsumer.securityContext | indent 8 }} + {{- end }} + containers: + - name: {{ .Chart.Name }}-snuba + image: "{{ template "snuba.image" . }}" + imagePullPolicy: {{ default "IfNotPresent" .Values.images.snuba.pullPolicy }} + command: + - "snuba" + - "consumer" + - "--storage" + - "generic_metrics_sets_raw" + - "--consumer-group" + - "snuba-gen-metrics-sets-consumers" + - "--auto-offset-reset" + - "{{ .Values.snuba.genericMetricsSetsConsumer.autoOffsetReset }}" + - "--max-batch-time-ms" + - "750" + {{- if .Values.snuba.genericMetricsSetsConsumer.maxBatchSize }} + - "--max-batch-size" + - "{{ .Values.snuba.genericMetricsSetsConsumer.maxBatchSize }}" + {{- end }} + {{- if .Values.snuba.genericMetricsSetsConsumer.processes }} + - "--processes" + - "{{ .Values.snuba.genericMetricsSetsConsumer.processes }}" + {{- end }} + {{- if .Values.snuba.genericMetricsSetsConsumer.inputBlockSize }} + - "--input-block-size" + - "{{ .Values.snuba.genericMetricsSetsConsumer.inputBlockSize }}" + {{- end }} + {{- if .Values.snuba.genericMetricsSetsConsumer.outputBlockSize }} + - "--output-block-size" + - "{{ .Values.snuba.genericMetricsSetsConsumer.outputBlockSize }}" + {{- end }} + {{- if .Values.snuba.genericMetricsSetsConsumer.maxBatchTimeMs }} + - "--max-batch-time-ms" + - "{{ .Values.snuba.genericMetricsSetsConsumer.maxBatchTimeMs }}" + {{- end }} + {{- if .Values.snuba.genericMetricsSetsConsumer.queuedMaxMessagesKbytes }} + - "--queued-max-messages-kbytes" + - "{{ .Values.snuba.genericMetricsSetsConsumer.queuedMaxMessagesKbytes }}" + {{- end }} + {{- if .Values.snuba.genericMetricsSetsConsumer.queuedMinMessages }} + - "--queued-min-messages" + - "{{ .Values.snuba.genericMetricsSetsConsumer.queuedMinMessages }}" + {{- end }} + {{- if .Values.snuba.genericMetricsSetsConsumer.noStrictOffsetReset }} + - "--no-strict-offset-reset" + {{- end }} + ports: + - containerPort: {{ template "snuba.port" }} + env: +{{ include "sentry.snuba.env" . | indent 8 }} +{{- if .Values.snuba.genericMetricsSetsConsumer.env }} +{{ toYaml .Values.snuba.genericMetricsSetsConsumer.env | indent 8 }} +{{- end }} + envFrom: + - secretRef: + name: {{ template "sentry.fullname" . }}-snuba-env + volumeMounts: + - mountPath: /etc/snuba + name: config + readOnly: true +{{- if .Values.snuba.genericMetricsSetsConsumer.volumeMounts }} +{{ toYaml .Values.snuba.genericMetricsSetsConsumer.volumeMounts | indent 8 }} +{{- end }} + resources: +{{ toYaml .Values.snuba.genericMetricsSetsConsumer.resources | indent 12 }} +{{- if .Values.snuba.genericMetricsSetsConsumer.containerSecurityContext }} + securityContext: +{{ toYaml .Values.snuba.genericMetricsSetsConsumer.containerSecurityContext | indent 12 }} +{{- end }} + {{- if .Values.serviceAccount.enabled }} + serviceAccountName: {{ .Values.serviceAccount.name }}-snuba + {{- end }} + volumes: + - name: config + configMap: + name: {{ template "sentry.fullname" . }}-snuba +{{- if .Values.snuba.genericMetricsSetsConsumer.volumes }} +{{ toYaml .Values.snuba.genericMetricsSetsConsumer.volumes | indent 8 }} +{{- end }} diff --git a/sentry/templates/deployment-snuba-metrics-consumer.yaml b/sentry/templates/deployment-snuba-metrics-consumer.yaml new file mode 100644 index 000000000..7d5f2fd98 --- /dev/null +++ b/sentry/templates/deployment-snuba-metrics-consumer.yaml @@ -0,0 +1,148 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: {{ template "sentry.fullname" . }}-snuba-metrics-consumer + labels: + app: {{ template "sentry.fullname" . }} + chart: "{{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }}" + release: "{{ .Release.Name }}" + heritage: "{{ .Release.Service }}" + app.kubernetes.io/managed-by: "Helm" + {{- if .Values.asHook }} + {{- /* Add the Helm annotations so that deployment after asHook from true to false works */}} + annotations: + meta.helm.sh/release-name: "{{ .Release.Name }}" + meta.helm.sh/release-namespace: "{{ .Release.Namespace }}" + "helm.sh/hook": "post-install,post-upgrade" + "helm.sh/hook-weight": "12" + {{- end }} +spec: + revisionHistoryLimit: {{ .Values.revisionHistoryLimit }} + selector: + matchLabels: + app: {{ template "sentry.fullname" . }} + release: "{{ .Release.Name }}" + role: snuba-metrics-consumer + replicas: {{ .Values.snuba.metricsConsumer.replicas }} + template: + metadata: + annotations: + checksum/snubaSettingsPy: {{ .Values.config.snubaSettingsPy | sha256sum }} + checksum/config.yaml: {{ include (print $.Template.BasePath "/configmap-snuba.yaml") . | sha256sum }} + {{- if .Values.snuba.metricsConsumer.annotations }} +{{ toYaml .Values.snuba.metricsConsumer.annotations | indent 8 }} + {{- end }} + labels: + app: {{ template "sentry.fullname" . }} + release: "{{ .Release.Name }}" + role: snuba-metrics-consumer + {{- if .Values.snuba.metricsConsumer.podLabels }} +{{ toYaml .Values.snuba.metricsConsumer.podLabels | indent 8 }} + {{- end }} + spec: + affinity: + {{- if .Values.snuba.metricsConsumer.affinity }} +{{ toYaml .Values.snuba.metricsConsumer.affinity | indent 8 }} + {{- end }} + {{- if .Values.snuba.metricsConsumer.nodeSelector }} + nodeSelector: +{{ toYaml .Values.snuba.metricsConsumer.nodeSelector | indent 8 }} + {{- end }} + {{- if .Values.snuba.metricsConsumer.tolerations }} + tolerations: +{{ toYaml .Values.snuba.metricsConsumer.tolerations | indent 8 }} + {{- end }} + {{- if .Values.images.snuba.imagePullSecrets }} + imagePullSecrets: +{{ toYaml .Values.images.snuba.imagePullSecrets | indent 8 }} + {{- end }} + {{- if .Values.dnsPolicy }} + dnsPolicy: {{ .Values.dnsPolicy | quote }} + {{- end }} + {{- if .Values.dnsConfig }} + dnsConfig: +{{ toYaml .Values.dnsConfig | indent 8 }} + {{- end }} + {{- if .Values.snuba.metricsConsumer.securityContext }} + securityContext: +{{ toYaml .Values.snuba.metricsConsumer.securityContext | indent 8 }} + {{- end }} + containers: + - name: {{ .Chart.Name }}-snuba + image: "{{ template "snuba.image" . }}" + imagePullPolicy: {{ default "IfNotPresent" .Values.images.snuba.pullPolicy }} + command: + - "snuba" + - "consumer" + - "--storage" + - "metrics_raw" + - "--consumer-group" + - "snuba-metrics-consumers" + - "--auto-offset-reset" + - "{{ .Values.snuba.metricsConsumer.autoOffsetReset }}" + - "--max-batch-time-ms" + - "750" + {{- if .Values.snuba.metricsConsumer.maxBatchSize }} + - "--max-batch-size" + - "{{ .Values.snuba.metricsConsumer.maxBatchSize }}" + {{- end }} + {{- if .Values.snuba.metricsConsumer.processes }} + - "--processes" + - "{{ .Values.snuba.metricsConsumer.processes }}" + {{- end }} + {{- if .Values.snuba.metricsConsumer.inputBlockSize }} + - "--input-block-size" + - "{{ .Values.snuba.metricsConsumer.inputBlockSize }}" + {{- end }} + {{- if .Values.snuba.metricsConsumer.outputBlockSize }} + - "--output-block-size" + - "{{ .Values.snuba.metricsConsumer.outputBlockSize }}" + {{- end }} + {{- if .Values.snuba.metricsConsumer.maxBatchTimeMs }} + - "--max-batch-time-ms" + - "{{ .Values.snuba.metricsConsumer.maxBatchTimeMs }}" + {{- end }} + {{- if .Values.snuba.metricsConsumer.queuedMaxMessagesKbytes }} + - "--queued-max-messages-kbytes" + - "{{ .Values.snuba.metricsConsumer.queuedMaxMessagesKbytes }}" + {{- end }} + {{- if .Values.snuba.metricsConsumer.queuedMinMessages }} + - "--queued-min-messages" + - "{{ .Values.snuba.metricsConsumer.queuedMinMessages }}" + {{- end }} + {{- if .Values.snuba.metricsConsumer.noStrictOffsetReset }} + - "--no-strict-offset-reset" + {{- end }} + ports: + - containerPort: {{ template "snuba.port" }} + env: +{{ include "sentry.snuba.env" . | indent 8 }} +{{- if .Values.snuba.metricsConsumer.env }} +{{ toYaml .Values.snuba.metricsConsumer.env | indent 8 }} +{{- end }} + envFrom: + - secretRef: + name: {{ template "sentry.fullname" . }}-snuba-env + volumeMounts: + - mountPath: /etc/snuba + name: config + readOnly: true +{{- if .Values.snuba.metricsConsumer.volumeMounts }} +{{ toYaml .Values.snuba.metricsConsumer.volumeMounts | indent 8 }} +{{- end }} + resources: +{{ toYaml .Values.snuba.metricsConsumer.resources | indent 12 }} +{{- if .Values.snuba.metricsConsumer.containerSecurityContext }} + securityContext: +{{ toYaml .Values.snuba.metricsConsumer.containerSecurityContext | indent 12 }} +{{- end }} + {{- if .Values.serviceAccount.enabled }} + serviceAccountName: {{ .Values.serviceAccount.name }}-snuba + {{- end }} + volumes: + - name: config + configMap: + name: {{ template "sentry.fullname" . }}-snuba +{{- if .Values.snuba.metricsConsumer.volumes }} +{{ toYaml .Values.snuba.metricsConsumer.volumes | indent 8 }} +{{- end }} diff --git a/sentry/templates/deployment-snuba-subscription-consumer-metrics.yaml b/sentry/templates/deployment-snuba-subscription-consumer-metrics.yaml new file mode 100644 index 000000000..cb470312b --- /dev/null +++ b/sentry/templates/deployment-snuba-subscription-consumer-metrics.yaml @@ -0,0 +1,114 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: {{ template "sentry.fullname" . }}-snuba-subscription-consumer-metrics + labels: + app: {{ template "sentry.fullname" . }} + chart: "{{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }}" + release: "{{ .Release.Name }}" + heritage: "{{ .Release.Service }}" + app.kubernetes.io/managed-by: "Helm" + {{- if .Values.asHook }} + {{- /* Add the Helm annotations so that deployment after asHook from true to false works */}} + annotations: + meta.helm.sh/release-name: "{{ .Release.Name }}" + meta.helm.sh/release-namespace: "{{ .Release.Namespace }}" + "helm.sh/hook": "post-install,post-upgrade" + "helm.sh/hook-weight": "18" + {{- end }} +spec: + revisionHistoryLimit: {{ .Values.revisionHistoryLimit }} + selector: + matchLabels: + app: {{ template "sentry.fullname" . }} + release: "{{ .Release.Name }}" + role: snuba-subscription-consumer-metrics + replicas: {{ .Values.snuba.subscriptionConsumerMetrics.replicas }} + template: + metadata: + annotations: + checksum/snubaSettingsPy: {{ .Values.config.snubaSettingsPy | sha256sum }} + checksum/config.yaml: {{ include (print $.Template.BasePath "/configmap-snuba.yaml") . | sha256sum }} + {{- if .Values.snuba.subscriptionConsumerMetrics.annotations }} +{{ toYaml .Values.snuba.subscriptionConsumerMetrics.annotations | indent 8 }} + {{- end }} + labels: + app: {{ template "sentry.fullname" . }} + release: "{{ .Release.Name }}" + role: snuba-subscription-consumer-metrics + {{- if .Values.snuba.subscriptionConsumerMetrics.podLabels }} +{{ toYaml .Values.snuba.subscriptionConsumerMetrics.podLabels | indent 8 }} + {{- end }} + spec: + affinity: + {{- if .Values.snuba.subscriptionConsumerMetrics.affinity }} +{{ toYaml .Values.snuba.subscriptionConsumerMetrics.affinity | indent 8 }} + {{- end }} + {{- if .Values.snuba.subscriptionConsumerMetrics.nodeSelector }} + nodeSelector: +{{ toYaml .Values.snuba.subscriptionConsumerMetrics.nodeSelector | indent 8 }} + {{- end }} + {{- if .Values.snuba.subscriptionConsumerMetrics.tolerations }} + tolerations: +{{ toYaml .Values.snuba.subscriptionConsumerMetrics.tolerations | indent 8 }} + {{- end }} + {{- if .Values.images.snuba.imagePullSecrets }} + imagePullSecrets: +{{ toYaml .Values.images.snuba.imagePullSecrets | indent 8 }} + {{- end }} + {{- if .Values.snuba.subscriptionConsumerMetrics.securityContext }} + securityContext: +{{ toYaml .Values.snuba.subscriptionConsumerMetrics.securityContext | indent 8 }} + {{- end }} + containers: + - name: {{ .Chart.Name }}-snuba + image: "{{ template "snuba.image" . }}" + imagePullPolicy: {{ default "IfNotPresent" .Values.images.snuba.pullPolicy }} + command: + - "snuba" + - "subscriptions-scheduler-executor" + - "--auto-offset-reset={{ .Values.snuba.subscriptionConsumerMetrics.autoOffsetReset }}" + - "--dataset=metrics" + - "--entity=metrics_sets" + - "--entity=metrics_counters" + {{- if .Values.snuba.subscriptionConsumerMetrics.noStrictOffsetReset }} + - "--no-strict-offset-reset" + {{- end }} + - "--consumer-group=nuba-metrics-subscriptions-consumers" + - "--followed-consumer-group=snuba-metrics-consumers" + - "--delay-seconds=60" + - "--schedule-ttl=60" + - "--stale-threshold-seconds=900" + ports: + - containerPort: {{ template "snuba.port" }} + env: +{{ include "sentry.snuba.env" . | indent 8 }} +{{- if .Values.snuba.subscriptionConsumerMetrics.env }} +{{ toYaml .Values.snuba.subscriptionConsumerMetrics.env | indent 8 }} +{{- end }} + envFrom: + - secretRef: + name: {{ template "sentry.fullname" . }}-snuba-env + volumeMounts: + - mountPath: /etc/snuba + name: config + readOnly: true +{{- if .Values.snuba.subscriptionConsumerMetrics.volumeMounts }} +{{ toYaml .Values.snuba.subscriptionConsumerMetrics.volumeMounts | indent 8 }} +{{- end }} + resources: +{{ toYaml .Values.snuba.subscriptionConsumerMetrics.resources | indent 12 }} +{{- if .Values.snuba.subscriptionConsumerMetrics.containerSecurityContext }} + securityContext: +{{ toYaml .Values.snuba.subscriptionConsumerMetrics.containerSecurityContext | indent 12 }} +{{- end }} + {{- if .Values.serviceAccount.enabled }} + serviceAccountName: {{ .Values.serviceAccount.name }}-snuba + {{- end }} + volumes: + - name: config + configMap: + name: {{ template "sentry.fullname" . }}-snuba +{{- if .Values.snuba.subscriptionConsumerMetrics.volumes }} +{{ toYaml .Values.snuba.subscriptionConsumerMetrics.volumes | indent 6 }} +{{- end }} diff --git a/sentry/templates/serviceaccount-sentry-generic-metrics-consumer.yaml b/sentry/templates/serviceaccount-sentry-generic-metrics-consumer.yaml new file mode 100644 index 000000000..5c410f433 --- /dev/null +++ b/sentry/templates/serviceaccount-sentry-generic-metrics-consumer.yaml @@ -0,0 +1,10 @@ +{{- if .Values.serviceAccount.enabled }} +apiVersion: v1 +kind: ServiceAccount +metadata: + name: {{ .Values.serviceAccount.name }}-generic-metrics-consumer +{{- if .Values.serviceAccount.annotations }} + annotations: {{ toYaml .Values.serviceAccount.annotations | nindent 4 }} +{{- end }} +automountServiceAccountToken: {{ .Values.serviceAccount.automountServiceAccountToken }} +{{- end }} diff --git a/sentry/templates/serviceaccount-sentry-metrics-consumer.yaml b/sentry/templates/serviceaccount-sentry-metrics-consumer.yaml new file mode 100644 index 000000000..976c66691 --- /dev/null +++ b/sentry/templates/serviceaccount-sentry-metrics-consumer.yaml @@ -0,0 +1,10 @@ +{{- if .Values.serviceAccount.enabled }} +apiVersion: v1 +kind: ServiceAccount +metadata: + name: {{ .Values.serviceAccount.name }}-metrics-consumer +{{- if .Values.serviceAccount.annotations }} + annotations: {{ toYaml .Values.serviceAccount.annotations | nindent 4 }} +{{- end }} +automountServiceAccountToken: {{ .Values.serviceAccount.automountServiceAccountToken }} +{{- end }} diff --git a/sentry/templates/serviceaccount-sentry-subscription-consumer-generic-metrics.yaml b/sentry/templates/serviceaccount-sentry-subscription-consumer-generic-metrics.yaml new file mode 100644 index 000000000..04fd5fd8a --- /dev/null +++ b/sentry/templates/serviceaccount-sentry-subscription-consumer-generic-metrics.yaml @@ -0,0 +1,10 @@ +{{- if .Values.serviceAccount.enabled }} +apiVersion: v1 +kind: ServiceAccount +metadata: + name: {{ .Values.serviceAccount.name }}-subscription-consumer-generic-metrics +{{- if .Values.serviceAccount.annotations }} + annotations: {{ toYaml .Values.serviceAccount.annotations | nindent 4 }} +{{- end }} +automountServiceAccountToken: {{ .Values.serviceAccount.automountServiceAccountToken }} +{{- end }} diff --git a/sentry/templates/serviceaccount-sentry-subscription-consumer-metrics.yaml b/sentry/templates/serviceaccount-sentry-subscription-consumer-metrics.yaml new file mode 100644 index 000000000..f08422933 --- /dev/null +++ b/sentry/templates/serviceaccount-sentry-subscription-consumer-metrics.yaml @@ -0,0 +1,10 @@ +{{- if .Values.serviceAccount.enabled }} +apiVersion: v1 +kind: ServiceAccount +metadata: + name: {{ .Values.serviceAccount.name }}-subscription-consumer-metrics +{{- if .Values.serviceAccount.annotations }} + annotations: {{ toYaml .Values.serviceAccount.annotations | nindent 4 }} +{{- end }} +automountServiceAccountToken: {{ .Values.serviceAccount.automountServiceAccountToken }} +{{- end }} diff --git a/sentry/values.yaml b/sentry/values.yaml index ecc2329de..c0fa3497c 100644 --- a/sentry/values.yaml +++ b/sentry/values.yaml @@ -403,6 +403,60 @@ sentry: # - mountPath: /dev/shm # name: dshm + genericMetricsConsumer: + replicas: 1 + # concurrency: 4 + env: [] + resources: {} + affinity: {} + nodeSelector: {} + securityContext: {} + containerSecurityContext: {} + # tolerations: [] + # podLabels: [] + # maxBatchSize: "" + + # it's better to use prometheus adapter and scale based on + # the size of the rabbitmq queue + autoscaling: + enabled: false + minReplicas: 1 + maxReplicas: 3 + targetCPUUtilizationPercentage: 50 + sidecars: [] + volumes: [] + + # volumeMounts: + # - mountPath: /dev/shm + # name: dshm + + metricsConsumer: + replicas: 1 + # concurrency: 4 + env: [] + resources: {} + affinity: {} + nodeSelector: {} + securityContext: {} + containerSecurityContext: {} + # tolerations: [] + # podLabels: [] + # maxBatchSize: "" + + # it's better to use prometheus adapter and scale based on + # the size of the rabbitmq queue + autoscaling: + enabled: false + minReplicas: 1 + maxReplicas: 3 + targetCPUUtilizationPercentage: 50 + sidecars: [] + volumes: [] + + # volumeMounts: + # - mountPath: /dev/shm + # name: dshm + cron: replicas: 1 env: [] @@ -460,6 +514,7 @@ sentry: # noStrictOffsetReset: false # volumeMounts: [] + postProcessForwardErrors: replicas: 1 env: [] @@ -501,6 +556,34 @@ sentry: volumes: [] # volumeMounts: [] + subscriptionConsumerGenericMetrics: + replicas: 1 + env: [] + resources: {} + affinity: {} + nodeSelector: {} + securityContext: {} + containerSecurityContext: {} + # tolerations: [] + # podLabels: [] + sidecars: [] + volumes: [] + # volumeMounts: [] + + subscriptionConsumerMetrics: + replicas: 1 + env: [] + resources: {} + affinity: {} + nodeSelector: {} + securityContext: {} + containerSecurityContext: {} + # tolerations: [] + # podLabels: [] + sidecars: [] + volumes: [] + # volumeMounts: [] + cleanup: successfulJobsHistoryLimit: 5 failedJobsHistoryLimit: 5 @@ -623,6 +706,20 @@ snuba: # volumes: [] # volumeMounts: [] + metricsConsumer: + replicas: 1 + env: [] + resources: {} + affinity: {} + nodeSelector: {} + securityContext: {} + containerSecurityContext: {} + # tolerations: [] + # podLabels: [] + autoOffsetReset: "earliest" + # volumes: [] + # volumeMounts: [] + subscriptionConsumerEvents: replicas: 1 env: [] @@ -637,6 +734,62 @@ snuba: # volumes: [] # volumeMounts: [] + genericMetricsCountersConsumer: + replicas: 1 + env: [] + resources: {} + affinity: {} + nodeSelector: {} + securityContext: {} + containerSecurityContext: {} + # tolerations: [] + # podLabels: [] + autoOffsetReset: "earliest" + # volumes: [] + # volumeMounts: [] + + genericMetricsDistributionConsumer: + replicas: 1 + env: [] + resources: {} + affinity: {} + nodeSelector: {} + securityContext: {} + containerSecurityContext: {} + # tolerations: [] + # podLabels: [] + autoOffsetReset: "earliest" + # volumes: [] + # volumeMounts: [] + + genericMetricsSetsConsumer: + replicas: 1 + env: [] + resources: {} + affinity: {} + nodeSelector: {} + securityContext: {} + containerSecurityContext: {} + # tolerations: [] + # podLabels: [] + autoOffsetReset: "earliest" + # volumes: [] + # volumeMounts: [] + + subscriptionConsumerMetrics: + replicas: 1 + env: [] + resources: {} + affinity: {} + nodeSelector: {} + securityContext: {} + containerSecurityContext: {} + # tolerations: [] + # podLabels: [] + autoOffsetReset: "earliest" + # volumes: [] + # volumeMounts: [] + subscriptionConsumerTransactions: replicas: 1 env: [] From 0b785524109b80b88132bded3fc5bb92e48aa720 Mon Sep 17 00:00:00 2001 From: colton-4g <146887747+colton-4g@users.noreply.github.com> Date: Thu, 12 Oct 2023 11:35:40 -0700 Subject: [PATCH 083/394] add pod labels to metrics (#1030) --- sentry/Chart.yaml | 2 +- sentry/templates/deployment-metrics.yaml | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/sentry/Chart.yaml b/sentry/Chart.yaml index 97a3270b8..a14c0bc0a 100644 --- a/sentry/Chart.yaml +++ b/sentry/Chart.yaml @@ -2,7 +2,7 @@ apiVersion: v2 name: sentry description: A Helm chart for Kubernetes type: application -version: 20.6.0 +version: 20.6.1 appVersion: 23.9.1 dependencies: - name: memcached diff --git a/sentry/templates/deployment-metrics.yaml b/sentry/templates/deployment-metrics.yaml index 20d21fc29..1f66ea4e6 100644 --- a/sentry/templates/deployment-metrics.yaml +++ b/sentry/templates/deployment-metrics.yaml @@ -29,6 +29,9 @@ spec: app: {{ template "sentry.fullname" . }}-metrics release: "{{ .Release.Name }}" role: metrics + {{- if .Values.metrics.podLabels }} +{{ toYaml .Values.metrics.podLabels | indent 8 }} + {{- end }} spec: {{- if .Values.metrics.affinity }} affinity: From 0a08bff88a2323732d689594bbe0d5018f4b16e2 Mon Sep 17 00:00:00 2001 From: Anton Donskoy Date: Tue, 17 Oct 2023 21:16:41 +0300 Subject: [PATCH 084/394] October release (#1040) Co-authored-by: Anton Donskoy --- sentry/Chart.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sentry/Chart.yaml b/sentry/Chart.yaml index a14c0bc0a..a1951c2a0 100644 --- a/sentry/Chart.yaml +++ b/sentry/Chart.yaml @@ -2,8 +2,8 @@ apiVersion: v2 name: sentry description: A Helm chart for Kubernetes type: application -version: 20.6.1 -appVersion: 23.9.1 +version: 20.7.0 +appVersion: 23.10.0 dependencies: - name: memcached repository: oci://registry-1.docker.io/bitnamicharts From 97f57f0d3a0cf54ed5e7c2ea349e47193b868772 Mon Sep 17 00:00:00 2001 From: Anton Donskoy Date: Sun, 22 Oct 2023 12:00:52 +0300 Subject: [PATCH 085/394] Upgrade to 23.10.1 (#1046) Co-authored-by: Anton Donskoy --- sentry/Chart.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sentry/Chart.yaml b/sentry/Chart.yaml index a1951c2a0..895cdb85c 100644 --- a/sentry/Chart.yaml +++ b/sentry/Chart.yaml @@ -2,8 +2,8 @@ apiVersion: v2 name: sentry description: A Helm chart for Kubernetes type: application -version: 20.7.0 -appVersion: 23.10.0 +version: 20.8.0 +appVersion: 23.10.1 dependencies: - name: memcached repository: oci://registry-1.docker.io/bitnamicharts From 438a2f80c4408e256cbd98bc0fd1ac05e0fcfdbd Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 23 Oct 2023 08:03:16 +0200 Subject: [PATCH 086/394] chore(deps): update actions/checkout action to v3 (#1041) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- .github/workflows/lint.yaml | 2 +- .github/workflows/push.yaml | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/lint.yaml b/.github/workflows/lint.yaml index 4b3ccaf86..caaef7a84 100644 --- a/.github/workflows/lint.yaml +++ b/.github/workflows/lint.yaml @@ -6,7 +6,7 @@ jobs: lint-charts: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 with: fetch-depth: "0" - name: Set up chart-testing diff --git a/.github/workflows/push.yaml b/.github/workflows/push.yaml index 7ab557ce5..f8f6a61d1 100644 --- a/.github/workflows/push.yaml +++ b/.github/workflows/push.yaml @@ -10,11 +10,11 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 with: path: 'main' - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 with: path: 'gh-pages' From 5d21ac2b358664d63560faf99d9a7108f4287c5a Mon Sep 17 00:00:00 2001 From: Ugo Mignon <56931733+TartanLeGrand@users.noreply.github.com> Date: Mon, 23 Oct 2023 10:23:34 +0200 Subject: [PATCH 087/394] fix: missing profiling config (#1038) --- sentry/Chart.yaml | 2 +- sentry/templates/configmap-sentry.yaml | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/sentry/Chart.yaml b/sentry/Chart.yaml index 895cdb85c..9ae94f53c 100644 --- a/sentry/Chart.yaml +++ b/sentry/Chart.yaml @@ -2,7 +2,7 @@ apiVersion: v2 name: sentry description: A Helm chart for Kubernetes type: application -version: 20.8.0 +version: 20.8.1 appVersion: 23.10.1 dependencies: - name: memcached diff --git a/sentry/templates/configmap-sentry.yaml b/sentry/templates/configmap-sentry.yaml index 097c1b325..8403d7b14 100644 --- a/sentry/templates/configmap-sentry.yaml +++ b/sentry/templates/configmap-sentry.yaml @@ -454,6 +454,7 @@ data: "organizations:profiling-global-suspect-functions", "organizations:profiling-cpu-chart", "organizations:profiling-memory-chart", + "organizations:profiling-view", {{ end -}} "organizations:dashboards-mep", From a688d20687f4c24cf9dd9dd4d54dc108b6dba2c7 Mon Sep 17 00:00:00 2001 From: gersmann Date: Tue, 31 Oct 2023 07:50:34 +0100 Subject: [PATCH 088/394] fix: hide content-disposition header on /static for Safari (#1051) * fix: hide content-disposition header on /static for Safari Theres a bug in Sentry, which prevens Safari from rendering assets (JS). https://github.com/getsentry/self-hosted/issues/2285 It was fixed for the self-hosted deploy by adding a 'proxy_hide_header' statement. https://github.com/getsentry/self-hosted/commit/ab9dbbd41a31cac5b106fea24a12ba23a0e165fa * fix: tabs / whitespace * chore: update chart version --- sentry/Chart.yaml | 2 +- sentry/templates/configmap-nginx.yaml | 6 +++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/sentry/Chart.yaml b/sentry/Chart.yaml index 9ae94f53c..91981b6a7 100644 --- a/sentry/Chart.yaml +++ b/sentry/Chart.yaml @@ -2,7 +2,7 @@ apiVersion: v2 name: sentry description: A Helm chart for Kubernetes type: application -version: 20.8.1 +version: 20.8.2 appVersion: 23.10.1 dependencies: - name: memcached diff --git a/sentry/templates/configmap-nginx.yaml b/sentry/templates/configmap-nginx.yaml index e87e2d39d..6cb5520a1 100644 --- a/sentry/templates/configmap-nginx.yaml +++ b/sentry/templates/configmap-nginx.yaml @@ -28,7 +28,7 @@ data: location ~ ^/api/[1-9]\d*/ { proxy_pass http://relay; - } + } {{ if and .Values.nginx.metrics.enabled .Values.nginx.metrics.serviceMonitor.enabled -}} location = /status/ { @@ -40,5 +40,9 @@ data: location / { proxy_pass http://sentry; } + + location /_static/ { + proxy_hide_header Content-Disposition; + } } {{- end }} From a4a8a269721b6ff9e6e2a4faa28352980a21cf82 Mon Sep 17 00:00:00 2001 From: Aaron Johnson Date: Thu, 2 Nov 2023 01:08:22 -0500 Subject: [PATCH 089/394] add ability to set database CONN_MAX_AGE (#1055) Co-authored-by: Aaron Johnson --- sentry/Chart.yaml | 2 +- sentry/templates/configmap-sentry.yaml | 5 +++++ sentry/values.yaml | 6 ++++++ 3 files changed, 12 insertions(+), 1 deletion(-) diff --git a/sentry/Chart.yaml b/sentry/Chart.yaml index 91981b6a7..b1be5685a 100644 --- a/sentry/Chart.yaml +++ b/sentry/Chart.yaml @@ -2,7 +2,7 @@ apiVersion: v2 name: sentry description: A Helm chart for Kubernetes type: application -version: 20.8.2 +version: 20.9.0 appVersion: 23.10.1 dependencies: - name: memcached diff --git a/sentry/templates/configmap-sentry.yaml b/sentry/templates/configmap-sentry.yaml index 8403d7b14..5ef12b71c 100644 --- a/sentry/templates/configmap-sentry.yaml +++ b/sentry/templates/configmap-sentry.yaml @@ -167,6 +167,11 @@ data: "PASSWORD": os.environ.get("POSTGRES_PASSWORD", ""), "HOST": {{ include "sentry.postgresql.host" . | quote }}, "PORT": {{ template "sentry.postgresql.port" . }}, + {{- if .Values.postgresql.enabled }} + "CONN_MAX_AGE": {{ .Values.postgresql.connMaxAge }}, + {{- else }} + "CONN_MAX_AGE": {{ .Values.externalPostgresql.connMaxAge }}, + {{- end }} {{- if .Values.externalPostgresql.sslMode }} 'OPTIONS': { 'sslmode': '{{ .Values.externalPostgresql.sslMode }}', diff --git a/sentry/values.yaml b/sentry/values.yaml index c0fa3497c..0df0beace 100644 --- a/sentry/values.yaml +++ b/sentry/values.yaml @@ -1534,6 +1534,9 @@ postgresql: ## Use this to enable an extra service account # serviceAccount: # enabled: false + ## Default connection max age is 0 (unlimited connections) + ## Set to a higher number to close connections after a period of time in seconds + connMaxAge: 0 ## This value is only used when postgresql.enabled is set to false ## Set either externalPostgresql.password or externalPostgresql.existingSecret to configure password @@ -1548,6 +1551,9 @@ externalPostgresql: # existingSecretKey: secret-key-name database: sentry # sslMode: require + ## Default connection max age is 0 (unlimited connections) + ## Set to a higher number to close connections after a period of time in seconds + connMaxAge: 0 rabbitmq: ## If disabled, Redis will be used instead as the broker. From 78c93e5996f7bc26ea4148e0aa8cb6c4b0b3aafb Mon Sep 17 00:00:00 2001 From: Ugo Mignon <56931733+TartanLeGrand@users.noreply.github.com> Date: Mon, 6 Nov 2023 06:53:07 +0100 Subject: [PATCH 090/394] fix: replay session (#1054) --- sentry/Chart.yaml | 2 +- sentry/templates/configmap-sentry.yaml | 19 +++++++++++++++++++ sentry/values.yaml | 1 + 3 files changed, 21 insertions(+), 1 deletion(-) diff --git a/sentry/Chart.yaml b/sentry/Chart.yaml index b1be5685a..110b0de49 100644 --- a/sentry/Chart.yaml +++ b/sentry/Chart.yaml @@ -2,7 +2,7 @@ apiVersion: v2 name: sentry description: A Helm chart for Kubernetes type: application -version: 20.9.0 +version: 20.9.1 appVersion: 23.10.1 dependencies: - name: memcached diff --git a/sentry/templates/configmap-sentry.yaml b/sentry/templates/configmap-sentry.yaml index 5ef12b71c..194882046 100644 --- a/sentry/templates/configmap-sentry.yaml +++ b/sentry/templates/configmap-sentry.yaml @@ -447,7 +447,26 @@ data: "organizations:metrics", "organizations:metrics-extraction", "organizations:transaction-metrics-extraction", + + {{- if .Values.sentry.features.enableSessionReplay}} "organizations:session-replay", + "organizations:session-replay-ui", + "organizations:session-replay-sdk", + "organizations:session-replay-count-query-optimize", + "organizations:session-replay-sdk-errors-only", + "organizations:session-replay-recording-scrubbing", + "organizations:session-replay-a11y-tab", + "organizations:session-replay-slack-new-issue", + "organizations:session-replay-issue-emails", + "organizations:session-replay-event-linking", + "organizations:session-replay-weekly-email", + "organizations:session-replay-trace-table", + "organizations:session-replay-rage-dead-selectors", + "organizations:session-replay-new-event-counts", + "organizations:session-replay-new-timeline", + "organizations:issue-details-replay-event", + {{ end -}} + "organizations:issue-platform", {{- if .Values.sentry.features.enableProfiling }} diff --git a/sentry/values.yaml b/sentry/values.yaml index 0df0beace..1a6efcf7b 100644 --- a/sentry/values.yaml +++ b/sentry/values.yaml @@ -169,6 +169,7 @@ sentry: orgSubdomains: false vstsLimitedScopes: true enableProfiling: false + enableSessionReplay: true worker: replicas: 3 From ae07c35e642def515eacdaf0bd95d507fb3e8249 Mon Sep 17 00:00:00 2001 From: Gunslinger <1007708137@qq.com> Date: Mon, 6 Nov 2023 10:17:45 -0600 Subject: [PATCH 091/394] fix: nginx static path not pass proxy (#1060) --- sentry/Chart.yaml | 2 +- sentry/templates/configmap-nginx.yaml | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/sentry/Chart.yaml b/sentry/Chart.yaml index 110b0de49..76fbbfecb 100644 --- a/sentry/Chart.yaml +++ b/sentry/Chart.yaml @@ -2,7 +2,7 @@ apiVersion: v2 name: sentry description: A Helm chart for Kubernetes type: application -version: 20.9.1 +version: 20.9.2 appVersion: 23.10.1 dependencies: - name: memcached diff --git a/sentry/templates/configmap-nginx.yaml b/sentry/templates/configmap-nginx.yaml index 6cb5520a1..6cd708bad 100644 --- a/sentry/templates/configmap-nginx.yaml +++ b/sentry/templates/configmap-nginx.yaml @@ -42,6 +42,7 @@ data: } location /_static/ { + proxy_pass http://sentry; proxy_hide_header Content-Disposition; } } From 9851b49a0742627c94959185c027496659aeda75 Mon Sep 17 00:00:00 2001 From: Taehyun Kim Date: Thu, 9 Nov 2023 18:16:15 +0900 Subject: [PATCH 092/394] add snuba-spans topic (#1037) --- sentry/Chart.yaml | 2 +- sentry/values.yaml | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/sentry/Chart.yaml b/sentry/Chart.yaml index 76fbbfecb..35db34e56 100644 --- a/sentry/Chart.yaml +++ b/sentry/Chart.yaml @@ -2,7 +2,7 @@ apiVersion: v2 name: sentry description: A Helm chart for Kubernetes type: application -version: 20.9.2 +version: 20.9.3 appVersion: 23.10.1 dependencies: - name: memcached diff --git a/sentry/values.yaml b/sentry/values.yaml index 1a6efcf7b..54711c25d 100644 --- a/sentry/values.yaml +++ b/sentry/values.yaml @@ -1464,6 +1464,7 @@ kafka: - name: ingest-monitors - name: profiles - name: ingest-occurrences + - name: snuba-spans zookeeper: enabled: true kraft: From 58c44af14ee85f696b1711787d257f3244df79d1 Mon Sep 17 00:00:00 2001 From: Anton Donskoy Date: Thu, 16 Nov 2023 09:22:06 +0300 Subject: [PATCH 093/394] Sentry November release (#1068) Co-authored-by: Anton Donskoy --- sentry/Chart.yaml | 4 +- .../deployment-snuba-sessions-consumer.yaml | 146 ------------------ ...nt-snuba-subscription-consumer-events.yaml | 1 - ...t-snuba-subscription-consumer-metrics.yaml | 1 - ...-snuba-subscription-consumer-sessions.yaml | 113 -------------- ...ba-subscription-consumer-transactions.yaml | 1 - 6 files changed, 2 insertions(+), 264 deletions(-) delete mode 100644 sentry/templates/deployment-snuba-sessions-consumer.yaml delete mode 100644 sentry/templates/deployment-snuba-subscription-consumer-sessions.yaml diff --git a/sentry/Chart.yaml b/sentry/Chart.yaml index 35db34e56..92adf515c 100644 --- a/sentry/Chart.yaml +++ b/sentry/Chart.yaml @@ -2,8 +2,8 @@ apiVersion: v2 name: sentry description: A Helm chart for Kubernetes type: application -version: 20.9.3 -appVersion: 23.10.1 +version: 20.10.0 +appVersion: 23.11.0 dependencies: - name: memcached repository: oci://registry-1.docker.io/bitnamicharts diff --git a/sentry/templates/deployment-snuba-sessions-consumer.yaml b/sentry/templates/deployment-snuba-sessions-consumer.yaml deleted file mode 100644 index 9765d4ae9..000000000 --- a/sentry/templates/deployment-snuba-sessions-consumer.yaml +++ /dev/null @@ -1,146 +0,0 @@ -apiVersion: apps/v1 -kind: Deployment -metadata: - name: {{ template "sentry.fullname" . }}-sessions-consumer - labels: - app: {{ template "sentry.fullname" . }} - chart: "{{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }}" - release: "{{ .Release.Name }}" - heritage: "{{ .Release.Service }}" - app.kubernetes.io/managed-by: "Helm" - {{- if .Values.asHook }} - {{- /* Add the Helm annotations so that deployment after asHook from true to false works */}} - annotations: - meta.helm.sh/release-name: "{{ .Release.Name }}" - meta.helm.sh/release-namespace: "{{ .Release.Namespace }}" - "helm.sh/hook": "post-install,post-upgrade" - "helm.sh/hook-weight": "16" - {{- end }} -spec: - revisionHistoryLimit: {{ .Values.revisionHistoryLimit }} - selector: - matchLabels: - app: {{ template "sentry.fullname" . }} - release: "{{ .Release.Name }}" - role: sessions-consumer - replicas: {{ .Values.snuba.sessionsConsumer.replicas }} - template: - metadata: - annotations: - checksum/snubaSettingsPy: {{ .Values.config.snubaSettingsPy | sha256sum }} - checksum/config.yaml: {{ include (print $.Template.BasePath "/configmap-snuba.yaml") . | sha256sum }} - {{- if .Values.snuba.sessionsConsumer.annotations }} -{{ toYaml .Values.snuba.sessionsConsumer.annotations | indent 8 }} - {{- end }} - labels: - app: {{ template "sentry.fullname" . }} - release: "{{ .Release.Name }}" - role: sessions-consumer - {{- if .Values.snuba.sessionsConsumer.podLabels }} -{{ toYaml .Values.snuba.sessionsConsumer.podLabels | indent 8 }} - {{- end }} - spec: - affinity: - {{- if .Values.snuba.sessionsConsumer.affinity }} -{{ toYaml .Values.snuba.sessionsConsumer.affinity | indent 8 }} - {{- end }} - {{- if .Values.snuba.sessionsConsumer.nodeSelector }} - nodeSelector: -{{ toYaml .Values.snuba.sessionsConsumer.nodeSelector | indent 8 }} - {{- end }} - {{- if .Values.snuba.sessionsConsumer.tolerations }} - tolerations: -{{ toYaml .Values.snuba.sessionsConsumer.tolerations | indent 8 }} - {{- end }} - {{- if .Values.images.snuba.imagePullSecrets }} - imagePullSecrets: -{{ toYaml .Values.images.snuba.imagePullSecrets | indent 8 }} - {{- end }} - {{- if .Values.dnsPolicy }} - dnsPolicy: {{ .Values.dnsPolicy | quote }} - {{- end }} - {{- if .Values.dnsConfig }} - dnsConfig: -{{ toYaml .Values.dnsConfig | indent 8 }} - {{- end }} - {{- if .Values.snuba.sessionsConsumer.securityContext }} - securityContext: -{{ toYaml .Values.snuba.sessionsConsumer.securityContext | indent 8 }} - {{- end }} - containers: - - name: {{ .Chart.Name }}-snuba - image: "{{ template "snuba.image" . }}" - imagePullPolicy: {{ default "IfNotPresent" .Values.images.snuba.pullPolicy }} - command: - - "snuba" - - "consumer" - - "--storage" - - "sessions_raw" - - "--auto-offset-reset" - - "{{ .Values.snuba.sessionsConsumer.autoOffsetReset }}" - - "--max-batch-time-ms" - - "750" - {{- if .Values.snuba.sessionsConsumer.maxBatchSize }} - - "--max-batch-size" - - "{{ .Values.snuba.sessionsConsumer.maxBatchSize }}" - {{- end }} - {{- if .Values.snuba.sessionsConsumer.processes }} - - "--processes" - - "{{ .Values.snuba.sessionsConsumer.processes }}" - {{- end }} - {{- if .Values.snuba.sessionsConsumer.inputBlockSize }} - - "--input-block-size" - - "{{ .Values.snuba.sessionsConsumer.inputBlockSize }}" - {{- end }} - {{- if .Values.snuba.sessionsConsumer.outputBlockSize }} - - "--output-block-size" - - "{{ .Values.snuba.sessionsConsumer.outputBlockSize }}" - {{- end }} - {{- if .Values.snuba.sessionsConsumer.maxBatchTimeMs }} - - "--max-batch-time-ms" - - "{{ .Values.snuba.sessionsConsumer.maxBatchTimeMs }}" - {{- end }} - {{- if .Values.snuba.sessionsConsumer.queuedMaxMessagesKbytes }} - - "--queued-max-messages-kbytes" - - "{{ .Values.snuba.sessionsConsumer.queuedMaxMessagesKbytes }}" - {{- end }} - {{- if .Values.snuba.sessionsConsumer.queuedMinMessages }} - - "--queued-min-messages" - - "{{ .Values.snuba.sessionsConsumer.queuedMinMessages }}" - {{- end }} - {{- if .Values.snuba.sessionsConsumer.noStrictOffsetReset }} - - "--no-strict-offset-reset" - {{- end }} - ports: - - containerPort: {{ template "snuba.port" }} - env: -{{ include "sentry.snuba.env" . | indent 8 }} -{{- if .Values.snuba.sessionsConsumer.env }} -{{ toYaml .Values.snuba.sessionsConsumer.env | indent 8 }} -{{- end }} - envFrom: - - secretRef: - name: {{ template "sentry.fullname" . }}-snuba-env - volumeMounts: - - mountPath: /etc/snuba - name: config - readOnly: true -{{- if .Values.snuba.sessionsConsumer.volumeMounts }} -{{ toYaml .Values.snuba.sessionsConsumer.volumeMounts | indent 8 }} -{{- end }} - resources: -{{ toYaml .Values.snuba.sessionsConsumer.resources | indent 12 }} -{{- if .Values.snuba.sessionsConsumer.containerSecurityContext }} - securityContext: -{{ toYaml .Values.snuba.sessionsConsumer.containerSecurityContext | indent 12 }} -{{- end }} - {{- if .Values.serviceAccount.enabled }} - serviceAccountName: {{ .Values.serviceAccount.name }}-snuba - {{- end }} - volumes: - - name: config - configMap: - name: {{ template "sentry.fullname" . }}-snuba -{{- if .Values.snuba.sessionsConsumer.volumes }} -{{ toYaml .Values.snuba.sessionsConsumer.volumes | indent 8 }} -{{- end }} diff --git a/sentry/templates/deployment-snuba-subscription-consumer-events.yaml b/sentry/templates/deployment-snuba-subscription-consumer-events.yaml index 4a2a3badb..2ab8dc396 100644 --- a/sentry/templates/deployment-snuba-subscription-consumer-events.yaml +++ b/sentry/templates/deployment-snuba-subscription-consumer-events.yaml @@ -75,7 +75,6 @@ spec: {{- end }} - "--consumer-group=snuba-events-subscriptions-consumers" - "--followed-consumer-group=snuba-consumers" - - "--delay-seconds=60" - "--schedule-ttl=60" - "--stale-threshold-seconds=900" ports: diff --git a/sentry/templates/deployment-snuba-subscription-consumer-metrics.yaml b/sentry/templates/deployment-snuba-subscription-consumer-metrics.yaml index cb470312b..a921ccd8f 100644 --- a/sentry/templates/deployment-snuba-subscription-consumer-metrics.yaml +++ b/sentry/templates/deployment-snuba-subscription-consumer-metrics.yaml @@ -76,7 +76,6 @@ spec: {{- end }} - "--consumer-group=nuba-metrics-subscriptions-consumers" - "--followed-consumer-group=snuba-metrics-consumers" - - "--delay-seconds=60" - "--schedule-ttl=60" - "--stale-threshold-seconds=900" ports: diff --git a/sentry/templates/deployment-snuba-subscription-consumer-sessions.yaml b/sentry/templates/deployment-snuba-subscription-consumer-sessions.yaml deleted file mode 100644 index 112e2f4f3..000000000 --- a/sentry/templates/deployment-snuba-subscription-consumer-sessions.yaml +++ /dev/null @@ -1,113 +0,0 @@ -apiVersion: apps/v1 -kind: Deployment -metadata: - name: {{ template "sentry.fullname" . }}-snuba-subscription-consumer-sessions - labels: - app: {{ template "sentry.fullname" . }} - chart: "{{ .Chart.Name }}-{{ .Chart.Version | replace "+" "_" }}" - release: "{{ .Release.Name }}" - heritage: "{{ .Release.Service }}" - app.kubernetes.io/managed-by: "Helm" - {{- if .Values.asHook }} - {{- /* Add the Helm annotations so that deployment after asHook from true to false works */}} - annotations: - meta.helm.sh/release-name: "{{ .Release.Name }}" - meta.helm.sh/release-namespace: "{{ .Release.Namespace }}" - "helm.sh/hook": "post-install,post-upgrade" - "helm.sh/hook-weight": "18" - {{- end }} -spec: - revisionHistoryLimit: {{ .Values.revisionHistoryLimit }} - selector: - matchLabels: - app: {{ template "sentry.fullname" . }} - release: "{{ .Release.Name }}" - role: snuba-subscription-consumer-sessions - replicas: {{ .Values.snuba.subscriptionConsumerSessions.replicas }} - template: - metadata: - annotations: - checksum/snubaSettingsPy: {{ .Values.config.snubaSettingsPy | sha256sum }} - checksum/config.yaml: {{ include (print $.Template.BasePath "/configmap-snuba.yaml") . | sha256sum }} - {{- if .Values.snuba.subscriptionConsumerSessions.annotations }} -{{ toYaml .Values.snuba.subscriptionConsumerSessions.annotations | indent 8 }} - {{- end }} - labels: - app: {{ template "sentry.fullname" . }} - release: "{{ .Release.Name }}" - role: snuba-subscription-consumer-sessions - {{- if .Values.snuba.subscriptionConsumerSessions.podLabels }} -{{ toYaml .Values.snuba.subscriptionConsumerSessions.podLabels | indent 8 }} - {{- end }} - spec: - affinity: - {{- if .Values.snuba.subscriptionConsumerSessions.affinity }} -{{ toYaml .Values.snuba.subscriptionConsumerSessions.affinity | indent 8 }} - {{- end }} - {{- if .Values.snuba.subscriptionConsumerSessions.nodeSelector }} - nodeSelector: -{{ toYaml .Values.snuba.subscriptionConsumerSessions.nodeSelector | indent 8 }} - {{- end }} - {{- if .Values.snuba.subscriptionConsumerSessions.tolerations }} - tolerations: -{{ toYaml .Values.snuba.subscriptionConsumerSessions.tolerations | indent 8 }} - {{- end }} - {{- if .Values.images.snuba.imagePullSecrets }} - imagePullSecrets: -{{ toYaml .Values.images.snuba.imagePullSecrets | indent 8 }} - {{- end }} - {{- if .Values.snuba.subscriptionConsumerSessions.securityContext }} - securityContext: -{{ toYaml .Values.snuba.subscriptionConsumerSessions.securityContext | indent 8 }} - {{- end }} - containers: - - name: {{ .Chart.Name }}-snuba - image: "{{ template "snuba.image" . }}" - imagePullPolicy: {{ default "IfNotPresent" .Values.images.snuba.pullPolicy }} - command: - - "snuba" - - "subscriptions-scheduler-executor" - - "--auto-offset-reset={{ .Values.snuba.subscriptionConsumerSessions.autoOffsetReset }}" - - "--dataset=sessions" - - "--entity=sessions" - {{- if .Values.snuba.subscriptionConsumerSessions.noStrictOffsetReset }} - - "--no-strict-offset-reset" - {{- end }} - - "--consumer-group=snuba-sessions-subscriptions-consumers" - - "--followed-consumer-group=snuba-consumers" - - "--delay-seconds=60" - - "--schedule-ttl=60" - - "--stale-threshold-seconds=900" - ports: - - containerPort: {{ template "snuba.port" }} - env: -{{ include "sentry.snuba.env" . | indent 8 }} -{{- if .Values.snuba.subscriptionConsumerSessions.env }} -{{ toYaml .Values.snuba.subscriptionConsumerSessions.env | indent 8 }} -{{- end }} - envFrom: - - secretRef: - name: {{ template "sentry.fullname" . }}-snuba-env - volumeMounts: - - mountPath: /etc/snuba - name: config - readOnly: true -{{- if .Values.snuba.subscriptionConsumerSessions.volumeMounts }} -{{ toYaml .Values.snuba.subscriptionConsumerSessions.volumeMounts | indent 8 }} -{{- end }} - resources: -{{ toYaml .Values.snuba.subscriptionConsumerSessions.resources | indent 12 }} -{{- if .Values.snuba.subscriptionConsumerSessions.containerSecurityContext }} - securityContext: -{{ toYaml .Values.snuba.subscriptionConsumerSessions.containerSecurityContext | indent 12 }} -{{- end }} - {{- if .Values.serviceAccount.enabled }} - serviceAccountName: {{ .Values.serviceAccount.name }}-snuba - {{- end }} - volumes: - - name: config - configMap: - name: {{ template "sentry.fullname" . }}-snuba -{{- if .Values.snuba.subscriptionConsumerSessions.volumes }} -{{ toYaml .Values.snuba.subscriptionConsumerSessions.volumes | indent 6 }} -{{- end }} diff --git a/sentry/templates/deployment-snuba-subscription-consumer-transactions.yaml b/sentry/templates/deployment-snuba-subscription-consumer-transactions.yaml index b3a04c92c..dbcc31c8b 100644 --- a/sentry/templates/deployment-snuba-subscription-consumer-transactions.yaml +++ b/sentry/templates/deployment-snuba-subscription-consumer-transactions.yaml @@ -75,7 +75,6 @@ spec: {{- end }} - "--consumer-group=snuba-transactions-subscriptions-consumers" - "--followed-consumer-group=transactions_group" - - "--delay-seconds=60" - "--schedule-ttl=60" - "--stale-threshold-seconds=900" ports: From 2081c77dbeef98eb419afcac687a5d4d855216f4 Mon Sep 17 00:00:00 2001 From: Anton Donskoy Date: Thu, 16 Nov 2023 19:14:49 +0300 Subject: [PATCH 094/394] Add missing generic_metrics_gauges storage set (#1069) --- sentry/Chart.yaml | 2 +- sentry/templates/configmap-snuba.yaml | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/sentry/Chart.yaml b/sentry/Chart.yaml index 92adf515c..0db766611 100644 --- a/sentry/Chart.yaml +++ b/sentry/Chart.yaml @@ -2,7 +2,7 @@ apiVersion: v2 name: sentry description: A Helm chart for Kubernetes type: application -version: 20.10.0 +version: 20.10.1 appVersion: 23.11.0 dependencies: - name: memcached diff --git a/sentry/templates/configmap-snuba.yaml b/sentry/templates/configmap-snuba.yaml index 92996537a..473cbd61e 100644 --- a/sentry/templates/configmap-snuba.yaml +++ b/sentry/templates/configmap-snuba.yaml @@ -47,6 +47,7 @@ data: "generic_metrics_counters", "spans", "group_attributes", + "generic_metrics_gauges", }, {{- /* The default clickhouse installation runs in distributed mode, while the external From 5cc2b0d6683f6d7f2a2f848740cc17fade53bcf8 Mon Sep 17 00:00:00 2001 From: Sem Schilder Date: Mon, 20 Nov 2023 09:32:19 +0100 Subject: [PATCH 095/394] Make loglevel configurable (#1073) --- sentry/Chart.yaml | 2 +- sentry/templates/deployment-sentry-cron.yaml | 3 +++ sentry/values.yaml | 2 ++ 3 files changed, 6 insertions(+), 1 deletion(-) diff --git a/sentry/Chart.yaml b/sentry/Chart.yaml index 0db766611..ff330ec8b 100644 --- a/sentry/Chart.yaml +++ b/sentry/Chart.yaml @@ -2,7 +2,7 @@ apiVersion: v2 name: sentry description: A Helm chart for Kubernetes type: application -version: 20.10.1 +version: 20.11.0 appVersion: 23.11.0 dependencies: - name: memcached diff --git a/sentry/templates/deployment-sentry-cron.yaml b/sentry/templates/deployment-sentry-cron.yaml index 6ad808c55..eb6532d75 100644 --- a/sentry/templates/deployment-sentry-cron.yaml +++ b/sentry/templates/deployment-sentry-cron.yaml @@ -67,6 +67,9 @@ spec: args: - "run" - "cron" + {{- if .Values.sentry.cron.logLevel }} + - "-l{{ .Values.sentry.cron.logLevel}}" + {{- end }} env: - name: C_FORCE_ROOT value: "true" diff --git a/sentry/values.yaml b/sentry/values.yaml index 54711c25d..22560883a 100644 --- a/sentry/values.yaml +++ b/sentry/values.yaml @@ -469,6 +469,8 @@ sentry: sidecars: [] volumes: [] # volumeMounts: [] + ## Log level can be any of: DEBUG, INFO, WARNING, ERROR, CRITICAL, FATAL + # logLevel: info subscriptionConsumerEvents: replicas: 1 From d2f305c73b7b0ab625734a30fe5b5363606cd751 Mon Sep 17 00:00:00 2001 From: Majid Date: Mon, 27 Nov 2023 13:16:34 +0100 Subject: [PATCH 096/394] =?UTF-8?q?feat:=20Allow=20to=20set=20max=5Fsuspic?= =?UTF-8?q?ious=5Fbroken=5Fparts=20in=20merge=5Ftree=20settings=E2=80=A6?= =?UTF-8?q?=20(#1080)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- clickhouse/Chart.yaml | 2 +- clickhouse/templates/configmap-config.yaml | 1 + clickhouse/values.yaml | 2 ++ 3 files changed, 4 insertions(+), 1 deletion(-) diff --git a/clickhouse/Chart.yaml b/clickhouse/Chart.yaml index 79e5d6b33..156028580 100755 --- a/clickhouse/Chart.yaml +++ b/clickhouse/Chart.yaml @@ -11,6 +11,6 @@ keywords: name: clickhouse sources: - https://github.com/sentry-kubernetes/charts -version: 3.5.0 +version: 3.6.0 maintainers: - name: sentry-kubernetes diff --git a/clickhouse/templates/configmap-config.yaml b/clickhouse/templates/configmap-config.yaml index 15c136499..1c90b7d7f 100755 --- a/clickhouse/templates/configmap-config.yaml +++ b/clickhouse/templates/configmap-config.yaml @@ -165,6 +165,7 @@ data: {{ .Values.clickhouse.configmap.merge_tree.parts_to_delay_insert }} {{ .Values.clickhouse.configmap.merge_tree.parts_to_throw_insert }} {{ .Values.clickhouse.configmap.merge_tree.max_part_loading_threads }} + 100 {{- end }} diff --git a/clickhouse/values.yaml b/clickhouse/values.yaml index 6a9092175..0f7eb3bdb 100755 --- a/clickhouse/values.yaml +++ b/clickhouse/values.yaml @@ -371,6 +371,8 @@ clickhouse: parts_to_throw_insert: 300 # The maximum number of threads that read parts when ClickHouse starts. max_part_loading_threads: auto + # If the number of broken parts in a single partition exceeds the max_suspicious_broken_parts value, automatic deletion is denied. + max_suspicious_broken_parts: 100 ## ## Web interface for ClickHouse in the Tabix project. From c5fec72ad8dc16e727019094d07dbaae4359cdf8 Mon Sep 17 00:00:00 2001 From: Majid Date: Fri, 1 Dec 2023 12:24:09 +0100 Subject: [PATCH 097/394] fix:replace hardcoded value (#1085) --- clickhouse/Chart.yaml | 2 +- clickhouse/templates/configmap-config.yaml | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/clickhouse/Chart.yaml b/clickhouse/Chart.yaml index 156028580..2b8857ce7 100755 --- a/clickhouse/Chart.yaml +++ b/clickhouse/Chart.yaml @@ -11,6 +11,6 @@ keywords: name: clickhouse sources: - https://github.com/sentry-kubernetes/charts -version: 3.6.0 +version: 3.6.1 maintainers: - name: sentry-kubernetes diff --git a/clickhouse/templates/configmap-config.yaml b/clickhouse/templates/configmap-config.yaml index 1c90b7d7f..e7d0a5ef0 100755 --- a/clickhouse/templates/configmap-config.yaml +++ b/clickhouse/templates/configmap-config.yaml @@ -165,7 +165,8 @@ data: {{ .Values.clickhouse.configmap.merge_tree.parts_to_delay_insert }} {{ .Values.clickhouse.configmap.merge_tree.parts_to_throw_insert }} {{ .Values.clickhouse.configmap.merge_tree.max_part_loading_threads }} - 100 + {{ .Values.clickhouse.configmap.merge_tree.max_suspicious_broken_parts }} + {{- end }} From 27750a1f45254c82290693cd521098f63169b039 Mon Sep 17 00:00:00 2001 From: Taehyun Kim Date: Mon, 11 Dec 2023 00:22:06 +0900 Subject: [PATCH 098/394] Support HPA container resource (#1065) --- sentry/Chart.yaml | 2 +- sentry/templates/_helper.tpl | 8 +++ sentry/templates/hpa-ingestConsumer.yaml | 89 +++++++++++++++++++++++- sentry/templates/hpa-relay.yaml | 21 +++++- sentry/templates/hpa-snuba-api.yaml | 21 +++++- sentry/templates/hpa-vroom.yaml | 21 +++++- sentry/templates/hpa-web.yaml | 21 +++++- sentry/templates/hpa-worker.yaml | 21 +++++- 8 files changed, 195 insertions(+), 9 deletions(-) diff --git a/sentry/Chart.yaml b/sentry/Chart.yaml index ff330ec8b..e782ed415 100644 --- a/sentry/Chart.yaml +++ b/sentry/Chart.yaml @@ -2,7 +2,7 @@ apiVersion: v2 name: sentry description: A Helm chart for Kubernetes type: application -version: 20.11.0 +version: 20.12.0 appVersion: 23.11.0 dependencies: - name: memcached diff --git a/sentry/templates/_helper.tpl b/sentry/templates/_helper.tpl index 8ae32f31b..d6b275b62 100644 --- a/sentry/templates/_helper.tpl +++ b/sentry/templates/_helper.tpl @@ -573,3 +573,11 @@ Common Sentry environment variables key: {{ default "api-token" .Values.openai.existingSecretKey }} {{- end }} {{- end -}} + +{{- define "sentry.autoscaling.apiVersion" -}} +{{- if .Capabilities.APIVersions.Has "autoscaling/v2" -}} +{{- print "autoscaling/v2" -}} +{{- else -}} +{{- print "autoscaling/v1" -}} +{{- end -}} +{{- end -}} diff --git a/sentry/templates/hpa-ingestConsumer.yaml b/sentry/templates/hpa-ingestConsumer.yaml index 296c974f7..04e0d2035 100644 --- a/sentry/templates/hpa-ingestConsumer.yaml +++ b/sentry/templates/hpa-ingestConsumer.yaml @@ -1,14 +1,97 @@ {{- if .Values.sentry.ingestConsumer.autoscaling.enabled }} -apiVersion: autoscaling/v1 +apiVersion: {{ template "sentry.autoscaling.apiVersion" . }} kind: HorizontalPodAutoscaler metadata: - name: {{ template "sentry.fullname" . }}-sentry-ingest-consumer + name: {{ template "sentry.fullname" . }}-sentry-ingest-consumer-attachments spec: scaleTargetRef: apiVersion: apps/v1 kind: Deployment - name: {{ template "sentry.fullname" . }}-ingest-consumer + name: {{ template "sentry.fullname" . }}-ingest-consumer-attachments minReplicas: {{ .Values.sentry.ingestConsumer.autoscaling.minReplicas }} maxReplicas: {{ .Values.sentry.ingestConsumer.autoscaling.maxReplicas }} + {{- if eq (include "sentry.autoscaling.apiVersion" .) "autoscaling/v1" }} targetCPUUtilizationPercentage: {{ .Values.sentry.ingestConsumer.autoscaling.targetCPUUtilizationPercentage }} + {{- else if semverCompare ">=1.27-0" .Capabilities.KubeVersion.GitVersion }} + metrics: + - type: ContainerResource + containerResource: + container: {{ .Chart.Name }}-ingest-consumer-attachments + name: cpu + target: + type: Utilization + averageUtilization: {{ .Values.sentry.ingestConsumer.autoscaling.targetCPUUtilizationPercentage }} + {{- else }} + metrics: + - type: Resource + resource: + name: cpu + target: + type: Utilization + averageUtilization: {{ .Values.sentry.ingestConsumer.autoscaling.targetCPUUtilizationPercentage }} + {{- end }} +--- +apiVersion: {{ template "sentry.autoscaling.apiVersion" . }} +kind: HorizontalPodAutoscaler +metadata: + name: {{ template "sentry.fullname" . }}-sentry-ingest-consumer-events +spec: + scaleTargetRef: + apiVersion: apps/v1 + kind: Deployment + name: {{ template "sentry.fullname" . }}-ingest-consumer-events + minReplicas: {{ .Values.sentry.ingestConsumer.autoscaling.minReplicas }} + maxReplicas: {{ .Values.sentry.ingestConsumer.autoscaling.maxReplicas }} + {{- if eq (include "sentry.autoscaling.apiVersion" .) "autoscaling/v1" }} + targetCPUUtilizationPercentage: {{ .Values.sentry.ingestConsumer.autoscaling.targetCPUUtilizationPercentage }} + {{- else if semverCompare ">=1.27-0" .Capabilities.KubeVersion.GitVersion }} + metrics: + - type: ContainerResource + containerResource: + container: {{ .Chart.Name }}-ingest-consumer-events + name: cpu + target: + type: Utilization + averageUtilization: {{ .Values.sentry.ingestConsumer.autoscaling.targetCPUUtilizationPercentage }} + {{- else }} + metrics: + - type: Resource + resource: + name: cpu + target: + type: Utilization + averageUtilization: {{ .Values.sentry.ingestConsumer.autoscaling.targetCPUUtilizationPercentage }} + {{- end }} +--- +apiVersion: {{ template "sentry.autoscaling.apiVersion" . }} +kind: HorizontalPodAutoscaler +metadata: + name: {{ template "sentry.fullname" . }}-sentry-ingest-consumer-transactions +spec: + scaleTargetRef: + apiVersion: apps/v1 + kind: Deployment + name: {{ template "sentry.fullname" . }}-ingest-consumer-transactions + minReplicas: {{ .Values.sentry.ingestConsumer.autoscaling.minReplicas }} + maxReplicas: {{ .Values.sentry.ingestConsumer.autoscaling.maxReplicas }} + {{- if eq (include "sentry.autoscaling.apiVersion" .) "autoscaling/v1" }} + targetCPUUtilizationPercentage: {{ .Values.sentry.ingestConsumer.autoscaling.targetCPUUtilizationPercentage }} + {{- else if semverCompare ">=1.27-0" .Capabilities.KubeVersion.GitVersion }} + metrics: + - type: ContainerResource + containerResource: + container: {{ .Chart.Name }}-ingest-consumer-transactions + name: cpu + target: + type: Utilization + averageUtilization: {{ .Values.sentry.ingestConsumer.autoscaling.targetCPUUtilizationPercentage }} + {{- else }} + metrics: + - type: Resource + resource: + name: cpu + target: + type: Utilization + averageUtilization: {{ .Values.sentry.ingestConsumer.autoscaling.targetCPUUtilizationPercentage }} + {{- end }} {{- end }} diff --git a/sentry/templates/hpa-relay.yaml b/sentry/templates/hpa-relay.yaml index 974b917f0..cc69c7c36 100644 --- a/sentry/templates/hpa-relay.yaml +++ b/sentry/templates/hpa-relay.yaml @@ -1,5 +1,5 @@ {{- if .Values.relay.autoscaling.enabled }} -apiVersion: autoscaling/v1 +apiVersion: {{ template "sentry.autoscaling.apiVersion" . }} kind: HorizontalPodAutoscaler metadata: name: {{ template "sentry.fullname" . }}-relay @@ -15,5 +15,24 @@ spec: name: {{ template "sentry.fullname" . }}-relay minReplicas: {{ .Values.relay.autoscaling.minReplicas }} maxReplicas: {{ .Values.relay.autoscaling.maxReplicas }} + {{- if eq (include "sentry.autoscaling.apiVersion" .) "autoscaling/v1" }} targetCPUUtilizationPercentage: {{ .Values.relay.autoscaling.targetCPUUtilizationPercentage }} + {{- else if semverCompare ">=1.27-0" .Capabilities.KubeVersion.GitVersion }} + metrics: + - type: ContainerResource + containerResource: + container: {{ .Chart.Name }}-relay + name: cpu + target: + type: Utilization + averageUtilization: {{ .Values.relay.autoscaling.targetCPUUtilizationPercentage }} + {{- else }} + metrics: + - type: Resource + resource: + name: cpu + target: + type: Utilization + averageUtilization: {{ .Values.relay.autoscaling.targetCPUUtilizationPercentage }} + {{- end }} {{- end }} diff --git a/sentry/templates/hpa-snuba-api.yaml b/sentry/templates/hpa-snuba-api.yaml index 9f6b00524..ce00aca90 100644 --- a/sentry/templates/hpa-snuba-api.yaml +++ b/sentry/templates/hpa-snuba-api.yaml @@ -1,5 +1,5 @@ {{- if .Values.snuba.api.autoscaling.enabled }} -apiVersion: autoscaling/v1 +apiVersion: {{ template "sentry.autoscaling.apiVersion" . }} kind: HorizontalPodAutoscaler metadata: name: {{ template "sentry.fullname" . }}-snuba-api @@ -10,5 +10,24 @@ spec: name: {{ template "sentry.fullname" . }}-snuba-api minReplicas: {{ .Values.snuba.api.autoscaling.minReplicas }} maxReplicas: {{ .Values.snuba.api.autoscaling.maxReplicas }} + {{- if eq (include "sentry.autoscaling.apiVersion" .) "autoscaling/v1" }} targetCPUUtilizationPercentage: {{ .Values.snuba.api.autoscaling.targetCPUUtilizationPercentage }} + {{- else if semverCompare ">=1.27-0" .Capabilities.KubeVersion.GitVersion }} + metrics: + - type: ContainerResource + containerResource: + container: {{ .Chart.Name }}-snuba + name: cpu + target: + type: Utilization + averageUtilization: {{ .Values.snuba.api.autoscaling.targetCPUUtilizationPercentage }} + {{- else }} + metrics: + - type: Resource + resource: + name: cpu + target: + type: Utilization + averageUtilization: {{ .Values.snuba.api.autoscaling.targetCPUUtilizationPercentage }} + {{- end }} {{- end }} diff --git a/sentry/templates/hpa-vroom.yaml b/sentry/templates/hpa-vroom.yaml index a91a8af4a..954b8bd8f 100644 --- a/sentry/templates/hpa-vroom.yaml +++ b/sentry/templates/hpa-vroom.yaml @@ -1,5 +1,5 @@ {{- if .Values.vroom.autoscaling.enabled }} -apiVersion: autoscaling/v1 +apiVersion: {{ template "sentry.autoscaling.apiVersion" . }} kind: HorizontalPodAutoscaler metadata: name: {{ template "sentry.fullname" . }}-vroom @@ -10,5 +10,24 @@ spec: name: {{ template "sentry.fullname" . }}-vroom minReplicas: {{ .Values.vroom.autoscaling.minReplicas }} maxReplicas: {{ .Values.vroom.autoscaling.maxReplicas }} + {{- if eq (include "sentry.autoscaling.apiVersion" .) "autoscaling/v1" }} targetCPUUtilizationPercentage: {{ .Values.vroom.autoscaling.targetCPUUtilizationPercentage }} + {{- else if semverCompare ">=1.27-0" .Capabilities.KubeVersion.GitVersion }} + metrics: + - type: ContainerResource + containerResource: + container: {{ .Chart.Name }}-vroom + name: cpu + target: + type: Utilization + averageUtilization: {{ .Values.vroom.autoscaling.targetCPUUtilizationPercentage }} + {{- else }} + metrics: + - type: Resource + resource: + name: cpu + target: + type: Utilization + averageUtilization: {{ .Values.vroom.autoscaling.targetCPUUtilizationPercentage }} + {{- end }} {{- end }} diff --git a/sentry/templates/hpa-web.yaml b/sentry/templates/hpa-web.yaml index ebdc1be8a..b3e23445b 100644 --- a/sentry/templates/hpa-web.yaml +++ b/sentry/templates/hpa-web.yaml @@ -1,5 +1,5 @@ {{- if .Values.sentry.web.autoscaling.enabled }} -apiVersion: autoscaling/v1 +apiVersion: {{ template "sentry.autoscaling.apiVersion" . }} kind: HorizontalPodAutoscaler metadata: name: {{ template "sentry.fullname" . }}-sentry-web @@ -10,5 +10,24 @@ spec: name: {{ template "sentry.fullname" . }}-web minReplicas: {{ .Values.sentry.web.autoscaling.minReplicas }} maxReplicas: {{ .Values.sentry.web.autoscaling.maxReplicas }} + {{- if eq (include "sentry.autoscaling.apiVersion" .) "autoscaling/v1" }} targetCPUUtilizationPercentage: {{ .Values.sentry.web.autoscaling.targetCPUUtilizationPercentage }} + {{- else if semverCompare ">=1.27-0" .Capabilities.KubeVersion.GitVersion }} + metrics: + - type: ContainerResource + containerResource: + container: {{ .Chart.Name }}-web + name: cpu + target: + type: Utilization + averageUtilization: {{ .Values.sentry.web.autoscaling.targetCPUUtilizationPercentage }} + {{- else }} + metrics: + - type: Resource + resource: + name: cpu + target: + type: Utilization + averageUtilization: {{ .Values.sentry.web.autoscaling.targetCPUUtilizationPercentage }} + {{- end }} {{- end }} diff --git a/sentry/templates/hpa-worker.yaml b/sentry/templates/hpa-worker.yaml index 96412a3cb..1d3e971ae 100644 --- a/sentry/templates/hpa-worker.yaml +++ b/sentry/templates/hpa-worker.yaml @@ -1,5 +1,5 @@ {{- if .Values.sentry.worker.autoscaling.enabled }} -apiVersion: autoscaling/v1 +apiVersion: {{ template "sentry.autoscaling.apiVersion" . }} kind: HorizontalPodAutoscaler metadata: name: {{ template "sentry.fullname" . }}-sentry-worker @@ -10,5 +10,24 @@ spec: name: {{ template "sentry.fullname" . }}-worker minReplicas: {{ .Values.sentry.worker.autoscaling.minReplicas }} maxReplicas: {{ .Values.sentry.worker.autoscaling.maxReplicas }} + {{- if eq (include "sentry.autoscaling.apiVersion" .) "autoscaling/v1" }} targetCPUUtilizationPercentage: {{ .Values.sentry.worker.autoscaling.targetCPUUtilizationPercentage }} + {{- else if semverCompare ">=1.27-0" .Capabilities.KubeVersion.GitVersion }} + metrics: + - type: ContainerResource + containerResource: + container: {{ .Chart.Name }}-worker + name: cpu + target: + type: Utilization + averageUtilization: {{ .Values.sentry.worker.autoscaling.targetCPUUtilizationPercentage }} + {{- else }} + metrics: + - type: Resource + resource: + name: cpu + target: + type: Utilization + averageUtilization: {{ .Values.sentry.worker.autoscaling.targetCPUUtilizationPercentage }} + {{- end }} {{- end }} From 386e7b7328000a289a7642752af583e8f6d40106 Mon Sep 17 00:00:00 2001 From: Taehyun Kim Date: Thu, 21 Dec 2023 18:14:09 +0900 Subject: [PATCH 099/394] feat: add priorityClassName to clickhouse (#1098) --- clickhouse/Chart.yaml | 2 +- clickhouse/templates/statefulset-clickhouse.yaml | 3 +++ clickhouse/values.yaml | 2 ++ 3 files changed, 6 insertions(+), 1 deletion(-) diff --git a/clickhouse/Chart.yaml b/clickhouse/Chart.yaml index 2b8857ce7..dde947bb3 100755 --- a/clickhouse/Chart.yaml +++ b/clickhouse/Chart.yaml @@ -11,6 +11,6 @@ keywords: name: clickhouse sources: - https://github.com/sentry-kubernetes/charts -version: 3.6.1 +version: 3.7.0 maintainers: - name: sentry-kubernetes diff --git a/clickhouse/templates/statefulset-clickhouse.yaml b/clickhouse/templates/statefulset-clickhouse.yaml index 54f441fdb..7e7caa9ea 100755 --- a/clickhouse/templates/statefulset-clickhouse.yaml +++ b/clickhouse/templates/statefulset-clickhouse.yaml @@ -46,6 +46,9 @@ spec: {{- end }} {{- end }} spec: + {{- with .Values.clickhouse.priorityClassName }} + priorityClassName: {{ . }} + {{- end }} {{- with .Values.clickhouse.podSecurityContext }} securityContext: {{- toYaml . | nindent 8 }} diff --git a/clickhouse/values.yaml b/clickhouse/values.yaml index 0f7eb3bdb..15fe03216 100755 --- a/clickhouse/values.yaml +++ b/clickhouse/values.yaml @@ -134,6 +134,8 @@ clickhouse: imageVersion: "19.14" imagePullPolicy: "IfNotPresent" + priorityClassName: ~ + ## The resource limits and requests used by clickhouse resources: {} From 90172d94e22f73bf422be0eb407ccb5cbe5d7df5 Mon Sep 17 00:00:00 2001 From: Denis Klykvin Date: Wed, 27 Dec 2023 14:38:08 +0300 Subject: [PATCH 100/394] Allow to use specified key for slack existing secrets (#1035) --- sentry/Chart.yaml | 2 +- sentry/templates/_helper.tpl | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/sentry/Chart.yaml b/sentry/Chart.yaml index e782ed415..4248125a2 100644 --- a/sentry/Chart.yaml +++ b/sentry/Chart.yaml @@ -2,7 +2,7 @@ apiVersion: v2 name: sentry description: A Helm chart for Kubernetes type: application -version: 20.12.0 +version: 20.12.1 appVersion: 23.11.0 dependencies: - name: memcached diff --git a/sentry/templates/_helper.tpl b/sentry/templates/_helper.tpl index d6b275b62..797c0df78 100644 --- a/sentry/templates/_helper.tpl +++ b/sentry/templates/_helper.tpl @@ -519,17 +519,17 @@ Common Sentry environment variables valueFrom: secretKeyRef: name: {{ .Values.slack.existingSecret }} - key: "client-id" + key: {{ default "client-id" .Values.slack.existingSecretClientId }} - name: SLACK_CLIENT_SECRET valueFrom: secretKeyRef: name: {{ .Values.slack.existingSecret }} - key: "client-secret" + key: {{ default "client-secret" .Values.slack.existingSecretClientSecret }} - name: SLACK_SIGNING_SECRET valueFrom: secretKeyRef: name: {{ .Values.slack.existingSecret }} - key: "signing-secret" + key: {{ default "signing-secret" .Values.slack.existingSecretSigningSecret }} {{- end }} {{- if and .Values.github.existingSecret }} - name: GITHUB_APP_PRIVATE_KEY From c94c2fd6655d57e6b036fecf659153c99813197b Mon Sep 17 00:00:00 2001 From: Sem Schilder Date: Sat, 6 Jan 2024 19:47:40 +0100 Subject: [PATCH 101/394] Update sentry to 23.11.2 (#1106) --- sentry/Chart.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sentry/Chart.yaml b/sentry/Chart.yaml index 4248125a2..4fe1f8456 100644 --- a/sentry/Chart.yaml +++ b/sentry/Chart.yaml @@ -2,8 +2,8 @@ apiVersion: v2 name: sentry description: A Helm chart for Kubernetes type: application -version: 20.12.1 -appVersion: 23.11.0 +version: 20.12.2 +appVersion: 23.11.2 dependencies: - name: memcached repository: oci://registry-1.docker.io/bitnamicharts From dccd183760ee92aab2592333d8dc1a23d7411466 Mon Sep 17 00:00:00 2001 From: Taehyun Kim Date: Fri, 12 Jan 2024 17:17:17 +0900 Subject: [PATCH 102/394] feat: bump sentry dependencies (#1099) --- README.md | 10 ++++++++++ sentry/Chart.lock | 16 ++++++++-------- sentry/Chart.yaml | 16 ++++++++-------- sentry/charts/clickhouse-3.5.0.tgz | Bin 13016 -> 0 bytes sentry/charts/clickhouse-3.7.0.tgz | Bin 0 -> 13080 bytes sentry/charts/kafka-22.1.3.tgz | Bin 113854 -> 0 bytes sentry/charts/kafka-23.0.7.tgz | Bin 0 -> 114583 bytes sentry/charts/memcached-6.5.2.tgz | Bin 32381 -> 0 bytes sentry/charts/memcached-6.5.9.tgz | Bin 0 -> 32675 bytes sentry/charts/rabbitmq-11.15.3.tgz | Bin 55665 -> 0 bytes sentry/charts/rabbitmq-11.16.2.tgz | Bin 0 -> 55730 bytes sentry/charts/zookeeper-11.4.11.tgz | Bin 0 -> 42539 bytes sentry/charts/zookeeper-9.0.0.tgz | Bin 42226 -> 0 bytes 13 files changed, 26 insertions(+), 16 deletions(-) delete mode 100644 sentry/charts/clickhouse-3.5.0.tgz create mode 100644 sentry/charts/clickhouse-3.7.0.tgz delete mode 100644 sentry/charts/kafka-22.1.3.tgz create mode 100644 sentry/charts/kafka-23.0.7.tgz delete mode 100644 sentry/charts/memcached-6.5.2.tgz create mode 100644 sentry/charts/memcached-6.5.9.tgz delete mode 100644 sentry/charts/rabbitmq-11.15.3.tgz create mode 100644 sentry/charts/rabbitmq-11.16.2.tgz create mode 100644 sentry/charts/zookeeper-11.4.11.tgz delete mode 100644 sentry/charts/zookeeper-9.0.0.tgz diff --git a/README.md b/README.md index 44bf8c495..2dcad0629 100644 --- a/README.md +++ b/README.md @@ -14,6 +14,16 @@ Big thanks to the maintainers of the [deprecated chart](https://github.com/helm/ For now the full list of values is not documented but you can get inspired by the values.yaml specific to each directory. +## Upgrading from 20.x.x version of this Chart to 21.x.x + +Bumped dependencies: +- memcached > 6.5.9 +- kafka > 23.0.7 - This is a major update, but only kafka version is updated. See [bitnami charts' update note](https://github.com/bitnami/charts/tree/main/bitnami/kafka#to-2300) +- clickhouse > 3.7.0 - Supports priorityClassName and max_suspicious_broken_parts config. +- zookeeper > 11.4.11 - 2 Major updates from v9 to v11. See [To v10 upgrade notes](https://github.com/bitnami/charts/tree/main/bitnami/zookeeper#to-1000) and [To v11 upgrade notes](https://github.com/bitnami/charts/tree/main/bitnami/zookeeper#to-1100) +- rabbitmq > 11.16.2 + + ## Upgrading from 19.x.x version of this Chart to 20.x.x Bumped dependencies: diff --git a/sentry/Chart.lock b/sentry/Chart.lock index 3091435b6..592aca01b 100644 --- a/sentry/Chart.lock +++ b/sentry/Chart.lock @@ -1,27 +1,27 @@ dependencies: - name: memcached repository: oci://registry-1.docker.io/bitnamicharts - version: 6.5.2 + version: 6.5.9 - name: redis repository: oci://registry-1.docker.io/bitnamicharts version: 17.11.3 - name: kafka repository: oci://registry-1.docker.io/bitnamicharts - version: 22.1.3 + version: 23.0.7 - name: clickhouse repository: https://sentry-kubernetes.github.io/charts - version: 3.5.0 + version: 3.7.0 - name: zookeeper - repository: https://raw.githubusercontent.com/bitnami/charts/pre-2022/bitnami - version: 9.0.0 + repository: oci://registry-1.docker.io/bitnamicharts + version: 11.4.11 - name: rabbitmq repository: oci://registry-1.docker.io/bitnamicharts - version: 11.15.3 + version: 11.16.2 - name: postgresql repository: oci://registry-1.docker.io/bitnamicharts version: 12.5.1 - name: nginx repository: oci://registry-1.docker.io/bitnamicharts version: 14.2.2 -digest: sha256:e5e8a8f0fca2c7298669bb86198f806cd770f8ce77ee41882a50eb40e4bd6672 -generated: "2023-07-19T08:53:14.343715+02:00" +digest: sha256:1efe56211a485ac6f6e7e24b1dec64beac3e13fc47f2ec3919f6a11df7f24e3a +generated: "2023-12-22T11:35:21.369627+09:00" diff --git a/sentry/Chart.yaml b/sentry/Chart.yaml index 4fe1f8456..81f6b7488 100644 --- a/sentry/Chart.yaml +++ b/sentry/Chart.yaml @@ -1,13 +1,13 @@ -apiVersion: v2 +apiVersion: v3 name: sentry description: A Helm chart for Kubernetes type: application -version: 20.12.2 +version: 21.0.0 appVersion: 23.11.2 dependencies: - name: memcached repository: oci://registry-1.docker.io/bitnamicharts - version: 6.5.2 + version: 6.5.9 condition: sourcemaps.enabled - name: redis repository: oci://registry-1.docker.io/bitnamicharts @@ -15,19 +15,19 @@ dependencies: condition: redis.enabled - name: kafka repository: oci://registry-1.docker.io/bitnamicharts - version: 22.1.3 + version: 23.0.7 condition: kafka.enabled - name: clickhouse repository: https://sentry-kubernetes.github.io/charts - version: 3.5.0 + version: 3.7.0 condition: clickhouse.enabled - name: zookeeper - repository: https://raw.githubusercontent.com/bitnami/charts/pre-2022/bitnami - version: 9.0.0 + repository: oci://registry-1.docker.io/bitnamicharts + version: 11.4.11 condition: zookeeper.enabled - name: rabbitmq repository: oci://registry-1.docker.io/bitnamicharts - version: 11.15.3 + version: 11.16.2 alias: rabbitmq condition: rabbitmq.enabled - name: postgresql diff --git a/sentry/charts/clickhouse-3.5.0.tgz b/sentry/charts/clickhouse-3.5.0.tgz deleted file mode 100644 index b5fbfe9fd52c170ad87c0798df763a65f09cf3ca..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13016 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 QeqsUri&swqtb+mmA5n8DW&i*H diff --git a/sentry/charts/clickhouse-3.7.0.tgz b/sentry/charts/clickhouse-3.7.0.tgz new file mode 100644 index 0000000000000000000000000000000000000000..33dbdbd1ce70f47f4945392c02b93273b0268970 GIT binary patch literal 13080 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

sfmLKPD88(JIe>_xpRr`d?cwp6>s8m}mL>zsy@) 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

gkWh4+J{s)*-tJbh{%>!0yZ2=OKg6>J&S1@XC7b z#?#1p{{O5s@CH&$5(bW69x=;}DER|F4FY|6*_V>HOD&JZs=*9EWg4^CEn35#oDn;@Y2*?0)sHXFE$idQkKD4hd=#P3N1=z2vflaHI#BS$Ih1JHLrxu0~_ z4PiJYbUpyY!-H;@qA_MMojZNkC*BpJE+*Zf>|b`zyA=I;BxEE&79Ryj`=5g(;^u1F zOrQrN{6=>_>swbi^ap@D@_76^jI1e&AvdBq<`VA;&xyZa?kEWYnGz{Bw)I!jxwMdg z{VNIr0^SlD__jo1Z4DfUF(rN?b|WlH=xS+?M3l_1j~IZO^g5&mCMbvyW#D>(y$SGO z$SonU3n0!r%uqlg5Ta`}Eg<3cwPcDC8+7zq0j4m7V?0rMtk3dNf>a6E-$bWTW| zF@feSK40-XLIc2rH)H|eBj!;oT%rMZDHspv=7z6_IZ*EY1jOSmkp%$y1gBAe1|Vfu z%QD!yp{w(>rJ$aK&)Lg_tk}OBj&b(<)e=$2vb(1 z1~)DA?5<^+ysKy>es>(F+8$I?xxFz6Kmdm*P%9LSqV}K4DLjqfp9xBh%4{}1e+KD! z2OWj|0)~4#DD={kls7k4ZqR-dWFvN6S4IC&I2)vAinX17c5rd=_VoN^`U1$1-!GI* z2gZ*;5nAMdjq-06kW0^w9I=YumM$l#KKNJMGRSv%h2{%;yfOmDZ97!Qpt5|!n;Stt zYt7tE5M(V#R9^U-qzSw+_Z5|Zot$1CUAXb5IOpWtVc)jbd)S@ZUjG(*w{5SYZOYfX z^DeHKo8uAJNFzc$zH$nt1u!nPBt3!I~nj`dF1U-}<@y&PvI0XE`NXXIKw?B)rNUp(!H#S#qkfFUD;P@S@iUj>zk)Usq zpuZXt^zVTL{UQl;DB*Q9rqJh>icle!1oYjW+q0~9ry)2YGc+9{3i{idV5_&)+mtT! zY)i+6!8K$+xFFm;8sQML3Gy=+e~jZvGITvM6|n;qZ(L(Bj1%UNkrPjlqr$A6O%P8o z15@}1p*p_9T|Jrj$M}Gi0h8{xdlMLr5#y_4fMqO$zt18CO2&kP5EHHx2#pAZu{2_R zJQ^V}Eh7ZugmO^6kHnU!9O|~Tpac{yhsxv?F^#ko6HNe|4-0VfQBk9mvaBiK+{L(pM3 z2SXB1ffP}%kA%E0TR+|PC`2fXG~kY+pUL+yXYm$!jDaqLs@YsaA4B>hVMqG8la1JnI31aQLls3AOBgLr9 zLm{M?a0S72wwfswbTPm731Yl^t+KQ{!f?(fGD9O9h42#!!e$Ol3Jph_Ey6ob47HX} zG(uD>s&`~G!XoG>n)$>_xMw5gY_agnwm!_ZKTPphPH=ZE{il;Kh zd3p>n0kdtzEw33GB>@OcK0W-ti8e>3b{jhNTRt+(*F;S zMDri{GPbRy#-;|SuZSk+zY0-;>zI?5&E zvDgCv495u^BQPd2L_@Kijp!6JxlF>)w*oxHu~LSm;ke(>R_@dD^gKOJ&r;9-4*&rF M|AVgOX8=4402-V&s{jB1 diff --git a/sentry/charts/kafka-23.0.7.tgz b/sentry/charts/kafka-23.0.7.tgz new file mode 100644 index 0000000000000000000000000000000000000000..34534e4a0a0181cecd6c375bbb8c316f0b70a629 GIT binary patch literal 114583 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 z