{
  "dashboard_title": "Ingestion Throughput",
  "description": "Operational dashboard for monitoring ingestion pipeline throughput, success rates, and item counts across source types.",
  "slug": "ingestion-throughput",
  "position_json": {
    "HEADER_ID": {"id": "HEADER_ID", "type": "HEADER", "meta": {"text": "Ingestion Throughput"}},
    "ROW-1": {
      "type": "ROW",
      "children": ["CHART-throughput-timeseries", "CHART-source-type-breakdown"]
    },
    "ROW-2": {
      "type": "ROW",
      "children": ["CHART-success-failure-rate", "CHART-items-fetched"]
    },
    "ROW-3": {
      "type": "ROW",
      "children": ["CHART-stale-sources", "CHART-active-companies"]
    }
  },
  "metadata": {
    "refresh_frequency": 300,
    "default_filters": "{}",
    "color_scheme": "supersetColors"
  },
  "charts": [
    {
      "slice_name": "Ingestion Runs Over Time",
      "viz_type": "echarts_timeseries_bar",
      "description": "Ingestion run counts bucketed by hour, stacked by source type",
      "datasource_type": "query",
      "query": "SELECT date_trunc('hour', ir.started_at) AS bucket, ir.source_type, COUNT(*) AS run_count, COUNT(*) FILTER (WHERE ir.status = 'completed') AS completed, COUNT(*) FILTER (WHERE ir.status = 'failed') AS failed FROM ingestion_runs ir WHERE ir.started_at >= NOW() - INTERVAL '24 hours' GROUP BY 1, 2 ORDER BY 1",
      "params": {
        "x_axis": "bucket",
        "metrics": ["run_count"],
        "groupby": ["source_type"],
        "time_grain_sqla": "PT1H"
      }
    },
    {
      "slice_name": "Source Type Breakdown",
      "viz_type": "pie",
      "description": "Distribution of ingestion runs by source type in the last 24h",
      "datasource_type": "query",
      "query": "SELECT ir.source_type, COUNT(*) AS runs FROM ingestion_runs ir WHERE ir.started_at >= NOW() - INTERVAL '24 hours' GROUP BY ir.source_type ORDER BY runs DESC"
    },
    {
      "slice_name": "Success vs Failure Rate",
      "viz_type": "echarts_timeseries_line",
      "description": "Hourly success and failure counts over time",
      "datasource_type": "query",
      "query": "SELECT date_trunc('hour', ir.started_at) AS bucket, COUNT(*) FILTER (WHERE ir.status = 'completed') AS completed, COUNT(*) FILTER (WHERE ir.status = 'failed') AS failed, ROUND(COUNT(*) FILTER (WHERE ir.status = 'completed')::numeric / NULLIF(COUNT(*), 0), 3) AS success_rate FROM ingestion_runs ir WHERE ir.started_at >= NOW() - INTERVAL '24 hours' GROUP BY 1 ORDER BY 1"
    },
    {
      "slice_name": "Items Fetched Over Time",
      "viz_type": "echarts_timeseries_bar",
      "description": "Total items fetched and new items per hour",
      "datasource_type": "query",
      "query": "SELECT date_trunc('hour', ir.started_at) AS bucket, COALESCE(SUM(ir.items_fetched), 0) AS items_fetched, COALESCE(SUM(ir.items_new), 0) AS items_new FROM ingestion_runs ir WHERE ir.started_at >= NOW() - INTERVAL '24 hours' GROUP BY 1 ORDER BY 1"
    },
    {
      "slice_name": "Stale Sources",
      "viz_type": "table",
      "description": "Sources with no successful run in the last 24 hours",
      "datasource_type": "query",
      "query": "SELECT c.ticker, s.source_type, s.source_name, MAX(ir.started_at) FILTER (WHERE ir.status = 'completed') AS last_success, COUNT(*) FILTER (WHERE ir.status = 'failed' AND ir.started_at >= NOW() - INTERVAL '24 hours') AS recent_failures FROM sources s JOIN companies c ON c.id = s.company_id LEFT JOIN ingestion_runs ir ON ir.source_id = s.id WHERE s.active = TRUE AND c.active = TRUE GROUP BY c.ticker, s.source_type, s.source_name HAVING MAX(ir.started_at) FILTER (WHERE ir.status = 'completed') < NOW() - INTERVAL '24 hours' OR MAX(ir.started_at) FILTER (WHERE ir.status = 'completed') IS NULL ORDER BY c.ticker"
    },
    {
      "slice_name": "Active Companies Ingested",
      "viz_type": "big_number_total",
      "description": "Count of distinct companies with ingestion activity in the last 24h",
      "datasource_type": "query",
      "query": "SELECT COUNT(DISTINCT company_id) AS active_companies FROM ingestion_runs WHERE started_at >= NOW() - INTERVAL '24 hours'"
    }
  ]
}
