监控的通用逻辑

- 定义数据源:首先,需要建立元数据基本模型,元数据是监控系统的根基。例如:定义应用、部署实例、机房信息,单元化信息等。在 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、机房、单元化等信息。