# Observability

## Logging

Structured JSON logs via `slog` (`internal/telemetry/logger.go`).

### Analysis job logs (`internal/service/commitintel/process_delta.go`)

| Event | Level | Fields |
| --- | --- | --- |
| `analysis job completed` | info | `job_id`, `analysis_id`, `event_id`, `repo_id`, `target_commit_sha`, `duration_ms` |
| `analysis job failed` | error | `job_id`, `error` |
| `analysis job skipped idempotent` | info | `event_id`, `repo_id` |

### Redis consumer logs (`internal/redis/consumer.go`)

| Event | Level | Fields |
| --- | --- | --- |
| `processing graph.delta.ready` | info | `event_id`, `repo_id`, `base_commit_sha`, `target_commit_sha` |
| `graph.artifact.ready ack` | info | `event_id`, `repo_id`, `artifact_id` |
| `handle message failed` | error | `stream`, `message_id`, `error` |

### Redis publisher logs (`internal/redis/publisher.go`)

| Event | Level | Fields |
| --- | --- | --- |
| `published event` | info | `stream`, `event_id`, `entry_id`, `publish_duration_ms` |

## Health Endpoints

- `/healthz` — liveness
- `/readyz` — Redis ping + artifact store writable
- `/version` — build/service version

## Future Work

- Redis consumer lag metrics
- Analysis queue depth metrics
