From 5d0078c8e843447f52e10454284c0150350c8564 Mon Sep 17 00:00:00 2001 From: chemavx Date: Wed, 22 Jul 2026 08:21:03 +0000 Subject: [PATCH] monitoring: los 12 estados de servicio miden el servicio, no el namespace MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Los paneles heredados preguntaban "cuántos pods hay Running en el namespace". Para n8n u ollama da igual, pero el panel llamado "grafana" contaba los 7 pods de monitoring y el de "argocd" los suyos: se habrían quedado en verde con Grafana muerta mientras Prometheus siguiera en pie. Lo mismo en "authentik" y "gitea", que sumaban su Postgres, su Redis y el runner. Ahora los 12 usan la misma forma: ¿están en pie TODOS los componentes de los que depende el servicio? min((kube_deployment_status_replicas_available{SEL} >= bool 1) or (kube_statefulset_status_replicas_ready{SEL} >= bool 1)) or vector(0) El selector define qué es el servicio: el namespace entero cuando el namespace ES el servicio (argocd, authentik); acotado cuando alberga varias cosas (grafana dentro de monitoring, researchowl/searxng); y en gitea sólo el StatefulSet, porque si cae el runner se paran los builds pero Gitea sigue sirviendo — pintarlo "Down" sería una falsa alarma. Cambio invisible salvo cuando algo falla: los 12 mapean 0 -> "Down" y >=1 -> "Running", así que en pantalla nunca se vio el número. Y además exige réplicas *disponibles*, no pods en fase Running: un pod arrancado pero que no pasa el readiness ya no cuenta como sano. Verificado los 12 en verde y los 12 en rojo (simulando escasez de réplicas), y el caso que de verdad importa: UN solo componente caído entre sanos arrastra el panel a 0 (probado con dex-server en argocd y con el Postgres de authentik). Después, los 12 otra vez a través del proxy de datasource de Grafana. Co-Authored-By: Claude Opus 4.8 --- .../configmap-chemavx-homelab-overview.yaml | 26 +++++++++---------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/monitoring/configmap-chemavx-homelab-overview.yaml b/monitoring/configmap-chemavx-homelab-overview.yaml index 6e2ea40..70b3557 100644 --- a/monitoring/configmap-chemavx-homelab-overview.yaml +++ b/monitoring/configmap-chemavx-homelab-overview.yaml @@ -398,7 +398,7 @@ data: "type": "prometheus", "uid": "prometheus" }, - "expr": "sum(kube_pod_status_phase{namespace=\"n8n\",phase=\"Running\"}) or vector(0)", + "expr": "min((kube_deployment_status_replicas_available{namespace=\"n8n\"} >= bool 1) or (kube_statefulset_status_replicas_ready{namespace=\"n8n\"} >= bool 1)) or vector(0)", "instant": true, "legendFormat": "n8n", "refId": "A" @@ -486,7 +486,7 @@ data: "type": "prometheus", "uid": "prometheus" }, - "expr": "sum(kube_pod_status_phase{namespace=\"vaultwarden\",phase=\"Running\"}) or vector(0)", + "expr": "min((kube_deployment_status_replicas_available{namespace=\"vaultwarden\"} >= bool 1) or (kube_statefulset_status_replicas_ready{namespace=\"vaultwarden\"} >= bool 1)) or vector(0)", "instant": true, "legendFormat": "vaultwarden", "refId": "A" @@ -574,7 +574,7 @@ data: "type": "prometheus", "uid": "prometheus" }, - "expr": "sum(kube_pod_status_phase{namespace=\"monitoring\",phase=\"Running\"}) or vector(0)", + "expr": "min((kube_deployment_status_replicas_available{namespace=\"monitoring\",deployment=\"kube-prometheus-stack-grafana\"} >= bool 1) or (kube_statefulset_status_replicas_ready{namespace=\"monitoring\",deployment=\"kube-prometheus-stack-grafana\"} >= bool 1)) or vector(0)", "instant": true, "legendFormat": "grafana", "refId": "A" @@ -662,7 +662,7 @@ data: "type": "prometheus", "uid": "prometheus" }, - "expr": "sum(kube_pod_status_phase{namespace=\"authentik\",phase=\"Running\"}) or vector(0)", + "expr": "min((kube_deployment_status_replicas_available{namespace=\"authentik\"} >= bool 1) or (kube_statefulset_status_replicas_ready{namespace=\"authentik\"} >= bool 1)) or vector(0)", "instant": true, "legendFormat": "authentik", "refId": "A" @@ -750,7 +750,7 @@ data: "type": "prometheus", "uid": "prometheus" }, - "expr": "sum(kube_pod_status_phase{namespace=\"homarr\",phase=\"Running\"}) or vector(0)", + "expr": "min((kube_deployment_status_replicas_available{namespace=\"homarr\"} >= bool 1) or (kube_statefulset_status_replicas_ready{namespace=\"homarr\"} >= bool 1)) or vector(0)", "instant": true, "legendFormat": "homarr", "refId": "A" @@ -838,7 +838,7 @@ data: "type": "prometheus", "uid": "prometheus" }, - "expr": "sum(kube_pod_status_phase{namespace=\"gitea\",phase=\"Running\"}) or vector(0)", + "expr": "min((kube_deployment_status_replicas_available{namespace=\"gitea\",statefulset=\"gitea\"} >= bool 1) or (kube_statefulset_status_replicas_ready{namespace=\"gitea\",statefulset=\"gitea\"} >= bool 1)) or vector(0)", "instant": true, "legendFormat": "gitea", "refId": "A" @@ -926,7 +926,7 @@ data: "type": "prometheus", "uid": "prometheus" }, - "expr": "sum(kube_pod_status_phase{namespace=\"argocd\",phase=\"Running\"}) or vector(0)", + "expr": "min((kube_deployment_status_replicas_available{namespace=\"argocd\"} >= bool 1) or (kube_statefulset_status_replicas_ready{namespace=\"argocd\"} >= bool 1)) or vector(0)", "instant": true, "legendFormat": "argocd", "refId": "A" @@ -1014,7 +1014,7 @@ data: "type": "prometheus", "uid": "prometheus" }, - "expr": "sum(kube_pod_status_phase{namespace=\"ollama\",phase=\"Running\"}) or vector(0)", + "expr": "min((kube_deployment_status_replicas_available{namespace=\"ollama\"} >= bool 1) or (kube_statefulset_status_replicas_ready{namespace=\"ollama\"} >= bool 1)) or vector(0)", "instant": true, "legendFormat": "ollama", "refId": "A" @@ -1102,7 +1102,7 @@ data: "type": "prometheus", "uid": "prometheus" }, - "expr": "sum(kube_deployment_status_replicas_available{namespace=\"ghost-en\",deployment=\"ghost-en\"}) or vector(0)", + "expr": "min((kube_deployment_status_replicas_available{namespace=\"ghost-en\"} >= bool 1) or (kube_statefulset_status_replicas_ready{namespace=\"ghost-en\"} >= bool 1)) or vector(0)", "instant": true, "legendFormat": "ghost-en", "refId": "A" @@ -1190,7 +1190,7 @@ data: "type": "prometheus", "uid": "prometheus" }, - "expr": "sum(kube_deployment_status_replicas_available{namespace=\"zona-exclusion\",deployment=\"zona-exclusion\"}) or vector(0)", + "expr": "min((kube_deployment_status_replicas_available{namespace=\"zona-exclusion\"} >= bool 1) or (kube_statefulset_status_replicas_ready{namespace=\"zona-exclusion\"} >= bool 1)) or vector(0)", "instant": true, "legendFormat": "zona-exclusion", "refId": "A" @@ -1278,7 +1278,7 @@ data: "type": "prometheus", "uid": "prometheus" }, - "expr": "sum(kube_deployment_status_replicas_available{namespace=\"researchowl\",deployment=\"researchowl\"}) or vector(0)", + "expr": "min((kube_deployment_status_replicas_available{namespace=\"researchowl\",deployment=\"researchowl\"} >= bool 1) or (kube_statefulset_status_replicas_ready{namespace=\"researchowl\",deployment=\"researchowl\"} >= bool 1)) or vector(0)", "instant": true, "legendFormat": "researchowl", "refId": "A" @@ -1366,7 +1366,7 @@ data: "type": "prometheus", "uid": "prometheus" }, - "expr": "sum(kube_deployment_status_replicas_available{namespace=\"researchowl\",deployment=\"searxng\"}) or vector(0)", + "expr": "min((kube_deployment_status_replicas_available{namespace=\"researchowl\",deployment=\"searxng\"} >= bool 1) or (kube_statefulset_status_replicas_ready{namespace=\"researchowl\",deployment=\"searxng\"} >= bool 1)) or vector(0)", "instant": true, "legendFormat": "searxng", "refId": "A" @@ -1728,6 +1728,6 @@ data: "timezone": "browser", "title": "ChemaVX Homelab Overview", "uid": "chemavx-homelab-v1", - "version": 5, + "version": 6, "weekStart": "" }