Skip to content

DPU Offload Observability

The Gateway exposes read-only diagnostics for optional NVIDIA DOCA DPU offload. Standard release Dockerfiles do not build with HAVE_DOCA=1; on a normal CPU/eBPF deployment these APIs can return disabled or empty state. Use them to verify an explicitly qualified DPU build, not to infer hardware support from the OpenAPI specification.

Observability layers

flowchart TD
    B["Pinned Gateway build"] --> M{"DPU plugin registered?"}
    M -->|no| E["Disabled or empty diagnostics"]
    M -->|yes| A["Aggregate debug counters"]
    A --> P["Prometheus DOCA metrics"]
    A --> F["Filtered entry details"]
    A --> H["Per-flow hardware counters"]

    style E fill:#fff9c4,stroke:#f9a825
    style A fill:#e1f5fe,stroke:#0288d1
    style P fill:#e8f5e9,stroke:#43a047

Prefer aggregate metrics for continuous monitoring. Per-entry APIs enumerate flow or table state and should be used only for bounded diagnostics.

Access requirements

The raw DPU routes pass through management authentication when a management auth mode is configured. Use an administrator identity, TLS, and a restricted management network. The responses can reveal flow keys, endpoints, service names, MAC addresses, routes, and hardware activity; never expose them to tenants or a public diagnostics service.

export CONTROL_API="https://gateway.example.com/netlox/v1"
install -m 600 /dev/null ./control-plane.headers
printf 'Authorization: Bearer %s\n' "$CONTROL_PLANE_TOKEN" > ./control-plane.headers

Step 1: Read aggregate state

curl --fail-with-body --silent --show-error \
  --header @control-plane.headers \
  "$CONTROL_API/config/dpu/debug" | jq .

Important fields include:

Field Meaning
enabled DPU manager/plugin state reported by the running build
plugins Registered plugin names
offload_success, offload_failure, offload_active Aggregate operation and active-flow counters
offload_*_by_pipe Breakdown for CT, UDP CT, route, FDB, and ACL families
circuit_breaker_open Whether a registered plugin reports its offload circuit breaker open

An empty or disabled response is not an error on a non-DPU build. It also does not prove that the eBPF fallback path has been exercised; send representative traffic and verify data-plane behavior separately.

Step 2: Inspect a bounded filtered set

Supplying any of pipe, svc, ep, or limit uses the filtered detail path:

curl --fail-with-body --silent --show-error \
  --get \
  --header @control-plane.headers \
  --data-urlencode 'pipe=ct_fwd_5tuple' \
  --data-urlencode 'svc=inference-service' \
  --data-urlencode 'limit=50' \
  "$CONTROL_API/config/dpu/debug" | jq .

limit defaults to 200 and is clamped at 2000. Supported pipe filters are rss, to_kernel, egress_dispatch, ct_fwd_5tuple, ct_rev_5tuple, root_l3l4_dispatch, fdb_l2, deny, and allow. Invalid pipe or endpoint input returns 400; an uninitialized manager returns 503 on the filtered path.

Use flows=1 only when per-flow, FDB, route, and ACL arrays are required:

curl --fail-with-body --silent --show-error \
  --header @control-plane.headers \
  "$CONTROL_API/config/dpu/debug?flows=1" | jq .

This path is more expensive than the aggregate response. Do not poll it as a dashboard source.

Step 3: Read hardware counters

curl --fail-with-body --silent --show-error \
  --header @control-plane.headers \
  "$CONTROL_API/config/dpu/hwcounters" | jq .

The response contains flows, total_flows, parsed protocol/source/destination fields, and packet/byte counters. With no provider registered it returns an empty list and total_flows: 0.

Prometheus metrics

DPU metric families are registered when a DPU plugin attaches; absence on a non-DPU deployment is expected. Core signals include:

Metric Meaning
doca_offload_active_flows Current hardware-offloaded flows
doca_offload_attempts_total Offload attempts
doca_offload_failures_total Offload failures
doca_circuit_breaker_state 0 closed, 1 open
doca_pipe_hw_pkts_total{pipe,direction} Delta-tracked hardware packets by pipe and direction
doca_pipe_hw_bytes_total{pipe,direction} Delta-tracked hardware bytes by pipe and direction
doca_ct_pipe_utilization{pipe} Go-tracked CT entries divided by configured capacity; not a direct hardware occupancy reading
loxilb_doca_collector_query_errors_total Hardware-counter collection errors
loxilb_doca_egress_counters_available Whether the selected hardware path reports egress counters

Alert on failure-rate increases, circuit breaker opening, unexpected loss of a previously present family, and collector errors. Correlate metrics with the debug endpoint and real traffic; zero counters can mean no traffic, no plugin, unsupported counters, or a collection problem.

Disruptive debug actions

POST /config/dpu/debug supports plugin unregister and circuit-breaker cb_force actions. They unload offload state or deliberately force fallback behavior and are intended for controlled testing.

Do not run debug actions during normal production traffic

Use a maintenance window, drain traffic, capture the pre-change state, and have a tested recovery procedure. Restrict POST access more tightly than read-only monitoring. This guide intentionally does not provide copy-paste commands for destructive debug actions.

Production qualification checklist

  • pin the Gateway image and match it to the DPU SDK, firmware, drivers, and supported hardware;
  • verify successful plugin registration and expected pipe inventory;
  • test offload and eBPF fallback with representative TCP, UDP, routing, FDB, firewall, and QoS behavior that is in deployment scope;
  • test circuit-breaker transition and recovery without using live tenant data;
  • compare software and hardware packet/byte evidence and document expected counter gaps;
  • measure per-entry query cost at the deployment's maximum flow count;
  • validate restart, upgrade, and rollback on the physical target.

Repository implementation and API schemas do not replace vendor/hardware qualification. Publish performance or HA claims only from reproducible tests on the same hardware/software bill of materials.

See also