@@ -119,6 +119,51 @@ for receiver_name in ("p0-discord", "p1-discord"):
119119 raise SystemExit(f"{receiver_name} must use alertmanager-contact-points/webhook-url")
120120print("ALERTMANAGER SHAPE OK")
121121
122+ stack_values = yaml.safe_load((root / "kube-prometheus-stack-values.yaml").read_text())
123+ prometheus_spec = stack_values.get("prometheus", {}).get("prometheusSpec", {})
124+ for key in (
125+ "serviceMonitorSelectorNilUsesHelmValues",
126+ "podMonitorSelectorNilUsesHelmValues",
127+ "ruleSelectorNilUsesHelmValues",
128+ ):
129+ if prometheus_spec.get(key) is not False:
130+ raise SystemExit(f"kube-prometheus-stack prometheusSpec.{key} must be false")
131+ alertmanager_selector = (
132+ stack_values.get("alertmanager", {})
133+ .get("alertmanagerSpec", {})
134+ .get("alertmanagerConfigSelector", {})
135+ .get("matchLabels", {})
136+ )
137+ if alertmanager_selector.get("alertmanagerConfig") != "codeplace":
138+ raise SystemExit("AlertmanagerConfig selector must match alertmanagerConfig=codeplace")
139+ grafana_values = stack_values.get("grafana", {})
140+ datasources = grafana_values.get("additionalDataSources") or []
141+ if not any(ds.get("name") == "Loki" and ds.get("type") == "loki" for ds in datasources):
142+ raise SystemExit("Grafana values must provision Loki datasource")
143+ dashboard_sidecar = grafana_values.get("sidecar", {}).get("dashboards", {})
144+ if dashboard_sidecar.get("label") != "grafana_dashboard":
145+ raise SystemExit("Grafana dashboard sidecar must select grafana_dashboard label")
146+ print("KUBE-PROMETHEUS-STACK VALUES SHAPE OK")
147+
148+ backend_sm = yaml.safe_load((root / "backend-service-monitor.yaml").read_text())
149+ if backend_sm.get("metadata", {}).get("labels", {}).get("release") != "kube-prometheus-stack":
150+ raise SystemExit("backend ServiceMonitor must keep release=kube-prometheus-stack label")
151+ endpoint = (backend_sm.get("spec", {}).get("endpoints") or [{}])[0]
152+ if endpoint.get("port") != "api" or endpoint.get("path") != "/metrics" or endpoint.get("interval") != "15s":
153+ raise SystemExit("backend ServiceMonitor must scrape api /metrics every 15s")
154+ if backend_sm.get("spec", {}).get("selector", {}).get("matchLabels", {}).get("app") != "backend":
155+ raise SystemExit("backend ServiceMonitor must select app=backend")
156+
157+ pod_monitors = list(yaml.safe_load_all((root / "datastore-pod-monitors.yaml").read_text()))
158+ for monitor in pod_monitors:
159+ name = monitor.get("metadata", {}).get("name")
160+ if monitor.get("metadata", {}).get("labels", {}).get("release") != "kube-prometheus-stack":
161+ raise SystemExit(f"{name} PodMonitor must keep release=kube-prometheus-stack label")
162+ endpoint = (monitor.get("spec", {}).get("podMetricsEndpoints") or [{}])[0]
163+ if endpoint.get("interval") != "30s":
164+ raise SystemExit(f"{name} PodMonitor must scrape every 30s")
165+ print("SCRAPE RESOURCE SHAPE OK")
166+
122167kustomization = yaml.safe_load((root / "kustomization.yaml").read_text())
123168if "./alertmanager-config-email.example.yaml" in kustomization.get("resources", []):
124169 raise SystemExit("email fallback example must not be included in default kustomization")
0 commit comments