Metrics 设计
Metrics
设计思路
- Seata 作为一个被集成的数据一致性框架,Metrics 模块将尽可能少的使用第三方依赖以降低发生冲突的风险;
- Metrics 模块将竭力争取更高的度量性能和更低的资源开销,尽可能降低开启后带来的副作用;
- 配置时,Metrics 是否激活、数据如何发布,取决于对应的配置;开启配置则自动启用并将度量数据发布到Prometheus;
- 不使用 Spring,使用 SPI(Service Provider Interface)加载扩展;
- 初始仅发布核心 Transaction 相关指标,之后结合社区的需求,逐步完善运维方面的所有其他指标。
模块说明
由 2 个核心 API 模块seata-metrics-api
和seata-metrics-core
,以及 N 个实现模块例如seata-metrics-registry-compact
、seata-metrics-exporter-prometheus
构成:
- seata-metrics-api 模块
此模块是 Metrics 的核心,将作为 Seata 基础架构的一部分被 TC、TM 和 RM 引用,它内部没有任何具体实现代码,仅包含接口定义,定义的内容包括:
- Meter 类接口:
Gauge
、Counter
、Timer
... - 注册容器接口
Registry
- Measurement 发布接口
Publisher
提示:Metrics 本身在开源领域也已有很多实现,例如
它们有的轻而敏捷,有的重而强大,由于 也是“实现”,因此不会纳入
seata-metrics-api
中,避免实现绑定。
- seata-metrics-core 模块
Metrics 核心模块,根据配置组织(加载)1 个 Registry 和 N 个 Exporter;
- seata-metrics-registry-compact 模块
这是我们提供的默认(内置)的 Registry 实现,不使用其它 Metrics 开源库,轻量级的实现了以下四种 Meter:
- seata-metrics-exporter-prometheus 模块
这是我们默认提供的 Metrics 实现,不使用其它 Metrics 开源实现,并轻量级的实现了以下三个 Meter:
Meter 类型 | 描述 |
---|---|
Gauge | 单一最新值度量器 |
Counter | 单一累加度量器,可增可减 |
Summary | 多 Measurement 输出计数器,将输出total (合计)、count (计数)和tps (合计/时间间隔),无单位 |
Timer | 多 Measurement 输出计时器,将输出total (合计)、count (计数)、max (最大)和average (合计/计数),支持微秒为单位累计 |
说明:
- 未来可能增加更丰富复杂的度量器例如 Histogram,这是一种可以本地统计聚合 75th, 90th, 95th, 98th, 99th,99.9th...的度量器,适合某些场合,但需要更多内存。
- 所有的计量器都将继承自 Meter,所有的计量器执行 measure()方法后,都将归一化的生成 1 或 N 个 Measurement 结果。
它也会实现一个内存的 Registry 和 PrometheusExporter,将度量数据同步给 Prometheus。
说明:不同的监控系统,采集度量数据的方式不尽相同,例如 Zabbix 支持用 zabbix-agent 推送,Prometheus 则推荐使用 prometheus-server拉取的方式;同样数据交换协议也不同,因此往往需要逐一适配。
如何使用
新增配置
如果需要开启 TC 的 Metrics,需要在其配置中增加配置项:
比如 file.conf
## metrics settings
metrics {
enabled = true
registryType = "compact"
# multi exporters use comma divided
exporterList = "prometheus"
exporterPrometheusPort = 9898
}