Prometheus在云原生监控领域里已经成为业界认可的标准,对此业界普遍展开基础监控能力对接,大规模应用于生产环境的实例则是少之又少。


本文将会介绍【优维监控实践】,针对金融行业的场景需求,结合落地应用经验,构建基于Prometheus的大规模线上业务交易监控能力。


集群化方案现状



Prometheus最大的优势在于PromQL,提供灵活的数据分析查询能力,结合Grafana提供的仪表盘查询,满足大部分指标监控需求。


但在现实场景中,大型互联网公司 / 金融行业场景的大规模、高可用、高时效性、高精确度等要求,会对现有的联邦或分布式存储Prometheus解决方案带来挑战。


原生Prometheus单实例模式无法直接满足需求,需要一种面向生产环境的集群化高可用方案来进行支撑。


集群化高可用建设思路

# 联邦集群方案

联邦集群方案是基于Prometheus单体模式的一种补充,让一系列单体分别采集目标,再把数据统一汇总到中央集群服务中。


该方案中央仍然为单体模式,实际存储能力仍然会受到单机的限制。


所以在构建联邦模式时,需要根据数据量对第一层所采集到的数据进行一些聚合计算,将减少后的数据传输到中央。


这种方案只能适用于最终需要分析的数据量偏少的场景,同时本身维护成本颇高,需要对集群每一个分片采集与预计算配置进行管理,还要记录访问路由。


# 远端存储方案

远端存储提供相比单体Prometheus,突破单机资源限制,提供更大规模和更长时间的存储能力。


通过这种方式,整体集群管理会更简单,只需对设置分片采集,统一将数据导入远端存储即可,配置管理成本也会降低许多。


在大规模业务监控场景下,一种基于远端存储的方案是必须的,但仍有问题需要解决。

远端存储方案需要解决的问题

# 自身有着容量上限

针对数据存储时长、性能等要求,并不可能无限扩容。


# 数据量越大,查询分析的压力也越大

一些涉及聚合计算曲线较多的查询、预计算规则、报警规则所带来的大量查询,仍会将整个集群拖垮。


远端存储解决方案

# 减少指标量级

借鉴Prometheus联邦思路,从采集层做预聚合,从业务角度分析,针对交易量类型的指标,缩减指标量级。


# 提升架构性能

从架构实现角度,解决单纯远端存储无法处理的大规模数据分析和报警检测的需求。


# 降维指标


“降维打击”原有指标,降低指标包含的Label,对相同Label的数据进行合并,减少最终数据量级。根据业务故障报警与定位需求,对原有指标进行聚合计算。


在架构实现上,采用Prometheus对原始指标进行全量采集,保留少量存储来保存原始指标数据,同时对指标进行加工,降维缩减量级后,传输到远端存储服务中。


# 选择聚合算子

业务交易量的指标类型为Histogram,用于统计每一个模块处理交易请求的数量与响应时间,获得分位值数据。


<metricName>_count:表示增加的次数,比如交易量的次数。


<metricName>_sum:表示增加的总耗时,比如交易的总耗时。


<metricName>_bucket:表示在不同耗时分桶区间内,增加的次数,比如如在0-500ms内的交易量次数。


自动扩展的分片采集

# 分片采集服务



使用一个Prometheus集群来满足对业务所有服务Exporter的监控,应对方法是建设独立采集分片管理服务、Prom-Scheduler服务、Prom-Agent服务。


Prom-Scheduler负责基于采集任务进行任务分配,同时通过定期对采集端点进行探测,获得Exporter产出的指标量级,进行任务负载均衡。


Prom-Agent则与采集服务一同部署,负责管理分片采集配置。


整个采集服务使用Kubernetes进行部署,在资源情况允许的情况下,通过对采集指标量级的监控,实现自动采集服务扩缩容。


# 交易服务采集集群

针对包含业务指标的服务监控,按App自动分片采集,同一个App所属的实例Exporter分配在同一组Prometheus采集服务上。


同一个App的指标基于预计算规则尽量减少量级。


# 非交易服务采集集群

通过计算每个Exporter产生的指标数量,负载均衡到Prometheus集群中,实现分片采集。


其中Exporter的指标量级,通过定期对目标端点进行探测来获取指标量级的变化。



流式计算引入

# Flink引入

通过指标降维的方案实现指标减量,但减量后的指标量级,仍然超过远端存储服务承载上限。


尤其是存储服务的计算规则和报警规则,由于涉及数据量大,常处于超时状态。


因此必须引入Flink构建流式计算服务,承接原有由存储服务支持的预计算和报警阈值检测能力,降低对于存储的查询时计算压力。


基于流式计算的特征,业务所提出的计算、报警低延迟的需求也同样得到满足。


# 采集服务

使用Prometheus作为采集服务,额外增加自动分片管理能力,实现对业务模块、中间件等Exporter自动发现与数据采集。


同时会进行业务指标进行降维计算,发送到监控数据通路的数据进行。


# 转发服务

Prometheus数据发送到Adaptor服务,Adaptor服务负责将数据转发到Kafka对应的Topic中,Flink流式计算与存储服务可以从Kafka中订阅所需的数据。


# 流式计算服务

基于Flink构建的流式计算服务,负责执行用户配置的预计算规则和报警规则,将计算结果写回Kafka。


在Flink算子实现中,通过对原有Prometheus算子针对流式计算进行并行化重写,实现流式计算算力提升。


# 存储服务

远端存储服务使用优维自研数据存储方案,实现Prometheus Remote-Write接口与Kafka订阅两种模式,满足不同场景的数据接入需求。


查询层实现与Prometheus兼容的PromQL查询引擎与接口,无缝对接Grafana。


同时基于Prometheus数据模型,增加数据多层级降采样,满足长时间存储需求。


# 报警服务

原生Prometheus的AlertManager基础告警通知能力偏薄弱,报警服务采用优维自研报警事件与通告管理服务。


优维对告警通知、告警处置、告警渠道管理、AIOps故障分析定位能力进一步增强,满足用户告警处理需求。


本文初步介绍

基于Prometheus技术方案

针对大规模业务监控场景

优维监控实践建设思路

优维将会持续深入分析应用场景

从各环节的技术细节出发

继续构建高标准的监控系统

不忘初心  赋能业务

优维监控  敬请期待