监控的通用逻辑
定义数据源:首先,需要建立元数据基本模型,元数据是监控系统的根基。例如:定义应用、部署实例、机房信息,单元化信息等。在 SOFAStack 场景下,这部分信息需要从 PaaS 侧自动获取。
数据采集:通过安装在机器上的 Agent 采集监控数据,这部分可以是日志,也可以是通过各种方式获取到的指标。
数据清洗:将采集得到的非结构化的数据,解析为监控系统可以处理的结构化信息。这部分解析能力需要是事先通过监控系统预设好的某种规则。例如,日志解析规则、Prometheus 协议规则等。
举个例子,有业务日志样例如下,希望通过监控获取每一分钟各商品各自创建了多少笔交易这一数据。
2012-11-11 11:11:11,2950211004,衣服,交易,创建,7,Y, 2012-11-11 11:11:12,2950211005,衣服,交易,创建,8,Y, 2012-11-11 11:11:13,2950211006,食品,交易,创建,9,Y, 2012-11-11 11:11:14,2950211007,家居,交易,创建,11,Y, 2012-11-11 11:11:15,2950211008,食品,交易,创建,7,N, ……
说明日志格式为:
日志打印时间,订单id,商品,服务名,方法名,耗时,结果
。数据统计:由于监控系统面对的是海量集群,在获取结构化数据之后,需要对数据进行数据统计。统计方式可以有很多种,比如求行数、求和、求平均、最大/最小值等统计方法。
预警配置:可在统计数据上定义类型丰富的预警规则,包括绝对值、同比、环比、最近 N 分钟求和等,支持定义多项规则和逻辑运算。
实现原理
基本实现原理是在所有的应用主机上部署 Agent(代理),从而采集主机和应用的各种指标、日志和链路等数据,并将其存储在 CeresDB 中,通过在 PontusSpark 中进行分析计算,实现在不同产品场景中的可视化展现和告警通知。
实现原理示意图
采集层
DaemonSet Agent(又称 Pontus-Agent)日志采集代理
负责所有的数据的最终采集,包括原始日志拉取和指标型数据采集。
具有插件化的能力,统一本地调度能力,负责拉起插件和解析数据,解析完了之后做一次聚合计算。然后放入本地的缓存中,等待 Vessel 来拉取数据。
提供一次性的任务执行能力,主要用于性能分析。
启动时会和 Register 进行通信。通信之后会获取 Agent 运行所需要的所有配置,包含运行时采集配置,Vessel 建连的配置等。
Register 注册中心
负责与 Agent 之间保持网络心跳,收集所有 Agent 的状态,版本透视等信息。
负责 Agent 与 Vessel 的配置生成与下发,即负责管控所有的采集配置。
负责管控 Agent 与 Vessel 之间的连接与会话(session),Register 感知 Vessel 集群负载,负责通知 Agent,应该和哪个 Vessel 地址进行建连。
Vessel 流量清洗组件
抽象来看,Vessel 其实就是一个独立部署的 Agent,这个 Agent 通过 remote input 的形式,拿到了日志或者其他的原始数据。
一个 Vessel 服务可以托管 N 个 Agent,即从 N 个 Agent 中收集数据。
Vessel 可以通过一系列的解析规则,最终将非结构化的数据变成结构化的数据并返回,也就是所谓的数据清洗。
所有上层组件(包括计算层与链路层组件)都是通过 Vessel 来获取数据。
计算层
DimServer 维度数据服务(又称元数据服务)
包括维度数据的读和写的服务。在这一层上无业务语义,业务语义为上层产品层注入。
计算和采集层都会用到维度数据(元数据),通过 DimServer 提供的 Java Client 来实现数据通讯。
为适配任意维度数据结构,DimServer 实现了维度数据 Table 化,即使用若干张宽表来处理所有可能的元数据表结构,这类宽表被称为维度表。
PontusConsole 监控数据平台的管控端
主要负责内部运维性管控、系统配置,以及提供给产品使用的配置接口。
提供操作维度表、指标表的标准数据服务接口。
Scheduler 全局任务调度器
不依赖任何中间件,实现全局任务调度能力,仅用于监控系统内部,实现功能自闭环。
负责根据配置信息定时生成并分发监控的计算任务。
Scheduler 可以实现多机房部署,通过数据库维持高可用。
PontusSpark 分布式计算引擎
功能强大的 Spark 计算集群,负责接收产品层的计算配置,并对数据进行离线计算和统计。
从 Register 中获取监控数据采集的 Vessel 地址,并通过 Vessel 获取必要的监控数据。
PontusAlarm 监控告警组件(又称 RMSAlarm)
主要负责将监控计算完成的告警信息以短信、邮件、钉钉等方式向外推送。
在 SOFAStack 输出的模式下,告警渠道主要通过 Gotone 服务提供。
MonitorGateway 分布式链路追踪
主要负责分布式链路处理的相关功能。
对于链路信息的收集,提供三种方式,分别为主动日志采集、SLS 日志采集以及链路日志上报。
数据层
主要是由时序数据库 CeresDB 来承载。CeresDB 是蚂蚁自研的时序数据库,时序引擎是一种存储和管理时间序列数据的分布式数据库,为时间序列提供高性能读写、预处理计算、可视化查询等功能。
产品层
产品层(应用名为 monitorprod)承载了RMS的所有页面以及用户交互、配置逻辑,是监控对客的主要门户。
产品层负责与用户权限系统打通,读取用户身份信息。同时,产品层也负责打通 PaaS 元数据,将元数据同步至 DimServer 。
PaaS 元数据,是指通过 PaaS 系统发布的描述应用的基本信息,例如应用 IP、机房、单元化等信息。