monitoring: los 12 estados de servicio miden el servicio, no el namespace

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 <noreply@anthropic.com>
This commit is contained in:
2026-07-22 08:21:03 +00:00
co-authored by Claude Opus 4.8
parent 886fee9292
commit 5d0078c8e8
@@ -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": ""
}