{
  "license": "CC BY 4.0",
  "licenseUrl": "https://creativecommons.org/licenses/by/4.0/",
  "recipe": {
    "slug": "dead-letter-queue-growth",
    "title": "Measure Dead-Letter Queue Growth",
    "testedWith": "Apache DataFusion 45.2.0",
    "lastReviewed": "2026-07-27"
  },
  "contract": {
    "tableName": "job_events",
    "schema": [
      {
        "name": "timestamp_utc",
        "type": "Timestamp",
        "description": "Job lifecycle event time."
      },
      {
        "name": "job_id",
        "type": "Utf8",
        "description": "Stable logical job identifier."
      },
      {
        "name": "queue_name",
        "type": "Utf8",
        "description": "Queue that owns the job."
      },
      {
        "name": "event_name",
        "type": "Utf8",
        "description": "dead_letter_created or dead_letter_resolved."
      },
      {
        "name": "error_type",
        "type": "Utf8",
        "description": "Categorized terminal failure."
      }
    ]
  },
  "query": "SELECT\n  date_trunc('day', timestamp_utc) AS day,\n  queue_name,\n  SUM(CASE\n    WHEN event_name = 'dead_letter_created' THEN 1 ELSE 0\n  END) AS created_jobs,\n  SUM(CASE\n    WHEN event_name = 'dead_letter_resolved' THEN 1 ELSE 0\n  END) AS resolved_jobs,\n  SUM(CASE\n    WHEN event_name = 'dead_letter_created' THEN 1\n    WHEN event_name = 'dead_letter_resolved' THEN -1\n    ELSE 0\n  END) AS net_queue_change\nFROM job_events\nWHERE timestamp_utc >= now() - INTERVAL '30 days'\n  AND event_name IN ('dead_letter_created', 'dead_letter_resolved')\nGROUP BY date_trunc('day', timestamp_utc), queue_name\nORDER BY day, queue_name;",
  "fixtureKind": "schema-example",
  "inputRows": [
    {
      "timestamp_utc": "2026-07-28T10:00:00Z",
      "job_id": "job_id_example_1",
      "queue_name": "queue_name_example_1",
      "event_name": "workflow_completed",
      "error_type": "none"
    },
    {
      "timestamp_utc": "2026-07-28T11:00:00Z",
      "job_id": "job_id_example_2",
      "queue_name": "queue_name_example_2",
      "event_name": "workflow_completed",
      "error_type": "dependency_timeout"
    },
    {
      "timestamp_utc": "2026-07-28T12:00:00Z",
      "job_id": "job_id_example_3",
      "queue_name": "queue_name_example_3",
      "event_name": "workflow_completed",
      "error_type": "none"
    }
  ],
  "illustrativeInputRows": [
    {
      "timestamp_utc": "2026-07-28T10:00:00Z",
      "job_id": "job_id_example_1",
      "queue_name": "queue_name_example_1",
      "event_name": "workflow_completed",
      "error_type": "none"
    },
    {
      "timestamp_utc": "2026-07-28T11:00:00Z",
      "job_id": "job_id_example_2",
      "queue_name": "queue_name_example_2",
      "event_name": "workflow_completed",
      "error_type": "dependency_timeout"
    },
    {
      "timestamp_utc": "2026-07-28T12:00:00Z",
      "job_id": "job_id_example_3",
      "queue_name": "queue_name_example_3",
      "event_name": "workflow_completed",
      "error_type": "none"
    }
  ],
  "expectedOutput": {
    "columns": [
      "day",
      "queue_name",
      "created_jobs",
      "resolved_jobs",
      "net_queue_change"
    ],
    "rows": [
      {
        "day": "2026-07-25",
        "queue_name": "billing",
        "created_jobs": 18,
        "resolved_jobs": 16,
        "net_queue_change": 2
      },
      {
        "day": "2026-07-26",
        "queue_name": "billing",
        "created_jobs": 31,
        "resolved_jobs": 9,
        "net_queue_change": 22
      },
      {
        "day": "2026-07-27",
        "queue_name": "imports",
        "created_jobs": 12,
        "resolved_jobs": 14,
        "net_queue_change": -2
      }
    ]
  },
  "notes": [
    "The compact input rows demonstrate field names and JSON types; they are not claimed to generate the displayed aggregate by themselves.",
    "The expected output is deterministic synthetic review data for the documented output shape.",
    "Adapt time windows, thresholds, identities, and business definitions before operational use."
  ]
}