DI Oncall AI Bot — State of Incidents

Incident volume, triage, auto-resolution and handoff, since table inception

1. Headline metrics

2,771
Total incidents logged
since 2026‑03‑17
891
Resolved via Knowledge Base
32.2% of all incidents
1,880
Resolved via LLM analysis
67.8% of all incidents — oncall bot
54
Escalated to a real outage
1.9% — paged via PagerDuty
372.4 hrs
Cumulative time saved to date
de-duplicated for flood failures — see note below
87 / 1,070
Distinct DAGs / tasks touched
2,681 distinct error fingerprints
This is a corrected number, not the raw per-row calculation. Applying 15/20 min credit to every one of the 2,771 logged rows gives 849.4 hrs — but 62% of those rows (1,731 of 2,772) are flood duplicates: the same DAG run failing across many tasks from one shared root cause (a missing permission, a bad PR, a deleted S3 bucket — see section 6). The oncall engineer diagnoses that once, not once per task. Collapsing rows into 1,041 distinct diagnostic events (one per tenant + DAG + scheduled run) and crediting full 15/20 min only to the first occurrence in each — with a 2 min residual for every duplicate the bot still has to post and someone still has to glance at — gives 372.4 hrs, the number used throughout this report from here on.

Time-saved heuristic (same one the weekly handoff report uses): 15 min per KB auto-resolution, 20 min per LLM root-cause analysis, vs. a human manually digging through Airflow logs — applied once per distinct diagnostic event. 388 KB + 653 LLM first-occurrences × (15/20 min) + 1,731 duplicate rows × 2 min = 22,342 min = 372.4 hrs. This is cumulative time avoided across the whole team over 27 weeks (~13.6 hrs/week average) — not hours worked by one person in one day.

Projected cumulative time saved by end of fiscal year (Jan 31, 2027)

~621 hrs
If growth flattens to the 27‑week average
+249 hrs over the next 128 days, at 1.94 hrs/day
~786 hrs
If Aug/Sep volume growth continues
+414 hrs over the next 128 days, at 3.2 hrs/day

Methodology: incident volume has been rising all year (see section 3), so a flat extrapolation likely understates the total. Both scenarios are built on de-duplicated diagnostic events, not raw rows. Low end applies the full 27‑week average rate (372.4 hrs ÷ 192 days ≈ 1.94 hrs/day) to the 128 remaining days to Jan 31, 2027. High end applies the last three full weeks' rate (Aug 31–Sep 20: 188 distinct diagnostic events / 21 days ≈ 9.0 events/day ≈ 3.2 hrs/day) to the same 128 days. Actual will depend on whether that recent pace holds and whether flood frequency stays constant — both scenarios assume no material change to KB coverage, DAG failure rates, or the rate of flood-style outages; treat as a directional range, not a forecast commitment.

2. How an incident is triaged, end to end

The bot sits between an Airflow task failure and a human. Every failure is filtered for noise before it ever becomes a logged "incident", then routed to either an instant fix or an AI-authored root-cause analysis:

85%
Noise filtering matters: 1,608 alerts (≈37% as many as the incidents actually logged) were auto-suppressed because they fired on average just 4.5 minutes after an ECS task restart — i.e. transient blips, not real problems. Without this filter, on-call volume would look roughly 1.6x noisier than it actually is.

3. KB vs LLM resolution split

Resolution source

Severity mix (self-reported by bot)

Weekly incident volume — KB vs LLM

Volume has grown sharply since May — largely LLM-handled failures (e.g. sfdc_etl_load*, jira_load Jira-API rate limiting). KB coverage hasn't kept pace with growth: KB accounted for ~40–60% of weekly volume through April, but has dropped to single-digit percentages most weeks since June as new/unclassified failure types outrun the known-issue library.

4. Outage-level (PagerDuty-paged) incidents

Of 2,771 incidents, only 54 (1.9%) escalated to actually paging a human — everything else was handled silently via Slack/Jira. Outages are almost entirely one recurring pattern:

DAGPaged incidentsNotes
syslog2_daily_sensor49Known-Issue KB rule — per-cell syslog volume anomaly vs. historical average. Not transient; requires manual pipeline check.
okta_s3_cellside_iga_aurora_incremental2LLM-flagged, escalated
federal_datashare2LLM-flagged, escalated
jira_load1LLM-flagged, escalated
Trending up: paged incidents jumped from 1 in July to 15 in August to 27 in September — almost entirely syslog2_daily_sensor (13 → 25). Worth a closer look at that sensor's health/thresholds before next quarter, since it's now the dominant source of real on-call pages.
⚠ Action needed now — the sensor's own thresholds, not the pipeline, are causing most of the September pages. Pulling the actual today-vs-historical-average numbers behind every OK19/OK20 page this quarter: Both are firing nightly and paging a human every time — this is within the oncall team's control to tune today, not a wait-for-next-quarter item. Recommend: (1) recalibrate/widen the OK19 baseline window this week, (2) assign someone to root-cause the OK20 volatility before further tuning its threshold, (3) revisit nightly instead of quarterly given it's the #1 page source.
syslog2_daily_sensor has failed this exact way before — twice. A 2025-04-03 RCA found 3 weeks of missing OK5/OK10 syslog data in the federal cell because the syslog2-gov DAG silently dropped out of Airflow's dagbag (zombie tasks) — its own action item was "add OK5/OK10 cell data check to syslog2_sensor DAG." A 2025-12-09 P0 then lost OK5/OK10 data again, this time because a hotfix stripped those cells from a shared OKTA_CELL_LIST parameter used by multiple DAGs. The sensor now paging most in Sept 2026 is the same one both prior RCAs were about — this looks like a chronically under-fixed pipeline, not a fresh problem.

