开发者说:Seata 0.7.0 版本,你 get 'Metrics' 技能了吗?

本文涉及的产品
Serverless 应用引擎 SAE,800核*时 1600GiB*时
云原生网关 MSE Higress,422元/月
注册配置 MSE Nacos/ZooKeeper,118元/月
简介: 从用户的视角来感受一个开源项目的成长,是我们推出「开发者说」专栏的初衷,即在开发者进行开源项目选型时,提供更为立体的项目信息。专栏所有内容均来自作者原创/投稿,本文是「开发者说」的第9篇,作者郑扬勇,云粒智慧技术专家,开源爱好者,关注微服务、IOT领域技术,希望通过参与开源帮助别人的同时帮助自己。

从用户的视角来感受一个开源项目的成长,是我们推出「开发者说」专栏的初衷,即在开发者进行开源项目选型时,提供更为立体的项目信息。专栏所有内容均来自作者原创/投稿,本文是「开发者说」的第9篇,作者郑扬勇,云粒智慧技术专家,开源爱好者,关注微服务、IOT领域技术,希望通过参与开源帮助别人的同时帮助自己。

Seata 0.7.0版本中将包含全新的特性 - Metrics,作为 APM(Application Performance Management & Monitoring)三大基石之一,通过它可以快速详尽的获取到TC、TM(规划中)和RM(规划中)中事务的活动状态以及时延等重要统计信息。

设计思路

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

模块说明

Seata Metrics 的模块全部在seata-metrics下,0.7版本包含:

lALPDgQ9q2weDuPNAZDNAu8_751_400_png_620x10000q90g

由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 引用,它内部没有任何具体实现代码,仅包含接口定义,定义的内容包括:

1、Meter类接口:Gauge、Counter、Timer...

2、注册容器接口:Registry

3、Measurement 数据导出接口:Exporter

提示:Metrics 本身在开源领域也已有很多实现,例如 Netflix-Spectator、Dropwizard-Metrics、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(合计/计数),支持微秒为单位累计

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

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

  • seata-metrics-exporter-prometheus模块
    Prometheus 发布器PrometheusExporter,将度量数据同步给 Prometheus。

工作原理

lALPDgQ9q2weDuXNAmPNA2c_871_611_png_620x10000q90g

TC中Metrics的初始化步骤和工作原理如下:

  1. Server 调用 MetricsManager.get().init() 启动 Metrics 的初始化;
  2. MetricsManager读取配置,通过SPI初始化对应的1个Registry和N个Exporter(分别通过RegistryFactory和ExporterFactory);
  3. 如果初始化成功,代表用户启用了 Metrics 特性,初始化 MetricsSubscriber 并注册到 EventBus;
  4. DefaultCore 和 DefaultCoordinator 根据 Transaction 的状态变化触发对应状态的事件,MetricsSubscriber 根据状态,记录对应的 Metric 至 Registry;
  5. Exporter 定期从 Registry 中获取数据,发布到外部对接的监控系统。

可以看出,Metrics 定位为一个可选特性,如果不配置,事件订阅器 MetricsSubscriber并不会创建和注册,避免无谓的性能开销。

如何使用

如果需要开启 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包括:

Metrics 描述
seata.transaction(role=tc,meter=counter,status=active/committed/rollback) 当前活动中/已提交/已回滚的事务总数
seata.transaction(role=tc,meter=counter,status=active/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)的值可能相同,但它们来源于两个不同的度量器。

如何扩展

如果有下面几种情况:

1、您不是使用 Prometheus 作为运维监控系统,但希望能够将Seata的Metrics数据集成进 Dashboard 中;

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

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

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

3、您需要改变默认 Metric 的 Measurement 输出,例如在 Timer 中增加一个min或sd(方差);

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

未来发展

1. 为 TM 和 RM 追加 Metrics 特性:

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

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

2. 响应社区,扩展更多的 Registry 和 Exporter ,以及支持更丰富的 Meter。

结束语

文介绍的 Metrics 是一个侵入式特性,如果用户希望只使用无侵入的 Metrics,则可以使用 SkyWalking 在6.3版本中增加的与 Seata 集成的方案。

「开发者说」系列文章:

