Observability

How to run Hippo’s optional OpenTelemetry stack, which dashboards to open, and which provisioned alerts fire when capture paths degrade. Companion to otel/README.md (stack setup and commands) and capture/operator-runbook.md (first-aid when alarms fire).

Telemetry is off by default. Nothing is emitted until you build with OTel support, enable [telemetry] in config, and start the Docker stack.

Quick start

mise run otel:up          # Grafana + Prometheus + collector on localhost
mise run build:otel       # daemon with OTel feature
hippo config edit         # [telemetry] enabled = true
export HIPPO_OTEL_ENABLED=1   # brain + MCP
mise run restart
open http://localhost:3030

Default Grafana login: admin / hippo (anonymous Admin is also enabled for local use).

Architecture

hippo-daemon ──┐
               ├── OTLP ──→ OTel Collector ──→ Tempo (traces)
hippo-brain  ──┤                            ──→ Loki (logs)
hippo-mcp   ──┘                            ──→ Prometheus (metrics)
                                               Grafana (dashboards + alerts)
ServicePortPurpose
Grafana3030Dashboards, Explore, provisioned alert rules
Prometheus9090Metrics storage (30d / 10GB default retention)
OTel Collector4317 (gRPC), 4318 (HTTP)OTLP ingest
Tempo3200Trace storage
Loki3100Log aggregation

Persistent data: ~/.local/share/hippo/otel/. Stack restarts do not wipe state.

Dashboards

All dashboards provision automatically from otel/grafana/dashboards/ into the Hippo folder. No manual import.

DashboardUIDURLWhat it shows
Hippo Overviewhippo-overviewhttp://localhost:3030/d/hippo-overview ↗Health grade, capture lag, probe success/lag, invariant violations, alarm firings, daemon drops
Hippo Daemonhippo-daemonhttp://localhost:3030/d/hippo-daemon ↗Event ingest/drop rates, flush latency, redactions, fallback writes, watcher throughput
Hippo Enrichmenthippo-enrichmenthttp://localhost:3030/d/hippo-enrichment ↗Brain queue depth, LLM latency, enrichment throughput, MCP tool metrics
Hippo Processeshippo-processeshttp://localhost:3030/d/hippo-processes ↗process.* CPU/memory for daemon and brain

Metric names in PromQL use Prometheus exporter suffixes (_total, _milliseconds, etc.). The canonical allow-list and drift tests live in brain/tests/test_otel_dashboards.py.

Provisioned alert rules

Alert rules provision from otel/grafana/alerting/hippo-capture-alerts.yml on stack start. They appear under Alerting → Alert rules in the Hippo folder.

AlertFires whenforSeverity
Daemon events droppedrate(hippo_daemon_events_dropped_total[5m]) > 05mwarning
FS watcher events droppedrate(hippo_watcher_events_dropped_total[5m]) > 05mwarning
Watchdog not runningrate(hippo_watchdog_run_total[5m]) < 0.0015mcritical
Probe failure rate highok=false probe runs > 10% over 15m15mwarning
Capture invariant violationrate(hippo_watchdog_invariant_violation_total[15m]) > 015mcritical

All rules use noDataState: OK so a stack with telemetry disabled does not page. When OTel is enabled but a rule has no series, treat that as “instrument not emitting” rather than healthy silence.

Notification routing: this repo provisions rules only. Wire contact points and notification policies in Grafana UI (or add provisioning YAML) when you want Slack/PagerDuty delivery.

Enabling telemetry

Daemon (Rust)

# ~/.config/hippo/config.toml
[telemetry]
enabled = true
endpoint = "http://localhost:4317"

Build: mise run build:otel or cargo build --features otel.

Brain / MCP (Python)

export HIPPO_OTEL_ENABLED=1
# optional: export OTEL_EXPORTER_OTLP_ENDPOINT=http://localhost:4318

Commands

mise run otel:up       # start stack
mise run otel:down     # stop stack
mise run otel:status   # container health
mise run otel:logs     # tail compose logs
mise run otel:backup   # snapshot persisted data

See otel/README.md for retention overrides, reset workflow, and process-metric details.

When alerts fire

  1. hippo doctor --explain — isolated checks with CAUSE/FIX per failure
  2. hippo alarms list — unacknowledged capture alarms from SQLite ground truth
  3. capture/operator-runbook.md — version mismatch, enrichment wedge, probe failures

SQLite source_health remains the correctness source during OTel outages; dashboards and alerts are time-series views on the same invariants.