5. PagerDuty alert types (not just DAG incidents)

Section 4's "54 paged incidents" comes entirely from ONCALL_ANALYSIS_HISTORY, which only contains bot-logged Airflow DAG/task failures. Reading #eng-data-alerts and #eng-data-trex-alerts directly (Jan 1 – Sep 25, 2026) surfaces a second, structurally invisible population of pages: infra-level ECS/CloudWatch alarms that page a human the same way but never touch a DAG, so they can't appear in that count.

Alert typeChannel / tenantFirst → last seen (2026)FrequencyIn ONCALL_ANALYSIS_HISTORY?
SYSLOG2_DAILY_SENSOR anomaly checkBoth (prod + trex)Predates 2026 → ongoing~1/night, escalating to 2–3/night in SeptYes
jira_load / federal_datashare escalationsBothScattered all yearLow, sporadic (few/month)Yes
biwms-trex: Desired > running for <service>#eng-data-alerts (despite the trex name)2026-09-08 → 09-237 alerts totalNo — infra
ECS deployment-stuck (worker/api_server/dag_processor/triggerer/scheduler "failing to start tasks, has NOT converged")#eng-data-alerts (bi-wms-prod)2026-09-08 → 09-223 bursts: 9/8 (7 alerts), 9/17 (6), 9/22 (9, during biwms prod release 09/22)No — infra
The ECS alarms are new, not historical. Zero ECS "Desired>running" / "deployment-stuck" pages exist anywhere in the Jan–Aug 2026 window — all three bursts land in a two-week span (Sept 8–22) and each one starts right after a Conductor Bot "Starting new bi-wms deployment in prod" message. This reads as a side-effect of a recent deployment-process change (the ECS service dips below desired task count mid-rollout, tripping a CloudWatch alarm that pages), not a pre-existing failure mode — worth a dedicated check before the next prod release.
This isn't a new class of instability either — it's a recurring one. Airflow/ECS scheduler & worker instability has a documented trail: a 2025-06-19 RCA found worker memory spiking to 240% and disconnecting ECS agents (action items to migrate to Postgres / EKS were marked "not started"); a 2025-01-30 RCA (itself a recurrence of an Oct-2024 incident) found the Airflow metadata DB pinned at 99% CPU forcing restarts, with the recommended Postgres migration and retention job still "in progress"/"not started"; and a 2026-01-27 RCA traced random JWT/API failures under load to an Airflow 3.1.6 + Python 3.12 "thundering herd" bug. The Sept 2026 ECS PagerDuty bursts look like the same chronic fragility resurfacing under a new trigger (deployments), not a fresh regression.

6. Flood failures: one root cause, many Slack messages

A distinct pattern from the ECS-restart noise filter in section 2: a single DAG occasionally throws 10–20+ near-identical task-failure messages within the same minute or two, flooding the channel. Each one still gets logged as its own incident (inflating the DAG counts in section 7), but they share one root cause and one fix. Reading the bot's own thread replies (not just the alert headers) shows at least four distinct causes hiding behind that pattern:

CauseExampleBot's diagnosisReal KB-expansion candidate?
Airflow scheduler ECS restart (self-resolving)2026-09-22 ~13:11 EDT — 15+ sfdc_etl_load_v2 bronze-load tasks failed in the same minuteCorrectly auto-detected: "Airflow Scheduler Restart Detected... not a code issue" — same event as the Sept ECS PagerDuty bursts aboveNo — already handled well
Code/schema defect fanning outPR #10832 renamed a Snowflake schema (BASE_SALESFORCE→SALESFORCE) but missed a stored proc; broke ~15 sfdc_bronze_v2 objects identicallyCorrectly identified the PR, severity high, "not safe to retry"No — one-off code bug, already root-caused
External API rate limitingjira_load recon task hit Jira HTTP 429s 9 times in 3 weeks (Sept)Flagged escalating trend, "not self-resolving," recommended a rate-limit exemptionPartial — bot sees it, no structural fix shipped yet
External SaaS outage during auth2026-05-21 ~17:20 EDT — 14+ sfdc_iceberg objects failed at once on Salesforce SERVER_UNAVAILABLE during SOAP loginCorrectly distinguished transient outage from an actual expired/invalid credentialNo — correctly triaged as transient
Genuine permission/access gapsCompass metadata columns "not accessible for our user in prod" (Sept); Snowflake login rejected on IP allowlist (Jul)Escalated to a human — bot has no fix pathYes
Schema drift from an upstream sourceSFDC silently renamed MDF_Budgeted_Cost_of_Campaign__c→MDF_Budgeted_Cost__c, breaking sfdc_etl_load with no notice (2026-04-24 RCA)Surfaced the exact INVALID_FIELD error, but required a human to chase SFDC support for a fixYes
Only the last two rows — permission/access gaps and upstream schema drift — are real gaps worth writing KB rules for. The other four are either already self-resolving or already correctly triaged by the bot; adding KB entries there would just be automating something that's not broken.

