diff --git a/.github/workflows/helm-test.yml b/.github/workflows/helm-test.yml index 6babeceefcf9..3b7a1c32fd39 100644 --- a/.github/workflows/helm-test.yml +++ b/.github/workflows/helm-test.yml @@ -74,5 +74,13 @@ jobs: uses: helm/kind-action@v1.8.0 if: steps.list-changed.outputs.changed == 'true' + - name: Add dependency chart repos + run: | + helm repo add prometheus-community https://prometheus-community.github.io/helm-charts + + - name: Install Prometheus Operator CRDs + run: | + helm install my-prometheus-operator-crds prometheus-community/prometheus-operator-crds --version 6.0.0 + - name: Test charts run: ct install --config ./operations/helm/ct.yaml diff --git a/operations/helm/README.md b/operations/helm/README.md index 43fab812a1ee..eeead5738df7 100644 --- a/operations/helm/README.md +++ b/operations/helm/README.md @@ -10,8 +10,8 @@ These manifests are never run directly, but are instead used to validate the correctness of the templates emitted by the Helm chart. To regenerate this folder, call `make rebuild-tests` from the root of the repository. -`make rebuild-tests` will iterate through the value.yaml files in -`charts/grafana-agent/tests` and generate each one as a separate directory. +`make generate-helm-tests` will iterate through the value.yaml files in +`charts/grafana-agent/ci` and generate each one as a separate directory under `charts/grafana-agent/tests`. When modifying the Helm charts, `make rebuild-tests` must be run before submitting a PR, as a linter check will ensure that this directory is diff --git a/operations/helm/charts/grafana-agent/CHANGELOG.md b/operations/helm/charts/grafana-agent/CHANGELOG.md index 7104cf1d004f..c2c683adcac0 100644 --- a/operations/helm/charts/grafana-agent/CHANGELOG.md +++ b/operations/helm/charts/grafana-agent/CHANGELOG.md @@ -14,6 +14,8 @@ Unreleased - An image's digest can now be used in place of a tag. (@hainenber) +- Add ServiceMonitor support. (@QuentinBisson) + 0.24.0 (2023-09-08) ------------------- diff --git a/operations/helm/charts/grafana-agent/README.md b/operations/helm/charts/grafana-agent/README.md index f2982e5f9c1d..6e45b8d4f666 100644 --- a/operations/helm/charts/grafana-agent/README.md +++ b/operations/helm/charts/grafana-agent/README.md @@ -118,6 +118,11 @@ use the older mode (called "static mode"), set the `agent.mode` value to | serviceAccount.annotations | object | `{}` | Annotations to add to the created service account. | | serviceAccount.create | bool | `true` | Whether to create a service account for the Grafana Agent deployment. | | serviceAccount.name | string | `nil` | The name of the existing service account to use when serviceAccount.create is false. | +| serviceMonitor.additionalLabels | object | `{}` | Additional labels for the service monitor. | +| serviceMonitor.enabled | bool | `false` | | +| serviceMonitor.interval | string | `""` | Scrape interval. If not set, the Prometheus default scrape interval is used. | +| serviceMonitor.metricRelabelings | list | `[]` | MetricRelabelConfigs to apply to samples after scraping, but before ingestion. ref: https://github.com/prometheus-operator/prometheus-operator/blob/main/Documentation/api.md#relabelconfig | +| serviceMonitor.relabelings | list | `[]` | RelabelConfigs to apply to samples before scraping ref: https://github.com/prometheus-operator/prometheus-operator/blob/main/Documentation/api.md#relabelconfig | ### agent.extraArgs diff --git a/operations/helm/charts/grafana-agent/ci/enable-servicemonitor-values.yaml b/operations/helm/charts/grafana-agent/ci/enable-servicemonitor-values.yaml new file mode 100644 index 000000000000..837bf3f5ff2c --- /dev/null +++ b/operations/helm/charts/grafana-agent/ci/enable-servicemonitor-values.yaml @@ -0,0 +1,5 @@ +# Test rendering of the chart with the service monitor enabled +service: + enabled: true +serviceMonitor: + enabled: true diff --git a/operations/helm/charts/grafana-agent/templates/servicemonitor.yaml b/operations/helm/charts/grafana-agent/templates/servicemonitor.yaml new file mode 100644 index 000000000000..06472be839d1 --- /dev/null +++ b/operations/helm/charts/grafana-agent/templates/servicemonitor.yaml @@ -0,0 +1,29 @@ +{{- if and .Values.service.enabled .Values.serviceMonitor.enabled -}} +apiVersion: monitoring.coreos.com/v1 +kind: ServiceMonitor +metadata: + name: {{ include "grafana-agent.fullname" . }} + labels: + {{- include "grafana-agent.labels" . | nindent 4 }} + {{- with .Values.serviceMonitor.additionalLabels }} + {{- toYaml . | nindent 4 }} + {{- end }} +spec: + endpoints: + - port: http-metrics + honorLabels: true + {{- if .Values.serviceMonitor.interval }} + interval: {{ .Values.serviceMonitor.interval }} + {{- end }} + {{- if .Values.serviceMonitor.metricRelabelings }} + metricRelabelings: + {{ tpl (toYaml .Values.serviceMonitor.metricRelabelings | nindent 6) . }} + {{- end }} + {{- if .Values.serviceMonitor.relabelings }} + relabelings: + {{ tpl (toYaml .Values.serviceMonitor.relabelings | nindent 6) . }} + {{- end }} + selector: + matchLabels: + {{- include "grafana-agent.selectorLabels" . | nindent 6 }} +{{- end }} diff --git a/operations/helm/charts/grafana-agent/values.yaml b/operations/helm/charts/grafana-agent/values.yaml index da4a1b737073..114cac02cdfb 100644 --- a/operations/helm/charts/grafana-agent/values.yaml +++ b/operations/helm/charts/grafana-agent/values.yaml @@ -216,6 +216,29 @@ service: annotations: {} # cloud.google.com/load-balancer-type: Internal +serviceMonitor: + enabled: false + # -- Additional labels for the service monitor. + additionalLabels: {} + # -- Scrape interval. If not set, the Prometheus default scrape interval is used. + interval: "" + # -- MetricRelabelConfigs to apply to samples after scraping, but before ingestion. + # ref: https://github.com/prometheus-operator/prometheus-operator/blob/main/Documentation/api.md#relabelconfig + metricRelabelings: [] + # - action: keep + # regex: 'kube_(daemonset|deployment|pod|namespace|node|statefulset).+' + # sourceLabels: [__name__] + + # -- RelabelConfigs to apply to samples before scraping + # ref: https://github.com/prometheus-operator/prometheus-operator/blob/main/Documentation/api.md#relabelconfig + relabelings: [] + # - sourceLabels: [__meta_kubernetes_pod_node_name] + # separator: ; + # regex: ^(.*)$ + # targetLabel: nodename + # replacement: $1 + # action: replace + ingress: # -- Enables ingress for the agent (faro port) enabled: false diff --git a/operations/helm/tests/enable-servicemonitor/grafana-agent/templates/configmap.yaml b/operations/helm/tests/enable-servicemonitor/grafana-agent/templates/configmap.yaml new file mode 100644 index 000000000000..2fdc6f011777 --- /dev/null +++ b/operations/helm/tests/enable-servicemonitor/grafana-agent/templates/configmap.yaml @@ -0,0 +1,42 @@ +--- +# Source: grafana-agent/templates/configmap.yaml +apiVersion: v1 +kind: ConfigMap +metadata: + name: grafana-agent + labels: + helm.sh/chart: grafana-agent + app.kubernetes.io/name: grafana-agent + app.kubernetes.io/instance: grafana-agent + app.kubernetes.io/version: "vX.Y.Z" + app.kubernetes.io/managed-by: Helm +data: + config.river: |- + logging { + level = "info" + format = "logfmt" + } + + discovery.kubernetes "pods" { + role = "pod" + } + + discovery.kubernetes "nodes" { + role = "node" + } + + discovery.kubernetes "services" { + role = "service" + } + + discovery.kubernetes "endpoints" { + role = "endpoints" + } + + discovery.kubernetes "endpointslices" { + role = "endpointslice" + } + + discovery.kubernetes "ingresses" { + role = "ingress" + } diff --git a/operations/helm/tests/enable-servicemonitor/grafana-agent/templates/controllers/daemonset.yaml b/operations/helm/tests/enable-servicemonitor/grafana-agent/templates/controllers/daemonset.yaml new file mode 100644 index 000000000000..de2bd68bad5b --- /dev/null +++ b/operations/helm/tests/enable-servicemonitor/grafana-agent/templates/controllers/daemonset.yaml @@ -0,0 +1,70 @@ +--- +# Source: grafana-agent/templates/controllers/daemonset.yaml +apiVersion: apps/v1 +kind: DaemonSet +metadata: + name: grafana-agent + labels: + helm.sh/chart: grafana-agent + app.kubernetes.io/name: grafana-agent + app.kubernetes.io/instance: grafana-agent + app.kubernetes.io/version: "vX.Y.Z" + app.kubernetes.io/managed-by: Helm +spec: + minReadySeconds: 10 + selector: + matchLabels: + app.kubernetes.io/name: grafana-agent + app.kubernetes.io/instance: grafana-agent + template: + metadata: + labels: + app.kubernetes.io/name: grafana-agent + app.kubernetes.io/instance: grafana-agent + spec: + serviceAccountName: grafana-agent + containers: + - name: grafana-agent + image: docker.io/grafana/agent:v0.36.1 + imagePullPolicy: IfNotPresent + args: + - run + - /etc/agent/config.river + - --storage.path=/tmp/agent + - --server.http.listen-addr=0.0.0.0:80 + env: + - name: AGENT_MODE + value: flow + - name: HOSTNAME + valueFrom: + fieldRef: + fieldPath: spec.nodeName + ports: + - containerPort: 80 + name: http-metrics + readinessProbe: + httpGet: + path: /-/ready + port: 80 + initialDelaySeconds: 10 + timeoutSeconds: 1 + volumeMounts: + - name: config + mountPath: /etc/agent + - name: config-reloader + image: docker.io/jimmidyson/configmap-reload:v0.8.0 + args: + - --volume-dir=/etc/agent + - --webhook-url=http://localhost:80/-/reload + volumeMounts: + - name: config + mountPath: /etc/agent + resources: + requests: + cpu: 1m + memory: 5Mi + dnsPolicy: ClusterFirst + volumes: + - name: config + configMap: + name: grafana-agent diff --git a/operations/helm/tests/enable-servicemonitor/grafana-agent/templates/rbac.yaml b/operations/helm/tests/enable-servicemonitor/grafana-agent/templates/rbac.yaml new file mode 100644 index 000000000000..30b608a04f7f --- /dev/null +++ b/operations/helm/tests/enable-servicemonitor/grafana-agent/templates/rbac.yaml @@ -0,0 +1,101 @@ +--- +# Source: grafana-agent/templates/rbac.yaml +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + name: grafana-agent + labels: + helm.sh/chart: grafana-agent + app.kubernetes.io/name: grafana-agent + app.kubernetes.io/instance: grafana-agent + app.kubernetes.io/version: "vX.Y.Z" + app.kubernetes.io/managed-by: Helm +rules: + # Rules which allow discovery.kubernetes to function. + - apiGroups: + - "" + - "discovery.k8s.io" + - "networking.k8s.io" + resources: + - endpoints + - endpointslices + - ingresses + - nodes + - nodes/proxy + - nodes/metrics + - pods + - services + verbs: + - get + - list + - watch + # Rules which allow loki.source.kubernetes and loki.source.podlogs to work. + - apiGroups: + - "" + resources: + - pods + - pods/log + - namespaces + verbs: + - get + - list + - watch + - apiGroups: + - "monitoring.grafana.com" + resources: + - podlogs + verbs: + - get + - list + - watch + # Rules which allow mimir.rules.kubernetes to work. + - apiGroups: ["monitoring.coreos.com"] + resources: + - prometheusrules + verbs: + - get + - list + - watch + - nonResourceURLs: + - /metrics + verbs: + - get + # Rules for prometheus.kubernetes.* + - apiGroups: ["monitoring.coreos.com"] + resources: + - podmonitors + - servicemonitors + - probes + verbs: + - get + - list + - watch + # Rules which allow eventhandler to work. + - apiGroups: + - "" + resources: + - events + verbs: + - get + - list + - watch +--- +# Source: grafana-agent/templates/rbac.yaml +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRoleBinding +metadata: + name: grafana-agent + labels: + helm.sh/chart: grafana-agent + app.kubernetes.io/name: grafana-agent + app.kubernetes.io/instance: grafana-agent + app.kubernetes.io/version: "vX.Y.Z" + app.kubernetes.io/managed-by: Helm +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: ClusterRole + name: grafana-agent +subjects: + - kind: ServiceAccount + name: grafana-agent + namespace: default diff --git a/operations/helm/tests/enable-servicemonitor/grafana-agent/templates/service.yaml b/operations/helm/tests/enable-servicemonitor/grafana-agent/templates/service.yaml new file mode 100644 index 000000000000..04f6eeff3c4d --- /dev/null +++ b/operations/helm/tests/enable-servicemonitor/grafana-agent/templates/service.yaml @@ -0,0 +1,22 @@ +--- +# Source: grafana-agent/templates/service.yaml +apiVersion: v1 +kind: Service +metadata: + name: grafana-agent + labels: + helm.sh/chart: grafana-agent + app.kubernetes.io/name: grafana-agent + app.kubernetes.io/instance: grafana-agent + app.kubernetes.io/version: "vX.Y.Z" + app.kubernetes.io/managed-by: Helm +spec: + type: ClusterIP + selector: + app.kubernetes.io/name: grafana-agent + app.kubernetes.io/instance: grafana-agent + ports: + - name: http-metrics + port: 80 + targetPort: 80 + protocol: "TCP" diff --git a/operations/helm/tests/enable-servicemonitor/grafana-agent/templates/serviceaccount.yaml b/operations/helm/tests/enable-servicemonitor/grafana-agent/templates/serviceaccount.yaml new file mode 100644 index 000000000000..1dfd6fff9bdf --- /dev/null +++ b/operations/helm/tests/enable-servicemonitor/grafana-agent/templates/serviceaccount.yaml @@ -0,0 +1,12 @@ +--- +# Source: grafana-agent/templates/serviceaccount.yaml +apiVersion: v1 +kind: ServiceAccount +metadata: + name: grafana-agent + labels: + helm.sh/chart: grafana-agent + app.kubernetes.io/name: grafana-agent + app.kubernetes.io/instance: grafana-agent + app.kubernetes.io/version: "vX.Y.Z" + app.kubernetes.io/managed-by: Helm diff --git a/operations/helm/tests/enable-servicemonitor/grafana-agent/templates/servicemonitor.yaml b/operations/helm/tests/enable-servicemonitor/grafana-agent/templates/servicemonitor.yaml new file mode 100644 index 000000000000..0b456bb94294 --- /dev/null +++ b/operations/helm/tests/enable-servicemonitor/grafana-agent/templates/servicemonitor.yaml @@ -0,0 +1,20 @@ +--- +# Source: grafana-agent/templates/servicemonitor.yaml +apiVersion: monitoring.coreos.com/v1 +kind: ServiceMonitor +metadata: + name: grafana-agent + labels: + helm.sh/chart: grafana-agent + app.kubernetes.io/name: grafana-agent + app.kubernetes.io/instance: grafana-agent + app.kubernetes.io/version: "vX.Y.Z" + app.kubernetes.io/managed-by: Helm +spec: + endpoints: + - port: http-metrics + honorLabels: true + selector: + matchLabels: + app.kubernetes.io/name: grafana-agent + app.kubernetes.io/instance: grafana-agent