Excititor Observability Guide

Audience: Ops, Advisory AI, and VEX Lens engineers wiring Excititor’s evidence telemetry into exporters, dashboards, and alerts. Added 2025-11-14 alongside Sprint 119 (EXCITITOR-AIAI-31-003). Complements the AirGap/mirror runbooks under docs/modules/excititor.

Excititor’s evidence APIs emit first-class OpenTelemetry metrics so VEX Lens, Advisory AI, and Ops can detect misuse or missing provenance without paging through logs. This guide lists the counters and histograms shipped by the WebService (src/Excititor/StellaOps.Excititor.WebService) and explains how to hook them into your exporters and dashboards. For the endpoints these metrics describe, see the Evidence APIs guide.

Telemetry prerequisites

Metrics reference

MetricTypeDescriptionKey dimensions
excititor.vex.observation.requestsCounterNumber of /v1/vex/observations/{vulnerabilityId}/{productKey} requests handled.tenant, outcome (success, error, cancelled), truncated (true/false)
excititor.vex.observation.statement_countHistogramDistribution of statements returned per observation projection request.tenant, outcome
excititor.vex.signature.statusCounterSignature status per statement (missing vs. unverified).tenant, status (missing, unverified)
excititor.vex.aoc.guard_violationsCounterAggregated count of Aggregation-Only Contract violations detected by the WebService (ingest + /v1/vex/aoc/verify).tenant, surface (ingest, aoc_verify, etc.), code (AOC error code)
excititor.vex.chunks.requestsCounterRequests to /v1/vex/evidence/chunks (NDJSON stream).tenant, outcome (success,error,cancelled), truncated (true/false)
excititor.vex.chunks.bytesHistogramSize of NDJSON chunk streams served (bytes).tenant, outcome
excititor.vex.chunks.recordsHistogramCount of evidence records emitted per chunk stream.tenant, outcome

All metrics originate from the EvidenceTelemetry helper (src/Excititor/StellaOps.Excititor.WebService/Telemetry/EvidenceTelemetry.cs). When disabled (telemetry off), the helper is inert.

Dashboard hints

Operational steps

  1. Enable telemetry: set Excititor:Telemetry:EnableMetrics=true, configure OTLP endpoints/headers as described in TelemetryExtensions.
  2. Add dashboards: import panels referencing the metrics above (see Grafana JSON snippets in Ops repo once merged).
  3. Alerting: add rules for high guard violation rates, missing signatures, and abnormal chunk bytes/record counts. Tie alerts back to connectors via tenant metadata.
  4. Post-deploy checks: after each release, verify metrics emit by curling /v1/vex/observations/... and /v1/vex/evidence/chunks, watching the console exporter (dev) or OTLP (prod).

SLOs (Sprint 119 – OBS-51-001)

The following SLOs apply to Excititor evidence read paths when telemetry is enabled. Record them in the shared SLO registry and alert via the platform alertmanager.

SurfaceSLITargetWindowBurn alertNotes
/v1/vex/observationsp95 latency≤ 450 ms7d2 % over 1hMeasured on successful responses only; tenant scoped.
/v1/vex/observationsfreshness≥ 99 % within 5 min of upstream ingest7d5 % over 4hDerived from arrival minus createdAt; requires ingest clocks in UTC.
/v1/vex/observationssignature presence≥ 98 % statements with signature present7d3 % over 24hUse excititor.vex.signature.status{status="missing"}.
/v1/vex/evidence/chunksp95 stream duration≤ 600 ms7d2 % over 1hFrom request start to last NDJSON write; excludes client disconnects.
/v1/vex/evidence/chunkstruncation rate≤ 1 % truncated streams7d1 % over 1hexcititor.vex.chunks.records with truncated=true.
AOC guardrailzero hard violations0continuousimmediateAny excititor.vex.aoc.guard_violations with severity error pages ops.

Implementation notes: