開發者說:Seata 0.7.0 版本,你 get 'Metrics' 技能了嗎?
從使用者的視角來感受一個開源專案的成長,是我們推出「開發者說」專欄的初衷,即在開發者進行開源專案選型時,提供更為立體的專案資訊。專欄所有內容均來自作者原創/投稿,本文是「開發者說」的第9篇,作者鄭揚勇,雲粒智慧技術專家,開源愛好者,關注微服務、IOT領域技術,希望通過參與開源幫助別人的同時幫助自己。
Seata 0.7.0版本中將包含全新的特性 - Metrics,作為 APM(Application Performance Management & Monitoring)三大基石之一,通過它可以快速詳盡的獲取到TC、TM(規劃中)和RM(規劃中)中事務的活動狀態以及時延等重要統計資訊。
設計思路
- Seata 作為一個被整合的資料一致性框架,Metrics 模組將盡可能少的使用第三方依賴以降低發生衝突的風險;例如不使用 Spring Bean 機制,而是使用SPI(Service Provider Interface) 載入擴充套件。
- Metrics 模組將竭力爭取更高的度量效能和更低的資源開銷,儘可能降低開啟後帶來的副作用;
- 配置式,Metrics 是否啟用、資料如何釋出,取決於對應的配置;
- 開始僅在 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的初始化步驟和工作原理如下:
- Server 呼叫 MetricsManager.get().init() 啟動 Metrics 的初始化;
- MetricsManager讀取配置,通過SPI初始化對應的1個Registry和N個Exporter(分別通過RegistryFactory和ExporterFactory);
- 如果初始化成功,代表使用者啟用了 Metrics 特性,初始化 MetricsSubscriber 並註冊到 EventBus;
- DefaultCore 和 DefaultCoordinator 根據 Transaction 的狀態變化觸發對應狀態的事件,MetricsSubscriber 根據狀態,記錄對應的 Metric 至 Registry;
- 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 整合的方案。
本文作者:中介軟體小哥
本文為雲棲社群原創內容,未經