# 046_TLTY0101 ยท Concelier Observability Baseline (Ingest Health) Date: 2025-11-23 Scope: Minimal, deterministic telemetry schema for Concelier ingest health endpoints so downstream services (Console widgets, health/timeline SSE) can proceed. ## Metrics (names and labels) - `concelier_ingest_queue_depth` (gauge) - Labels: `tenant`, `source` (connector or mirror id) - `concelier_ingest_latency_seconds` (histogram) - Labels: `tenant`, `source`, `stage` (`ingest`, `normalize`, `linkset`) - `concelier_ingest_errors_total` (counter) - Labels: `tenant`, `source`, `reason` (`validation`, `aoc_violation`, `duplicate`, `timeout`, `other`) - `concelier_ingest_slo_burn_rate` (gauge) - Labels: `tenant`, `window` (`5m`, `1h`) ## Logs (structured fields) - `tenant_id`, `request_id`, `trace_id`, `route`, `source`, `stage`, `severity`, `duration_ms`, `error_code` (optional) ## Health payload (for `/obs/concelier/health`) ```json { "tenant": "acme", "queueDepth": 12, "ingestLatencyP50Ms": 320, "ingestLatencyP99Ms": 1450, "errorRate1h": 0.002, "sloBurnRate": 0.8, "window": "5m", "updatedAt": "2025-11-23T12:00:00Z" } ``` ## Timeline event (for `/obs/concelier/timeline` future task) ```json { "type": "ingest.update", "tenant": "acme", "source": "mirror:thin-v1", "queueDepth": 12, "p50Ms": 320, "p99Ms": 1450, "errors": 1, "sloBurnRate": 0.8, "traceId": "4f7c...", "occurredAt": "2025-11-23T12:00:00Z" } ``` ## Acceptance - Add these metric/log names and labels to service instrumentation. - Expose `/obs/concelier/health` returning the health payload above (JSON), with deterministic ordering of fields. - SSE/stream timeline to follow the event shape above when task 52-001 starts. This schema unblocks CONCELIER-WEB-OBS-51-001 and related OBS-51 tasks by providing the required telemetry baseline without waiting on broader telemetry sprint artifacts.