夜莺项目开源地址:https://github.com/ccfos/nightingale 欢迎收藏,欢迎分享您的落地案例。
宏地科技在 6 天内完成 7 大业务系统的跨平台监控中台建设,用夜莺统一接入 VictoriaMetrics、独立 Prometheus 和 K8S 内部 Prometheus,并通过标签降级、标识优先级和语义化告警模板,把碎片化监控改造成可定位、可通知、可执行的监控体系。
核心要点
- 场景覆盖智慧商砼、校车平台、车联网、充电桩等 7 个独立业务系统。
- 数据源没有“大搬家”,而是通过夜莺做多源聚合和统一入口。
- 标签降级兼容解决不同 Exporter 标签命名不一致的问题。
- 标识优先级重构让告警对象从主机 IP 变成容器名、Pod 名等更明确对象。
- 语义化告警模板把机器指标翻译成运维可直接行动的告警说明。
- 结果包括故障定位时间缩短至 15 分钟内,告警误报率下降 76%。
公司介绍
宏地科技是全国领先的商用车车联网信息服务提供商,致力于打造安全、安心、智慧、智能的道路交通运输安全车联网体系,是一家以科技、数据、应用来驱动道路交通运输安全的车联网信息服务公司。
核心挑战:在“行驶的赛车”上换零件
我们面对的是一个典型的“监控烟囱”环境:
- 平台杂:涵盖智慧商砼、校车平台、车联网、充电桩等 7 个独立业务系统。
- 组件多:从传统的 Oracle/MySQL 到现代的 IoTDB、RabbitMQ、K8S。
- 源多样:数据散落在 VictoriaMetrics、独立 Prometheus 以及 K8S 内部 Prometheus 中。
- 时间紧:只有 6 天时间,必须完成从环境搭建到 7 大平台全覆盖。
架构设计:混合动力,统一入口
我们没有选择“数据大搬家”,而是采用了多源聚合策略:
- VictoriaMetrics (VM):作为主时序库,处理商砼和车联网的高频 IoT 数据,利用其 MetricsQL 的增强性能。
- K8S 内生 Prometheus:通过夜莺直接接入 K8S 内部 Service 地址,省去了跨集群抓取数据的网络开销。
- 原有 Prometheus:保留旧有运维系统的采样点,通过夜莺做逻辑平移。
- 结果:数据不动,逻辑动。夜莺作为“指挥中心”,实现了全平台指标的一键溯源。

实战避坑:那些“细节”里的填坑笔记
标签降级兼容:解决“识别不了项目”
- 痛点:不同 Exporter 的标签命名极不规范。有的叫 project,有的叫 projectA,有的啥也不带。
- 对策:在夜莺通知模板中建立“标签提取链条”。
- 逻辑:优先找 project -> 找不到找 projectA -> 再没有找 app -> 最后保底显示“通用项目”。
- 价值:确保了无论数据源多乱,发到钉钉里的告警都能一眼看出是哪个业务线在“冒烟”。


标识优先级重构:解决“故障对象指代不明”
- 痛点:监控容器 CPU 时,告警只报主机 IP(ident),运维分不清是哪个容器。
- 对策:智能标识提取顺序:容器名 (container_name) > Pod名 (pod) > 主机名 (ident) > IP。
- 效果:告警标题从 【告警】192.168.xx.xx 异常 变成了 【告警】rabbitmq 容器异常。这种“一眼定罪”的能力,直接砍掉了 5 分钟的二次排查时间。


语义化告警:让机器指标“说人话”
- 痛点:服务挂了报 0.0,运维反应慢。
- 对策:
- 状态转译:在模板里把 0 映射为红色的“离线”,1 映射为绿色的“在线”。
- 排查逻辑分流:根据指标名(如 up 指标 vs usage 指标),自动切换底部的排查建议。不再用“资源占用过高”去敷衍一个已经宕机的服务。
核心技术干货 (MetricsQL/PromQL)
针对本次重构,我们统一了核心指标的计算口径:
CPU 利用率(平滑去噪)
round((1 - avg by(instance, projectA) (rate(node_cpu_seconds_total{mode="idle"}[5m]))) * 100, 0.01)
注:使用 rate 而非 irate,配合 5m 窗口,有效过滤了商砼系统瞬间启动时的毛刺误报。
内存可用率(真实视角)
round((1 - node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes) * 100, 0.01)
注:强制使用 MemAvailable,排除 Linux 缓存干扰,降低 30% 以上的虚假内存告警。
这两条规则背后的共同原则是:告警表达式不只要能算出结果,还要降低误报。CPU 使用 rate 配合 5m 窗口做平滑,内存使用 MemAvailable 而不是简单空闲内存,都是为了让告警更接近真实业务风险。
落地执行表
| 阶段 | 任务重点 | 核心产出 |
|---|---|---|
| D1: 筑基 | 拉起 n9e/VM 核心,接入商砼 DB/MQ | 商砼生产链路监控闭环 |
| D2: 标准化 | 全量部署 Categraf,下发主机模板 | 7 大平台主机资源画像 |
| D3: 安全攻坚 | 校车/车联网视频流与 MQTT 指标接入 | 高并发接入层稳定性监控 |
| D4: 垂直调优 | Oracle 存活、IoTDB 写入、充电桩支付链路 | 数据库与交易链路深度监控 |
| D5: 闭环告警 | 调试全兼容通知模板,配置 P0/P1 分级推送 | 告警“语义化”通知上线 |
| D6: 驾驶舱 | 7 大项目健康度总览大屏,全链路拨测验证 | 运维驾驶舱交付 |
写在最后:监控的本质是“救火指南”
通过这段时间的重构,我们把监控从“一堆乱七八糟的数字”变成了“一封封清晰的救火说明书”。
后续红线:
- 新增监控必带标签:任何新项目接入,必须在采集侧带上 env 和 projectA 标签。
- 持续时长必填:所有告警必须设置 >60s 的持续时长,宁可慢报 1 分钟,不可误报 100 次。
- 模板动态更新:随着后续农机、充电桩平台深入,持续完善 TagsMap 的提取逻辑。
FAQ
Q1: 宏地科技为什么选择多源聚合,而不是统一迁移数据? A: 因为原有数据已经分布在 VictoriaMetrics、独立 Prometheus 和 K8S 内部 Prometheus 中。直接迁移会增加时间成本和风险,用夜莺做统一入口可以更快完成 7 大平台覆盖。
Q2: 标签降级兼容解决什么问题?
A: 它解决不同 Exporter 标签命名不统一的问题。模板按 project -> projectA -> app -> 通用项目 的顺序提取业务标识,保证告警能指向业务线。
Q3: 语义化告警的价值是什么? A: 它把机器指标转换成运维能直接理解和行动的描述。例如把 0/1 状态转译成“离线/在线”,并根据指标类型切换排查建议,减少二次解释成本。
小结
宏地科技的实践重点不是重新建设一套孤立监控,而是在不搬迁原始数据的前提下,用夜莺统一查询、规则、通知和驾驶舱入口。真正提升效率的细节,来自标签治理、对象识别和告警模板语义化,这些工作让告警从“指标异常”变成了“应该怎么处理”的提示。
夜莺项目开源地址:https://github.com/ccfos/nightingale 欢迎收藏。