7. Top failing pipelines

DAGTotal incidentsKBLLMKB %
sfdc_etl_load52525127448%
compass_metadata_load_v228918510464%
sfdc_etl_load_v2253102434%
jira_load232102224%
tableau_cloud_federal_copy19311921%
sfdc_iceberg_load14511441%
workflows_load79433654%
databricks_ml_run77106713%
syslog2_daily_sensor5655198%
greenhouse_load_v15453198%

These 10 DAGs account for ~1,900 of 2,771 incidents (69%) across only 87 distinct DAGs total — failure volume is highly concentrated. sfdc_etl_load_v2, jira_load, tableau_cloud_federal_copy and sfdc_iceberg_load are the best KB-expansion candidates: high volume, almost entirely LLM-handled (1–4% KB coverage), meaning the bot re-diagnoses the same/similar failures from scratch every time instead of applying a saved fix.

8. Breakdown by tenant

"Distinct diagnoses" and "Hours saved" are de-duplicated per section 1's methodology — one credited diagnosis per DAG + scheduled run, not per failed task row.

TenantTotal incidents loggedDistinct diagnosesKBLLMHours saved% of diagnoses
bi-wms-trex1,415443170273165.942.6%
bi-wms-prod1,032344163181124.033.0%
bi-regional-prod2181921617663.518.4%
bi-wms9454342016.55.2%
bi-regional128532.40.8%
bi-regional-prod barely floods at all — 218 logged incidents collapse to only 192 distinct diagnoses (88% ratio), vs. bi-wms-trex's 1,415→443 (31% ratio). Trex's raw incident count looks 4x bigger than bi-regional-prod's, but its real diagnostic-effort footprint is only ~2.3x bigger — most of that gap is flood duplication, not genuinely more distinct problems.

bi-wms-trex (the pre-prod/Trex cell) generates more incidents than bi-wms-prod — expected for a lower environment catching issues before they promote, but worth confirming that's the intended balance and Trex isn't just noisier due to under-provisioned resources.

9. Weekly handoff & human feedback loop

43
Weekly handoff Jira tickets filed
28 for bi-wms, 15 for bi-regional
15 / 18
Positive feedback reactions
👍 + "PR caused it" acknowledgements
70
Cortex / service-user access events
23 requested, 15 approved, 7 revoked

Every Monday, the bot aggregates the trailing 7 days per tenant, creates one Jira ticket (project DA) summarizing metrics and top failing DAGs, tags the outgoing/incoming on-call Guardian (via PagerDuty schedule lookup), and posts the same summary to Slack. All bot analyses for that week get appended to the ticket as comments automatically, so the ticket becomes the week's incident log for whoever's on call. This has run continuously for 43 consecutive tenant-weeks with no gaps.

Engineers can react 👍/👎 to any bot analysis; 15 of 18 recorded reactions to date are positive (thumbsup, or confirming the bot correctly linked a failure to a PR), versus 3 negative (thumbsdown or "PR unrelated" corrections) — a rough proxy for perceived analysis quality, though the sample size (18) is small relative to 2,771 incidents.

10. Known gaps & recommendations

MTTR isn't actually being tracked yet. ONCALL_RESOLUTION_EVENTS — the table designed to hold ALERTED_AT → RESOLVED_AT and MTTR_MINUTES — has 0 rows despite existing since mid-June. We can report incident count and resolution method confidently, but not how long incidents stayed open. Closing this gap (wiring up whatever marks an alert "resolved" to insert here) would let a future version of this report show real time-to-resolution, not just the flat 15/20-min proxy used for "time saved."
KB coverage isn't keeping up with volume. KB's share of weekly incidents has fallen from ~40–60% (March–April) to single digits most weeks since June, even as total volume tripled. The highest-value, lowest-effort next step is expanding the known-issue library for the four high-volume/low-KB DAGs in section 7 — plus the permission/access and schema-drift flood causes identified in section 6.
syslog2_daily_sensor is now the #1 source of real pages (25 of 27 paged incidents in September) and its page rate is accelerating month over month. This is at least the third documented occurrence of OK5/OK10 syslog trouble since April 2025 (section 4) — worth treating as a standing reliability project, not a one-off investigation.
The "54 paged incidents" headline undercounts real on-call pages. It's built entirely from DAG-incident data and structurally excludes the ECS/CloudWatch infra alarms documented in section 5, which paged 22 times in September alone via three separate deployment-linked bursts. Any MTTR or on-call-load conversation should account for both populations, not just the DAG-based one.