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-sysloghost=<edge-name>
systemd journald(所有 unit)job=systemd-journalhost=<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:733compileLogMatchRule 每 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。派发模型见 技能

另见