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

从用户的视角来感受一个开源项目的成长,是我们推出「开发者说」专栏的初衷,即在开发者进行开源项目选型时,提供更为立体的项目信息。专栏所有内容均来自作者原创/投稿,本文是「开发者说」的第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版本包含:

由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。

工作原理

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 集成的方案。


原文链接
本文为云栖社区原创内容,未经允许不得转载。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/518325.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

面试时遇到「看门狗」脖子上挂着「时间轮」,我就问你怕不怕?

来源 | Why技术封图 | CSDN 下载于视觉中国之前写了一篇文章&#xff0c;有一个小节中写到这样一段话&#xff1a;于是就有读者来问了&#xff1a;老哥&#xff0c;看门狗介绍一下呗。面试的时候被问到了&#xff0c;没有回答上来。听到这个问题我脑海里首先浮现出了几个问题&…

海量结构化数据存储技术揭秘:Tablestore存储和索引引擎详解

前言 表格存储Tablestore是阿里云自研的面向海量结构化数据存储的Serverless NoSQL多模型数据库。Tablestore在阿里云官网上有各种文档介绍&#xff0c;也发布了很多场景案例文章&#xff0c;这些文章收录在这个合集中《表格存储Tablestore权威指南》。值得一提的是&#xff0…

JavaScript-数组

数组 Array可以包含任意的数据类型 var arr [1,2,3,4,5,6] arr[0] // 取值 arr[0] 3 // 赋值长度 arr.length arr.length 10 // 长度是可变的注意&#xff1a;假如给arr.length 赋值&#xff0c;数组大小就会发生变化。如果赋值过小&#xff0c;元素就会丢失 获取指定字…

Alibaba Sentinel规则持久化-推模式-手把手教程【基于Nacos】

前面&#xff0c;已经为Sentinel实现了 基于拉模式的规则持久化 &#xff0c;本文来实现基于 推模式的规则持久化。 文章目录一、推模式架构图二、原理简述三、微服务改造3.1. 加依赖3.2. 添加配置四、Sentinel控制台改造五、编译 & 启动六、测试测试1&#xff1a;测试2&am…

现代IM系统中的消息系统架构 - 实现篇

序 消息类场景是表格存储&#xff08;Tablestore&#xff09;主推的方向之一&#xff0c;因其数据存储结构在消息类数据存储上具有天然优势。为了方便用户基于Tablestore为消息类场景建模&#xff0c;Tablestore封装Timeline模型&#xff0c;旨在让用户更快捷的实现消息类场景…

linux 环境 RocketMQ 4.8.0 安装、部署控制台

windows下RocketMQ下载、安装、部署、控制台 https://gblfy.blog.csdn.net/article/details/115734482 文章目录一、软件下载二、启动2.1. Linux/Unix/MacOS安装教程2.2. 验证RocketMQ功能正常&#xff08;可选&#xff09;2.3. 服务停止三、安装可视化插件3.1. github下载3.2.…

数据洪流时代,开发者这样硬核突围!

随着社会信息化的脚步加快&#xff0c;我们每个人无时无刻都在产生数据&#xff1a;刷抖音、聊微信、视频会议、点外卖……拇指轻轻一点击的背后&#xff0c;将引发意想不到的数据洪流&#xff1a;据 IDC 发布《数据时代 2025》的报告显示&#xff0c;全球每年产生的数据将从 2…

机器学习在交通标志检测与精细分类中的应用

导读 数据对于地图来说十分重要&#xff0c;没有数据&#xff0c;就没有地图服务。用户在使用地图服务时&#xff0c;不太会想到数据就像冰山一样&#xff0c;用户可见只是最直接、最显性的产品功能部分&#xff0c;而支撑显性部分所需要的根基&#xff0c;往往更庞大。 地图…

Kubenetes 监控一站式解决方案:阿里云 Prometheus 免费公测

Prometheus是目前企业级云原生应用的首选开源监控工具。作为云原生计算基金会&#xff08;CNCF&#xff09;第二个毕业的项目&#xff08;第一个是Kubernetes&#xff09;&#xff0c;Prometheus对K8s容器环境有很好的原生支持。近日刚刚发布免费公测的阿里云Prometheus&#x…

SpringBoot2.x Nacos RocketMQ 事务消息

