开发者说:Seata 0.7.0 版本,你 get 'Metrics' 技能了吗?
從用戶的視角來感受一個開源項目的成長,是我們推出「開發(fā)者說」專欄的初衷,即在開發(fā)者進行開源項目選型時,提供更為立體的項目信息。專欄所有內(nèi)容均來自作者原創(chuàng)/投稿,本文是「開發(fā)者說」的第9篇,作者鄭揚勇,云粒智慧技術專家,開源愛好者,關注微服務、IOT領域技術,希望通過參與開源幫助別人的同時幫助自己。
Seata 0.7.0版本中將包含全新的特性 - Metrics,作為 APM(Application Performance Management & Monitoring)三大基石之一,通過它可以快速詳盡的獲取到TC、TM(規(guī)劃中)和RM(規(guī)劃中)中事務的活動狀態(tài)以及時延等重要統(tǒng)計信息。
設計思路
模塊說明
Seata Metrics 的模塊全部在seata-metrics下,0.7版本包含:
由2個核心 API 模塊 seata-metrics-api和seata-metrics-core,以及N個實現(xiàn)模塊,例如:seata-metrics-registry-compact、seata-metrics-exporter-prometheus構(gòu)成:
- seata-metrics-api 模塊
此模塊是 Metrics 的核心,將作為 Seata 基礎架構(gòu)的一部分被 TC、TM 和 RM 引用,它內(nèi)部沒有任何具體實現(xiàn)代碼,僅包含接口定義,定義的內(nèi)容包括:
1、Meter類接口:Gauge、Counter、Timer...
2、注冊容器接口:Registry
3、Measurement 數(shù)據(jù)導出接口:Exporter
提示:Metrics 本身在開源領域也已有很多實現(xiàn),例如 Netflix-Spectator、Dropwizard-Metrics、Dubbo-Metrics。它們有的輕而敏捷,有的重而強大,由于也是“實現(xiàn)”,因此不會納入seata-metrics-api中,避免實現(xiàn)綁定。
- seata-metrics-core 模塊
Metrics核心模塊,根據(jù)配置組織(加載)1個Registry和N個Exporter; - seata-metrics-registry-compact 模塊
這是我們提供的默認(內(nèi)置)的Registry實現(xiàn),不使用其它Metrics開源庫,輕量級的實現(xiàn)了以下四種Meter:
| CompactGauge | 單一最新值度量器 | |
| CompactCounter | 單一累加度量器,可增可減 | |
| CompactSummary | 多Measurement輸出計數(shù)器,將輸出total(合計)、count(計數(shù))、max(最大)、average(合計/計數(shù))和tps(合計/時間間隔),無單位 | |
| CompactTimer | 多Measurement輸出計數(shù)器,將輸出total(合計)、count(計數(shù))、max(最大)、average(合計/計數(shù)),支持微秒為單位累計 | |
其中包含的 Registry,即CompactRegistry,它只有接受 measure() 方法調(diào)用的時候才計算度量值,因此計算窗口完全取決于Exporter的實現(xiàn),故目前不太適合需要多Exporter 的場景使用(如何擴展請參見后文)。
說明:未來可能增加更豐富復雜的度量器例如Histogram,這是一種可以本地統(tǒng)計聚合75th, 90th, 95th, 98th, 99th,99.9th...的度量器,適合某些場合,但需要更多內(nèi)存。所有的計量器都將繼承自Meter,所有的計量器執(zhí)行 measure() 方法后,都將歸一化的生成1或N個 Measurement 結(jié)果。
- seata-metrics-exporter-prometheus模塊
Prometheus 發(fā)布器PrometheusExporter,將度量數(shù)據(jù)同步給 Prometheus。
工作原理
TC中Metrics的初始化步驟和工作原理如下:
可以看出,Metrics 定位為一個可選特性,如果不配置,事件訂閱器 MetricsSubscriber并不會創(chuàng)建和注冊,避免無謂的性能開銷。
如何使用
如果需要開啟 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的文本格式數(shù)據(jù)。
提示:默認使用9898端口,Prometheus 已登記的端口列表在此,如果想更換端口,可通過metrics.exporter-prometheus-port配置修改。
下載并啟動 Prometheus
下載完畢后,修改 Prometheus 的配置文件prometheus.yml,在scrape_configs中增加一項抓取 Seata 的度量數(shù)據(jù):
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']查看數(shù)據(jù)輸出
推薦結(jié)合配置 Grafana 獲得更好的查詢效果,目前Seata導出的Metrics包括:
| seata.transaction(role=tc,meter=counter,status=active/committed/rollback) | 當前活動中/已提交/已回滾的事務總數(shù) | |
| seata.transaction(role=tc,meter=counter,status=active/committed/rollback) | 當前周期內(nèi)提交/回滾的事務數(shù) | |
| seata.transaction(role=tc,meter=summary,statistic=tps,status=committed/rollback) | 當前周期內(nèi)提交/回滾的事務TPS(transaction per second) | |
| seata.transaction(role=tc,meter=timer,statistic=total,status=committed/rollback) | 當前周期內(nèi)提交/回滾的事務耗時總和 | |
| seata.transaction(role=tc,meter=timer,statistic=count,status=committed/rollback) | 當前周期內(nèi)提交/回滾的事務數(shù) | |
| seata.transaction(role=tc,meter=timer,statistic=average,status=committed/rollback) | 當前周期內(nèi)提交/回滾的事務平均耗時 | |
| seata.transaction(role=tc,meter=timer,statistic=max,status=committed/rollback) | 當前周期內(nèi)提交/回滾的事務最大耗時 | |
提示:seata.transaction(role=tc,meter=summary,statistic=count,status=committed/rollback)和seata.transaction(role=tc,meter=timer,statistic=count,status=committed/rollback)的值可能相同,但它們來源于兩個不同的度量器。
如何擴展
如果有下面幾種情況:
1、您不是使用 Prometheus 作為運維監(jiān)控系統(tǒng),但希望能夠?qū)eata的Metrics數(shù)據(jù)集成進 Dashboard 中;
您需要實現(xiàn)新的Exporter,例如如果需要對接Zabbix,創(chuàng)建seata-metrics-exporter-zabbix模塊,然后在ExporterType中添加新的Exporter類型,最后在metrics.exporter-list中配置。
2、您需要更復雜強大的度量器類型,這些度量器在其他 Metrics 實現(xiàn)庫中已有,希望集成這些第三方依賴直接使用;
您可以不使用內(nèi)置的 CompactRegistry 的實現(xiàn),完全擴展一個新的Registry庫,例如希望使用 Netflix Spectator 的實現(xiàn),擴展名為seata-metrics-registry-spectator的模塊,然后在RegistryType中添加新的Registry類型,開發(fā)完成后,設置metrics.registry-type為對應的類型。
3、您需要改變默認 Metric 的 Measurement 輸出,例如在 Timer 中增加一個min或sd(方差);
您可以修改對應 Meter 的實現(xiàn),包括measure()方法返回的 Measurement 列表。
未來發(fā)展
1. 為 TM 和 RM 追加 Metrics 特性:
TM:稍后實現(xiàn),包括諸如:
seata.transaction(role=tm,name{GlobalTransactionalName},meter=counter,status=active/committed/rollback) : 以GlobalTransactionalName為維度區(qū)分不同Transactional的狀態(tài)。
RM:稍后實現(xiàn),包括諸如:
eata.transaction(role=rm,name{BranchTransactionalName},mode=at/mt,meter=counter,status=active/committed/rollback):以BranchTransactionalName為維度以及AT/MT維度區(qū)分不同分支 Transactional 的狀態(tài)。
2. 響應社區(qū),擴展更多的 Registry 和 Exporter ,以及支持更豐富的 Meter。
結(jié)束語
文介紹的 Metrics 是一個侵入式特性,如果用戶希望只使用無侵入的 Metrics,則可以使用 SkyWalking 在6.3版本中增加的與 Seata 集成的方案。
原文鏈接
本文為云棲社區(qū)原創(chuàng)內(nèi)容,未經(jīng)允許不得轉(zhuǎn)載。
總結(jié)
以上是生活随笔為你收集整理的开发者说:Seata 0.7.0 版本,你 get 'Metrics' 技能了吗?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 全球独家 | 赋予企业级开源无限可能,阿
- 下一篇: 使用EMR Spark Relation