Skip to content

遥测数据面

Ongrid edge 通过两条物理路径跟 manager 说话:

  1. 控制面 —— geminio tunnel(ADR-001 / ADR-007)。用于 edge 生命周期、 RPC、心跳、告警事件、指标推送(push_prom_samples)。
  2. 遥测数据面 —— 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/s1–10 MB/s
链路取决于采样率跟日志相当

100 个 edge × 1 MB/s = manager 持续 100 MB/s 入站。tunnel 不是为这个设计 的。逼日志和链路走它会撞上两个问题:

  1. manager CPU 化掉。 tunnel 帧编解码 + 转给下游存的过程在 Go 进程 里。nginx + 直接到下游存便宜好几倍。
  2. 队头阻塞。 高吞吐字节流跟控制 RPC 在 mux 上争用。运维问"edge 42 怎 么了?"时体会到秒级抖动。

tunnel 是控制面。数据面是数据面。混在一起是 NAT 约束下的权宜之计;切分 让边界明显。

架构

text
                                      ┌──────────────────────────────┐
   ┌──────────────┐                    │           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_URLmanager发给 edge 作为数据面根的 URL。数据面工作必需。
ONGRID_LOG_QUERY_URLmanager读路径 —— manager → Loki 给 Logs 页。跟 edge 推送独立。
ONGRID_TRACE_QUERY_URLmanager读路径 —— manager → Tempo 给 Traces 页。
ONGRID_EDGE_PLUGIN_BIN_DIRedge插件二进制住哪(promtail、otelcol-contrib)。
ONGRID_EDGE_PLUGIN_WORK_DIRedge按插件运行时目录(config、PID、队列 spool)。

ONGRID_PUBLIC_URL 是 manager 侧最重要的生产设置。空就整体禁用数据面 —— edge 通过 tunnel 连上、agent 启起来,但日志和链路从不发出。

另见