由2个核心API模块seata-metrics-api和seata-metrics-core,以及N个实现模块例如seata-metrics-registry-compact、seata-metrics-exporter-prometheus构成:
此模块是Metrics的核心,将作为Seata基础架构的一部分被TC、TM和RM引用,它内部没有任何具体实现代码,仅包含接口定义,定义的内容包括:
Gauge、Counter、Timer...RegistryExporter提示:Metrics本身在开源领域也已有很多实现,例如
它们有的轻而敏捷,有的重而强大,由于也是“实现”,因此不会纳入
seata-metrics-api中,避免实现绑定。
Metrics核心模块,根据配置组织(加载)1个Registry和N个Exporter;
这是我们提供的默认(内置)的Registry实现,不使用其它Metrics开源库,轻量级的实现了以下四种Meter:
| Meter类型 | 描述 |
|---|---|
| CompactGauge | 单一最新值度量器 |
| CompactCounter | 单一累加度量器,可增可减 |
| CompactSummary | 多Measurement输出计数器,将输出total(合计)、count(计数)、max(最大)、average(合计/计数)和tps(合计/时间间隔),无单位 |
| CompactTimer | 多Measurement输出计时器,将输出total(合计)、count(计数)、max(最大)和average(合计/计数),支持微秒为单位累计 |
其中包含的Registry,即CompactRegistry,它只有接受measure()方法调用的时候才计算度量值,因此计算窗口完全取决于Exporter的实现,故目前不太适合需要多Exporter的场景使用(如何扩展请参见后文)。
说明:
- 未来可能增加更丰富复杂的度量器例如Histogram,这是一种可以本地统计聚合75th, 90th, 95th, 98th, 99th,99.9th...的度量器,适合某些场合,但需要更多内存。
- 所有的计量器都将继承自Meter,所有的计量器执行measure()方法后,都将归一化的生成1或N个Measurement结果。
Prometheus发布器PrometheusExporter,将度量数据同步给Prometheus。
说明:不同的监控系统,采集度量数据的方式不尽相同,例如Zabbix支持用zabbix-agent推送,Prometheus则推荐使用prometheus-server拉取的方式;同样数据交换协议也不同,因此往往需要逐一适配。
如果需要开启TC的Metrics,需要在其配置中增加配置项:
## metrics settings metrics { enable = true 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.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包括:
| 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)的值可能相同,但它们来源于两个不同的度量器。
稍后实现,包括诸如: seata.transaction(role=tm,name={GlobalTransactionalName},meter=counter,status=active/committed/rollback) : 以GlobalTransactionalName为维度区分不同Transactional的状态。
稍后实现,包括诸如: seata.transaction(role=rm,name={BranchTransactionalName},mode=at/mt,meter=counter,status=active/committed/rollback):以BranchTransactionalName为维度以及AT/MT维度区分不同分支Transactional的状态。
如果有下面几种情况:
您需要实现新的Exporter,例如如果需要对接Zabbix,创建seata-metrics-exporter-zabbix模块,然后在ExporterType中添加新的Exporter类型,最后在metrics.exporter-list中配置。
您可以不使用内置的CompactRegistry的实现,完全扩展一个新的Registry库,例如希望使用Netflix Spectator的实现,扩展名为seata-metrics-registry-spectator的模块,然后在RegistryType中添加新的Registry类型,开发完成后,设置metrics.registry-type为对应的类型。
min或sd(方差);您可以修改对应Meter的实现,包括measure()方法返回的Measurement列表。