1. 程式人生 > >開發者說:Seata 0.7.0 版本,你 get 'Metrics' 技能了嗎?

開發者說: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 整合的方案。

 


本文作者:中介軟體小哥

原文連結

本文為雲棲社群原創內容,未經