基于VictoriaMetrics构建亿级APM Metric监控体系
应用层Metric可观测性弱:过去音乐内部Metric监控以机器层面的Metric监控为主,虽也提供了常用框架的监控插件,但无论是性能还是可视化效果都有一定改进空间,问题排查效率低;
Metric关联到Trace的问题:Metric是发现问题最直观的方式,比如“接口错误数10”,但还需要Trace协同工作才能定位到发生错误的根因;
性能与成本问题:旧版Metric监控数据存储成本较高;而社区版Prometheus单体应用,无法支撑音乐如此大的数量级。需要一套高可用而低成本的数据采集、数据存储方案;
数据维度大,聚合查询吃力:监控数据时常应对聚合查询,应用层数据的采集维度很大,若直接查询原始数据往往需要数秒甚至数十秒,严重影响问题排查;
可视化能力弱,缺乏灵活的数据对比:监控数据时常需要同环比、多实例比较等手段来帮助定位问题,Prometheus UI和可视化工具Grafana都没有支持这项功能。
Metric关联到Trace的问题排查:解决信息孤岛,从Metric入手可下钻到Trace、Log排查问题;
高效的Metric监控可视化与图表分析能力:我们设计了丰富、直观、多维度的Dashboard,使用户能够在第一时间观测到Metric存在的问题,还改造Grafana提供了图表分析能力,大大提升问题分析效果;
高性能、低成本的采集存储方案:我们采用VM作为Prometheus的替代存储方案,以较低的成本支撑了音乐Metric监控;
毫秒级的聚合数据查询:为了解决数据聚合、查询效率低的问题,我们实现了时序数据预聚合Recording Rules服务和查询代理Proxy服务。受益于此,常用的大维度数据聚合查询得以在毫秒级完成。
采集链路负责将Metric数据分片收集、预聚合后存储到vmstorage(VM的存储引擎)中,由以下组件组成:
Exporter:内嵌在业务服务中的Prometheus SDK,暴露数据采集端口; vmagent:负责数据采集; Nacos:注册中心,负责vmagent和Exporter之间的服务发现。监控数据采集的服务发现节点量级较大,对一致性的要求没有可用性和性能的要求高,故我们选型Nacos,并对其做了兼容Prometheus服务发现的补充; Recording Rules:自研的Flink任务,负责Metric数据的流式预聚合; vminsert:VM集群模式的组件之一,负责数据写入;
查询链路负责优化数据查询语句,查询存储引擎,由以下组件组成:
Grafana:数据可视化,我们将其二次开发支持了数据同环比、多实例比较; proxy:自研的查询代理,负责解析并优化PromQL; vmselect:VM集群模式的组件之一,负责数据查询。
查询代理Proxy
环比分析:支持用户对监控项跨时间段比较;
多实例比较:支持用户同集群内的同监控项跨实例比较,还支持按照不同的数据指标排序、查看TopK的实例等;
指标分析:帮助研发一键计算曲线的数据指标,方便数据统计方面的需求。