变电站 / 电力边缘 AI 可观测性(日志 / 指标 / 追踪)手册
调研日期:约 2026-10-25(Asia/Shanghai)
定位:边缘盒上如何采指标、打结构化日志、发出运维告警事件;与 MQTT telemetry、D60/D90、授时、证据仓、多路 RTSP、VLAN 对齐;不进保护网。
衔接:edge-ai-mqtt-hardening-offline-buffer.md、edge-ai-time-sync-ntp-ptp.md、edge-ai-evidence-store-snapshot-retention.md、edge-ai-multistream-rtsp-scheduling.md、edge-ai-d60-d90-acceptance-checklist.md、edge-ai-vlan-network-isolation.md、edge-ai-substation-gateway-bom.md、edge-ai-event-schema-acceptance.md。
公开工具可引用:Prometheus、OpenTelemetry、Grafana、VictoriaMetrics、Loki、Promtail/Alloy;站端具体型号与既有 SIEM unknown。本文不编造未公开站规。
0. 一句话结论与红线
结论:边缘 AI 可观测性以 Metrics + 结构化 JSON 日志 为主、Traces 可选;指标经本机 scrape / MQTT telemetry 上报,运维事件走 events/ops;全部落在 AI / MQ / MGMT VLAN,禁止进入保护二层或过程层。
| 红线 ID |
禁止项 |
说明 |
| O1 |
日志禁含密钥 / 完整人脸原图 |
禁止写密码、证书 PEM、预签名长 URL、完整未脱敏人脸;证据路径只记 event_id / 相对 media_refs |
| O2 |
指标不上保护通道 |
Prometheus/OTel/MQTT telemetry 不得映射到保护 GOOSE、跳闸、软压板;104 只读镜像仅允许业务告警位,不含运维高基数序列 |
| O3 |
高基数标签控制 |
禁止以 event_id、frame_id、完整 URL、bbox 坐标作 Prometheus label;cam/task/device_id 枚举有界 |
| O4 |
可观测路径不断推理 |
scrape、写日志、发 telemetry 异步有界;满则丢 telemetry / debug 日志,不得阻塞解码/NPU(对齐 MQTT R2、D60-03) |
| O5 |
日志与证据分盘 |
/var/log/edgeai 与 /var/edgeai/evidence 分挂载或分配额;日志轮转不得吃光证据 SSD |
1. 三大支柱(边缘简化)
| 支柱 |
边缘站建议 |
典型用途 |
默认 |
| Metrics |
Prometheus 文本 /metrics + MQTT telemetry 周期快照 |
FPS、延迟、队列、温度、盘水位、clock_quality |
必做 |
| Logs |
结构化 JSON → 本地文件(可选 Loki) |
启停、模型加载、流断、授时告警、审计 |
必做 |
| Traces |
OpenTelemetry 抽样 span(解码→推理→发布) |
偶发延迟尖刺排查 |
可选(A 档可省略;B/C 档抽样 ≤1%) |
原则:先能看水位与否决项,再谈分布式追踪。站内带宽与 SSD 有限时,优先 Metrics + INFO 以上结构化日志。
| 档位(对齐 BOM) |
Metrics |
JSON 日志 |
Traces |
站内 TSDB |
| A 入门 1–2 路 |
/metrics + telemetry |
本地 jsonl |
关 |
可省略,靠 MQTT+文件 |
| B 标准 4–8 路 |
同上 + node 基础 |
jsonl + 可选 Loki |
抽样可选 |
单节点 VM/Prom |
| C 汇聚 16–32 路 |
分路 label 仍须有界 |
jsonl;DEBUG 默认关 |
排障时开 |
单节点 + 更短保留或远程写地市 |
2. 核心指标清单
命名建议:edgeai_* 前缀;单位用秒/字节/比值的 Prometheus 惯例;cam/task 仅作低基数 label。
| 指标名(建议) |
类型 |
单位 / 说明 |
采集点 |
告警启发阈值 |
edgeai_decode_fps |
Gauge |
解码有效 FPS / 路 |
解码线程滑动窗 5~10 s |
低于档位基线 30% 持续 ≥2 min |
edgeai_infer_latency_seconds |
Histogram |
推理耗时(可分 decode/infer/post) |
推理出口 |
P95 超 SLA(站内自定,unknown 合同值) |
edgeai_queue_depth |
Gauge |
decode_q / infer_q / event_q / mqtt_q |
各有界队列 |
mqtt_q 或 infer_q >80% 容量 |
edgeai_drop_frames_total |
Counter |
过载丢帧累计 |
调度器 |
5 min 斜率异常升高 |
edgeai_npu_util |
Gauge |
0~1 |
厂商工具 / sysfs(型号相关,unknown) |
长期贴顶 + 延迟恶化 |
edgeai_cpu_util / edgeai_mem_used_bytes |
Gauge |
系统资源 |
/proc 或 node_exporter |
内存 >85% 或 OOM 前兆 |
edgeai_soc_temp_celsius |
Gauge |
SoC / NPU 温度 |
hwmon / 厂商 API |
超厂商结温降频点(以 BOM 板卡为准) |
edgeai_mqtt_publish_fail_total |
Counter |
发布失败 |
MQTT 客户端 |
连续失败或积压 |
edgeai_evidence_disk_used_ratio |
Gauge |
0~1 证据盘水位 |
statvfs 对证据挂载点 |
≥0.80 / 0.90 水位 |
edgeai_clock_offset_seconds |
Gauge |
相对参考源偏移 |
chrony/ptp |
与授时手册阈值对齐 |
edgeai_clock_quality |
Gauge |
枚举映射:0=unsync,1=sync,2=step_recent… |
授时守护 |
unsync / step_recent → ops 事件 |
edgeai_stream_up |
Gauge |
1/0 每路 |
RTSP watchdog |
任一路 DOWN >60 s |
edgeai_model_info |
Gauge(=1) |
label: name,ver,hash_short |
模型加载成功时 |
加载失败发 ops,不用高基数 hash 全长 |
禁止:label{event_id=…}、label{uri=…}、每帧新建时间序列。Histogram bucket 站内钉死一版,避免看板爆炸。
3. 导出路径
3.1 本机 Prometheus 文本(推荐默认)
- Agent 暴露
http://127.0.0.1:9108/metrics(端口示例;生产仅 MGMT / 本机 可达,防火墙默认 deny)。
- 可选旁路 node_exporter(系统盘、网卡、温度);AI 业务指标由 Agent 自暴露,避免与业务进程争锁。
- scrape 间隔建议 15~30 s(边缘);站内 VictoriaMetrics / Prometheus 单节点即可,保留 7~15 天(更长进地市,unknown 业主策略)。
3.2 OpenTelemetry(可选)
| 信号 |
建议 |
注意 |
| Metrics |
OTLP → 本机 collector → Prometheus remote write / VM |
与 /metrics 二选一主路径,避免双计 |
| Logs |
仍以本地 JSON 文件为主;OTel log 桥接可选 |
勿把证据 JPEG 当 log body |
| Traces |
抽样;trace_id 可写入同条结构化日志 |
默认关;排障时临时开 |
3.3 MQTT telemetry 周期字段表
Topic:edgeai/{org}/{site}/{device_id}/telemetry,QoS0,周期 2~5 s(对齐多路手册);水位紧时最先丢。
| 字段 |
类型 |
说明 |
ts / ts_utc |
string |
RFC3339 UTC |
device_id |
string |
盒 ID |
schema_ver |
string |
telemetry 子 schema |
fps_in / fps_infer |
object 或 per-cam |
入流 / 推理 FPS |
latency_ms |
object |
e2e / infer / decode(滑动窗) |
queue |
object |
decode/infer/event/mqtt 深度 |
drops |
object |
frame/telemetry 累计或增量 |
npu_util / cpu_util / mem_used_mb |
number |
资源 |
temp_c / power_w |
number |
热与功耗(有则报) |
disk_evidence_pct |
number |
证据盘使用率 % |
clock_quality |
object |
source/state/offset_ms(授时手册) |
streams |
array |
{cam, state, fps_in} 摘要 |
model |
object |
{name, ver} 当前加载 |
mqtt_q |
uint |
发布队列深度 |
勿在 telemetry 中塞 bbox、人脸图、完整证据路径清单。
3.4 站内 Grafana / VictoriaMetrics 部署注意
| 项 |
建议 |
| 网络 |
看板与 TSDB 仅 MGMT / MQ 管理侧;禁止挂 PROT;公网默认关 |
| 账号 |
本地管理员 + 只读运维;禁匿名 |
| 磁盘 |
TSDB 与证据仓、日志 三分开 或硬配额 |
| 大盘 |
一页:路状态、FPS、队列、温度、证据水位、clock_quality、近 1 h ops 事件计数 |
| Loki(可选) |
只收 JSON 日志;保留短于证据仓热盘;禁索引高基数字段为 label |
3.5 scrape 与告警路由(站内最小)
[边缘盒 Agent :9108/metrics]
| scrape 仅 MGMT 源 IP
v
[VictoriaMetrics 或 Prometheus 单节点] ----> [Grafana 大盘]
|
+--> Alertmanager(可选)--> 站内短信/工单 webhook(unknown:业主通道)
|
+ 并行:MQTT telemetry --> 地市/站控只读订阅(非保护)
| 规则名(示意) |
表达式启发 |
for |
动作 |
EdgeAIStreamDown |
edgeai_stream_up == 0 |
1m |
发/对齐 STREAM_DOWN |
EdgeAIQueueHigh |
edgeai_queue_depth{q="infer"} / capacity > 0.8 |
2m |
QUEUE_HIGH |
EdgeAIDiskWatermark |
edgeai_evidence_disk_used_ratio > 0.9 |
5m |
DISK_WATERMARK ERROR |
EdgeAIClockUnsync |
edgeai_clock_quality == 0 |
1m |
CLOCK_UNSYNC;业务 quality=suspect |
Prometheus 告警与 MQTT ops 可双轨:前者给站内值班看大盘,后者进事件总线与审计;二者 code 字段应对齐,避免两套话术。
3.6 采集侧伪代码要点(防堵推理)
# 热路径:decode -> infer -> event_q
# 旁路:metrics registry 无锁或分片;log/telemetry 写入有界 channel
on_tick_2s:
snapshot = copy_gauges() # 不持推理锁
try_send_mqtt_telemetry(snapshot) # 满则 drop;永不 join 推理线程
maybe_flush_json_log() # 异步
scrape_handler:
return registry.text() # 只读;超时快速失败
硬门禁:人为断开 Broker 与故意打满 log 盘时,推理线程不得出现同步 fsync/网络 send。
4. 结构化日志
4.1 JSON 字段约定
每行一条 JSON(newline-delimited):
{
"ts": "2026-10-25T01:05:00.123Z",
"device_id": "box-rk3588-07",
"site": "SS-220-01",
"task": "ops",
"event_id": null,
"level": "WARN",
"code": "STREAM_DOWN",
"cam": "bay3-camA",
"msg": "rtsp reconnect exhausted",
"ctx": { "fail_count": 5, "last_error": "timeout" }
}
| 字段 |
必填 |
说明 |
ts |
Y |
UTC RFC3339;与 Schema ts_utc 同风格 |
device_id |
Y |
盒唯一 ID |
task |
Y |
业务任务或 ops / ota / mqtt |
event_id |
条件 |
关联告警/证据时填(= msg_id 推荐);纯运维可为 null |
level |
Y |
DEBUG/INFO/WARN/ERROR/FATAL |
code |
建议 |
稳定事件码(见 §5) |
cam / model_ver |
可选 |
低基数上下文 |
msg / ctx |
Y / 可选 |
人类可读 + 结构化细节;禁止密钥与原图 |
4.2 轮转、保留与分盘
| 项 |
建议 |
| 路径 |
/var/log/edgeai/agent.jsonl(示例) |
| 轮转 |
logrotate:单文件 100~200 MB 或按日;保留 7~14 天 |
| 权限 |
0640,用户 edgeai,组运维只读 |
| 分盘 |
日志挂载 ≠ 证据 SSD;证据水位告警不要靠删日志续命 |
| 级别 |
生产默认 INFO;DEBUG 仅临时候命且限速 |
5. 运维告警事件码(ops)
走 MQTT:edgeai/{org}/{site}/{device_id}/events/ops,QoS1;event.code 用下表;禁止映射为保护动作。
| code |
级别建议 |
触发条件(启发) |
关联指标 / 动作 |
CLOCK_UNSYNC |
WARN/ERROR |
clock_quality.state ∈ {unsync, step_recent} 超阈 |
事件 quality=suspect;禁进金标准 |
QUEUE_HIGH |
WARN |
任队列深度 >80% 持续 N 秒 |
检查丢帧策略;勿扩无界队列 |
DISK_WATERMARK |
WARN→ERROR |
证据盘 ≥80% / ≥90% |
触发保留策略;ERROR 时拒写非必要 clip |
MODEL_LOAD_FAIL |
ERROR |
签名校验失败或加载异常 |
对齐 OTA;保持上一版本或安全空载(站策 unknown) |
STREAM_DOWN |
WARN |
某路 RTSP DOWN >60 s |
watchdog 重连;他路 FPS 保护 |
MQTT_BACKPRESSURE |
WARN |
mqtt_q 高或连续 publish 失败 |
丢 telemetry;保 events;不断推理 |
THERMAL_THROTTLE |
WARN |
温度触发降频或 FPS 雪崩 |
砍次要路;查风道 |
AGENT_RESTART |
INFO/WARN |
进程崩溃拉起 |
记 model.ver 与 uptime |
CONFIG_RELOAD_FAIL |
ERROR |
配置/阈值热加载失败 |
保持旧配置 |
EVIDENCE_WRITE_FAIL |
ERROR |
证据落盘失败 |
查只读挂载/inode;告警运维 |
业务告警码(如 PPE_NO_HELMET)仍走 events/{task},与 ops 分 topic,看板分面板。
6. 两周落地清单
| 日 |
动作 |
产出 |
| D1 |
确认日志盘 / 证据盘 / 系统盘三分或配额;VLAN 上仅开 MGMT scrape |
挂载表 |
| D2 |
Agent 暴露 /metrics 最小集:FPS、队列、温度、stream_up |
curl 本机样例 |
| D3 |
结构化 JSON 日志落地 + logrotate;扫一遍禁密钥/原图 |
样例 20 行 |
| D4 |
MQTT telemetry 2~5 s 上报;断 Broker 5 min 验证不断推理 |
D60-03 记录 |
| D5 |
实现 ops 码:STREAM_DOWN、QUEUE_HIGH、CLOCK_UNSYNC |
人工注入测试 |
| D6 |
DISK_WATERMARK + MODEL_LOAD_FAIL;证据仓水位联调 |
截图 |
| D7 |
站内 VictoriaMetrics 或 Prometheus 单节点 + Grafana 一页大盘 |
URL(仅内网) |
| D8 |
高基数审查:无 event_id label;Histogram bucket 钉版 |
checklist 签字 |
| D9 |
与授时、clock_quality 字段对齐;unsync 时日志+ops |
授时联调单 |
| D10 |
多路满载 30 min:指标与丢帧计数进报告(对齐 D90-01) |
性能附录草稿 |
| D11 |
(可选)OTel 抽样 Trace 或 Loki;默认关 |
开关文档 |
| D12–14 |
验收门禁勾选;修缺口;不把 Zoo FPS 写进合同 |
见 §7 |
7. 可勾选验收门禁
| ID |
门禁 |
证据 |
□ |
| OB-01 |
/metrics 含 FPS、队列、温度、证据水位、stream_up、model 信息 |
curl 输出 + 大盘截图 |
□ |
| OB-02 |
telemetry QoS0 周期上报;断 Broker ≥5 min 推理 FPS 跌落 ≤5% |
实验记录(对齐 D60-03) |
□ |
| OB-03 |
日志为 JSON 行;抽样无密钥、无完整人脸原图、无长预签名 URL |
审计抽样表 |
□ |
| OB-04 |
日志与证据分盘或分配额;水位告警可触发 |
df + 告警截图 |
□ |
| OB-05 |
ops 至少覆盖:CLOCK_UNSYNC、QUEUE_HIGH、DISK_WATERMARK、MODEL_LOAD_FAIL、STREAM_DOWN |
注入/实测事件 JSON |
□ |
| OB-06 |
Prometheus label 无 event_id/frame_id/URL;cam/task 枚举有界 |
指标清单评审 |
□ |
| OB-07 |
scrape/看板/TSDB 不在保护 VLAN;ACL 默认 deny |
VLAN/防火墙对照(对齐 N1) |
□ |
| OB-08 |
满载报告引用本机指标而非 Zoo FPS |
D90-01 附录 |
□ |
8. 衔接索引
| 手册 |
本手册如何对齐 |
| MQTT 加固 |
telemetry QoS0 可丢;ops/events QoS1;断线不堵推理 |
| 授时 |
clock_quality 进指标与 telemetry;CLOCK_UNSYNC → suspect |
| 证据仓 |
盘水位指标;写失败 ops;日志与证据分盘;MQTT 只引 media_refs |
| 多路 RTSP |
decode_fps/drop_frames/stream_up;过载丢帧保推理 |
| D60/D90 |
OB 门禁支撑 D60-03、D90-01;禁止跨保同 D60-09 |
| VLAN |
Metrics/Logs 出口仅 AI/MQ/MGMT;禁 PROT |
| BOM |
温度/电源传感器与网口规划影响采集可行性 |
| Schema |
device_id/ts_utc/model.ver/health 字段同源 |
9. unknown / 边界声明
- 业主现网 SIEM、syslog 服务器地址与保留年限:unknown(对接时补)。
- 具体 NPU 利用率 sysfs/API 路径随芯片而异:unknown,以板卡 BSP 为准。
- 合同级 P95 延迟与温度阈:unknown,须试点实测写入 SOW,禁止抄 Zoo。
- 电力二次安防细则、等保测评条款:不由本文替代;分区与出口须安监终审。
- OpenTelemetry / Grafana / Loki 等 SPDX 与商用插件许可以官网为准,嵌入发行前过许可台账。
文末:可观测性是「能报、能断线、能追责」的运维面——看得到 FPS 与水位,叫得应 ops 事件,且永远不进保护网。