Skip to content

日志 ​

日志是 L1 栈里 Loki 的那一半。它跟指标同一个数据面形状:edge 直接通过 HTTPS 推到 Loki,manager 只查询。

数据面 ​

text
edge:
  ongrid-edge agent
    └─ plugin: promtail (subprocess)
        ├─ tails /var/log/syslog, /var/log/messages, journald
        └─ remote write HTTPS → loki:3100
                                     │
                                     ▼ /loki/api/v1/query_range
                              ┌───────────────┐
                              │  manager:     │
                              │   - alert     │
                              │   - LLM tools │
                              └───────────────┘

ADR-015 插件运行时

promtail 作为 edge agent 插件运行时下的子进程跑。agent 管它生命周期 —— 崩了重启,关闭时排空,跟 agent 一起打到同一个 systemd journal。从运维视角 就是一个 systemd 服务,不是两个。

更早的备选方案("把 promtail vendor 成静态链接 Go 库")被否,因为每次 Loki client 升级都会逼着 edge agent 重新发版。子进程化把它们解耦。

配置 ​

每个 edge 的 promtail 配置由服务端 biz/edge/plugin_config.go 渲染,插件启动时通过控制 tunnel 推下去。它读 system_settings.loki.url, 所以 admin 改 URL 不用重建 agent。

默认采集集:

来源Loki label
/var/log/syslog、/var/log/messagesjob=node-syslog、host=<edge-name>
systemd journald(所有 unit)job=systemd-journal、host=<edge-name>、unit=<svc>

通过 SPA 的 /edges/<id>/logs/sources 页加自定义采集 —— 写到同一个 system_settings.loki.* 命名空间。

数据面分离 ​

ADR-014:遥测直走,控制走 tunnel。对日志来说就是:

  • ✅ promtail HTTPS POST → loki:3100/loki/api/v1/push(直连)。
  • ✅ Loki HTTPS GET ← manager /loki/api/v1/query_range(直连)。
  • ❌ 日志不走 geminio 控制 tunnel。

为什么:tunnel 是进程内多路复用器;把日志洪峰塞进去,吃数据时会把控制 RPC (RCA tool 调用、WebSSH I/O)饿死。把数据面拆出来解决了 noisy-neighbour 问题, 让 nginx 用统一姿势管理两个一半的公网面(TLS、限流、认证)。

告警类型 ​

两种日志驱动的规则类型 —— 都属于 Phase-B,都在 evaluators_phaseB.go。

log_match ​

当 count_over_time(<stream_selector> |~ <line_filter> [window]) <op> threshold 返回至少一个 matrix 条目时触发。

json
{
  "kind": "log_match",
  "scope_type": "global",
  "conditions_json": {
    "stream_selector": "{job=\"systemd-journal\",unit=\"nginx.service\"}",
    "line_filter": "(?i)5\\d{2}",
    "window": "5m",
    "operator": ">=",
    "threshold": 50
  }
}

line_filter 可选 —— 留空就数 stream 里每行。查询由 rules.go:733 的 compileLogMatchRule 每 tick 构建。

log_volume ​

v1 里跟 log_match 同一个引擎(当前窗口计数对绝对阈值)。spec 原本的 "对前一窗口比率" 语义暂缓 —— 它需要两次 LogQL 查询 + Go 侧做除法;绝对形态 已经覆盖了 "日志冲过 N" 的常见场景。

spec 列是 ratio_op / ratio_threshold(保留以备前向兼容);编译器把它们 映射到 operator / threshold。

工具 ​

search_logs / query_logql ​

LLM 面的日志搜索。两条注册路径指向同一个执行器:

  • query_logql —— 裸 LogQL 透传。investigator worker 在 persona 明确知道要 查哪个 stream 时用。
  • search_logs —— 友好的封装,露在 chat UI 的 Quick Actions 里,吃自由 文本 query + 一个服务名。

Schema + 执行器在 query_logql_basetool.go。 底层 client:internal/pkg/logquery。

两者都遵守全局 ONGRID_LOG_QUERY_URL env(默认 http://loki:3100),并从 edge 推送用的同一个 nginx 层继承认证。

host_tail_file ​

技能侧的日志探针 —— 跑在 edge 上,不是 manager。当你需要原始文件 (比如不在 journald 里的 /var/log/ongrid-edge.log)而不是 Loki 摄入视图时 用这个。ScopeHost;需要 edge_id。派发模型见 技能。

另见 ​