Observability Metrics Schema
scripts/observability_metrics.py defines the durable ledger schema for crawl and analysis observability artifacts written to data/metrics/observability/.
Schema version
- Current version:
observability_v1 - Writers must set
schema_versionexactly. - Downstream checks should fail if
validate_ledger()reports any missing required field paths.
Artifact layout
Current pipeline writers emit:
data/metrics/observability/{week}-github-crawl.jsondata/metrics/observability/{week}-external-news-crawl.jsondata/metrics/observability/{week}-map-reduce.json
These are runtime artifacts and are gitignored.
Top-level ledger fields
Required:
schema_versionrun_idweektimestampcrawl_metricsenvironment
Optional:
analysis_metrics
crawl_metrics[]
Required fields:
source_type(githuborexternal-news)duration_secondsapi_callscache_hitscache_missesstale_cache_hitsrate_limit_eventssecondary_rate_limit_hit
Optional fields:
duration_p95_secondsduration_sample_count
Notes:
- GitHub crawl currently records overall run duration as the comparable sampled duration.
- External-news crawl records p95 from per-source fetch durations when available.
analysis_metrics
Required fields when present:
duration_secondstoken_ledgermap_stages
Optional:
reduce_stage
token_ledger
Required:
input_tokensoutput_tokenstotal_tokens
Common additional field:
cost_usd
map_stages[] and reduce_stage
Required:
stageduration_secondsinput_tokensoutput_tokenscost_usdstatus(passorfail)gate_failure_reasons
Validation
Use validate_ledger() from scripts.observability_metrics:
from scripts.observability_metrics import validate_ledger
errors = validate_ledger(payload)
if errors:
raise SystemExit(f"Missing required observability fields: {errors}")
emit_ledger() already validates before writing and raises ValueError on schema gaps.
Example
Representative end-to-end sample:
tests/fixtures/observability/2026-W21-full-run.json
Minimal shape:
{
"schema_version": "observability_v1",
"run_id": "12345",
"week": "2026-W21",
"timestamp": "2026-05-20T12:00:00Z",
"crawl_metrics": [
{
"source_type": "github",
"duration_seconds": 12.4,
"api_calls": 27,
"cache_hits": 14,
"cache_misses": 27,
"stale_cache_hits": 1,
"rate_limit_events": 2,
"secondary_rate_limit_hit": false
}
],
"analysis_metrics": {
"duration_seconds": 3.2,
"token_ledger": {
"input_tokens": 1234,
"output_tokens": 456,
"total_tokens": 1690,
"cost_usd": 0.0
},
"map_stages": [],
"reduce_stage": null
},
"environment": {
"pipeline": "map-reduce-dry-run"
}
}
Downstream check guidance
- Treat
schema_versionas a compatibility gate. - Call
validate_ledger()and fail on any returned field path. - Prefer exact field-path assertions over permissive defaults so missing metrics break CI early.
- For experiment reports tied to issue #356, link the representative fixture above plus the emitted runtime artifacts from the relevant workflow run.