Stack de logging centralizado (Loki + Promtail + Grafana)¶
Patrón estándar para agregar logs de múltiples servicios, queryarlos con LogQL y alertar proactivamente. Sin esto, "no tinkering" es ilusorio porque el usuario tendría que abrir HA UI y scrollear logs cada vez que sospecha que algo no anda. El agente AI tampoco puede diagnosticar sin un endpoint queryable.
Contexto¶
Es la capa 4 del self-healing stack. Habilita el resto: sin logs centralizados, no hay detection proactiva, no hay diagnosis automatizada, no hay aprendizaje del agente sobre qué se rompe.
Contenido¶
Componentes¶
- Promtail (agente): scrapes log files locales, los streams a Loki. Configurable con
pipeline_stagespara parsear/labelear/dropear logs en source. - Loki (storage + query engine): time-series store optimizado para logs. Habla LogQL (sintaxis Prometheus-like).
- Grafana (UI + alerting): visualización de queries Loki, dashboards, alertas a múltiples canales (Telegram, email, webhook).
Flujo¶
HA / Z2M / ESPHome / mini-PC services
│
▼ (file logs)
Promtail (scrape + filter)
│
▼ (HTTP push)
Loki (store + index)
│
▼ (LogQL queries)
Grafana (dashboards + alerts)
│
▼ (webhook)
Agente AI / Telegram / email
Aplicado al setup del usuario¶
| Source de logs | Cómo se ingiere |
|---|---|
HA Core (/var/log/home-assistant.log o equivalente HAOS) |
Promtail con regex pipeline para parsear level/component |
| Z2M | Promtail con job aparte; Z2M loguea en formato distinto |
| ESPHome devices | Cada device emite logs via syslog o MQTT; necesita Promtail con syslog o pipeline custom MQTT→Loki |
| Mosquitto | Standard mosquitto log file → Promtail |
| Docker container logs | Promtail con docker_sd_configs |
| Gatus health check failures | Webhook directo a Grafana, o emit a Loki via custom integration |
Patrón "alerta proactiva" (LogQL templates)¶
# Alerta si HA loguea cualquier ERROR
count_over_time({job="homeassistant", level="ERROR"}[5m]) > 0
# Alerta si Zigbee tiene >2 connection failures en 15 min (catch intermittent glitches)
count_over_time(
{job="homeassistant", component=~".*zigbee.*", level="ERROR"} |= "failed to connect"
[15m]) > 2
# Alerta si Z2M está down (no logs recibidos en 5 min)
absent_over_time({job="zigbee2mqtt"}[5m])
# Alerta si ESPHome device específico no reporta
absent_over_time({job="esphome", device="sensor_cocina"}[10m])
Patrón "agente AI usa Loki como input"¶
El agente del Q10 strategy llama Loki HTTP API directo:
curl -G -s "http://loki:3100/loki/api/v1/query_range" \
--data-urlencode "query={job=\"homeassistant\", level=\"ERROR\"}" \
--data-urlencode "start=$(date -u -d '15 min ago' +%s)000000000" \
--data-urlencode "end=$(date -u +%s)000000000"
Output JSON → el agente parsea y razona. Patrón estándar para Q10.
Tuning¶
- Retention: 30 días default es razonable para smart home. Si hay constraint de disco, bajar a 14.
- Drop noise en Promtail: ESPHome puede ser muy verbose en DEBUG; drop reglas evitan llenar Loki.
- HA logger config: control granular antes de que el log salga de HA.
logger: default: warning, logs: homeassistant.components.zha: info.
Failure modes del stack mismo (meta)¶
- Loki down: alertas dejan de funcionar. Critical: monitorear Loki con Gatus o Prometheus self-check.
- Disk lleno (logs acumulados): retention falla. Monitorear
dfdel directorio de Loki. - Promtail desconectado: los logs siguen en disco pero no llegan a Loki. Pipeline silencioso fallido.
Aplicación al "invisible smart home"¶
El usuario no debería tener que mirar ni los logs ni el Grafana. Los alerts deben ser únicos y accionables, no inundación de notifications. Heurística:
| Severity | Notification |
|---|---|
| Critical (essentials down) | Telegram immediate + email |
| Warning (experimental misbehaving, intermitencia) | Telegram batched (1x/hour) |
| Info (cambios del agente) | Daily digest |
| Debug | No notification — sólo en Grafana para investigación |
Relaciones¶
- Capa 4 de: self-healing-infrastructure.
- Habilita: ai-as-operator (sin logs queryable, agente está ciego).
- Habilita: ../analysis/failure-mode-stuck-haos-update-mechanism (detection de "stale version" via log pattern).
- Implementación principal de: Q5 (observability).
Citas / evidencia¶
-
"Transform from a reactive debugging process into a proactive, insightful monitoring strategy." — ../sources/newerest-ha-loki-grafana.
- Stack idéntico al referenciado por madebynathan — ../sources/madebynathan-self-healing-2026-02.
Abierto / gaps¶
- Pipeline concreta para ESPHome logs vía MQTT (gap específico — el patrón general no aplica directo porque ESPHome no escribe a un file central por default).
- Cómo integrar Prometheus metrics además de logs (mismo Grafana puede leer ambos).
- Templates Grafana dashboards específicos para smart home (gap: encontrar / armar JSON exportables).