{
  "license": "CC BY 4.0",
  "recipe": {
    "slug": "database-migration-failures-by-release",
    "title": "Track Database Migration Failures by Release",
    "testedWith": "Apache DataFusion 45.2.0",
    "lastReviewed": "2026-07-28"
  },
  "contract": {
    "tableName": "database_migration_events",
    "schema": [
      {
        "name": "timestamp_utc",
        "type": "Timestamp",
        "description": "Terminal migration time in UTC."
      },
      {
        "name": "migration_id",
        "type": "Utf8",
        "description": "Stable migration identifier from source control."
      },
      {
        "name": "service",
        "type": "Utf8",
        "description": "Service or deploy job that ran the migration."
      },
      {
        "name": "database_name",
        "type": "Utf8",
        "description": "Approved logical database name."
      },
      {
        "name": "release",
        "type": "Utf8",
        "description": "Application or infrastructure release."
      },
      {
        "name": "status",
        "type": "Utf8",
        "description": "success, failed, or rolled_back."
      },
      {
        "name": "duration_ms",
        "type": "Float64",
        "description": "Migration execution duration."
      },
      {
        "name": "error_type",
        "type": "Utf8",
        "description": "Controlled failure category without raw database output."
      },
      {
        "name": "environment",
        "type": "Utf8",
        "description": "Deployment environment."
      }
    ]
  },
  "query": "SELECT\n  release,\n  service,\n  database_name,\n  COUNT(*) AS migrations,\n  SUM(CASE WHEN status = 'success' THEN 1 ELSE 0 END) AS successful,\n  SUM(CASE WHEN status = 'failed' THEN 1 ELSE 0 END) AS failed,\n  SUM(CASE WHEN status = 'rolled_back' THEN 1 ELSE 0 END) AS rolled_back,\n  100.0 * SUM(CASE WHEN status = 'success' THEN 1 ELSE 0 END)\n    / NULLIF(COUNT(*), 0) AS success_rate_pct,\n  AVG(duration_ms) AS average_duration_ms\nFROM database_migration_events\nWHERE timestamp_utc >= now() - INTERVAL '30 days'\n  AND environment = 'production'\nGROUP BY release, service, database_name\nORDER BY release DESC;",
  "fixtureKind": "reproducible",
  "inputRows": [
    {
      "timestamp_utc": "2026-07-28T18:00:00.000Z",
      "migration_id": "2026.07.2-migration-1",
      "service": "application-api",
      "database_name": "app_production",
      "release": "2026.07.2",
      "status": "success",
      "duration_ms": 1200,
      "error_type": "none",
      "environment": "production"
    },
    {
      "timestamp_utc": "2026-07-28T17:00:00.000Z",
      "migration_id": "2026.07.2-migration-2",
      "service": "application-api",
      "database_name": "app_production",
      "release": "2026.07.2",
      "status": "success",
      "duration_ms": 850,
      "error_type": "none",
      "environment": "production"
    },
    {
      "timestamp_utc": "2026-07-28T16:00:00.000Z",
      "migration_id": "2026.07.2-migration-3",
      "service": "application-api",
      "database_name": "app_production",
      "release": "2026.07.2",
      "status": "success",
      "duration_ms": 1400,
      "error_type": "none",
      "environment": "production"
    },
    {
      "timestamp_utc": "2026-07-28T15:00:00.000Z",
      "migration_id": "2026.07.2-migration-4",
      "service": "application-api",
      "database_name": "app_production",
      "release": "2026.07.2",
      "status": "failed",
      "duration_ms": 2100,
      "error_type": "lock_timeout",
      "environment": "production"
    },
    {
      "timestamp_utc": "2026-07-28T14:00:00.000Z",
      "migration_id": "2026.07.2-migration-5",
      "service": "application-api",
      "database_name": "app_production",
      "release": "2026.07.2",
      "status": "rolled_back",
      "duration_ms": 1800,
      "error_type": "validation_failure",
      "environment": "production"
    },
    {
      "timestamp_utc": "2026-07-27T18:00:00.000Z",
      "migration_id": "2026.07.1-migration-1",
      "service": "application-api",
      "database_name": "app_production",
      "release": "2026.07.1",
      "status": "success",
      "duration_ms": 900,
      "error_type": "none",
      "environment": "production"
    },
    {
      "timestamp_utc": "2026-07-27T17:00:00.000Z",
      "migration_id": "2026.07.1-migration-2",
      "service": "application-api",
      "database_name": "app_production",
      "release": "2026.07.1",
      "status": "success",
      "duration_ms": 700,
      "error_type": "none",
      "environment": "production"
    },
    {
      "timestamp_utc": "2026-07-27T16:00:00.000Z",
      "migration_id": "2026.07.1-migration-3",
      "service": "application-api",
      "database_name": "app_production",
      "release": "2026.07.1",
      "status": "success",
      "duration_ms": 1100,
      "error_type": "none",
      "environment": "production"
    },
    {
      "timestamp_utc": "2026-07-27T15:00:00.000Z",
      "migration_id": "2026.07.1-migration-4",
      "service": "application-api",
      "database_name": "app_production",
      "release": "2026.07.1",
      "status": "success",
      "duration_ms": 950,
      "error_type": "none",
      "environment": "production"
    },
    {
      "timestamp_utc": "2026-07-27T14:00:00.000Z",
      "migration_id": "2026.07.1-migration-5",
      "service": "application-api",
      "database_name": "app_production",
      "release": "2026.07.1",
      "status": "success",
      "duration_ms": 800,
      "error_type": "none",
      "environment": "production"
    }
  ],
  "illustrativeInputRows": [
    {
      "timestamp_utc": "2026-07-28T18:00:00.000Z",
      "migration_id": "2026.07.2-migration-1",
      "service": "application-api",
      "database_name": "app_production",
      "release": "2026.07.2",
      "status": "success",
      "duration_ms": 1200,
      "error_type": "none",
      "environment": "production"
    },
    {
      "timestamp_utc": "2026-07-28T17:00:00.000Z",
      "migration_id": "2026.07.2-migration-2",
      "service": "application-api",
      "database_name": "app_production",
      "release": "2026.07.2",
      "status": "success",
      "duration_ms": 850,
      "error_type": "none",
      "environment": "production"
    },
    {
      "timestamp_utc": "2026-07-28T16:00:00.000Z",
      "migration_id": "2026.07.2-migration-3",
      "service": "application-api",
      "database_name": "app_production",
      "release": "2026.07.2",
      "status": "success",
      "duration_ms": 1400,
      "error_type": "none",
      "environment": "production"
    },
    {
      "timestamp_utc": "2026-07-28T15:00:00.000Z",
      "migration_id": "2026.07.2-migration-4",
      "service": "application-api",
      "database_name": "app_production",
      "release": "2026.07.2",
      "status": "failed",
      "duration_ms": 2100,
      "error_type": "lock_timeout",
      "environment": "production"
    },
    {
      "timestamp_utc": "2026-07-28T14:00:00.000Z",
      "migration_id": "2026.07.2-migration-5",
      "service": "application-api",
      "database_name": "app_production",
      "release": "2026.07.2",
      "status": "rolled_back",
      "duration_ms": 1800,
      "error_type": "validation_failure",
      "environment": "production"
    },
    {
      "timestamp_utc": "2026-07-27T18:00:00.000Z",
      "migration_id": "2026.07.1-migration-1",
      "service": "application-api",
      "database_name": "app_production",
      "release": "2026.07.1",
      "status": "success",
      "duration_ms": 900,
      "error_type": "none",
      "environment": "production"
    },
    {
      "timestamp_utc": "2026-07-27T17:00:00.000Z",
      "migration_id": "2026.07.1-migration-2",
      "service": "application-api",
      "database_name": "app_production",
      "release": "2026.07.1",
      "status": "success",
      "duration_ms": 700,
      "error_type": "none",
      "environment": "production"
    },
    {
      "timestamp_utc": "2026-07-27T16:00:00.000Z",
      "migration_id": "2026.07.1-migration-3",
      "service": "application-api",
      "database_name": "app_production",
      "release": "2026.07.1",
      "status": "success",
      "duration_ms": 1100,
      "error_type": "none",
      "environment": "production"
    },
    {
      "timestamp_utc": "2026-07-27T15:00:00.000Z",
      "migration_id": "2026.07.1-migration-4",
      "service": "application-api",
      "database_name": "app_production",
      "release": "2026.07.1",
      "status": "success",
      "duration_ms": 950,
      "error_type": "none",
      "environment": "production"
    },
    {
      "timestamp_utc": "2026-07-27T14:00:00.000Z",
      "migration_id": "2026.07.1-migration-5",
      "service": "application-api",
      "database_name": "app_production",
      "release": "2026.07.1",
      "status": "success",
      "duration_ms": 800,
      "error_type": "none",
      "environment": "production"
    }
  ],
  "expectedOutput": {
    "columns": [
      "release",
      "service",
      "database_name",
      "migrations",
      "successful",
      "failed",
      "rolled_back",
      "success_rate_pct",
      "average_duration_ms"
    ],
    "rows": [
      {
        "release": "2026.07.2",
        "service": "application-api",
        "database_name": "app_production",
        "migrations": 5,
        "successful": 3,
        "failed": 1,
        "rolled_back": 1,
        "success_rate_pct": 60,
        "average_duration_ms": 1470
      },
      {
        "release": "2026.07.1",
        "service": "application-api",
        "database_name": "app_production",
        "migrations": 5,
        "successful": 5,
        "failed": 0,
        "rolled_back": 0,
        "success_rate_pct": 100,
        "average_duration_ms": 890
      }
    ]
  },
  "notes": [
    "The included synthetic input rows generate the expected output when timestamps are shifted into the documented query window.",
    "Run this fixture in the public browser SQL playground; the selected query executes locally with DuckDB-Wasm.",
    "Adapt time windows, thresholds, identities, and business definitions before operational use."
  ]
}