遥测数据面
Ongrid edge 通过两条物理路径跟 manager 说话:
- 控制面 —— geminio tunnel(ADR-001 / ADR-007)。用于 edge 生命周期、 RPC、心跳、告警事件、指标推送(
push_prom_samples)。 - 遥测数据面 —— edge 到 manager 公开摄入端点的直接出站 HTTPS POST。 用于日志(Loki API)和链路(OTLP)。
这一页解释切分、认证模型、指标的迁移触发条件。
这一页是精简参考。完整决策记录在源码树里的 ADR-014。
切分
| 面 | 通道 | 承载 |
|---|---|---|
| 控制面 | geminio tunnel(已有 ADR-001) | edge 生命周期、RPC、心跳、告警事件、指标推送(目前) |
| 遥测数据面 | edge → manager 公开 HTTPS,独立出站连接 | 日志(ADR-012)、链路(ADR-013) |
两个面都是从 edge 出站 —— agent 拨 manager。edge 上无入站端口。
为什么切?
geminio tunnel 设计成控制 RPC 总线。它在一条持久连接里多路复用低延迟 RPC 调用。指标推送是 ADR-009 里加的 "搭顺风车",因为指标体量小(每个 edge 几 KB/s)、tunnel 有富余容量。
日志和链路不小。
| 信号 | 每 edge 稳态 | 每 edge 峰值 |
|---|---|---|
| 指标 | 几 KB/s | ~10 KB/s |
| 日志 | 几十 KB/s | 1–10 MB/s |
| 链路 | 取决于采样率 | 跟日志相当 |
100 个 edge × 1 MB/s = manager 持续 100 MB/s 入站。tunnel 不是为这个设计 的。逼日志和链路走它会撞上两个问题:
- manager CPU 化掉。 tunnel 帧编解码 + 转给下游存的过程在 Go 进程 里。nginx + 直接到下游存便宜好几倍。
- 队头阻塞。 高吞吐字节流跟控制 RPC 在 mux 上争用。运维问"edge 42 怎 么了?"时体会到秒级抖动。
tunnel 是控制面。数据面是数据面。混在一起是 NAT 约束下的权宜之计;切分 让边界明显。
架构
┌──────────────────────────────┐
┌──────────────┐ │ manager │
│ ongrid-edge │ │ │
│ │ │ nginx :443 ──► /api/* ───► ongrid (manager)
│ ┌─────────┐ │ geminio tunnel │ │
│ │ agent │ ├────► :40012 ──────►│ frontier (geminio broker) ──┤
│ └─────────┘ │ (control plane) │ │
│ │ │ nginx :443 ──► /loki/* ───► loki ← data plane
│ ┌─────────┐ │ │ ──► /v1/traces ─► tempo ← data plane
│ │promtail │ ├────► :443 ────────►│ ──► /api/v1/write─► prom (today)
│ └─────────┘ │ (data plane) │ │
│ │ │ edgeauth verifies the token │
│ ┌─────────┐ │ │ via /internal/auth/ │
│ │otelcol │ ├────► :443 ────────►│ dataplane-verify before │
│ └─────────┘ │ (data plane) │ proxying. │
└──────────────┘ └──────────────────────────────┘agent 每个插件(promtail、otelcol-contrib)用一个 TLS 连接。它们都从 edge 出站,到 ONGRID_PUBLIC_URL。
认证
一个信任根,两条路径。
edge 的 access-key/secret-key 对通过 geminio 的会话凭证认证 tunnel。同一对 凭证换一个 Bearer token,用在每次数据面 HTTPS POST 上。nginx 的 auth_request 指令回调到 manager 的 /internal/auth/dataplane-verify 验 token;200 时请求被代理到 Loki 或 Tempo。401/403 时 edge 看到 HTTP 错 误并退避。
这意味着:
- 轮换 edge 的
secret_key同时失效两个面。 - 没有第二个 secret 存储、没有按插件凭证、没有独立 ACL。
- manager 拥有认证 —— Loki 和 Tempo 从不直接见到 edge 身份。
Bearer token 短寿。agent 透明地通过 tunnel 刷它;tunnel 长时间断开的 edge 会在 token 过期后看到数据面 POST 开始 401,这强制 tunnel 重连。
NAT 兼容
到 manager 公开端口的出站 HTTPS 跟出站 tunnel 是同一类网络 —— 两者都从 edge 起源到单一目标端口范围(443 数据、40012 tunnel)。两者都穿过普通公司 出口防火墙。无特殊放行、无入站规则。
只能开一个出站连接的 NAT-only edge,geminio 有 raw-stream 回退(zstd 压缩 的日志载荷、有界缓冲、溢出丢老的)。这是逃生口,不是默认 —— 还没给客户 发过。
指标呢?
push_prom_samples 今天还在 tunnel 上。
| 为什么留在 tunnel |
|---|
| 每 edge 指标体量远低于饱和。 |
| 现有路径能用;迁移成本超过当前收益。 |
push_prom_samples 每次 release 都被锤;动它有风险。 |
我们会在以下任一成立时把指标移到数据面(Prometheus remote_write 直接 到 https://<manager>/api/v1/write):
- 单 manager tunnel CPU 持续 > 60%。
- 单 edge 指标推送率持续 > 100 KB/s(几乎总意味着 cardinality 跑飞 —— 先 修这个;持续了再迁)。
- 控制 RPC P95 延迟在指标流压力下退化 > 500ms。
Prometheus remote_write client 已经在 node_exporter 里,edge 的指标插件能 通过 env 改指向。上面这条触发只是设优先级。
edge 实现
磁盘上,agent 把每个遥测发送都走 internal/edgeagent/dataplane/。这个包集中了:
- 从 tunnel 会话凭证复用 token。
- 双目的地路由(tunnel 给控制、HTTPS 给数据)。
- 带 jitter 的指数退避重试,上限 1 分钟。
- 本地有界队列(内存里;agent 不 spool 到磁盘)。
每个插件(promtail、otelcol-contrib、未来的)消费这个包 —— 没有按插件的 重试 / 认证逻辑。这让 ongrid-edge 保持一个二进制加四个子进程,没有按插件 sidecar、没有按插件 systemd unit。
你调什么
| 变量 | 在哪 | 效果 |
|---|---|---|
ONGRID_PUBLIC_URL | manager | 发给 edge 作为数据面根的 URL。数据面工作必需。 |
ONGRID_LOG_QUERY_URL | manager | 读路径 —— manager → Loki 给 Logs 页。跟 edge 推送独立。 |
ONGRID_TRACE_QUERY_URL | manager | 读路径 —— manager → Tempo 给 Traces 页。 |
ONGRID_EDGE_PLUGIN_BIN_DIR | edge | 插件二进制住哪(promtail、otelcol-contrib)。 |
ONGRID_EDGE_PLUGIN_WORK_DIR | edge | 按插件运行时目录(config、PID、队列 spool)。 |
ONGRID_PUBLIC_URL 是 manager 侧最重要的生产设置。空就整体禁用数据面 —— edge 通过 tunnel 连上、agent 启起来,但日志和链路从不发出。