From 12c66fb612fe4f56d981f850066053d871c23479 Mon Sep 17 00:00:00 2001 From: rock Date: Tue, 27 Oct 2026 12:38:29 -0700 Subject: [PATCH] feat(grafana): provision a Gotify contact point Grafana gains one contact point, `gotify`, of type webhook. It posts to the bridge in the notifications namespace because Gotify rejects a Grafana payload with 400 "Field 'message' is required". maxAlerts 0 keeps every alert in one request, and the bridge names the extra count in the message body instead of dropping alerts. --- k8s/infra/logging/grafana-values.yaml | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/k8s/infra/logging/grafana-values.yaml b/k8s/infra/logging/grafana-values.yaml index c4dad62..2bef677 100644 --- a/k8s/infra/logging/grafana-values.yaml +++ b/k8s/infra/logging/grafana-values.yaml @@ -209,3 +209,25 @@ sidecar: disableDelete: false foldersFromFilesStructure: true searchNamespace: ALL + +# ── Alerting ────────────────────────────────────────────────────────────────── +# One contact point: Gotify. Gotify refuses Grafana's payload shape with +# 400 "Field 'message' is required", so a bridge service translates the JSON +# first (k8s/apps/gotify/bridge). Grafana posts to the bridge, the bridge posts +# to /message with an app token. +alerting: + contactpoints.yaml: + apiVersion: 1 + contactPoints: + - orgId: 1 + name: gotify + receivers: + - uid: gotify-webhook + type: webhook + disableResolveMessage: false + settings: + url: http://grafana-gotify-bridge.notifications.svc.cluster.local:8080/alert + httpMethod: POST + # 0 sends every alert in one request. The bridge names the extra + # count in the message body. + maxAlerts: 0