跳到主要内容
版本:v2.1

Metrics 设计

Metrics

设计思路

  1. Seata 作为一个被集成的数据一致性框架,Metrics 模块将尽可能少的使用第三方依赖以降低发生冲突的风险;
  2. Metrics 模块将竭力争取更高的度量性能和更低的资源开销,尽可能降低开启后带来的副作用;
  3. 配置时,Metrics 是否激活、数据如何发布,取决于对应的配置;开启配置则自动启用并将度量数据发布到Prometheus
  4. 不使用 Spring,使用 SPI(Service Provider Interface)加载扩展;
  5. 初始仅发布核心 Transaction 相关指标,之后结合社区的需求,逐步完善运维方面的所有其他指标。

模块说明

由 2 个核心 API 模块seata-metrics-apiseata-metrics-core,以及 N 个实现模块例如seata-metrics-registry-compactseata-metrics-exporter-prometheus构成:

  • seata-metrics-api 模块

此模块是 Metrics 的核心,将作为 Seata 基础架构的一部分被 TC、TM 和 RM 引用,它内部没有任何具体实现代码,仅包含接口定义,定义的内容包括:

  1. Meter 类接口:GaugeCounterTimer...
  2. 注册容器接口Registry
  3. Measurement 发布接口Publisher

提示:Metrics 本身在开源领域也已有很多实现,例如

  1. Netflix-Spectator
  2. Dropwizard-Metrics
  3. Dubbo-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(合计/计数),支持微秒为单位累计

说明:

  1. 未来可能增加更丰富复杂的度量器例如 Histogram,这是一种可以本地统计聚合 75th, 90th, 95th, 98th, 99th,99.9th...的度量器,适合某些场合,但需要更多内存。
  2. 所有的计量器都将继承自 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
}

或者 1.5.0+中使用 application.yaml

seata:
metrics:
enabled: true
registryType: compact
exporterList: prometheus
exporterPrometheusPort: 9898

或者使用第三方配置中心如 nacos,apollo 等

请参考此处,将 seata metrics 配置项上传到对应配置中心,也可打开对应配置中心控制台进行手动添加。

metrics.enabled=true
metrics.registryType=compact
metrics.exporterList=prometheus
metrics.exporterPrometheusPort=9898

之后启动 TC,即可在http://tc-server-ip:9898/metrics上获取到 Metrics 的文本格式数据。

提示:默认使用9898端口,Prometheus 已登记的端口列表在此查看,如果想更换端口,可通过metrics.exporter.prometheus.port来修改配置。

下载并启动 Prometheus

下载完毕后,修改 Prometheus 的配置文件prometheus.yml,在scrape_configs中增加一项抓取 Seata 的度量数据:

scrape_configs:
# The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
- job_name: 'prometheus'

# metrics_path defaults to '/metrics'
# scheme defaults to 'http'.

static_configs:
- targets: ['localhost:9090']

- job_name: 'seata'

# metrics_path defaults to '/metrics'
# scheme defaults to 'http'.

static_configs:
- targets: ['tc-server-ip:9898']
查看数据输出

推荐结合配置Grafana获得更好的查询效果,初期 Seata 导出的 Metrics 包括:

  • TC :
Metrics描述
seata.transaction(role=tc,meter=counter,status=active/committed/rollback)当前活动中/已提交/已回滚的事务总数
seata.transaction(role=tc,meter=summary,statistic=count,status=committed/rollback)当前周期内提交/回滚的事务数
seata.transaction(role=tc,meter=summary,statistic=tps,status=committed/rollback)当前周期内提交/回滚的事务 TPS(transaction per second)
seata.transaction(role=tc,meter=timer,statistic=total,status=committed/rollback)当前周期内提交/回滚的事务耗时总和
seata.transaction(role=tc,meter=timer,statistic=count,status=committed/rollback)当前周期内提交/回滚的事务数
seata.transaction(role=tc,meter=timer,statistic=average,status=committed/rollback)当前周期内提交/回滚的事务平均耗时
seata.transaction(role=tc,meter=timer,statistic=max,status=committed/rollback)当前周期内提交/回滚的事务最大耗时

提示:seata.transaction(role=tc,meter=summary,statistic=count,status=committed/rollback)和 seata.transaction(role=tc,meter=timer,statistic=count,status=committed/rollback)的值可能相同,但它们来源于两个不同的度量器。

  • TM:

稍后实现,包括诸如: seata.transaction(role=tm,name={GlobalTransactionalName},meter=counter,status=active/committed/rollback) : 以 GlobalTransactionalName 为维度区分不同 Transactional 的状态。

  • RM:

稍后实现,包括诸如: seata.transaction(role=rm,name={BranchTransactionalName},mode=at/mt,meter=counter,status=active/committed/rollback):以 BranchTransactionalName 为维度以及 AT/MT 维度区分不同分支 Transactional 的状态。

如何扩展

如果有下面几种情况:

  1. 您不是使用 Prometheus 作为运维监控系统,但希望能够将 Seata 的 Metrics 数据集成进 Dashboard 中;
  2. 您需要更复杂强大的度量器类型,这些度量器在其他 Metrics 实现库中已有,希望集成这些第三方依赖直接使用;
  3. 您需要改变默认 Metric 的 Measurement 输出,例如在 Timer 中增加一个minsd(方差);
  4. ...

那么需要自行扩展 Metrics 的实现,请创建新的模块项目例如seata-metrics-xxxx,之后:

  • 针对 1:您需要实现新的 Exporter;
  • 针对 2:您可以改变默认 Registry 的实现,返回第三方的 Meter 计量器实现;
  • 针对 3:您可以修改对应 Meter 的实现,包括measure()方法返回的 Measurement 列表。