Runbook: Service Probe Failure
Alert name: ServiceProbeFailure
A blackbox HTTP health check has failed for 2+ minutes, meaning a service is not responding to its health endpoint.
Affected Services
This alert covers the in-cluster HTTP services probed by the Alloy blackbox
exporter on ringtail’s k3s cluster. The probe targets are defined in
argocd/manifests/alloy-ringtail/config.alloy (prometheus.exporter.blackbox):
| Service | Health Endpoint |
|---|---|
| argocd | /healthz |
| authentik | /-/health/live/ |
| frigate | /api/version |
| grafana | /api/health |
| homepage | / |
| immich | /api/server/ping |
| kiwix | / |
| loki | /ready |
| mealie | /api/app/about |
| miniflux | /healthcheck |
| navidrome | /ping |
| ntfy | /v1/health |
| paperless | /accounts/login/ |
| prometheus | /-/healthy |
| shower | / (sent with Host: shower.ops.eblu.me) |
| teslamate | / |
| tempo | /ready |
| transmission | /transmission/web/ |
ollama is not probed: it is scaled to zero unless explicitly needed, so a
probe would fire this alert permanently.
Indri-native and public services (forgejo, zot, devpi, jellyfin, cv) are not
in this cluster and are checked directly by mise run services-check, not by
this alert.
The failing service is identified by the service label in the alert, extracted
from the job label (e.g. integrations/blackbox/immich → immich). To add a
service to this alert, add a target block to the blackbox exporter in the Alloy
config — no new alert rule is needed, the single label_replace rule covers any
integrations/blackbox/* job.
Diagnostic Steps
-
Check which service is down — the alert label
servicetells you. You can also run:kubectl get pods -n <namespace> --context=k3s-ringtail -
Check pod status — look for CrashLoopBackOff, OOMKilled, or pending pods:
kubectl describe pod -n <namespace> <pod-name> --context=k3s-ringtail -
Check pod logs:
kubectl logs -n <namespace> <pod-name> --context=k3s-ringtail --tail=50 -
Check if the cluster itself is healthy:
kubectl get nodes --context=k3s-ringtail ssh ringtail 'systemctl status k3s' -
Check NFS mounts (frigate, immich, kiwix, navidrome, paperless, shower, and transmission depend on sifaka NFS, mounted into pods via NFS PVs — see sifaka-nfs-from-ringtail). A lost mount shows up as pod mount errors:
kubectl describe pod -n <namespace> <pod-name> --context=k3s-ringtail
Common Causes
- Pod crashed — check logs, restart with
kubectl delete pod - NFS mount lost — sifaka offline or its NFS export unreachable. Check pod events for mount errors; see sifaka-nfs-from-ringtail
- Resource exhaustion — look for
OOMKilledin the pod events (step 2).kubectl topdoes not work here: ringtail’s k3s runs with--disable=metrics-server, so the Metrics API does not exist. For node-level numbers see runbook-pod-not-ready (Prometheus queries,kubectl describe node) - k3s down —
ssh ringtail 'systemctl status k3s', restart if needed
Silencing
For planned maintenance, silence this alert in Grafana:
- Go to Alerting → Silences → Create Silence
- Match label
alertname = ServiceProbeFailure - Optionally match
service = <specific-service>to silence only one - Set duration for your maintenance window
Related
- runbook-pod-not-ready — Sibling runbook; has the working Prometheus resource-pressure queries
- deploy-infra-alerting — Alerting pipeline overview
- configure-grafana-alerting-pipeline — Pipeline configuration