Oodle Telemetry Review — Left-Side Observability
Review the telemetry in a code change with the judgment a senior SRE brings to a
PR. This skill does not teach how to instrument — modern agents already know
the SDKs. It applies the judgment that is easy to skip: is the emitted telemetry
carrying the right business context at the right cardinality, is it
non-duplicative, does it cover the failure modes that matter, and is it adequate
to debug the alerts that already guard this code.
Review the diff, not the whole repository. Findings are recorded in the
O11y Change Context manifest so they travel
downstream to triage. Concrete fixes are handed off to the existing Oodle skills
rather than re-explained here.
When to use
- Reviewing or authoring a change that adds or alters metrics, spans, or logs.
- A PR touches instrumented or service code on a path that carries request
context (tenant/account/user) or does measurable work (I/O, loops, pools).
Skip telemetry review for docs-only or cosmetic changes.
Backend discovery (do this first)
Resolve what observability backend is reachable, by capability and tool
shape — never by a hard-coded server name (names vary: oodle-ai-us1, ap1,
staging, dev, or a customer-custom name).
- Look for an observability MCP exposing metric / alert / log / trace query
tools. Prefer discovering tools by their function (e.g. "find monitors",
"query metrics", "search traces") over any fixed prefix.
- If the tool suite matches Oodle's shape (monitors, PromQL query, logs, traces,
plus
load_skill__* workflows), use the Oodle tight path: pick the
environment that owns the touched service, and load a matching
load_skill__* when one fits.
- If a different vendor's observability MCP is present, use its equivalents.
- If no observability backend is reachable, run checks 1–3 (they are
static, from the diff) and explicitly report check 4 as degraded — do not
skip it silently.
Check 1 — Business context & cardinality placement
Where request context carries identity (tenant, account, user, org), that
identity must ride the telemetry — placed by cardinality:
- Low cardinality → metric labels. Bounded sets only: route, method, status
class, region, tier, queue name. These multiply the time series.
- High cardinality → span attributes and log fields.
tenant_id,
account_id, user_id, order_id, request_id belong here, where they add
debuggability without exploding series.
- Loops and batches must carry an iteration or batch identifier
(
item_index, sku, batch_id) on the span/log so per-iteration work is
attributable.
Flag: a high-cardinality value on a metric label (recommend relocation to a span
attribute or log field, and hand off to oodle-drop-rules if the metric already
ships); tenant/account absent from telemetry in tenant-scoped code.
Check 2 — No duplicate telemetry
Every added metric, span, or log must serve a distinct job. If a new signal
overlaps one that already exists (a timer duplicating a histogram; a log line
restating a span; two counters measuring the same event), flag it. Recommend
removal — recorded as a - line with a reason in the manifest telemetry
field — or an explicit statement of the distinct purpose that justifies it.
If a signal's purpose cannot be named in one line, it should not be added.
Check 3 — Perf-coverage patterns
On the touched code, check for the coverage that catches performance regressions:
- RED on request handlers — Rate, Errors, Duration (a latency histogram by
route/method, an error counter by class).
- USE on resource pools — Utilization, Saturation, Errors (DB/HTTP/thread
pools: active vs max, wait time / queue depth, connection errors).
- Queue saturation on async work — depth, consumer lag, processing time.
- Fan-out / N+1 — a loop issuing per-iteration I/O (DB, cache, RPC) with no
batched call and no span measuring the loop. Flag it and record the risk in
the manifest
watch field.
Report missing coverage on touched code as a gap; do not demand coverage for
untouched code.
Check 4 — Alert-driven scrutiny
This is the differentiator: align review effort with what production already
cares about.
- From the backend, resolve which alerts and SLOs guard the touched code
(by service/route/metric the change affects).
- For guarded code, demand the telemetry needed to debug that alert exists. A
latency alert guarding a path that lacks the spans/attributes to localize
where time is spent is a critical finding — an alert nobody can act on.
- Record the guards in the manifest
guarded-by field and mark the change
higher-risk (upgrade type toward critical-path when a critical SLO is
involved).
- If a guarded failure mode has a known blind spot, add it to the manifest
gaps field so triage knows the data cannot answer it.
When no backend is reachable, state that guards could not be resolved and
recommend the author confirm them manually.
Output discipline
- Report only high-confidence findings. Tag each
critical / important / minor. Do not produce a wall of nitpicks — the
goal is signal, matching Oodle's avoid-alert-fatigue ethos.
- Write results into the manifest: fill or refine
telemetry purposes,
guarded-by, watch, and gaps per the
O11y Change Context contract.
- Hand off concrete fixes rather than re-teaching them:
- Say what to change and why it matters. The agent already knows how
to write the instrumentation.
1---2name: oodle-o11y-review3description: Reviews a code change's telemetry during authoring or code review — checks business-context attributes and cardinality placement, telemetry duplication, RED/USE/queue/fan-out coverage, and alert-driven scrutiny of code guarded by existing alerts and SLOs. Writes findings into the O11y Change Context manifest and hands fixes off to oodle-monitors, oodle-drop-rules, and oodle-log-metrics. Use when reviewing or authoring instrumentation changes.4---56# Oodle Telemetry Review — Left-Side Observability78Review the telemetry in a code change with the judgment a senior SRE brings to a9PR. This skill does **not** teach how to instrument — modern agents already know10the SDKs. It applies the judgment that is easy to skip: is the emitted telemetry11carrying the right business context at the right cardinality, is it12non-duplicative, does it cover the failure modes that matter, and is it adequate13to debug the alerts that already guard this code.1415Review the **diff**, not the whole repository. Findings are recorded in the16[O11y Change Context](../oodle-o11y-context/SKILL.md) manifest so they travel17downstream to triage. Concrete fixes are handed off to the existing Oodle skills18rather than re-explained here.1920## When to use2122- Reviewing or authoring a change that adds or alters metrics, spans, or logs.23- A PR touches instrumented or service code on a path that carries request24 context (tenant/account/user) or does measurable work (I/O, loops, pools).2526Skip telemetry review for docs-only or cosmetic changes.2728## Backend discovery (do this first)2930Resolve what observability backend is reachable, by **capability and tool31shape** — never by a hard-coded server name (names vary: `oodle-ai-us1`, `ap1`,32`staging`, `dev`, or a customer-custom name).33341. Look for an observability MCP exposing metric / alert / log / trace query35 tools. Prefer discovering tools by their function (e.g. "find monitors",36 "query metrics", "search traces") over any fixed prefix.372. If the tool suite matches Oodle's shape (monitors, PromQL query, logs, traces,38 plus `load_skill__*` workflows), use the **Oodle tight path**: pick the39 environment that owns the touched service, and load a matching40 `load_skill__*` when one fits.413. If a different vendor's observability MCP is present, use its equivalents.424. If **no** observability backend is reachable, run checks 1–3 (they are43 static, from the diff) and explicitly report check 4 as degraded — do not44 skip it silently.4546## Check 1 — Business context & cardinality placement4748Where request context carries identity (tenant, account, user, org), that49identity must ride the telemetry — placed by cardinality:5051- **Low cardinality → metric labels.** Bounded sets only: route, method, status52 class, region, tier, queue name. These multiply the time series.53- **High cardinality → span attributes and log fields.** `tenant_id`,54 `account_id`, `user_id`, `order_id`, `request_id` belong here, where they add55 debuggability without exploding series.56- **Loops and batches** must carry an iteration or batch identifier57 (`item_index`, `sku`, `batch_id`) on the span/log so per-iteration work is58 attributable.5960Flag: a high-cardinality value on a metric label (recommend relocation to a span61attribute or log field, and hand off to `oodle-drop-rules` if the metric already62ships); tenant/account absent from telemetry in tenant-scoped code.6364## Check 2 — No duplicate telemetry6566Every added metric, span, or log must serve a distinct job. If a new signal67overlaps one that already exists (a timer duplicating a histogram; a log line68restating a span; two counters measuring the same event), flag it. Recommend69removal — recorded as a `-` line with a reason in the manifest `telemetry`70field — or an explicit statement of the distinct purpose that justifies it.7172If a signal's purpose cannot be named in one line, it should not be added.7374## Check 3 — Perf-coverage patterns7576On the touched code, check for the coverage that catches performance regressions:7778- **RED** on request handlers — Rate, Errors, Duration (a latency histogram by79 route/method, an error counter by class).80- **USE** on resource pools — Utilization, Saturation, Errors (DB/HTTP/thread81 pools: active vs max, wait time / queue depth, connection errors).82- **Queue saturation** on async work — depth, consumer lag, processing time.83- **Fan-out / N+1** — a loop issuing per-iteration I/O (DB, cache, RPC) with no84 batched call and no span measuring the loop. Flag it and record the risk in85 the manifest `watch` field.8687Report missing coverage on touched code as a gap; do not demand coverage for88untouched code.8990## Check 4 — Alert-driven scrutiny9192This is the differentiator: align review effort with what production already93cares about.94951. From the backend, resolve which alerts and SLOs **guard the touched code**96 (by service/route/metric the change affects).972. For guarded code, demand the telemetry needed to *debug that alert* exists. A98 latency alert guarding a path that lacks the spans/attributes to localize99 where time is spent is a **critical** finding — an alert nobody can act on.1003. Record the guards in the manifest `guarded-by` field and mark the change101 higher-risk (upgrade `type` toward `critical-path` when a critical SLO is102 involved).1034. If a guarded failure mode has a known blind spot, add it to the manifest104 `gaps` field so triage knows the data cannot answer it.105106When no backend is reachable, state that guards could not be resolved and107recommend the author confirm them manually.108109## Output discipline110111- Report only high-confidence findings. Tag each112 `critical` / `important` / `minor`. Do not produce a wall of nitpicks — the113 goal is signal, matching Oodle's avoid-alert-fatigue ethos.114- **Write results into the manifest**: fill or refine `telemetry` purposes,115 `guarded-by`, `watch`, and `gaps` per the116 [O11y Change Context](../oodle-o11y-context/SKILL.md) contract.117- **Hand off concrete fixes** rather than re-teaching them:118 - add or tune a guarding monitor → [oodle-monitors](../oodle-monitors/SKILL.md)119 - drop or sample a high-cardinality / high-volume metric → [oodle-drop-rules](../oodle-drop-rules/SKILL.md)120 - derive a metric from logs → [oodle-log-metrics](../oodle-log-metrics/SKILL.md)121- Say **what** to change and **why** it matters. The agent already knows **how**122 to write the instrumentation.