From 2ed35497aad06f802eb82793f405f4b4ea683849 Mon Sep 17 00:00:00 2001 From: "@tanya_r" Date: Fri, 19 Jun 2026 02:04:18 -0300 Subject: [PATCH] feat(observability): add prometheus operator servicemonitor to the helm charts Add an opt-in ServiceMonitor template to the ledger and payments charts so a cluster running the Prometheus Operator scrapes each service's /actuator/prometheus. The template is gated behind serviceMonitor.enabled (default false), so the default render stays CRD-free and the existing kubeconform-strict check is unchanged; a second CI step renders it with the flag on and validates everything but the operator CRD. Closes #249 --- .github/workflows/helm-test.yml | 7 +++++++ deploy/helm/ledger/templates/servicemonitor.yaml | 16 ++++++++++++++++ deploy/helm/ledger/values.yaml | 6 ++++++ .../helm/payments/templates/servicemonitor.yaml | 16 ++++++++++++++++ deploy/helm/payments/values.yaml | 6 ++++++ 5 files changed, 51 insertions(+) create mode 100644 deploy/helm/ledger/templates/servicemonitor.yaml create mode 100644 deploy/helm/payments/templates/servicemonitor.yaml diff --git a/.github/workflows/helm-test.yml b/.github/workflows/helm-test.yml index 18a52da..16eaa73 100644 --- a/.github/workflows/helm-test.yml +++ b/.github/workflows/helm-test.yml @@ -55,3 +55,10 @@ jobs: run: | helm template ${{ matrix.chart }} deploy/helm/${{ matrix.chart }} --set image.tag=test \ | kubeconform -strict -summary -kubernetes-version "$KUBERNETES_VERSION" + + - name: Validate the ServiceMonitor renders (operator CRD skipped) + run: | + rendered=$(helm template ${{ matrix.chart }} deploy/helm/${{ matrix.chart }} \ + --set image.tag=test --set serviceMonitor.enabled=true) + echo "$rendered" | grep -q 'kind: ServiceMonitor' + echo "$rendered" | kubeconform -strict -summary -skip ServiceMonitor -kubernetes-version "$KUBERNETES_VERSION" diff --git a/deploy/helm/ledger/templates/servicemonitor.yaml b/deploy/helm/ledger/templates/servicemonitor.yaml new file mode 100644 index 0000000..31463e5 --- /dev/null +++ b/deploy/helm/ledger/templates/servicemonitor.yaml @@ -0,0 +1,16 @@ +{{- if .Values.serviceMonitor.enabled }} +apiVersion: monitoring.coreos.com/v1 +kind: ServiceMonitor +metadata: + name: {{ include "ledger.fullname" . }} + labels: + {{- include "ledger.labels" . | nindent 4 }} +spec: + selector: + matchLabels: + {{- include "ledger.selectorLabels" . | nindent 6 }} + endpoints: + - port: http + path: {{ .Values.serviceMonitor.path }} + interval: {{ .Values.serviceMonitor.interval }} +{{- end }} diff --git a/deploy/helm/ledger/values.yaml b/deploy/helm/ledger/values.yaml index 69b67df..beb310f 100644 --- a/deploy/helm/ledger/values.yaml +++ b/deploy/helm/ledger/values.yaml @@ -19,6 +19,12 @@ service: type: ClusterIP port: 8080 +# Prometheus Operator ServiceMonitor. Off by default; enable on a cluster running the operator. +serviceMonitor: + enabled: false + interval: 30s + path: /actuator/prometheus + resources: requests: cpu: 250m diff --git a/deploy/helm/payments/templates/servicemonitor.yaml b/deploy/helm/payments/templates/servicemonitor.yaml new file mode 100644 index 0000000..6d5f87d --- /dev/null +++ b/deploy/helm/payments/templates/servicemonitor.yaml @@ -0,0 +1,16 @@ +{{- if .Values.serviceMonitor.enabled }} +apiVersion: monitoring.coreos.com/v1 +kind: ServiceMonitor +metadata: + name: {{ include "payments.fullname" . }} + labels: + {{- include "payments.labels" . | nindent 4 }} +spec: + selector: + matchLabels: + {{- include "payments.selectorLabels" . | nindent 6 }} + endpoints: + - port: http + path: {{ .Values.serviceMonitor.path }} + interval: {{ .Values.serviceMonitor.interval }} +{{- end }} diff --git a/deploy/helm/payments/values.yaml b/deploy/helm/payments/values.yaml index a3c416d..93363af 100644 --- a/deploy/helm/payments/values.yaml +++ b/deploy/helm/payments/values.yaml @@ -19,6 +19,12 @@ service: type: ClusterIP port: 8080 +# Prometheus Operator ServiceMonitor. Off by default; enable on a cluster running the operator. +serviceMonitor: + enabled: false + interval: 30s + path: /actuator/prometheus + resources: requests: cpu: 250m