首页 / 系统架构 / 设备与用户可观测平台

目标、边界与原图

可观测平台要回答的是:哪台设备、哪个用户会话、哪一版本、在哪一段链路、从何时开始出现了什么问题。它把 App、嵌入式设备、Java/Go 服务、MQTT/网关和运维任务产生的诊断信号关联起来,支撑设备排障、用户问题回放、版本质量分析、告警联动和远程诊断。

下图是目标架构蓝图,不等同于“所有组件已经上线”。接入、消息、存储与告警产品可按区域和现有基础设施选择实现,但字段口径、脱敏边界和关联键必须保持一致。

设备与用户可观测平台系统架构图
图:设备与用户可观测平台。点击可查看原图;覆盖采集、统一接入、消息缓冲、规范化处理、多模存储、诊断后台以及安全治理。
运行面与诊断面分离:定位上报、控制指令、告警和媒体会话仍走各自的生产链路;可观测数据是旁路采集或异步投递,任何日志/指标拥塞都不能阻塞设备控制、MQTT 心跳或实时媒体。

统一信号模型

信号用于回答的问题典型来源主存储
Log 日志“发生了什么、报错上下文是什么”设备环形日志、App SDK、Java/Go 结构化日志、Nginx/EMQX、运维脚本Loki / OpenSearch
Event 事件“业务状态是否变化、谁触发了它”绑定、登录、设备上线、告警、OTA、媒体会话、远程命令ClickHouse;关键业务事实仍在 MySQL/PostgreSQL
Metric 指标“系统现在是否健康、趋势是否变差”服务、Broker、网关、ZLMediaKit、设备资源与 App 性能Prometheus / VictoriaMetrics
Trace 链路“一次请求或会话卡在哪一跳”OpenTelemetry SDK、Collector、网关、异步消费者Tempo / Jaeger

所有信号至少可由 trace_id、伪名化 device_idsession_id(如登录/媒体/配网会话)、app_versionfirmware_versionregion 关联。不要把手机号、车牌、VIN、设备密钥、访问 Token、精确家庭地址或完整请求体作为可搜索标签。

公共事件信封

字段规则原因
event_time_ms事件在源端发生的 UTC epoch milliseconds用于弱网补传、轨迹和视频时间线排序
received_at_ms平台接收时间;不可覆盖源端时间区分设备离线、网络延迟与服务处理延迟
event_name / schema_version稳定命名,演进时升版本,不改写旧含义保证查询、告警和消费方兼容
trace_id / span_idHTTP、gRPC、MQTT 关联消息和异步消费都透传跨语言定位慢点与失败点
device_id / user_id仅保存内部 ID 或不可逆伪名;按权限展示支持关联,又避免把 PII 复制进遥测库
severity / result_code使用枚举;错误码与业务码分开避免只能全文检索、不能聚合告警

采集、处理与存储链路

阶段必须做什么关键失败处理
统一接入鉴权、租户/区域路由、限流、Schema 校验、大小限制、去重、时间修正、脱敏与降级缓冲。不合规或无法解析的数据进入隔离队列;拒绝原因本身要形成聚合指标。
消息缓冲Kafka / Pulsar / Redis Stream 承接突发流量;按设备或会话键保证局部有序。积压达到阈值时采样低价值 Debug 日志,绝不丢弃安全审计和关键业务事件。
数据处理解析、二次脱敏、富化版本/区域/产品模型、采样、分流、聚合、告警判断。处理错误带原始引用、Schema 版本和失败原因进入死信队列,支持限速重放。
多模存储日志、事件、指标、Trace、冷归档和业务事件库各归其位。以存储 TTL 和可重建性决定保留;不能用日志库替代业务事实库。
时间修正规则:展示和业务判断优先使用 event_time_ms;接入层保留 received_at_ms,并标记时钟偏差与乱序。不得因为补传就把历史事件伪装成刚发生的事件。

数据去向与职责

