Skip to content

监控

Ongrid 开箱发一条能用的监控管线,并设计为贴合你已有的那条。

数据面

text
edge:
  hostmetrics, procmetrics, node-exporter  ─┐
                                            │  remote_write (HTTPS direct)

                                       ┌─────────┐
                                       │  Prom   │  (default: bundled)
                                       └────┬────┘
                                            │ query_range / instant

                                  ┌──────────────────────┐
                                  │  manager:            │
                                  │   - alert evaluator  │
                                  │   - query_promql     │
                                  │   - /api/grafana     │
                                  └──────────────────────┘

默认是 docker-compose 里 prometheus:9090 上的内置 Prometheus。edge 通过 HTTPS 直接推到它 —— 不 scrape,不发现节点。这是 ADR-014 的数据面 / 控制面 分离:geminio tunnel 走控制,遥测直走。

为什么直推,不走 tunnel

在 50 台 host 装机上、cardinality ≥ 5k series/sec 时,把 remote_write 多路 复用到 geminio 控制 tunnel 上就堵了。直接 remote_write 把 manager 从热路径 上拿掉,让 Prom 自己的 write-ahead-log 处理摄入缓冲。代价是多暴一个 HTTPS 端点;nginx 反代片段见 服务端安装

内置 vs 外接 Prom

两种模式都是一等公民。

内置(默认)

docker compose upprometheus:v2.55,带 --web.enable-remote-write-receiver。 存储是命名卷 ongrid_prom_data。保留期默认 15d —— 在 .env 里通过 PROMETHEUS_RETENTION 调。

manager 通过 ONGRID_PROM_QUERY_URL env 在 http://prometheus:9090 上跟它 说话。不需要别的配置。

外接

ONGRID_PROM_QUERY_URL 指向你自己的 Prom / VictoriaMetrics / Thanos 查询端点。edge 还是 remote_write —— 通过 Edge 插件配置里每 edge 的 remote_write_url 指向你的摄入 URL (internal/manager/biz/edge/plugin_config.go)。

云端内置那份 Prom 可以继续跑,作为只 scrape manager 本身的 "self-observability" Prom(ADR-026 self-obs 指标住这)。需要两边都覆盖的告警可以定义两次,带不 同的 match_scope_types

查询路径

两个消费方,一个 client。

告警 evaluator

PipelineEvaluator.evaluatePromQuery 每 tick 跑每条启用 metric_raw 规则 的 Expr。PromQL 自己的比较运算符(up == 0cpu_pct > 90就是谓词 —— Prom 把不匹配的 series 从响应里丢掉,所以 evaluator 按返回 vector 每个 条目触发一条 incident,剩下的在下一 tick 的 recovery sweep 里收掉。

go
// pipeline.go:269
res, err := e.prom.Query(ctx, rule.Expr, now)
// ...
for _, ent := range entries {
    dedupeKey := fmt.Sprintf("pipeline:%s:%s", rule.RuleKey, labelSetKey(ent.Metric))
    // ... RecordFiring + notify
}

query_promql 工具

LLM 拿到一个叫 query_promql 的 BaseTool,吃 instant 或 range 查询,返回 JSON vector / matrix。investigator persona 把它当主要指标探针;coordinator chat 用它来回答 "edge-prod-04 现在 CPU 多少?"。

Schema 在 query_promql_basetool.go; 底层引擎是 internal/pkg/promquery

内嵌 Grafana

compose 里发 Grafana 在 grafana:3000。manager 通过 /api/grafana/* 反代 (认证在代理层做),让 SPA 的 MonitorPanel.tsx 一键嵌 iframe —— 不用单 独登录 Grafana。

开箱即用的情况下,manager 通过 biz/grafana/Service 按同步 tick 把内部 monitor 面板定义镜像到 Grafana 里。运维在 Grafana (富编辑器)里改面板,manager 捡回来。SPA 的 MonitorEditor 页面是个轻量 的 "读完跳转",把 Grafana 面板编辑器弹出来并预填相关 series。

Grafana 凭证

内置 Grafana 出厂账号是 admin / admin。暴露前先改。参见 首次启动清单

self-observability

ADR-026 给 manager 接上 /metrics 加 6 条基线告警(LLM token 飙升、告警 evaluator 卡住、tunnel 断连风暴、审计日志延迟、investigator 积压、RCA 延迟 p99)。首次启动时种到规则 + dashboard 表里,每次升级都会重新断言。

内置 Prom 会去 scrape manager 的 /metrics。外接 Prom 模式需要你在 manager:9100(默认 ONGRID_METRICS_ADDR)加一个 scrape target。

另见

  • 告警 —— 查 Prom 的规则类型。
  • 链路 —— spanmetrics 生成器把 traces_spanmetrics_* 喂回同一个 Prom。
  • 日志 —— Loki 的并行管线。
  • 环境变量 —— 每个 ONGRID_PROM_*PROMETHEUS_* 旋钮。