diff --git a/README.md b/README.md index 3a47601..a26bd41 100644 --- a/README.md +++ b/README.md @@ -63,6 +63,35 @@ for customizations. These can be configured in more detail via `values.yaml`. The following examples serve as individual configurations and as inspiration for how deployment problems can be solved. +#### Avoid CPU throttling by defining a CPU limit + +If the application is deployed with a CPU resource limit, Prometheus may throw a CPU throttling warning for the +application. This has more or less to do with the fact that the application finds the number of CPUs of the host, but +cannot use the available CPU time to perform computing operations. + +The application must be informed that despite several CPUs only a part (limit) of the available computing time is +available. As this is a Golang application, this can be implemented using `GOMAXPROCS`. The following example is one way +of defining `GOMAXPROCS` automatically based on the defined CPU limit like `100m`. Please keep in mind, that the CFS +rate of `100ms` - default on each kubernetes node, is also very important to avoid CPU throttling. + +Further information about this topic can be found [here](https://kanishk.io/posts/cpu-throttling-in-containerized-go-apps/). + +> [!NOTE] +> The environment variable `GOMAXPROCS` is set automatically, when a CPU limit is defined. An explicit configuration is +> not anymore required. + +```bash +helm install prometheus-postgres-exporter prometheus-exporters/prometheus-postgres-exporter \ + --set 'config.database.secret.databaseUsername=postgres' \ + --set 'config.database.secret.databasePassword=postgres' \ + --set 'config.database.secret.databaseConnectionUrl="postgres.example.local:5432/postgres?ssl=disable"' \ + --set 'prometheus.metrics.enabled=true' \ + --set 'prometheus.metrics.serviceMonitor.enabled=true' \ + --set 'deployment.postgresExporter.env.name=GOMAXPROCS' \ + --set 'deployment.postgresExporter.env.valueFrom.resourceFieldRef.resource=limits.cpu' \ + --set 'deployment.postgresExporter.resources.limits.cpu=100m' +``` + #### TLS authentication and encryption The first example shows how to deploy the metric exporter with TLS encryption. The verification of the custom TLS diff --git a/templates/prometheus-postgres-exporter/_deployment.tpl b/templates/prometheus-postgres-exporter/_deployment.tpl index 3cc9cf3..57d5935 100644 --- a/templates/prometheus-postgres-exporter/_deployment.tpl +++ b/templates/prometheus-postgres-exporter/_deployment.tpl @@ -9,6 +9,17 @@ {{- end }} {{- end }} +{{/* env */}} + +{{- define "prometheus-postgres-exporter.deployment.env" -}} +{{- $env := dict "env" (.Values.deployment.postgresExporter.env | default (list) ) }} +{{- if and (hasKey .Values.deployment.postgresExporter.resources "limits") (hasKey .Values.deployment.postgresExporter.resources.limits "cpu") }} +{{- $env = merge $env (dict "env" (list (dict "name" "GOMAXPROCS" "valueFrom" (dict "resourceFieldRef" (dict "resource" "limits.cpu"))))) }} +{{- end }} +{{ toYaml $env }} +{{- end -}} + + {{/* envFrom */}} {{- define "prometheus-postgres-exporter.deployment.envFrom" -}} diff --git a/templates/prometheus-postgres-exporter/deployment.yaml b/templates/prometheus-postgres-exporter/deployment.yaml index 6effd80..a09b462 100644 --- a/templates/prometheus-postgres-exporter/deployment.yaml +++ b/templates/prometheus-postgres-exporter/deployment.yaml @@ -34,9 +34,10 @@ spec: {{- range .Values.deployment.postgresExporter.args }} - {{ . | quote }} {{- end }} - {{- with .Values.deployment.postgresExporter.env }} + {{- $env := (include "prometheus-postgres-exporter.deployment.env" . | fromYaml) }} + {{- if and (hasKey $env "env") (gt (len $env.env) 0) }} env: - {{- toYaml . | nindent 8 }} + {{- toYaml $env.env | nindent 8 }} {{- end }} {{- $envFrom := (include "prometheus-postgres-exporter.deployment.envFrom" . | fromYaml) }} {{- if hasKey $envFrom "envFrom" }} diff --git a/unittests/deployment/deployment.yaml b/unittests/deployment/deployment.yaml index dc06335..aead8fa 100644 --- a/unittests/deployment/deployment.yaml +++ b/unittests/deployment/deployment.yaml @@ -227,6 +227,13 @@ tests: cpu: 25m memory: 100MB asserts: + - equal: + path: spec.template.spec.containers[0].env + value: + - name: GOMAXPROCS + valueFrom: + resourceFieldRef: + resource: limits.cpu - equal: path: spec.template.spec.containers[0].resources value: