Observability

Depot emits spans, logs, and metrics on a single OpenTelemetry pipeline, so any OTel-compatible backend works. The screenshots on this page come from the bundled docker/standalone stack with the monitoring profile active: an otel-collector sidecar fans traces to Tempo, logs to Loki, and metrics are scraped directly from the depot /metrics listener by Prometheus. Grafana reads all three.

Depot Overview dashboard

The provisioned Depot Overview dashboard is the at-a-glance view. The top row shows storage breakdown by repository (a donut chart), the total bytes and total artifact count across the cluster. Below that, three timeseries panels – operations in-flight, request rate by type, and ingest/blob/Docker throughput – expose load in real time. The bottom half is a stack of heatmaps: HTTP request latency, KV store operation latency, and blob store operation latency; points on the HTTP heatmap link straight into Tempo for trace-level drill-down. A Loki-sourced table at the bottom shows recent structured request logs (method, path, status, user, IP, bytes, latency, trace_id) and a free log stream panel tails depot’s depot.request target.

Depot Overview dashboard (light mode) Depot Overview dashboard (dark mode)

Loki logs

Depot exports structured log events over OTLP to the collector, which forwards to Loki. Every HTTP request becomes a log line with method, path, status, duration, response size, client IP, authenticated user, and the trace ID associated with the request span. The service_name resource attribute is set by [tracing] service_name = "depot", so queries like {service_name="depot"} pick up the full stream.

Loki logs stream in Grafana Explore (light mode) Loki logs stream in Grafana Explore (dark mode)

Tempo traces

Request spans are exported on the same OTel pipeline to Tempo. Each HTTP request becomes a root span with child spans for every KV operation (kv.get, kv.put_if_version, kv.scan_prefix, …) and every blob store operation (blob.write, blob.read, blob.delete), so a single trace shows the full waterfall from handler entry down to the storage backend. TraceQL searches via Grafana’s Tempo datasource; an empty {} query lists every recent trace.

Tempo trace search in Grafana Explore (light mode) Tempo trace search in Grafana Explore (dark mode)

Plugging in your own backend

The OTel pipeline is first-class, so you aren’t stuck with the bundled Tempo / Loki / Prometheus trio – point [tracing].otlp_endpoint and [logging].otlp_endpoint at any OTLP-compatible collector and choose what your collector exports to downstream (Jaeger, Honeycomb, Datadog, SigNoz, AWS X-Ray, Azure Monitor, Splunk, an object store, …). Metrics are served in Prometheus format at /metrics on the main listener (or on metrics_listen if you want them isolated), so they plug into any Prometheus-compatible scraper.