Fly Audit · 监控与告警
fly-audit 是独立的 fly app,负责审计 personal org 全部 fly 资源、估算月度花费、检测孤立资源,
通过 Telegram 推送日审与即时告警。
数据流
┌────────────────────────────────────────────────────────────────────────────┐
│ fly-audit machine │
│ │
│ ┌──────────────────┐ ┌────────────────────────────────────────────┐ │
│ │ node-cron │ │ node:http server :3000 │ │
│ │ │ │ POST /telegram/webhook │ │
│ │ 6h: auditCycle │ │ GET /health │ │
│ │ 9:00 JST: daily │ └────────────────┬───────────────────────────┘ │
│ └────────┬─────────┘ │ │
│ │ │ │
│ ▼ ▼ │
│ ┌────────────────────┐ ┌──────────────────────┐ │
│ │ FlyApiClient │ │ Webhook Handler │ │
│ │ (Machines API + │ │ • verify secret │ │
│ │ GraphQL) │ │ • verify chat_id │ │
│ └────────┬───────────┘ │ • dispatch /status │ │
│ │ │ /cost │ │
│ ▼ │ /help │ │
│ ┌────────────────────┐ └──────────┬───────────┘ │
│ │ cost-estimator │ │ │
│ │ + prices.yaml │ │ │
│ └────────┬───────────┘ │ │
│ │ │ │
│ ▼ ▼ │
│ ┌────────────────────┐ ┌──────────────────────┐ │
│ │ SQLite WAL ◄─────────┤ TelegramService │ │
│ │ - snapshots │ │ (Bot API direct) │ │
│ │ - alert_events │ └──────────┬───────────┘ │
│ │ /data/fly-audit.db │ │ │
│ └─────────────────────┘ │ │
│ │ │
└──────────────────────────────────────────────┼──────────────────────────────┘
│
▼
Telegram (你)
▲
│ (心跳超时回推)
healthchecks.io email8 维风险覆盖矩阵
| 维度 | 覆盖方式 | 实现位置 |
|---|---|---|
| stopped machine 烧 rootfs | 立即告警(≥24h, primary apps) | alert-rules.ts#detectStoppedMachines |
| 孤立 volume | 立即告警 | alert-rules.ts#detectOrphanVolumes |
| 孤立 Postgres | 通过 stopped machine 间接覆盖 | 同上 |
| 孤立 IPv4 | 立即告警 | alert-rules.ts#detectOrphanIpv4 |
| Egress spike(总量) | snapshot diff 体现于日审 | daily-digest.ts |
| Egress region 分桶 | 待 add-egress-region-label | 未实现 |
| Autoscaler 失控 | snapshot diff 体现 machine 增量 | 同上 |
| Postgres tier 误配 | 仅日审 cost 显示,无连接数 | 待 follow-up |
详细推断逻辑见 openspec/changes/add-fly-audit-telegram/design.md 的 D7 / D9 / D10。
优先级路由
| App | 优先级 | stopped_24h 行为 |
|---|---|---|
| openspec-api | primary | 立即告警 |
| openspec-db | primary | 立即告警 |
| ai-slide-server | secondary | 仅日审 digest |
| ai-slide-db | secondary | 仅日审 digest |
| ai-slide-export-pptx | secondary | 仅日审 digest |
| fly-audit | secondary | 仅日审 digest (自指) |
修改:apps/fly-audit/src/app-priority.ts。
单价表来源
apps/fly-audit/src/prices.yaml 当前快照:2026-05-14,来源 fly.io/docs/about/pricing/ 。
修改流程:
- 拉最新 fly 价格页
- 改
prices.yaml与version字段 pnpm test验证 cost-estimator 测试通过- PR review
- merge →
flyctl deploy -a fly-audit
告警去重逻辑
fly_alert_event 表按 dedup_key 唯一索引:
| 告警类型 | dedup_key 形态 | 窗口 |
|---|---|---|
| stopped_24h | stopped_24h:{machine_id} | 24h |
| orphan_volume | orphan_volume:{volume_id} | 24h |
| orphan_ipv4 | orphan_ipv4:{ip} | 24h |
| daily_digest | daily_digest | 24h |
同 dedup_key 在 24h 内不再发送。first_seen 保留首次触发时间。
自监控(防递归故障)
监控系统自身挂了谁告警?答:healthchecks.io 外部 heartbeat。
正常路径:
fly-audit cron 完成 → ping https://hc-ping.com/<uuid>
healthchecks.io 记录最近 ping 时间
故障路径:
fly-audit 崩溃 / 进程死 → 不再 ping
超过 7h(6h schedule + 1h grace)→ healthchecks.io 主动发邮件注意:
- 仅在完整 audit / digest 成功时 ping(包括 Telegram 推送成功)
- 任一步失败 → 不 ping → 让 7h 后 healthchecks 主动告警
运维 SOP
相关文档
- 设计 / 决策:
openspec/changes/add-fly-audit-telegram/design.md - 规范:
openspec/changes/add-fly-audit-telegram/specs/fly-audit/spec.md - 任务清单:
openspec/changes/add-fly-audit-telegram/tasks.md - 起源调研:Fly.io 监控能力与实施可行性 · 2026Q2