iT邦幫忙

2024 iThome 鐵人賽

DAY 21
1
DevOps

全端監控技術筆記---從Sentry到Opentelemetry系列 第 21

Day21--Opentelemetry是如何獲取metric data的?

  • 分享至 

  • xImage
  •  

前言

在我們的上一篇文章中,我們已經成功地在本地運行了Prometheus,並收集到正在運行的NodeJS應用的metric數據。本篇我們將深入探討Opentelemetry是如何收集和處理metric數據的機制。

Prometheus上的指標

在我們的 NodeJS OpenTelemetry demo中,我們並沒有手動配置任何特定的 metric data,但在 Prometheus 上卻能直接篩選和查看:

image

而幾乎都是http請求相關的 duration 指標:

  • http_client_duration_bucket---客戶端請求的延遲範圍
  • http_client_duration_count---發起客戶端請求次數
  • http_client_duration_sum---客戶端請求的延遲時間總和
  • http_server_duration_bucket---接收的服務端請求延遲範圍
  • http_server_duration_count---接收的服務端請求次數
  • http_server_duration_sum---接收的服務端請求延遲時間總和

這是因為,在getNodeAutoInstrumentations函數,它自動讓sdk採集了http相關metric。

OpenTelemetry如何收集metric數據

OpenTelemetry依靠一個核心組件—— Meterpackages/sdk-metrics/src/Meter.ts)來創建和管理與metrics相關的實例。每一個Meter實例可以生成不同類型的metrics來監控應用的各個方面。

Meter的核心功能

OpenTelemetry 中的 Meter 可以創建以下幾種類型的 metric:

  • Counter:一種累加器,通常用於記錄事件的數量,而且只能增加數、不能減少。
  • UpDownCounter:允許計數器的值增加和減少,用於跟蹤值的波動。
  • Histogram:用於記錄數據的分佈情況,可以用在跟蹤相應事件、請求大小等。
  • Gauge:代表瞬時值,反映當前常態,如memory使用量、CPU使用率等。
  • ObservableCounter:自動觀察的計數器,用於定期採集一個可以累加的值,例如週期性監測某個事件的總數。
  • ObservableUpDownCounter:自動觀察的計數器,值可以增加和減少。用於定期採集可以增加和減少的情況,如活躍的連接數或者thread數量。
  • ObservableGauge:用於定期採集瞬時值,例如CPU負載、RAM使用等變化的狀態。

在我們的 demo 中,OpenTelemetry 是使用 Histogram 來記錄 HTTP 請求的 duration 數據。它能夠有效地收集並呈現不同時間段內的延遲分佈,這樣開發者就可以分析響應時間的趨勢和異常。

HttpInstrumentation

正如在 OpenTelemetry 的 Tracing data,HttpInstrumentation 負責覆蓋 HTTP 請求。當 HTTP 請求發生時,會自動觸發數據收集邏輯。當覆蓋 HTTP 請求後,就可以跟蹤每一個進出服務的 HTTP 請求,並記錄如延遲時間、請求大小等關鍵 metric。

HttpInstrumentation 就是在 SDK 傳入 getNodeAutoInstrumentations 後開始執行,創建 meter Histogram 的蒐集物件:

    this._httpServerDurationHistogram = this.meter.createHistogram(
      'http.server.duration',
      {
        description: 'Measures the duration of inbound HTTP requests.',
        unit: 'ms',
        valueType: ValueType.DOUBLE,
      }
    );
    this._httpClientDurationHistogram = this.meter.createHistogram(
      'http.client.duration',
      {
        description: 'Measures the duration of outbound HTTP requests.',
        unit: 'ms',
        valueType: ValueType.DOUBLE,
      }
    );

instrumentation-http 中的相關原始碼

PrometheusExporter

metric exporter 是要導出 metric data 的關鍵組件,可以定義不同的 exporter 來格式化要導出的 metric
data、定義導出到的端口或是服務 endpoint 等等。

而 PrometheusExporter 是在 NodeJS 中通過啟動另一一個獨立的 HTTP server 來實現。該服務器將觀測到的metric數據轉換為Prometheus可解析的格式,並通過定義的URL暴露出去​​。其就是上一篇我們看到的 http://localhost:9464/metrics:

image

小結

透過本文,我們知道在SDK初始化時,透過 getNodeAutoInstrumentations 已經自動對 HTTP 請求進行覆蓋處理,所以當有請求進來或者服務發起求時,就可以採集並記錄 metric data ;而 prometheusExporter 則是自己運行了一個 http server,讓 Prometheus 服務可以透過定義好的 endpoint 來拉取。

接下來,我們就開始嘗試自己完成這個邏輯吧!

ref

ChangeLog

  • 20241005--補上圖片
  • 20240927--初稿

上一篇
Day20--簡單demo看看 Opentelemetry metric + Prometheus
下一篇
Day22--手寫一個獲取 metric data 的 SDK
系列文
全端監控技術筆記---從Sentry到Opentelemetry30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

1
雷N
iT邦研究生 1 級 ‧ 2024-10-05 13:07:39

讚,幫忙補充兩個術語的定義meterinstrument

  • Meter:用於產生和管理指標。每個 Meter 都與一個特定的名稱和版本相關聯,代表特定的檢測範圍(Instrumentation scope),如應用程式的一個特定模組或套件。每個 Meter 下可以建立多個 Instrument ,透過將不同的指標需求分配給不同的 Meter ,幫助保持計量系統的組織性和模組化。換言之,Meter 是用來建立 Insturment 的工廠。

  • Instrument:負責蒐集和報告各類型的計量資料(Measurement)。它們包括不同形式,如計數器(Counter)和直方圖(Histogram),每種都專門用於特定的檢測目的。建立一個 Instrument 所需要的參數會有 name、kind(Instrument 種 類 有 Counter、Histogram 和 Up-down Counter 等 )、Unit(ms、kB 等單位)、Description 和 Advisory(該屬性目前該參數還屬於實驗性階段)。

jamieleee iT邦新手 5 級 ‧ 2024-10-05 17:56:44 檢舉

感謝雷N大大的補充!!

我要留言

立即登入留言