Metrics
Prometheus metrics namespaced under runner_*. They exist only while a d3x-run process is running with -metrics-port set — a CLI one-shot (run-flow / run-suite) or another long-lived entrypoint that serves /metrics. There is no always-on daemon metrics port separate from the process you start.
Synopsis
Enable on a CLI run:
The flag is -metrics-port (also accepted as -metrics_port). Default is 0 (off). Serving metrics requires the obs.prometheus license capability.
Counters
The message and NGAP error counters instrument the NGAP pipeline only. SBI, REST, Diameter, and PFCP traffic is not counted here — track those flows through runner_flows_total and the latency histograms instead.
| Name | Labels | Description |
|---|---|---|
runner_messages_total | direction, msg_type | Total NGAP messages pipelined |
runner_message_bytes_total | direction, msg_type | Total bytes of NGAP messages pipelined |
runner_ngap_encode_errors_total | msg_type | NGAP encode failures inside EncoderStage |
runner_ngap_decode_errors_total | msg_type | NGAP decode failures inside DecoderStage |
runner_flows_total | flow, result | Completed flows (result: success, failed, timeout) |
runner_ue_deregistrations_total | — | UE deregistrations observed (inner-NAS DeregistrationAccept) |
runner_procedure_failures_total | procedure | Procedure failures observed on the wire |
runner_fsm_state_timeouts_total | flow, state | on_timeout firings |
runner_bus_handler_total | address | Total events dispatched per bus address |
runner_bus_handler_errors_total | address | Handler-level errors (not business errors routed to internal.error) |
runner_bus_events_dropped_total | reason | Events dropped (reason: no_handler for an unregistered address, stopped after the bus shuts down) |
Gauges
| Name | Labels | Description |
|---|---|---|
runner_flows_active | flow | UEs whose flow is in-flight (between FSM start and terminal state) |
runner_gnb_registered | — | gNBs that have completed NG Setup (incremented on NGSetupResponse) |
runner_ue_registered | — | UEs currently registered with the 5GC |
runner_pdu_sessions_active | — | PDU sessions currently active |
runner_bus_queue_depth | — | Live event-bus queue depth |
Histograms
| Name | Labels | Description |
|---|---|---|
runner_pipeline_stage_seconds | direction, stage, msg_type | Wall-clock time per pipeline stage per message |
runner_flow_latency_seconds | flow, result | End-to-end flow latency, FSM start → terminal state |
runner_step_latency_seconds | flow, from_state, to_state | FSM state dwell time per transition |
runner_bus_handler_duration_seconds | address | Wall-clock time per event-bus handler invocation |
Bucket layouts
runner_pipeline_stage_seconds and runner_step_latency_seconds use a stage-tuned bucket set covering 100 µs to 10 s in roughly half-decade steps:
runner_flow_latency_seconds uses a flow-tuned set covering 5 ms to 60 s:
runner_bus_handler_duration_seconds uses a finer low end (50 µs) for handler work:
Examples
Live success rate per flow
P95 flow latency
Bus backpressure
Notes
- All custom series are namespaced
runner_*. resultlabels on counters and histograms are kept low-cardinality (small enum) so they're safe to slice and dice.- CLI one-shots register metrics on an isolated registry for the lifetime of that process; scrape while the run is in flight.
- Agent mode does not expose a separate admin metrics port by itself — attach scrape configuration to whatever long-lived process you run with
-metrics-portenabled, or use the control plane's own observability surface.
Where to go next
- Running flows and suites — enable
-metrics-porton a one-shot. - Agent mode — continuous workers attached to the control plane.
- CI integration — gate on exit codes; scrape only when the job process is still alive.