在我們的上一篇文章中,我們已經成功地在本地運行了Prometheus,並收集到正在運行的NodeJS應用的metric數據。本篇我們將深入探討Opentelemetry是如何收集和處理metric數據的機制。
在我們的 NodeJS OpenTelemetry demo中,我們並沒有手動配置任何特定的 metric data,但在 Prometheus 上卻能直接篩選和查看:
而幾乎都是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依靠一個核心組件—— Meter(packages/sdk-metrics/src/Meter.ts
)來創建和管理與metrics相關的實例。每一個Meter實例可以生成不同類型的metrics來監控應用的各個方面。
OpenTelemetry 中的 Meter 可以創建以下幾種類型的 metric:
在我們的 demo 中,OpenTelemetry 是使用 Histogram 來記錄 HTTP 請求的 duration 數據。它能夠有效地收集並呈現不同時間段內的延遲分佈,這樣開發者就可以分析響應時間的趨勢和異常。
正如在 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 中的相關原始碼
metric exporter 是要導出 metric data 的關鍵組件,可以定義不同的 exporter 來格式化要導出的 metric
data、定義導出到的端口或是服務 endpoint 等等。
而 PrometheusExporter 是在 NodeJS 中通過啟動另一一個獨立的 HTTP server 來實現。該服務器將觀測到的metric數據轉換為Prometheus可解析的格式,並通過定義的URL暴露出去。其就是上一篇我們看到的 http://localhost:9464/metrics
:
透過本文,我們知道在SDK初始化時,透過 getNodeAutoInstrumentations
已經自動對 HTTP 請求進行覆蓋處理,所以當有請求進來或者服務發起求時,就可以採集並記錄 metric data ;而 prometheusExporter
則是自己運行了一個 http server,讓 Prometheus 服務可以透過定義好的 endpoint 來拉取。
接下來,我們就開始嘗試自己完成這個邏輯吧!
讚,幫忙補充兩個術語的定義meter
與instrument
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(該屬性目前該參數還屬於實驗性階段)。
感謝雷N大大的補充!!