Skip to main content
Veriqa is instrumented with the standard .NET primitives — 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

The image already subscribes to both meters and both activity sources, together with the ASP.NET Core, HttpClient and .NET runtime instrumentation. The export starts when the standard OpenTelemetry variable names a collector:
Without the variable nothing is exported. With it, metrics, traces and logs all go over OTLP; the other standard 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

  • initiated counts transactions that entered the lifecycle; terminated counts the ones that reached a terminal state, once each — a repeated terminal transition is not counted twice.
  • duration is 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 initiated against terminated with the outcome completed; the refusal share is the share of the other outcomes, superseded aside — that one is a repeated attempt, not a refusal, and is kept apart from failed so 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.failures is 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_code is the adapter’s error code, always from a code registry.
  • start.unserved makes 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_transaction is 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/authorize request. If your application propagates traceparent, that is your application’s own trace.
  • For a server-to-server confirmation it is the correlation_id you passed in the request.
  • The same value is written to the CorrelationId field 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.
In 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: with OTEL_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.