Files
wangchunxiang c2453d6434 chore(project): 添加项目配置文件和忽略规则
- 添加 Babel 配置文件支持 ES6+ 语法转换
- 添加 ESLint 忽略规则和配置文件
- 添加 Git 忽略规则文件
- 添加 Travis CI 配置文件
- 添加 1.4.2 版本变更日志文件
- 添加 Helm 图表辅助模板文件
- 添加 Helm 忽略规则文件
2026-03-27 17:36:48 +08:00
..

Metrics

设计思路

  1. Seata作为一个被集成的数据一致性框架Metrics模块将尽可能少的使用第三方依赖以降低发生冲突的风险
  2. Metrics模块将竭力争取更高的度量性能和更低的资源开销尽可能降低开启后带来的副作用
  3. 配置式Metrics是否激活、数据如何发布取决于对应的配置
  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数据导出接口Exporter

提示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

Meter类型 描述
CompactGauge 单一最新值度量器
CompactCounter 单一累加度量器,可增可减
CompactSummary 多Measurement输出计数器将输出total(合计)、count(计数)、max(最大)、average(合计/计数)和tps(合计/时间间隔),无单位
CompactTimer 多Measurement输出计时器将输出total(合计)、count(计数)、max(最大)和average(合计/计数),支持微秒为单位累计

其中包含的RegistryCompactRegistry它只有接受measure()方法调用的时候才计算度量值因此计算窗口完全取决于Exporter的实现故目前不太适合需要多Exporter的场景使用如何扩展请参见后文

说明:

  1. 未来可能增加更丰富复杂的度量器例如Histogram这是一种可以本地统计聚合75th, 90th, 95th, 98th, 99th,99.9th...的度量器,适合某些场合,但需要更多内存。
  2. 所有的计量器都将继承自Meter所有的计量器执行measure()方法后都将归一化的生成1或N个Measurement结果。
  • seata-metrics-exporter-prometheus模块

Prometheus发布器PrometheusExporter将度量数据同步给Prometheus。

说明不同的监控系统采集度量数据的方式不尽相同例如Zabbix支持用zabbix-agent推送Prometheus则推荐使用prometheus-server拉取的方式;同样数据交换协议也不同,因此往往需要逐一适配。

如何使用

如果需要开启TC的Metrics需要在其配置中增加配置项

## metrics settings
metrics {
  registry-type = "compact"
  # multi exporters use comma divided
  exporter-list = "prometheus"
  exporter-prometheus-port = 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中

您需要实现新的Exporter例如如果需要对接Zabbix创建seata-metrics-exporter-zabbix模块然后在ExporterType中添加新的Exporter类型最后在metrics.exporter-list中配置。

  1. 您需要更复杂强大的度量器类型这些度量器在其他Metrics实现库中已有希望集成这些第三方依赖直接使用

您可以不使用内置的CompactRegistry的实现完全扩展一个新的Registry库例如希望使用Netflix Spectator的实现扩展名为seata-metrics-registry-spectator的模块然后在RegistryType中添加新的Registry类型开发完成后设置metrics.registry-type为对应的类型。

  1. 您需要改变默认Metric的Measurement输出例如在Timer中增加一个minsd(方差)

您可以修改对应Meter的实现包括measure()方法返回的Measurement列表。