Skip to main content

Observability

Endpoints​

EndpointPurpose
GET /api/v1/prometheusPrometheus text scrape (authenticated)
GET /api/v1/metricsLive VM metrics from libvirt
GET /api/v1/metrics/historyRing buffer with optional JSONL persistence
GET /api/v1/host/linux-observabilityPSI, diskstats, SMART, thermal, cgroups
GET /api/v1/vms/{name}/guest-healthGuest agent, metrics and detected issues
GET /api/v1/fleet/prometheusOne scrape for the local host and all peers
GET /api/v1/bpf/flows, /bpf/dns, /bpf/l7, /bpf/healthKernel-level flows, DNS, L7 and TCP health from machina-bpfd
GET /api/v1/bpf/streamServer-sent events of all eBPF telemetry

eBPF telemetry​

machina-bpfd adds what metrics alone can't show: per-flow traffic with VM/pod attribution, DNS, L7 requests (HTTP, TLS SNI, gRPC, Redis, PostgreSQL, MySQL, Kafka), TCP connect latency and retransmits, JA3/JA4 fingerprints, an audit of who changed routes and links, and per-VM KVM exit, run-queue and I/O latency histograms. The controller feeds it into the SOC, the network canvas and Zyra AI root-cause analysis. See Native eBPF.

Prometheus​

Scrape with a read-only API token:

scrape_configs:
- job_name: machina
metrics_path: /api/v1/prometheus
static_configs:
- targets: ['hypervisor.example:5092']
authorization:
type: Bearer
credentials: '<mach_… token>'

Starter Grafana dashboard: contrib/grafana/machina-overview.json. Example alert rules: contrib/prometheus/alerts.yaml.

OTLP​

[observability.otlp]
enabled = true
endpoint = "http://127.0.0.1:4318"
interval_secs = 60
export_metrics = true
export_logs = true
export_traces = true

Works with the OpenTelemetry Collector and Grafana Alloy. API responses carry a W3C traceparent header.

Metrics history​

[metrics_history]
enabled = true
interval_secs = 30
max_points = 120
persist = true # /var/lib/machina/metrics-history.jsonl

Settings → Observability in the UI edits these values and reloads the workers without a restart.