DB Olympics

Queries · q345 · VP Platform Engineering · week 2, night 4

Checkout/Storefront Severe Outages, Nov-Dec 2025

“Was the Nov 28 checkout/storefront outage a one-off, or did similarly severe (>=50% unhealthy) readings happen at other times in the window we have data for?”

Manager · asked the questionDiego MoralesVP Platform Engineering. Former reliability lead at a payments company. Owns uptime and the integrations merchants depend on.
Analyst · planned the reportLucas MoreauPragmatic: answers the question asked with the simplest reliable report.
Engineer · wrote the SQLInesThinks in window functions: ranks, running totals, LAG/LEAD for comparisons, percent-of-total.

Fictional people at a fictional company, each played by a language-model agent. Who they are and what they are told

  1. A business event lands on the VP Platform Engineering's desk

    Week 1; shared with Samuel Whitcombe, Head of Merchant Success

    Leadership wants a review of platform reliability in 2025: failed and slow background jobs, health check failures, rate limiting, webhook delivery problems, and which merchants felt them.

  2. Diego Morales writes to Lucas Moreau

    The manager, at the start of week 2

    Subject: Re: 2025 Platform Reliability Review — good start, a few things I need tightened up

    Lucas,

    Thanks — this is useful and more honest than I expected on the limits of what we can see. A few things stood out and need more work before Friday's memo goes to leadership.

    First, the retention gap is itself a finding, not just a caveat. We're flying with 90 days of job history and 60 days of health-check history — that means we genuinely don't know how 2025 looked before October. I want that stated plainly and separately in the memo as a reliability/observability gap in its own right, not buried as a footnote under the carts.remind story.

    Second, the ERP/WMS/Accounting webhook stuck-retry pattern is, to me, the most important and actionable thing in here — more than the one-week carts.remind incident. I want that properly validated and sized, not eyeballed, before we say anything about it to leadership.

    Questions for this week:

    1. Can you redo the webhook comparison correctly and tell me: how many merchants are affected by this stuck-retry pattern, and what's the revenue or order volume behind them? I want to know if this is a handful of our biggest accounts or a long tail.
    2. Has the ~15% stuck-retry rate on those sync webhooks been happening all year, or is it new/recent? Even without full job history, is there any way to tell whether this is a longstanding bug we've lived with or something that regressed recently?
    3. On carts.remind — you said it looks tied to a feature flag or config rather than load. Can we get more confidence on that? I want to know if this is a one-off we already fixed, or a latent risk that could recur with other job types.
    4. Setting aside strict proof of causation, can you give me your best read on whether the ticket-volume climb for the 10 affected tenants in the weeks before the failures showed up in our logs is something merchants were telling us about directly (i.e., check if their tickets mention sync/reminders/missing carts) — even a rough read would tell us if our support channel was effectively an early warning system we ignored.

    On rate limiting: agreed, drop it for this cycle — don't spend a slot trying to force an answer out of config data alone. Just flag it as a 2026 instrumentation ask, as you already have.

    Priority for your remaining slots: #1 and #2 above. The webhook/sync issue is the one I can take into a fix-it conversation with engineering next week if the numbers hold up — I'd rather have that nailed down than more polish on the carts.remind narrative.

    Diego

  3. Lucas Moreau plans the night

    The analyst · week 2, night 4, request 2 of 3

    Report 1 confirms health checks for checkout/storefront run only every 2 hours (checks exist at 12:00, 14:00, 16:00 but nothing in between) - so even though monitoring did catch a 100%-unhealthy reading at 14:00, our detection granularity for this path is coarse (up to 2 hours to notice), which is itself worth flagging for Diego's #3. Report 2 is the smoking gun on business impact: hour 14 had just 1 order and hour 15 has NO row at all (zero orders) on Black Friday, versus 7-11 orders in every neighboring hour that day - a near-total order freeze for roughly 2 hours on the year's biggest shopping day. Report 3 shows Black Friday 2025 total revenue (€40,166) came in 26% below Black Friday 2024 (€54,186) despite the business having grown since then, which is directionally consistent with real lost sales, though other factors could contribute and I haven't isolated the outage's exact share of that gap. This is my last night before the memo, so I'm using the 3 slots to: (1) precisely size the lost-order/revenue window by comparing the same 14:00-16:00 UTC slot across Nov 28 against two baseline Fridays and Black Friday 2024, so I can give Diego an actual number rather than an impression; (2) check whether checkout/storefront ever showed another severe (>=50% unhealthy) outage anywhere else in the Nov-Dec window we have, to answer whether this was a true one-off or a recurring latent risk; (3) check payment attempts during the same window, since a checkout-path outage should show up there too and would confirm this was a full checkout failure, not just a reminder-email glitch.

    Checkout/Storefront Severe Outages, Nov-Dec 2025
    Question
    Was the Nov 28 checkout/storefront outage a one-off, or did similarly severe (>=50% unhealthy) readings happen at other times in the window we have data for?
    One row per
    hour and component where unhealthy_rate_pct >= 50
    Columns
    • checked_hour
    • component
    • total_checks
    • unhealthy_checks
    • unhealthy_rate_pct
    • avg_latency_ms
  4. Ines writes the SQL

    The engineer · 1 dry run on the empty schema, then the submission

    Dry run 1 · STATUS: COMPILES (dry run on the empty schema, no data read)
    SELECT
      date_trunc('hour', checked_at) AS checked_hour,
      component,
      count(*) AS total_checks,
      count(*) FILTER (WHERE is_healthy = false) AS unhealthy_checks,
      round(100.0 * count(*) FILTER (WHERE is_healthy = false) / count(*), 2) AS unhealthy_rate_pct,
      round(avg(latency_ms)) AS avg_latency_ms
    FROM system_health_checks
    WHERE checked_at >= DATE '2025-11-01'
      AND checked_at < DATE '2026-01-01'
      AND component IN ('checkout', 'storefront')
    GROUP BY date_trunc('hour', checked_at), component
    HAVING 100.0 * count(*) FILTER (WHERE is_healthy = false) / count(*) >= 50
    ORDER BY checked_hour ASC, component ASC

    “Query compiles cleanly with the expected columns. Submitting.”

    Submitted · the SQL of the last dry run, unchanged · Submitted to tonight's batch. Your work on this request is done.

    “Submitted. The report returns one row per hour+component (Nov 1–Dec 31, 2025, checkout/storefront only) where unhealthy_rate_pct >= 50, ordered by hour then component, so Lucas can see at a glance whether Nov 28 was isolated or part of a recurring pattern.”

  5. The report comes back overnight

    As Lucas Moreau saw it, from the small dataset the agents worked on

    checked_hour        | component  | total_checks | unhealthy_checks | unhealthy_rate_pct | avg_latency_ms
    --------------------+------------+--------------+------------------+--------------------+---------------
    2025-11-28 14:00:00 | checkout   |          111 |              111 |              100.0 |        10000.0
    2025-11-28 14:00:00 | storefront |          111 |              111 |              100.0 |        10000.0
    (2 rows)
  6. What came of it

    The memo and the queries that followed; links found by title, so inferred

    Lucas Moreau's memo to Diego Morales at the end of the week:

    • 4. This looks like a genuine one-off, not a recurring risk — within the window we can see. Across all of Nov-Dec 2025, the Nov 28 14:00 reading is the only time checkout/storefront hit ≥50% unhealthy. Source: "Checkout/Storefront Severe Outages, Nov-Dec 2025." I can't check before November (health-check retention stops there), so I can't fully rule out a prior occurrence.

    It builds on:

  7. It becomes benchmark query q345

    Changed only where the benchmark needs the same result on every system

    • numericsdocs/NUMERICS.md: rounding removed; results keep full precision; AVG over an integer computed as a decimal: AVG(CAST(x AS NUMERIC(18,6)))
    • determinismthe standard leaves the place of NULLs in a sort to the implementation: NULLS LAST ascending, NULLS FIRST descending, as in the reference results (2×)
    The benchmark text, against the submitted SQL
    SELECT  date_trunc('hour', checked_at) AS checked_hour,  component,  count(*) AS total_checks,  count(*) FILTER (WHERE is_healthy = false) AS unhealthy_checks,  round(100.0 * count(*) FILTER (WHERE is_healthy = false) / count(*), 2) AS unhealthy_rate_pct,  round(avg(latency_ms)) AS avg_latency_ms  100.0 * count(*) FILTER (WHERE is_healthy = false) / count(*) AS unhealthy_rate_pct,  avg(cast(latency_ms as numeric(18,6))) AS avg_latency_msFROM system_health_checksWHERE checked_at >= DATE '2025-11-01'  AND checked_at < DATE '2026-01-01'  AND component IN ('checkout', 'storefront')GROUP BY date_trunc('hour', checked_at), componentHAVING 100.0 * count(*) FILTER (WHERE is_healthy = false) / count(*) >= 50ORDER BY checked_hour ASC, component ASCORDER BY checked_hour ASC NULLS LAST, component ASC NULLS LAST
    SELECT
      date_trunc('hour', checked_at) AS checked_hour,
      component,
      count(*) AS total_checks,
      count(*) FILTER (WHERE is_healthy = false) AS unhealthy_checks,
      100.0 * count(*) FILTER (WHERE is_healthy = false) / count(*) AS unhealthy_rate_pct,
      avg(cast(latency_ms as numeric(18,6))) AS avg_latency_ms
    FROM system_health_checks
    WHERE checked_at >= DATE '2025-11-01'
      AND checked_at < DATE '2026-01-01'
      AND component IN ('checkout', 'storefront')
    GROUP BY date_trunc('hour', checked_at), component
    HAVING 100.0 * count(*) FILTER (WHERE is_healthy = false) / count(*) >= 50
    ORDER BY checked_hour ASC NULLS LAST, component ASC NULLS LAST
    1 ms10 ms100 msHyper3.7 msDuckDB8.8 msGizmoSQL11.1 msclickhouse_brew24.8 msFirebolt12.2 msDataFusion40.8 msClickHouse9.8 ms
  8. Everything, as recorded

    The agents' own records, as the role play wrote them; only the personal data of the person who ran it is redacted

    Ines's whole session, 7 turns
    • The request, as Ines received it
      Report request from Lucas Moreau (analyst for the VP Platform Engineering):
      
      Title: Checkout/Storefront Severe Outages, Nov-Dec 2025
      Question: Was the Nov 28 checkout/storefront outage a one-off, or did similarly severe (>=50% unhealthy) readings happen at other times in the window we have data for?
      Grain: one row per hour and component where unhealthy_rate_pct >= 50
      Columns:
      - checked_hour
      - component
      - total_checks
      - unhealthy_checks
      - unhealthy_rate_pct
      - avg_latency_ms
      Details: Table system_health_checks. Filter checked_at >= 2025-11-01 and < 2026-01-01, component in ('checkout','storefront'). Group by hour of checked_at and component. Keep only groups where unhealthy_rate_pct (is_healthy=false count / total_checks * 100) >= 50, rounded 2dp. avg_latency_ms over non-null latency_ms, rounded to whole number. Order by checked_hour ascending, component ascending.
      
      Check your query with the warehouse's dry_run tool, then hand it in with submit.
    • Ines calls dry_run
      SELECT
        date_trunc('hour', checked_at) AS checked_hour,
        component,
        count(*) AS total_checks,
        count(*) FILTER (WHERE is_healthy = false) AS unhealthy_checks,
        round(100.0 * count(*) FILTER (WHERE is_healthy = false) / count(*), 2) AS unhealthy_rate_pct,
        round(avg(latency_ms)) AS avg_latency_ms
      FROM system_health_checks
      WHERE checked_at >= DATE '2025-11-01'
        AND checked_at < DATE '2026-01-01'
        AND component IN ('checkout', 'storefront')
      GROUP BY date_trunc('hour', checked_at), component
      HAVING 100.0 * count(*) FILTER (WHERE is_healthy = false) / count(*) >= 50
      ORDER BY checked_hour ASC, component ASC
    • The warehouse answers
      STATUS: COMPILES (dry run on the empty schema, no data read)
      COLUMNS: checked_hour, component, total_checks, unhealthy_checks, unhealthy_rate_pct, avg_latency_ms
    • InesQuery compiles cleanly with the expected columns. Submitting.
    • Ines calls submit
      SELECT
        date_trunc('hour', checked_at) AS checked_hour,
        component,
        count(*) AS total_checks,
        count(*) FILTER (WHERE is_healthy = false) AS unhealthy_checks,
        round(100.0 * count(*) FILTER (WHERE is_healthy = false) / count(*), 2) AS unhealthy_rate_pct,
        round(avg(latency_ms)) AS avg_latency_ms
      FROM system_health_checks
      WHERE checked_at >= DATE '2025-11-01'
        AND checked_at < DATE '2026-01-01'
        AND component IN ('checkout', 'storefront')
      GROUP BY date_trunc('hour', checked_at), component
      HAVING 100.0 * count(*) FILTER (WHERE is_healthy = false) / count(*) >= 50
      ORDER BY checked_hour ASC, component ASC
    • The warehouse answers
      Submitted to tonight's batch. Your work on this request is done.
    • InesSubmitted. The report returns one row per hour+component (Nov 1–Dec 31, 2025, checkout/storefront only) where unhealthy_rate_pct >= 50, ordered by hour then component, so Lucas can see at a glance whether Nov 28 was isolated or part of a recurring pattern.