{
  "timestamp": 1780747903,
  "stale_after_sec": 120,
  "summary": {
    "services": {
      "total": 98,
      "ok": 97,
      "warn": 1,
      "bad": 0,
      "failed": 0,
      "attention": 1,
      "severity": "warn"
    },
    "feeds": {
      "total": 3,
      "ok": 3,
      "warn": 0,
      "bad": 0,
      "failed": 0,
      "listening": 3,
      "severity": "ok"
    }
  },
  "checks": {
    "external_sites": {
      "ok": true,
      "total": 3,
      "failed": 0,
      "severity": "ok",
      "targets": [
        {
          "id": "status_page",
          "url": "https://adsb-open.addevlab.com/status/",
          "status": 200,
          "ok": true
        },
        {
          "id": "tar1090_page",
          "url": "https://adsb-open.addevlab.com/tar1090/",
          "status": 200,
          "ok": true
        },
        {
          "id": "graphs1090_page",
          "url": "https://adsb-open.addevlab.com/graphs1090/",
          "status": 200,
          "ok": true
        }
      ]
    },
    "ssh_remote": {
      "ok": true,
      "severity": "ok",
      "target": "yuki@192.168.0.60",
      "total": 3,
      "failed": 0,
      "targets": [
        {
          "id": "readsb_active",
          "ok": true,
          "expected": "active",
          "actual": "active"
        },
        {
          "id": "airspy_adsb_active",
          "ok": true,
          "expected": "active",
          "actual": "active"
        },
        {
          "id": "internet_connectivity",
          "ok": true,
          "expected": "ok",
          "actual": "ok"
        }
      ],
      "system": {
        "cpu_percent": 65.1,
        "memory_percent": 32.5,
        "memory_total_kib": 15684308,
        "memory_used_kib": 5091940,
        "disk_percent": 14.5,
        "disk_total_bytes": 982240026624,
        "disk_used_bytes": 142491021312,
        "disk_read_bps": 0,
        "disk_write_bps": 304274,
        "net_iface": "enp2s0",
        "net_rx_bps": 2508,
        "net_tx_bps": 10571,
        "temperature_c": 56.0,
        "uptime_sec": 599198
      },
      "systemd_units": [
        {
          "id": "adsb-dist-1m-health-latest.service",
          "state": "inactive",
          "sub": "dead",
          "description": "Emit dist_1m_health_latest.json from summary.json",
          "age_sec": 3
        },
        {
          "id": "adsb-streamnew-memory-status.service",
          "state": "inactive",
          "sub": "dead",
          "description": "ADS-B Stream-New memory guardrail snapshot",
          "age_sec": 3
        },
        {
          "id": "adsb-streamnew-network-observer.service",
          "state": "active",
          "sub": "running",
          "description": "ADS-B Stream-New network observer",
          "age_sec": 599180
        },
        {
          "id": "adsb-streamnew-prometheus-exporter.service",
          "state": "active",
          "sub": "running",
          "description": "ADS-B Stream v3 arena-monitor Prometheus exporter",
          "age_sec": 599180
        },
        {
          "id": "adsb-streamnew-resource-memory.service",
          "state": "activating",
          "sub": "start",
          "description": "start ADS-B Stream-New resource memory diagnostic snapshot",
          "age_sec": 3
        },
        {
          "id": "adsb-streamnew-stream1090-report.service",
          "state": "inactive",
          "sub": "dead",
          "description": "ADS-B Stream-New local stream1090 report-only baseline sample",
          "age_sec": 172
        },
        {
          "id": "adsb-streamnew-upstream-report.service",
          "state": "inactive",
          "sub": "dead",
          "description": "ADS-B Stream-New upstream readsb/tar1090/stream1090 report-only baseline sample",
          "age_sec": 880
        },
        {
          "id": "adsb-streamnew-youtube-api-cost-open-day-report.service",
          "state": "inactive",
          "sub": "dead",
          "description": "ADS-B Stream-New YouTube API cost open-day burn-rate report",
          "age_sec": 240
        },
        {
          "id": "adsb-streamnew-youtube-api-cost-report.service",
          "state": "inactive",
          "sub": "dead",
          "description": "ADS-B Stream-New YouTube API cost daily report",
          "age_sec": 455
        },
        {
          "id": "adsb-streamnew-youtube-stream.service",
          "state": "inactive",
          "sub": "dead",
          "description": "ADS-B Stream-New YouTube Live Stream Engine"
        },
        {
          "id": "adsb-summary.service",
          "state": "inactive",
          "sub": "dead",
          "description": "ADS-B summary.json generator",
          "age_sec": 3
        },
        {
          "id": "adsb_dist_logger.service",
          "state": "inactive",
          "sub": "dead",
          "description": "ADS-B distance distribution logger (readsb aircraft.json -> JSONL)",
          "age_sec": 31
        },
        {
          "id": "adsb_dist_logger_notify@adsb_dist_logger.service.service",
          "state": "inactive",
          "sub": "dead",
          "description": "Discord notify on failure: adsb_dist_logger.service",
          "age_sec": 599173
        },
        {
          "id": "adsb_log_watchdog.service",
          "state": "inactive",
          "sub": "dead",
          "description": "ADS-B log watchdog (missing/stale/status errors -> JST JSONL)",
          "age_sec": 3
        },
        {
          "id": "adsb_perf_logger.service",
          "state": "inactive",
          "sub": "dead",
          "description": "ADS-B performance logger (tar1090 stats.json -> JSONL)",
          "age_sec": 20
        },
        {
          "id": "adsb_stats_extender.service",
          "state": "inactive",
          "sub": "dead",
          "description": "ADS-B stats extender (aircraft.json -> dist_signal_stats_1m.jsonl)",
          "age_sec": 40
        },
        {
          "id": "airspy_adsb.service",
          "state": "active",
          "sub": "running",
          "description": "Airspy ADS-B receiver",
          "age_sec": 54699
        },
        {
          "id": "airspy_adsb_file_metrics_logger.service",
          "state": "inactive",
          "sub": "dead",
          "description": "Log airspy_adsb metrics from stats.json",
          "age_sec": 40
        },
        {
          "id": "airspy_gain_guard.service",
          "state": "inactive",
          "sub": "dead",
          "description": "Airspy gain guard (day fixed / night auto)",
          "age_sec": 101
        },
        {
          "id": "amazon-notify-pubsub.service",
          "state": "active",
          "sub": "running",
          "description": "Amazon Notify (Pub/Sub StreamingPull realtime)",
          "age_sec": 599180
        },
        {
          "id": "check_adsb_alive.service",
          "state": "inactive",
          "sub": "dead",
          "description": "Check if ADS-B receiver service is alive",
          "age_sec": 234
        },
        {
          "id": "check_graphs1090_alive.service",
          "state": "inactive",
          "sub": "dead",
          "description": "Check graphs1090 health and restart if stale",
          "age_sec": 127
        },
        {
          "id": "check_readsb_alive.service",
          "state": "inactive",
          "sub": "dead",
          "description": "Check readsb status and restart if failed",
          "age_sec": 127
        },
        {
          "id": "cloudflared-adsb.service",
          "state": "active",
          "sub": "running",
          "description": "Cloudflare Tunnel (adsb-nginx)",
          "age_sec": 599180
        },
        {
          "id": "fr24feed.service",
          "state": "active",
          "sub": "running",
          "description": "Flightradar24 Decoder & Feeder",
          "age_sec": 599180
        },
        {
          "id": "graphs1090.service",
          "state": "active",
          "sub": "running",
          "description": "graphs1090 graph generation",
          "age_sec": 599179
        },
        {
          "id": "pfclient.service",
          "state": "active",
          "sub": "running",
          "description": "LSB: planefinder.net ads-b decoder",
          "age_sec": 599180
        },
        {
          "id": "plao-collect.service",
          "state": "active",
          "sub": "running",
          "description": "PLAO collector (readsb aircraft.json -> POS JSONL, daily rotate)",
          "age_sec": 599180
        },
        {
          "id": "readsb.service",
          "state": "active",
          "sub": "running",
          "description": "readsb ADS-B receiver",
          "age_sec": 599179
        },
        {
          "id": "rtl_biast-readsb.service",
          "state": "active",
          "sub": "exited",
          "description": "Enable bias tee for RTL-SDR Blog V4 (serial 00000120) before readsb",
          "age_sec": 599179
        },
        {
          "id": "stream-v3-arena-monitor.service",
          "state": "active",
          "sub": "running",
          "description": "stream_v3 arena monitoring control loop",
          "age_sec": 599180
        },
        {
          "id": "stream-v3-persistent-anchor-observer.service",
          "state": "active",
          "sub": "running",
          "description": "stream_v3 persistent TCP anchor observer",
          "age_sec": 26810
        },
        {
          "id": "stream-v3-remote-recovery.service",
          "state": "inactive",
          "sub": "dead",
          "description": "stream_v3 remote k3s recovery check",
          "age_sec": 3
        },
        {
          "id": "stream-v3-wan-address-observer.service",
          "state": "inactive",
          "sub": "dead",
          "description": "stream_v3 host WAN address observer",
          "age_sec": 30
        },
        {
          "id": "tar1090-stream1090.service",
          "state": "active",
          "sub": "running",
          "description": "tar1090-stream1090 - compress dump1090 json data",
          "age_sec": 599179
        },
        {
          "id": "tar1090.service",
          "state": "active",
          "sub": "running",
          "description": "tar1090 - compress dump1090 json data",
          "age_sec": 599179
        },
        {
          "id": "adsb-dist-1m-health-latest.timer",
          "state": "active",
          "sub": "waiting",
          "description": "Run dist_1m_health_latest emitter every minute",
          "age_sec": 3
        },
        {
          "id": "adsb-streamnew-memory-status.timer",
          "state": "active",
          "sub": "waiting",
          "description": "Run ADS-B Stream-New memory guardrail snapshot every minute",
          "age_sec": 3
        },
        {
          "id": "adsb-streamnew-resource-memory.timer",
          "state": "active",
          "sub": "running",
          "description": "Run ADS-B Stream-New resource memory diagnostic every minute",
          "age_sec": 3
        },
        {
          "id": "adsb-streamnew-stream1090-report.timer",
          "state": "active",
          "sub": "waiting",
          "description": "Run ADS-B Stream-New local stream1090 report-only baseline every 15 minutes",
          "age_sec": 172
        },
        {
          "id": "adsb-streamnew-upstream-report.timer",
          "state": "active",
          "sub": "waiting",
          "description": "Run ADS-B Stream-New upstream report-only baseline every 15 minutes",
          "age_sec": 880
        },
        {
          "id": "adsb-streamnew-youtube-api-cost-open-day-report.timer",
          "state": "active",
          "sub": "waiting",
          "description": "Run Stream-New YouTube API cost open-day report every 10 minutes",
          "age_sec": 240
        },
        {
          "id": "adsb-streamnew-youtube-api-cost-report.timer",
          "state": "active",
          "sub": "waiting",
          "description": "Run Stream-New YouTube API cost report every hour",
          "age_sec": 455
        },
        {
          "id": "adsb-summary.timer",
          "state": "active",
          "sub": "waiting",
          "description": "Run ADS-B summary generator every minute",
          "age_sec": 3
        },
        {
          "id": "adsb_dist_logger.timer",
          "state": "active",
          "sub": "waiting",
          "description": "Run ADS-B distance logger every 1 minute",
          "age_sec": 31
        },
        {
          "id": "adsb_log_watchdog.timer",
          "state": "active",
          "sub": "waiting",
          "description": "Run ADS-B log watchdog every minute",
          "age_sec": 3
        },
        {
          "id": "adsb_perf_logger.timer",
          "state": "active",
          "sub": "waiting",
          "description": "Run ADS-B performance logger every 1 minute",
          "age_sec": 20
        },
        {
          "id": "adsb_stats_extender.timer",
          "state": "active",
          "sub": "waiting",
          "description": "Run ADS-B stats extender every 1 minute",
          "age_sec": 40
        },
        {
          "id": "airspy_adsb_file_metrics_logger.timer",
          "state": "active",
          "sub": "waiting",
          "description": "Run airspy_adsb metrics logger every minute",
          "age_sec": 40
        },
        {
          "id": "airspy_gain_guard.timer",
          "state": "active",
          "sub": "waiting",
          "description": "Run airspy gain guard periodically",
          "age_sec": 101
        },
        {
          "id": "check_adsb_alive.timer",
          "state": "active",
          "sub": "waiting",
          "description": "Run ADS-B monitor every 5 minutes",
          "age_sec": 234
        },
        {
          "id": "check_graphs1090_alive.timer",
          "state": "active",
          "sub": "waiting",
          "description": "Run graphs1090 health check every 5 minutes",
          "age_sec": 127
        },
        {
          "id": "check_readsb_alive.timer",
          "state": "active",
          "sub": "waiting",
          "description": "Run readsb check every 5 minutes",
          "age_sec": 127
        },
        {
          "id": "stream-v3-remote-recovery.timer",
          "state": "active",
          "sub": "waiting",
          "description": "Run stream_v3 remote k3s recovery check every minute",
          "age_sec": 3
        },
        {
          "id": "stream-v3-wan-address-observer.timer",
          "state": "active",
          "sub": "waiting",
          "description": "Run stream_v3 host WAN address observer every minute",
          "age_sec": 30
        }
      ]
    },
    "network_incidents_recent": [
      {
        "first_ts": 1780744751,
        "last_ts": 1780744751,
        "probe_failures": [],
        "probe_actual": {},
        "external_failures": [
          "status_page"
        ],
        "external_status": {
          "status_page": 0
        },
        "count": 1
      },
      {
        "first_ts": 1780730282,
        "last_ts": 1780730282,
        "probe_failures": [],
        "probe_actual": {},
        "external_failures": [
          "status_page",
          "tar1090_page"
        ],
        "external_status": {
          "status_page": 0,
          "tar1090_page": 0
        },
        "count": 1
      },
      {
        "first_ts": 1780717295,
        "last_ts": 1780717295,
        "probe_failures": [],
        "probe_actual": {},
        "external_failures": [
          "graphs1090_page"
        ],
        "external_status": {
          "graphs1090_page": 0
        },
        "count": 1
      },
      {
        "first_ts": 1780710527,
        "last_ts": 1780710527,
        "probe_failures": [],
        "probe_actual": {},
        "external_failures": [
          "graphs1090_page"
        ],
        "external_status": {
          "graphs1090_page": 0
        },
        "count": 1
      },
      {
        "first_ts": 1780528158,
        "last_ts": 1780528158,
        "probe_failures": [
          "internet_connectivity"
        ],
        "probe_actual": {
          "internet_connectivity": "fail"
        },
        "external_failures": [],
        "external_status": {},
        "count": 1
      },
      {
        "first_ts": 1780441729,
        "last_ts": 1780441751,
        "probe_failures": [
          "internet_connectivity"
        ],
        "probe_actual": {
          "internet_connectivity": "fail"
        },
        "external_failures": [
          "graphs1090_page",
          "status_page",
          "tar1090_page"
        ],
        "external_status": {
          "status_page": 0,
          "tar1090_page": 0,
          "graphs1090_page": 0
        },
        "count": 2
      },
      {
        "first_ts": 1780409078,
        "last_ts": 1780409078,
        "probe_failures": [],
        "probe_actual": {},
        "external_failures": [
          "tar1090_page"
        ],
        "external_status": {
          "tar1090_page": 0
        },
        "count": 1
      },
      {
        "first_ts": 1780355341,
        "last_ts": 1780355341,
        "probe_failures": [],
        "probe_actual": {},
        "external_failures": [
          "graphs1090_page",
          "status_page",
          "tar1090_page"
        ],
        "external_status": {
          "status_page": 502,
          "tar1090_page": 502,
          "graphs1090_page": 502
        },
        "count": 1
      },
      {
        "first_ts": 1780355316,
        "last_ts": 1780355316,
        "probe_failures": [
          "internet_connectivity"
        ],
        "probe_actual": {
          "internet_connectivity": "fail"
        },
        "external_failures": [
          "graphs1090_page",
          "status_page",
          "tar1090_page"
        ],
        "external_status": {
          "status_page": 502,
          "tar1090_page": 502,
          "graphs1090_page": 502
        },
        "count": 1
      },
      {
        "first_ts": 1780350420,
        "last_ts": 1780350420,
        "probe_failures": [],
        "probe_actual": {},
        "external_failures": [
          "tar1090_page"
        ],
        "external_status": {
          "tar1090_page": 0
        },
        "count": 1
      }
    ],
    "ssh_remote_history": {
      "url": "ssh-remote-history.json",
      "window_sec": 86400
    }
  }
}