Ir al contenido

Monitorizar con Prometheus (SLO, métricas, alertas)

El motor expone tres endpoints operativos en el listener HTTP, todos aptos para sondas:

EndpointAuthPropósito
/livezningunaliveness del proceso — sin comprobaciones de dependencias, de modo que una caída del store nunca provoca un bucle de reinicios
/readyzningunareadiness — ping al store (y liderazgo HA): 200 {"status":"ok","store":"up","leader":true,…}, 503 {"status":"unavailable","store":"down"}, o 503 {"status":"standby",…,"leader":false} en un standby de HA
/metricsningunaexposición Prometheus. Deliberadamente sin autenticar: transporta series operativas, nunca datos de tenant

La accesibilidad de /readyz es el SLI de disponibilidad.

Todas las series las registra el motor (verificado contra el código actual); las que soportan el peso:

SerieQué te dice
olivares_store_upel store responde a un ping — lo primero que comprueba cada runbook
olivares_http_requests_total{code}SLI de éxito de peticiones (code!~"5..")
olivares_http_request_duration_secondslatencia de la API (objetivo p99 más abajo)
olivares_ingest_duration_secondsel SLI de backpressure — el p99 de ingesta sube cuando un suscriptor se satura
olivares_ingest_observations_total / olivares_ingest_rejected_totalthroughput de ingesta y rechazos
olivares_eventbus_queue_depth / _queue_capacity (por suscriptor)qué módulo es el consumidor lento
olivares_eventbus_publish_blocked_totaleventos de backpressure (el bus bloquea; no descarta)
olivares_eventbus_bridge_*salud del puente NATS cuando el bus distribuido está activo — _connected, _pending_messages, _dropped_total (la entrega entre nodos es at-most-once; los descartes se cuentan, nunca son silenciosos)
olivares_audit_checkpoint_age_secondsfrescura de la evidencia de manipulación — alerta cuando supera 2× el intervalo de checkpoint
olivares_auth_login_attempts_total{outcome}login con éxito / fallo / bloqueo
olivares_http_ratelimit_decisions_total{decision}presión de rate-limit
olivares_grpc_requests_total / olivares_grpc_request_duration_secondsel plano de ingesta colector→core

Los objetivos de nodo único —lo que la topología por defecto soporta realmente— y el nivel HA:

SLINodo únicoNivel HA (Postgres)
Disponibilidad (/readyz)99,5 % / 28d99,9 % / 28d
Éxito de petición (no-5xx)99,9 %99,95 %
Latencia p99 de la API< 300 ms< 200 ms
Latencia p99 de ingesta< 250 ms< 150 ms
Éxito de ingesta99,9 %99,95 %

La honestidad de las cifras: un único escritor en un solo nodo no puede prometer tres nueves de disponibilidad, así que la documentación no lo hace —99,5 % (≈ 3h 39m de presupuesto cada 28 días) es la verdad de nodo único, y el nivel del 99,9 % se gana con la topología HA, no con optimismo.

deploy/monitoring/olivares-slo.rules.yaml incluye 14 alertas listas para tu Prometheus: alertas de burn-rate multi-ventana sobre el presupuesto de éxito de petición (rápida 14,4× página / media 6× página / lenta 1× ticket), disparos absolutos de latencia y disponibilidad (OlivaresIngestP99High, OlivaresApiLatencyP99High, OlivaresStoreDown, OlivaresControlPlaneUnscrapeable), saturación (OlivaresEventBusSaturated a >90 % de cola durante 10m), salud del puente (OlivaresEventBusBridgeDropping, OlivaresEventBusBridgeDisconnected) y frescura del ledger (OlivaresAuditCheckpointStale con edad > 2h).

prometheus.yml
rule_files:
- olivares-slo.rules.yaml
scrape_configs:
- job_name: olivares
scheme: https
tls_config: { insecure_skip_verify: true } # or pin the real cert
static_configs: [{ targets: ["olivares.internal:8443"] }]

En Kubernetes, la opción ServiceMonitor del chart cablea la recolección para el operador de Prometheus. Junto a las reglas se incluye una configuración de página de estado Gatus para la sonda externa de /readyz (deploy/monitoring/status-page.gatus.yaml).

El diagnóstico síntoma a síntoma —store caído, p99 de ingesta alto, bus saturado, checkpoint obsoleto— está en la página de resolución de problemas, destilada de los mismos runbooks que referencian las anotaciones de las alertas.