需求背景&#xff1a; 现在有内容中心&#xff08;content-center&#xff09;和 用户中心&#xff08;user-center&#xff09;2个微服务&#xff0c;请求内容中心&#xff0c;发送消息给用户中心&#xff0c;完成为指定用户添加积分操作。 文章目录一、准备工作1. 版本对照2.…

阿里云宣布3年再投2000亿

4月20日&#xff0c;阿里云宣布&#xff1a;未来3年再投2000亿&#xff0c;用于云操作系统、服务器、芯片、网络等重大核心技术研发攻坚和面向未来的数据中心建设。 近期&#xff0c;谷歌、美团等相继关闭或收缩云计算业务。在当前经济形势下&#xff0c;阿里云是否会缩减投入&…

JavaScript-Map和Set

ES6新特性 Map var map new Map([[wang, 23],[ht, 22],[test,[1,2,3,yy]],[3,test num]]) // 通过 key获取 value var test1 map.get(test); var num map.get(3); console.log(test1) console.log(num) // 添加新的 键值对 map.set(admin, 123456) console.log(map) // 修…

MaxCompute技术人背后的故事:从ApacheORC到AliORC

2019大数据技术公开课第一季《技术人生专访》来袭&#xff0c;本季将带领开发者们探讨大数据技术&#xff0c;分享不同国家的工作体验。本文整理自阿里巴巴计算平台事业部高级技术专家吴刚的专访&#xff0c;将为大家介绍Apache ORC开源项目、主流的开源列存格式ORC和Parquet的…

JavaScript-Iterable迭代

Iterable ES6新特性 遍历数组 // for of 打印值 &#xff0c; for in 打印下标 var arr [4,5,6] for (const number of arr) {console.log(number) }遍历Map var map new Map([[whl,100],[ht,110],[other,0]]) for (let x of map) {console.log(x)console.log(x[0])consol…

阿里小程序亮相2019上海云峰会:大生态促成许多“小而美”

7月25日下午&#xff0c;在上海世博中心的阿里云峰会上海站上&#xff0c;阿里巴巴小程序繁星计划以展区加开放式论坛形式&#xff0c;与各领域开发者、企业和生态合作伙伴充分交流了小程序一云多端的规划和进展&#xff0c;以及阿里系各端APP向小程序开放的资源和能力。 与会者…

快速验证业务决策,“玩转”用户增长

背景 闲鱼目前已经是国内最大的闲置物品交易平台&#xff0c;每天都有数以千万计的用户过来闲鱼&#xff0c;以C2C交易为主。在闲鱼里面&#xff0c;用户的C2C购物频率其实是很低的&#xff0c;而纯粹地逛商品feed流是一件挺无聊的事情。在业务上做加法&#xff0c;突破闲鱼用…

JavaScript-函数

函数 定义函数 定义方式一 绝对值函数 function abs(x) {if (x>0){return x;}else{return -x;} }一旦执行到return 代表函数结束&#xff0c;返回结果&#xff01; 如果没有执行return&#xff0c;函数执行完也会返回结果&#xff0c;结果就是NaN / undefined 定义方式二…

领航智变时代 2020 NAVIGATE领航者峰会云上起航

4月20日&#xff0c;由紫光集团和旗下新华三集团主办的2020 NAVIGATE领航者峰会首次全面移师线上&#xff0c;盛大启航。本次线上峰会从4月20日到25日持续6天&#xff0c;以“智变”为主题&#xff0c;通过33个专题&#xff0c;超过120场演讲&#xff0c;聚焦探索智能时代的智与…

在阿里,我如何做好技术项目管理?

阿里妹导读&#xff1a;在技术公司、尤其是互联网公司&#xff0c;技术人员作为PM(项目经理)是非常常见的。有些同学得心应手&#xff0c;有条不紊&#xff0c;能得到清晰稳定的预期结果&#xff1b;有些同学则在过程中遇到各种闹心的事&#xff0c;最后不是项目上不了线&#…

云原生化的迁云实战

云原生的时代已经到来&#xff0c;云原生技术正在重塑整个软件生命周期&#xff0c;阿里巴巴是国内最早布局云原生技术的公司之一。 容器服务团队在过去的几年时间内帮助很多用户成功把业务云原生化并迁移上云&#xff0c;其中有现在已经是我们TOP10的大客户&#xff0c;也有需…