由于开发者通过接口修改了菜单配置_开发者说: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版本包含:

05284539c14e128dd53fb728ad3bbccb.png

由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:
88376b2f86bebf67bae16a5491d99984.png

其中包含的 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。

工作原理

e1ee010f0170734eefeae3f77e635c97.png

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=` 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包括:

853639dda8d12791b8aa83fc56385b3c.png

提示: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/266421.shtml

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

相关文章

Java 多线程(三) 线程的生命周期及优先级

Java 多线程(三) 线程的生命周期及优先级 线程的生命周期 线程的生命周期:一个线程从创建到消亡的过程。 如下图,表示线程生命周期中的各个状态: 线程的生命周期可以分为四个状态: 1.创建状态: …

eclipse 导入maven项目_手把手的Spring Boot Web 项目教程,Hello Spring Boot

在开始之前,我们需要去创建一个SpringBoot项目,大家可以去 http://start.spring.io/ 这个网站生成一个项目。如图,这边可以对SpringBoot项目进行详细设置:下面这个web一定要勾选:SpringBoot版本号选择1.5.10全部设置好…

ASP.Net中实现中英文复合检索文本框

前段时间,写一个用户部门的管理页面,需要对后台获取的用户数据实现英汉检索功能。  同时,选定一个选项之后,需要触发事件与后台交互,将该用户所在的部门显示到页面右边的ListBox控件中。 一、Dojo的FilteringSelect组…

sklearn 安装_初识sklearn

我的主业是互联网运营,业余的python爱好者,学习python已经快两年,主攻网络爬虫与数据分析,爬虫能使用代理ip、打码平台、OCR识别、基本的js逆向处理反爬;数据分析主要使用pandas与pyecharts进行可视化,我的…

[工具库]JOJSONBuilder工具类——一键把多个bean对象数据转换为JSON格式数据

本人大四即将毕业的准程序员(JavaSE、JavaEE、android等)一枚,小项目也做过一点,于是乎一时兴起就写了一些工具。 我会在本博客中陆续发布一些平时可能会用到的工具。 代码质量可能不是很好,大家多担待! 代…

mysql long类型_怒肝两个月MySQL源码,我总结出这篇2W字的MySQL协议详解(超硬核干货)!!...

点击上方蓝色“冰河技术”,关注并选择“设为星标”持之以恒,贵在坚持,每天进步一点点!作者个人研发的在高并发场景下,提供的简单、稳定、可扩展的延迟消息队列框架,具有精准的定时任务和延迟队列处理功能。…

状压dp之二之三 炮兵阵地/玉米田 By cellur925

一、简单的状压dp 玉米田 题目描述 Farmer John has purchased a lush new rectangular pasture composed of M by N (1 ≤ M ≤ 12; 1 ≤ N ≤ 12) square parcels. He wants to grow some yummy corn for the cows on a number of squares. Regrettably, some of the squares…

LockSupport的源码实现原理以及应用

一、为什么使用LockSupport类 如果只是LockSupport在使用起来比Object的wait/notify简单, 那还真没必要专门讲解下LockSupport。最主要的是灵活性。 上边的例子代码中,主线程调用了Thread.sleep(1000)方法来等待线程A计算完成进入wait状态。如果去掉Thr…

python3 爬虫 requests安装_BOSS直聘招聘信息获取之爬虫工具分析

点击蓝色“不太灵光的程序员”关注我哟加个“星标”,每天上午 09:30,干货推送!文中使用的组件库仅限于Python语言,由于最近收到一些同学的留言说,按照网上的教程一步一步的学习,却频繁的出现报错&#xff0…

假期周进度总计(四)

本周学习利用OEM工具创建删除表以及对表内数据进行增删改查的操作 一切均通过此工具进行,然后还学到了用SQL *Plus进行相应操作 本周每天4.5个小时,出现的错误就是点击的误操作,可以改正,下周进一步学习Oracle基本操作转载于:http…

Java集合框架(3)

Map(和Collection<E>一样都是集合框架的顶层接口) |--Hashtable:底层是哈希表数据结构&#xff0c;不可以用null对象作为键或值。它是线程同步的。 |--HashMap&#xff1a;底层是哈希表。允许使用null键null值&#xff0c;该集合是不同步的&#xff0c;效率高&#xff0c…

php函数从数组中取出指定的数目,PHP数组函数

1.array_rand()从数组中随机取出一个或多个元素(返回值是&#xff1a;随机元素的键)$arr[js,css,25,php,30];printf(%s,print_r($arr,true));//随机去2个元素$resarray_rand($arr,2);printf(%s,print_r($res,true));2.array_replace()使用后面数组元素相同 key 的值替换 array1…

存储过程 not supported yet_让我们来看看+Redis如何存储和计算一亿用户的活跃度

1前段时间&#xff0c;在网上看到一道面试题&#xff1a;如何用redis存储统计1亿用户一年的登陆情况&#xff0c;并快速检索任意时间窗口内的活跃用户数量。觉得很有意思&#xff0c;就仔细想了下 。并做了一系列实验&#xff0c;自己模拟了下 。还是有点收获的&#xff0c;现整…

HBase查询优化

1.概述 HBase是一个实时的非关系型数据库&#xff0c;用来存储海量数据。但是&#xff0c;在实际使用场景中&#xff0c;在使用HBase API查询HBase中的数据时&#xff0c;有时会发现数据查询会很慢。本篇博客将从客户端优化和服务端优化两个方面来介绍&#xff0c;如何提高查询…

NEC SV8100电话交换机配置梓博电话计费系统

为了节约办公成本&#xff0c;规范电话使用。公司最近为NEC SV8100电话交换机系统上线了一套梓博的电话计费系统。先将配置过程分享给各位。 1、登录电话交换机系统&#xff08;默认用户名tech、密码12345678&#xff09; 2、点击系统数据配置按钮 2、通过10-01选项调整电话交换…

判断闰年 php,PHP怎么判断一年是否为闰年?

判断是否为闰年的条件是满足下列二者条件之一&#xff1a;年号能被4整除、但不能被100整除&#xff0c;二是年号能被4整除&#xff0c;又能被400整除。那么PHP怎么判断一年是否为闰年&#xff1f;下面本篇文章就来给大家介绍一下使用PHP判断一年是否为闰年的方法&#xff0c;希…

redis desktop manager_面试官:Redis分布式锁如何解决锁超时问题?

Java面试笔试面经、Java技术每天学习一点Java面试关注不迷路作者&#xff1a;wangzaiplus来源&#xff1a;https://www.jianshu.com/u/8cb4591440ca一、前言关于redis分布式锁, 查了很多资料, 发现很多只是实现了最基础的功能, 但是, 并没有解决当锁已超时而业务逻辑还未执行完…

python print 换行_Python学习 | Python的基础语法

Python 语言与 Perl&#xff0c;C 和 Java 等语言有许多相似之处。但是&#xff0c;也存在一些差异&#xff0c;编写Paython程序之前需要对语法有所了解&#xff0c;才能编写规范的Python程序。一、行和缩进Python最大的特点之一就是Python 的代码块不使用大括号 {}了&#xff…

python 创建文件_Python入学首次项目,新手必看,简单易操作

继昨天文章python软件pycharm安装教程之后&#xff0c;今天则给新手小白们分享一哈&#xff0c;怎么制作并创建文件。print “hello world”&#xff1b;如后期需要资料文件的则可以私信留言&#xff0c;领取首次项目资料。本节知识点&#xff1a;python项目的创建pycharm的使用…

ajax跨域实现

2019独角兽企业重金招聘Python工程师标准>>> 我们都知道ajax是不能跨域的&#xff0c;那么怎么实现ajax跨域呢&#xff1f; 看了看jquery&#xff0c;当然&#xff0c;jquery封装的很好&#xff0c;$.ajax就可以实现跨域&#xff0c;只需要在参数中配置一下即可&am…