目标保存内容不应保存
Loki / OpenSearch结构化诊断日志、脱敏后的错误上下文明文凭证、完整请求体、未脱敏 PII
ClickHouse匿名化 App 行为、版本质量、漏斗与运营分析主业务交易事实和密钥材料
Prometheus / VictoriaMetrics可聚合数值、直方图、SLO/SLA 指标高基数用户/设备 ID 标签、长文本日志
Tempo / Jaeger采样 Trace、服务调用与耗时敏感参数、未经脱敏的 SQL/HTTP Body
S3 / OSS / MinIO经授权的设备诊断包、冷归档公开桶、永久有效下载链接
MySQL / PostgreSQL告警工单、审计事实、可追责的业务事件索引高频全量日志和指标明细

关联诊断与告警

一次设备/用户问题的最短排查路径

  1. 用工单号、时间窗和伪名化设备 ID 找到业务事件;确认产品、版本、区域和用户授权状态。
  2. 沿 trace_id 查 App/API/Java/Go/消息消费者;比较源端事件时间与平台接收时间。
  3. 查看 MQTT 连接、设备心跳、网关拒绝原因和队列积压,判断是设备、网络、入口还是处理链路问题。
  4. 如涉及实时视频,按 media_session_id 关联信令、ICE、TURN、首帧、丢包和会话结束原因;媒体内容本身不进入日志。
  5. 确定影响范围后创建告警/工单;修复后以相同查询确认恢复,并把根因与版本关联回写。

建议作为首批看板的指标

核心指标关注方式
设备接入在线率、认证失败率、心跳延迟、上报拒绝率、离线原因分布按产品、固件、区域、运营商聚合;不按单设备建立指标标签。
App 质量崩溃/ANR、启动时长、网络重试、配网成功率、版本留存仅使用伪名会话 ID;合规地区以用户同意为前提。
媒体会话ICE 成功率、首帧时延、TURN 中继比例、丢包率、RTT、会话异常退出率媒体 ADD 的一期参考线为:ICE/建连成功率 ≥98%,首帧 P95 ≤1.5s,TURN 比例 ≤10%。上线前应按区域重设 SLO。
平台与成本入口 QPS、队列积压、消费延迟、存储写入错误、采样率、对象存储费用积压和拒绝率应与业务影响告警关联,避免只报机器 CPU。

安全、留存与成本治理

  • 访问控制:按角色和数据域分权;支持“谁在何时查看了哪个设备的诊断信息”的审计。解密或查看高敏信息需要单独授权。
  • 脱敏前置:在 Collector/Fluent Bit/处理器进入搜索索引前剔除 Token、DSN、密码、精确 IP 与 PII;不能只依赖查询侧遮罩。
  • 设备日志按需拉取:云端通过 MQTT 控制命令触发,设备本地压缩后使用区域对象存储的预签名 URL 直传。URL 应短效(建议不超过 10 分钟),日志包独立桶且排障后按策略自动删除(建议 7 天)。
  • 分层留存:热日志用于即时排障,温存储供短期复盘,冷归档只保留合规允许且有再利用价值的数据。原始保留期、聚合保留期、删除责任人和跨区边界必须逐项登记。
  • 成本闸门:控制高基数标签、Trace 采样率、Debug 日志开关和对象存储生命周期;告警优先指向可行动的业务症状。

落地清单与验收

  1. 发布统一事件信封、字段字典、Schema 兼容规则与 PII 分类清单。
  2. 在 Java/Go 网关、核心消费者和 App/设备 SDK 接入统一 Trace 与结构化日志;先覆盖登录、设备上线、绑定、告警、OTA、媒体会话。
  3. 部署接入鉴权、限流、Schema 校验、脱敏与死信队列;压测突发上报和错误风暴。
  4. 建立日志、事件、指标、Trace 各自的数据源与保留策略,并用合成数据验证查询/索引。
  5. 上线设备、App、媒体、消息和成本五类看板,以及告警分级、值班路由和抑制规则。
  6. 用一次故障演练验证:可在限定权限下从告警追到版本、区域、链路节点和恢复证据;同时确认日志中没有泄露密钥或 PII。
验收证据:字段契约测试、脱敏回归、跨 Java/Go/消息链路的 Trace 样例、队列故障/重放演练、看板截图与告警闭环记录。仅“日志能搜到”不足以证明可观测闭环完成。