observability — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited observability (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
You can't operate what you can't see. Observability is the ability to ask new questions about a running system without shipping code — through logs, metrics, and traces. Monitoring tells you when something broke; observability helps you why it broke and who it hurt.
Build telemetry with the feature, not after the first outage. Adding print and redeploying during [[incident-response]] is the most expensive logging strategy.
Pairs with [[launch-readiness]] for pre-launch signals, [[incident-response]] and [[fault-recovery]] for diagnosis, [[hardening]] for safe logs (no secrets/PII), [[perf-budget]] for latency targets, [[resilience]] for failure-path visibility, and [[llm-feature-engineering]] for AI cost/quality metrics.
Skip for throwaway local scripts with no production path. Still log meaningfully in CI jobs that gate releases ([[pipeline-ops]]).
Work in order. Define health before picking tools.
Before instrumenting, answer: what user-visible failure would we notice?
| Signal type | Examples |
|---|---|
| Latency | p95/p99 request duration, queue wait time |
| Errors | HTTP 5xx rate, failed jobs, validation failures |
| Traffic | Requests/sec, orders/min — context for anomalies |
| Saturation | CPU, memory, connection pool, queue depth, DB threads |
Pick 2–5 SLIs (Service Level Indicators) per component — the numbers that map to user pain.
Checkout API healthy when:
- p95 POST /orders < 500ms
- 5xx rate < 0.1%
- payment callback failures < 0.05%SLO (target) and error budget (how much bad per month) drive alerting — not arbitrary thresholds ([[perf-budget]] for latency work). If "healthy" is undefined, every alert is guesswork.
| Pillar | Best for | Weak for |
|---|---|---|
| Metrics | Rates, aggregates, alerting, trends | Individual request story |
| Logs | Specific event detail, audit, errors | High-cardinality aggregation |
| Traces | Latency breakdown across hops | Business KPIs |
You need all three on critical paths — metrics page you, logs explain, traces show where time went.
Correlation id (request_id, trace_id) links them — same id in logs, metrics exemplars, and traces.
Structured (JSON/key-value), not free-text paragraphs:
{
"level": "error",
"msg": "payment_failed",
"request_id": "req_abc",
"order_id": "ord_123",
"error_code": "CARD_DECLINED",
"duration_ms": 842
}Log levels — use deliberately:
| Level | Use |
|---|---|
| error | Needs human attention or failed user operation |
| warn | Suspicious but handled (retry succeeded, slow dependency) |
| info | Lifecycle milestones (job started, deploy marker) — sparse |
| debug | Diagnostic — often off in prod or sampled |
If everything is error, on-call ignores real fires.
Always include on request-scoped logs: correlation id, service name, environment, key entity ids (order, user, tenant — not PII blobs).
Never log ([[hardening]]): passwords, tokens, full credit cards, session cookies, raw health data. Scrub or hash identifiers when policy requires.
Log for action — each error log should answer "what broke" and "what context to investigate."
Avoid: chatty per-row logs in hot loops, duplicate stack traces on every retry.
Instrument boundaries that matter:
Naming — consistent prefix: service.subsystem.metric (checkout.payment.duration_ms).
Cardinality trap — don't label metrics with unbounded values (user id, order id, URL path with ids). High cardinality breaks systems and costs explode. Use logs/traces for per-entity detail.
RED method (requests): Rate, Errors, Duration per endpoint. USE method (resources): Utilization, Saturation, Errors.
Prefer one histogram per endpoint over ten derived counters nobody understands.
Propagate context across HTTP headers, message queues, and async jobs:
Spans should name operations (db.query.orders, stripe.create_payment) not generic function_call.
Traces answer: "Which hop added 800ms?" — metrics alone show only total latency.
Sample in high-traffic services — 100% trace on errors often worth keeping.
Alert when users are or will be hurt, with a response you can take:
| Alert on (good) | Don't page on (noise) |
|---|---|
| SLO breach / error budget burn | Single blip on low traffic |
| 5xx rate above threshold sustained | CPU 80% once |
| Queue depth growing unbounded | Log line matched "error" in info |
| Payment failure rate spike | Dependency blip self-recovered |
Symptom-based — checkout failing — beats cause-based — CPU high (CPU isn't always user pain).
Every alert needs:
Alert fatigue kills on-call — if an alert is routinely ignored, fix threshold or delete it.
Test alerts: trigger failure in staging → confirm notification fires.
One service dashboard per critical component:
Launch dashboard ([[launch-readiness]]) — feature-specific metrics for rollout week, then merge or tune for steady state.
Dashboards without alerts are visibility — good for diagnosis, not for waking people.
When adding/changing production behavior, add telemetry in the same PR:
Verify telemetry works before merge:
Missing instrumentation in the PR → same class of bug as missing tests.
Async paths need observability too:
A silent failing cron is a production outage with no pages.
Browser errors, API failures from client, and Core Web Vitals complement server telemetry:
Server-only observability misses CDN, client bugs, and partial outages visible to users ([[browser-checks]] complements).
More telemetry isn't always better — signal over noise ([[context-curation]] applies to ops too).
New HTTP service
RED metrics per route → structured access logs → trace propagation → SLO + alert on 5xx/latency → runbook.
New background consumer
Queue depth gauge → process latency histogram → DLQ alert → idempotent failure logs with message id.
Feature launch ([[launch-readiness]])
Define healthy → dashboard panel → alert thresholds → trigger test in staging → watch through ramp.
Post-incident "we were blind"
Gap analysis → add metric/log/trace at failure point → alert on symptom → runbook update → verify in staging.
Slow endpoint ([[perf-budget]])
Trace sample → find dominant span → fix → compare p95 before/after on dashboard.
LLM feature ([[llm-feature-engineering]])
Token usage, model latency, schema validation failure rate, fallback rate, quality proxy metrics.
Multi-tenant SaaS
Per-tenant metrics only if low tenant count or aggregated; never explode cardinality with per-user metrics labels.
On-call setup
Service catalog → dashboards → SLOs → paging alerts → runbooks → escalation → game day fire drill.
order_id=~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.