System.Diagnostics.Metrics and
System.Diagnostics.ActivitySource — and exports nothing by itself. The components own their
instruments; the host subscribes to them and decides where the data goes. The names on this page
are a public contract: build dashboards and alerts on them.
Turning the export on
- Self-hosted image
- Embedded in your host
The image already subscribes to both meters and both activity sources, together with the
ASP.NET Core, Without the variable nothing is exported. With it, metrics, traces and logs all go over OTLP;
the other standard
HttpClient and .NET runtime instrumentation. The export starts when the
standard OpenTelemetry variable names a collector:OTEL_EXPORTER_OTLP_* variables (protocol, headers) and OTEL_SERVICE_NAME
are read by the OpenTelemetry SDK as usual.The image has no scrape endpoint of its own — there is no /metrics. For Prometheus, point the
image at an OpenTelemetry Collector and let the collector expose or push the metrics.Metrics
Transactions — meter Veriqa.Core.TransactionEngine
initiatedcounts transactions that entered the lifecycle;terminatedcounts the ones that reached a terminal state, once each — a repeated terminal transition is not counted twice.durationis the lifetime from creation to the terminal state. With a user in the loop it is dominated by how long the person takes to answer, not by the server.- The sign-in funnel is
initiatedagainstterminatedwith the outcomecompleted; the refusal share is the share of the other outcomes,supersededaside — that one is a repeated attempt, not a refusal, and is kept apart fromfailedso that retries do not raise the share of failures.
completed is deliberately not confirmed. The outcome shown to the user in the messenger is
“confirmed”; the engine records completed one step later, when the identity is resolved and
stored. A sign-in confirmed in the channel can therefore still end as failed.Channels — meter Veriqa.Core.ChannelAdapter
notice.failuresis the one to alert on first: a growing series means users are not getting the confirmation prompt (notice_kind=message) or the final outcome (notice_kind=outcome).error_codeis the adapter’s error code, always from a code registry.start.unservedmakes a silence visible. The user opened a stale link or scanned an old QR, and a channel with no reply text configured answers nothing — the counter still moves.event.foreign_transactionis answered to the sender exactly like an unknown transaction, so the answer reveals nothing. A sustained rate is someone trying identifiers that are not theirs.
No identifiers in metric tags. Tags never carry a transaction, session or channel-user
identifier, a recipient or message text. Every tag is a closed set, so the number of time series
is bounded by your channels and the values above.
Traces
A sign-in is two traces, not one. The user answers an arbitrary time after the prompt, and the
messenger propagates no trace context, so the inbound event opens a trace of its own. The two are
stitched by an attribute:
veriqa.transaction.trace_id on the inbound span holds the trace
identifier of the trace that created the transaction. To get from the answer to the sign-in
request, search your backend by that value.
- For a sign-in the stored value is the trace identifier of the
/connect/authorizerequest. If your application propagatestraceparent, that is your application’s own trace. - For a server-to-server confirmation it is the
correlation_idyou passed in the request. - The same value is written to the
CorrelationIdfield of the audit record, so the audit trail and the traces are joined by it too. - A host without tracing stores no value for a sign-in — no identifier is invented in its place — and the inbound span is then left without the attribute.
Reading span status. A span is marked
Error for a failure that ends inside the operation it
covers, with the reason in error_code. An unset status means “no failure ended here”, not “the
operation succeeded” — the outcome of the transaction is in the metrics and the audit trail.Polling mode there is no inbound HTTP request and no veriqa.channel.inbound span; the
veriqa.transaction.complete span is still opened.
Logs
In the self-hosted image logs follow the same switch as the other signals: withOTEL_EXPORTER_OTLP_ENDPOINT set they are exported over OTLP, with the formatted message and the
logging scopes included. Log records written inside a span carry its trace and span identifiers, so
a log line leads to its trace.
What is and is not written to logs — and at which level — is covered in
Security and data handling.
Health endpoints
These are the endpoints of the self-hosted image.
Channels are deliberately absent from readiness: an unreachable messenger must not take a working
replica out of rotation. What
/health/channels does and does not tell you is described in the
self-hosted quickstart.