Bering supports two batch JSON formats and two runtime ingest paths.
For explicit non-trace topology input, see topology-input-format.md.
bering discoverandbering serveemitio.mb3r.bering.model@1.1.0andio.mb3r.bering.snapshot@1.1.0by default.bering validatestill accepts preserved1.0.0artifacts.- Trace inputs can now populate observed edge latency summaries when span timing exists.
Top-level shape:
{
"spans": [
{
"trace_id": "trace-1",
"span_id": "span-1",
"parent_span_id": "",
"service": "frontend",
"kind": "server",
"name": "GET /checkout",
"start_time": "2026-03-11T12:00:00Z",
"end_time": "2026-03-11T12:00:00.050Z",
"attributes": {
"http.request.method": "GET",
"http.route": "/checkout"
}
}
]
}Accepted aliases:
traceIdfortrace_idspanIdforspan_idparentSpanIdforparent_span_idservice_nameorservice.nameforservicestartTimeforstart_timeendTimeforend_time
Timestamp values may be RFC3339 strings.
Expected hierarchy:
resourceSpans[]resourceSpans[].resource.attributes[]resourceSpans[].scopeSpans[]orinstrumentationLibrarySpans[]...scopeSpans[].spans[]
Supported OTLP fields:
traceId,spanId,parentSpanId,name,kindstartTimeUnixNano,endTimeUnixNano- resource and span attributes in key/value form
service.name is resolved from resource attributes first, then span attributes.
bering serve accepts OTLP/HTTP at POST /v1/traces.
Supported encodings:
- protobuf:
application/x-protobuf - JSON:
application/json - optional
Content-Encoding: gzip
bering serve optionally accepts OTLP/gRPC on server.grpc_listen_address.
Supported request shape:
- standard
opentelemetry.proto.collector.trace.v1.TraceService/Export - protobuf OTLP payloads normalized through the same conversion path as OTLP/HTTP
- services
- edges
- deterministic edge ids using
from|to|kind|blocking - endpoint ids
- endpoint
method - endpoint
path
Async edge detection uses:
- span kind
producerorconsumer messaging.systemmessaging.destinationmessaging.operation
When a discovered cross-service edge has child spans with both start_time and end_time, Bering computes:
observed.latency_ms.p50observed.latency_ms.p90observed.latency_ms.p95observed.latency_ms.p99
The current implementation uses the discovered child-span duration as the directly observed timing sample for that edge. If timestamps are absent, Bering leaves observed unset rather than fabricating values.
Generic trace ingestion does not currently infer:
resilience.request_timeout_msresilience.per_try_timeout_ms- retry budgets or retry policies
- circuit-breaker limits
- placement groups
- shared resource references
Populate those fields through topology_api input or discovery overlays instead.
http.request.method,http.methodhttp.route,url.path,http.target- span-name fallback such as
GET /checkout
messaging.systemmessaging.destinationmessaging.operation
--input can point to:
- a single JSON file
- a directory; Bering reads all
*.jsonfiles recursively in path order
Trace ingestion in Bering stops at discovery and publication. It does not implement retry-amplification math, timeout-wave propagation, blast-radius scoring, or Sheaft fault simulation.