Reference
Eden metrics, traces, and logs
Use this guide with exporter setup, the metric semantics and dashboards, and the API discovery guide.
Complete source catalogs
The generated catalogs enumerate first-party production declarations and emission sites, with source links so each record can be checked:
| Catalog | Details |
|---|---|
| Metrics | Derived instruments, explicit OpenTelemetry/Prometheus declarations, and handwritten Service exporters. Type and help text are taken from source. |
| Traces | Handler instrumentation, explicit client/server spans, tracing spans, span events and attribute assignments, including dynamic expressions. |
| Logs | Structured log_*, log/tracing macros, events and console diagnostics; severity, message template, fields, audience and source. |
| Machine-readable catalog | The same entries with enclosing function, attached cfg conditions and full emission arguments for detailed inspection. |
This is a source inventory across Eden product components, not a promise that every entry appears at /metrics or in every running deployment. Orchestrator, Licensing, LLM Hosting, and other executables expose their own signals; the source component identifies them. Test-only items, test files, examples, benchmarks, tools, and vendored dependency instrumentation are excluded. Dependencies can emit additional diagnostics. Attached cfgs are recorded, but module/build gates and runtime selection still determine which sites are reachable. Macro-generated and runtime-selected names are documented as their producer or expression; they are not an enumerable set of live IDs.
Metrics: names, types, units and labels
The Service's AllMetrics registry contains these fast metric groups:
| Group | Main meaning | Label dimensions / scope |
|---|---|---|
eden | Requests, responses, bytes, timing, cache, pool, LLM usage, export health | Organization/user/endpoint, cache or backend type; some telemetry health is process-wide. |
eden.iam | Authentication, authorization, RBAC | Auth/operation context. |
eden.endpoint | Endpoint requests, in-flight work, duration | Organization, endpoint and request kind. |
gateway | Protocol proxy requests/operations, latency stages, connections, queues, pool lanes, multiplexing, mirroring, dual-write | Interlay, endpoint, protocol, operation and bounded outcome/reason. |
migration | State/progress, transfer, batches, errors, queues, conflict handling and workers | Migration, source/target and worker context. |
migration_live | Live capture/replay state and accounting | Migration and bounded replay state. |
migration_governor | Resource policy and migration admission | Migration, lane/resource policy and refusal reason. |
snapshot | Snapshot migration and restore work | Snapshot/migration context. |
workload | Workload classification/profiling | Endpoint and workload class. |
redis (metadata) | Metadata/cache work | Metadata operation and cache context; historical metric names remain part of the contract. |
analytics | Analytics processing | Endpoint and processing state. |
eden.rag | Object RAG operations | Store, operation and result context. |
eden.validator | Tool safety checks | Tool and validation outcome. |
workflow | Workflow lifecycle/events | Workflow and result context. |
| Endpoint comparison, optional | Comparison requests, contender outcomes, consistency, skips and latency | Dynamic comparison scope plus process-level handoff/dispatch counters. Check the specific export path before expecting these on a direct scrape. |
Each generated metric row links to its declaration and exact help text. The curated metrics reference documents units, collection points, labels, migration timing semantics, and dashboard interpretation by group. Recording methods determine each instrument's actual labels; a shared label schema does not mean every label is attached to every series.
For derived instruments, DogStatsD uses . The derive passes to Prometheus, OTLP and ClickHouse exporters. For example, gateway.request_duration_microseconds becomes gateway_request_duration_microseconds on a direct scrape. Keep punctuation in prefixes in mind: the current direct text writer preserves dots in a prefix (for example, eden.endpoint_active_requests); it does not replace them with underscores. Inspect actual exporter output and your receiver's accepted naming format when moving queries between backends. Handwritten comparison and semantic exporters have their own literal names. The JSON catalog records the declaration and names separately; it does not normalize Collector-added namespaces or backend-specific suffixes.
| Type | Interpretation |
|---|---|
| Counter / DynamicCounter | Cumulative count in native snapshots; DogStatsD uses deltas. Derive does not imply every name ends in _total. |
| Gauge / DynamicGauge(I64) | Current value, including signed in-flight work where applicable. Do not apply rate() to a current queue depth. |
| Distribution | Direct Prometheus text is a summary with _count and _sum only, without quantiles or buckets. It cannot supply p95/p99. Other exporters have different representations. |
| Histogram | Explicit buckets plus _count and _sum in text export. Use bucket-aware queries and preserve the instrument's units. |
| Duration tracker | Call count plus sampled durations; inspect generated export names and sampling semantics. |
Most core/gateway/endpoint durations are microseconds; semantic timing histograms have their own units, and retained trace duration is nanoseconds. Use each instrument's documentation and recording conversion instead of inferring units solely from a suffix. Do not turn histogram bucket values into unweighted observations. Do not average percentiles across nodes or sum cumulative snapshots over time as though they were deltas.
Native OTLP distributions use cumulative exponential histograms (scale 0, base-2 buckets), while the direct Prometheus text form keeps only count and sum. A Collector translating the OTLP path must preserve histogram counts and bounds; a text-summary scrape cannot reconstruct the discarded distribution.
Dynamic families are created when traffic records a label set and may be evicted after inactivity. Missing series can mean idle, disabled, evicted, unavailable or lost data; absence does not establish zero. Exporter queues and span collectors are bounded. Export loss counters, provider state and query completeness must accompany evidence used for a migration gate.
Common request dimensions originate in TelemetryLabels: eden_node_uuid, HTTP method/path/status, gRPC method, org_uuid, user ID/UUID, endpoint ID/UUID/kind, request/access kind, request/correlation IDs, client context, and traffic_class. internal marks control-plane work; external marks customer traffic. Retained telemetry rows use organization_uuid; shared source instruments commonly use org_uuid. _system is a system sentinel, not a customer organization. Check label presence before applying a traffic filter to older/unlabeled data.
Prometheus is deployment-wide and its bearer token does not filter tenants. Organization-scoped API reads derive organization identity from authentication. Avoid promoting user IDs, paths, client addresses or arbitrary error strings to unbounded downstream tags.
Traces: producers and record fields
Eden has two trace producers:
- Native fast spans: the HTTP middleware produces
eden.http.requestserver
spans; #[with_telemetry] produces a handler-named server span and a tracing info span. Explicit client_tracer/server_tracer calls describe authentication, database/cache operations, endpoint dispatch, protocol and migration work. The generated trace catalog includes every recognized producer and add_event site with arguments.
tracinginstrumentation:#[instrument]andtracing::*_span!create
spans routed through the OpenTelemetry SDK when OTLP is enabled. These use gRPC export. Native spans use a separate HTTP/ClickHouse fanout path.
W3C traceparent/tracestate propagate request ancestry. Responses can include traceparent; logs carry trace_id and span_id for correlation. Native HTTP spans include component=http, http.method, http.route, status, request labels and authenticated organization scope when established. Handler events add their own attributes; inspect the emission site for the exact event schema.
The retained native trace row is defined by TraceRow:
| Fields | Type / units / meaning |
|---|---|
timestamp, start_time, end_time | UTC DateTime64 milliseconds in ClickHouse. |
organization_uuid, telemetry_plane, data_class | Tenant/plane fence; trace class is operational_trace. |
service_name, node_uuid | Exporting service/node. |
trace_id, span_id, parent_span_id | Distributed trace identities. |
span_name, span_kind | Operation name/expression and span kind. |
duration_ns | Unsigned duration in nanoseconds. |
status, status_message | Completion status and optional error detail. |
attributes | String key/value pairs after exporter conversion. |
events_json | Serialized span events, including event-specific attributes. |
Native producers buffer spans, with a 64-span publication target and bounded per-thread queues. HTTP completion handling flushes completed request work; other producers and idle threads can have different visibility timing. Sampling, producer drops, fanout capacity and export failure can make a trace partial. The collector's DogStatsD diagnostics are span.sampling.recorded, span.sampling.sampled_out, and span.collection.dropped; these do not imply all three are exposed by every other exporter. Enabling log level trace is not the same as enabling distributed trace export.
Logs: producers, severities, audiences and fields
Structured eden_logger_internal::log_* records are sent to an installed bounded sink callback and independently formatted to the console according to the writer. log/tracing diagnostics and println!/eprintln! are also listed in the source catalog, but they do not all pass through the structured Eden callback. Use a container agent to retain those streams.
| Control | Meaning |
|---|---|
EDEN_LOGS_ENABLED | Enables/disables regular logging through configured filters. |
EDEN_LOG_LEVEL | Default info; supported severity progression includes error, warn, info, debug, trace, and off. |
RUST_LOG | tracing subscriber filtering; does not replace the Eden logger's filter. |
EDEN_BACKTRACES_ENABLED | Default false; enables Rust backtraces when no explicit RUST_BACKTRACE is set. |
Structured severity is TRACE, DEBUG, INFO, WARN or ERROR. Audience is Internal, Client or Both in the typed enum (display/rendering can use uppercase). Audience is separate from severity and from authorization: the telemetry query API applies its authenticated tenant/plane fence and permissions, while audience is a separately filterable field. Do not treat the audience enum alone as a tenant access control.
The structured schema combines EdenLog and EdenRequestFields:
| Fields | Meaning |
|---|---|
timestamp, level, audience, message | UTC time, severity, audience and formatted message. |
trace_id, span_id | Optional correlation to active trace context. |
feature, function, file, line | Optional producer/source location. |
eden_node_uuid | Optional application request node context. |
organization_uuid, organization_id | Optional authenticated organization context. |
user_uuid, user_id | Optional principal context. |
endpoint_uuid, endpoint_id, endpoint_kind | Optional affected endpoint context. |
error_code, error_category | Optional structured error classification. |
additional | Event-specific key/value fields, listed in the log catalog and retained through exporter conversion. |
The retained LogRow adds service_name, node_uuid, telemetry_plane, data_class=operational_log, and a labels string-pair map. Optional context can become empty columns; do not assume a background/system event has a customer principal. Console display text, the typed structured record and the retained analytics row are different representations of the same producer where that producer uses the callback.
Frequent log families include startup/configuration, auth/RBAC decisions, endpoint/backend failures, gateway connection termination with reason and queue snapshots, migration phase/recovery/cutover, workflow execution, telemetry queue/export outcomes and managed-control/VPN lifecycle. The generated log catalog supplies the actual message templates and fields for every recognized first-party emission site rather than a fixed list of possible fully formatted messages.
Audit and analytics event records
These are separate typed records, not extra Prometheus series or a guarantee that the event appears in the operational log table:
| Record | Fields / source |
|---|---|
| Request audit | event_time, event_id, organization_uuid, endpoint_uuid, service, command, optional key, args_hash, latency_us, success, optional client_ip/user_uuid, connection_id; AuditEventRow. |
| Blocked command | Time, organization/endpoint, command, reason, severity, service and optional client IP; BlockedCommandRow. |
| Anti-pattern | Detection time, organization/endpoint, protocol, pattern type, details, connection ID and occurrence count; AntiPatternRow. |
| PII aggregate | Window start/seconds, organization/endpoint, PII type, count and representative redacted sample/pattern; PiiAggregateRow. |
| Session history | Session/principal identity, start/end/last-active times, client/auth method, status and request/error counts; SessionHistoryRow. |
| API usage | Request time/ID, organization/user/session, HTTP method/path/status, optional endpoint, latency, byte counts, client context and errors; ApiUsageHistoryRow. |
| Feature/control audit | Identity, action, entity, result and provenance from feature audit; read through authorized feature history/evidence APIs. |
| Workflow, migration and live replay evidence | Typed lifecycle/phase and capture/replay records; migration schemas and migration metrics. |
| Backend snapshots/rollups | Protocol-specific polling, infrastructure, command/endpoint/LLM usage aggregates; schema module index and analytics metrics. |
See audit exporter setup for ClickHouse/S3 fanout. Audit rows and request-analysis fields can contain customer identifiers/key patterns: apply your retention and access policy. Verify credential redaction on the exact image before enabling request analysis or sharing logs. Keep AUTH arguments and request bodies out of downstream metric tags and diagnostic bundles; apply bounded retention and access controls to request-derived telemetry.
Read retained signals
Use an organization JWT with ControlPerms::READ, not the deployment's Prometheus bearer. The canonical API supports query- or path-selected signals:
curl --fail --silent --show-error \
--header "Authorization: Bearer $EDEN_TOKEN" \
"$EDEN_ORIGIN/api/v1/analytics/telemetry/metrics?range=1h&limit=100"
curl --fail --silent --show-error \
--header "Authorization: Bearer $EDEN_TOKEN" \
"$EDEN_ORIGIN/api/v1/analytics/telemetry/traces?range=1h&limit=100"
curl --fail --silent --show-error \
--header "Authorization: Bearer $EDEN_TOKEN" \
"$EDEN_ORIGIN/api/v1/analytics/telemetry/logs?range=1h&limit=100"GET /analytics/telemetry?signal=metrics|traces|logs is equivalent. Common parameters are inclusive RFC 3339 from/to, lookback range, order, limit and offset. Default limit is 500, maximum 5,000, maximum offset 100,000, default range one hour, maximum range 365 days; provider capacity or retention can impose tighter bounds. Use explicit time bounds when paging a moving dataset. Signal-specific filtering follows the handler's parameter validation. The /analytics/clickhouse paths are compatibility aliases; new clients should use /analytics/telemetry.
For ShardTelemetry-capable builds, GET /api/v1/analytics/telemetry/status?signal=traces reports authenticated provider observations. Interpret unsupported, unavailable, stale, incomplete, capacity-exhausted and tenant-mismatch evidence explicitly. An empty result or an installed adapter is not proof of complete evidence. Endpoint audit history uses /api/v1/endpoints/{endpoint}/analytics/audit-trail with its own keyset pagination and permissions; migration test-run logs and scheduled-agent logs also have dedicated APIs. Find them in the full API reference.
Refresh and verify the catalogs
The generator parses Rust syntax rather than matching strings in comments or test fixtures. It does not build or execute the service and does not expand arbitrary Rust macros. Its supported producer forms and explicit handwritten export adapters are in the script; extend them when a new instrumentation API is introduced. The live exporter output remains authoritative for a deployed binary, and the source catalogs are an audit aid for the version in this tree.
python3 -m venv /tmp/eden-doc-reference
/tmp/eden-doc-reference/bin/pip install tree-sitter==0.25.2 tree-sitter-rust==0.24.0
/tmp/eden-doc-reference/bin/python scripts/generate-telemetry-reference.py
/tmp/eden-doc-reference/bin/python scripts/generate-telemetry-reference.py --check
/tmp/eden-doc-reference/bin/python -m unittest discover \
-s scripts/tests -p test_telemetry_reference.py--check compares all generated artifacts and fails when they are stale. Review newly added producer forms and handwritten exporters during a release; there is no static generator that can prove which runtime-selected names or third-party diagnostics a workload will emit.
Search the JSON without loading the large tables in a browser:
jq -r '.metrics[] | select(.name | test("redis|migration"; "i")) |
[.name, .export_name, .kind, .source, .line] | @tsv' \
docs/reference/telemetry-catalog.json
jq -r '.logs[] | select(.level == "ERROR") |
[.source, .line, .message] | @tsv' docs/reference/telemetry-catalog.json