1st:《深度剖析开源分布式事务方案 Seata 的事务协调器》
2nd:《RocketMQ 消息发送的高可用设计》
3st:《消息队列 Kafka 和 RocketMQ 之我见》
4th:《如何参与定义一款 IDE 插件》
5th:《基于 Nacos 的网关灰度路由和服务权重灰度》
6th:《开发者说:Sentinel 流控功能在 SpringMVC/SpringBoot 上的实践》
7th:《深度解析 RocketMQ Topic 的创建机制》
8th:《这个注解一次搞定限流与熔断降级》

相关实践学习
容器服务Serverless版ACK Serverless 快速入门:在线魔方应用部署和监控
通过本实验,您将了解到容器服务Serverless版ACK Serverless 的基本产品能力,即可以实现快速部署一个在线魔方应用,并借助阿里云容器服务成熟的产品生态,实现在线应用的企业级监控,提升应用稳定性。
相关文章
|
5月前
|
SQL Oracle 关系型数据库
seata版本问题之码云拉取代码异常如何解决
Seata是一款开源的分布式事务解决方案,旨在提供高效且无缝的分布式事务服务;在集成和使用Seata过程中,开发者可能会遇到不同的异常问题,本合集针对Seata常见异常进行系统整理,为开发者提供详细的问题分析和解决方案,助力高效解决分布式事务中的难题。
267 5
|
5月前
|
存储 Java Nacos
Seata常见问题之springboot 2.3.7 和高版本 seata 2.0.0,1.6.1不兼容如何解决
Seata 是一个开源的分布式事务解决方案,旨在提供高效且简单的事务协调机制,以解决微服务架构下跨服务调用(分布式场景)的一致性问题。以下是Seata常见问题的一个合集
663 0
|
5月前
|
存储 Java 关系型数据库
Seata 2.x 首个版本正式发布,支持 Raft 集群模式
Seata 2.x 首个版本正式发布,支持 Raft 集群模式
|
11月前
|
存储 SQL 中间件
微服务之分布式事务服务端搭建(seata 1.0以下版本)
微服务之分布式事务服务端搭建(seata 1.0以下版本)
50 1
微服务之分布式事务服务端搭建(seata 1.0以下版本)
|
SQL 前端开发 Java
有来实验室|第一篇:Seata1.5.2版本部署和开源全栈商城订单支付业务实战(二)
有来实验室|第一篇:Seata1.5.2版本部署和开源全栈商城订单支付业务实战(二)
|
NoSQL 关系型数据库 MySQL
有来实验室|第一篇:Seata1.5.2版本部署和开源全栈商城订单支付业务实战(一)
有来实验室|第一篇:Seata1.5.2版本部署和开源全栈商城订单支付业务实战(一)
|
SQL 关系型数据库 MySQL
阿里 Seata 新版本终于解决了 TCC 模式的幂等、悬挂和空回滚问题
阿里 Seata 新版本终于解决了 TCC 模式的幂等、悬挂和空回滚问题
384 0
阿里 Seata 新版本终于解决了 TCC 模式的幂等、悬挂和空回滚问题
|
Java Spring
Seata Failed to get available servers: endpoint format should like ip:port 报错原因/解决方案汇总版(看完本文必解决问题)
Seata Failed to get available servers: endpoint format should like ip:port 报错原因/解决方案汇总版(看完本文必解决问题)
942 0
Seata Failed to get available servers: endpoint format should like ip:port 报错原因/解决方案汇总版(看完本文必解决问题)
|
存储 中间件 Shell
新野来噶--M1 芯片下Seata1.4版本安装和配置
Seata 是什么? Seata 是一款开源的分布式事务解决方案,致力于在微服务架构下提供高性能和简单易用的分布式事务服务。在 Seata 开源之前,Seata 对应的内部版本在阿里经济体内部一直扮演着分布式一致性中间件的角色,帮助经济体平稳的度过历年的双11,对各BU业务进行了有力的支撑。经过多年沉淀与积累,商业化产品先后在阿里云、金融云进行售卖。2019.1 为了打造更加完善的技术生态和普惠技术成果,Seata 正式宣布对外开源,未来 Seata 将以社区共建的形式帮助其技术更加可靠与完备。
551 0
|
Kubernetes Cloud Native Java
Seata-golang grpc 通信版本与 Transaction Mesh
随着云原生时代的到来,kubernetes 被广泛地使用,seata-golang v1 版本的设计并不完全符合云原生的理念。所以最近作者又将 Seata-golang 的 TCC 模式集成到了 Mosn 中,尝试去实现Transaction Mesh。
Seata-golang grpc 通信版本与 Transaction Mesh
下一篇
无影云桌面