上一次我們講了 OpenTelemetry Logs 與 OpenTelemetry Traces。今天繼續來說說 OpenTelemetry Metrics。 隨著現代應用程式的複雜性不斷增加,對於性能監控和故障排除的需求也日益迫切。在 .NET 生態系統中,OpenTelemetry Metri ...
上一次我們講了 OpenTelemetry Logs
與 OpenTelemetry Traces
。今天繼續來說說 OpenTelemetry Metrics
。
隨著現代應用程式的複雜性不斷增加,對於性能監控和故障排除的需求也日益迫切。在 .NET 生態系統中,OpenTelemetry Metrics 可用於實時監控和分析應用程式的性能指標。比如監控記憶體,CPU 使用量,鏈接數等等。
OpenTelemetry Metrics 概述
OpenTelemetry Metrics 是 OpenTelemetry 的一部分,用於記錄和導出應用程式的性能指標。它提供了一組靈活的 API 和工具,用於創建、註冊和導出度量指標,以便實時監控和分析應用程式的性能。OpenTelemetry Metrics 支持各種類型的度量指標,包括計數器(Counter)、測量值(ObservableGauge)等,以滿足不同場景下的性能監控需求。
監控 ASP.NET Core 與 Runtime 的指標
OpenTelemetry 已經為我們直接提供了一些開箱即用的包。我們使用這些包就可以非常便捷的對 ASP.NET Core 或者 Runtime 的一些指標進行監控。以下我們將演示通過簡單的幾步如何把這些指標通過 OpenTelemetry 協議發送給 Prometheus。
使用 nuget 安裝包
首先安裝相關的包
<PackageReference Include="OpenTelemetry.Exporter.OpenTelemetryProtocol" Version="1.8.1" />
<PackageReference Include="OpenTelemetry.Extensions.Hosting" Version="1.8.1" />
<PackageReference Include="OpenTelemetry.Instrumentation.AspNetCore" Version="1.8.1" />
<PackageReference Include="OpenTelemetry.Instrumentation.Runtime" Version="1.8.1" />
配置服務
跟 logs,traces 一樣,我們需要在啟動的時候添加必要的服務及配置。
builder.Services.AddControllers();
var otel = builder.Services.AddOpenTelemetry();
// Configure OpenTelemetry Resources with the application name
otel.ConfigureResource(resource => resource
.AddService(builder.Environment.ApplicationName));
otel.WithMetrics(metrics =>
{
metrics.AddAspNetCoreInstrumentation()
.AddRuntimeInstrumentation()
.AddOtlpExporter((otlpOptions, metricReaderOptions) =>
{
otlpOptions.Protocol = OtlpExportProtocol.HttpProtobuf;
otlpOptions.Endpoint = new Uri("http://localhost:9090/api/v1/otlp/v1/metrics");
metricReaderOptions.PeriodicExportingMetricReaderOptions.ExportIntervalMilliseconds = 1000;
});
});
安裝 Prometheus
從官網下載 Prometheus 的安裝包或者 k8s 運行。啟動的時候記得開啟參數:otlp-write-receiver
./prometheus --enable-feature=otlp-write-receiver
prometheus 預設的 metrics 的 api 地址為:http://localhost:9090/api/v1/otlp/v1/metrics
在 Prometheus 中查看指標
讓我們運行上面的 .NET 程式,等待一會。然後打開 http://localhost:9090/graph 進行查看。我們能看到 Prometheus 中多了很多跟 ASP.NET Core 以及 .NET runtime 相關的指標。
有 kestrel 相關的,GC 相關的, Thread pool 相關的指標等等很多很多。
下麵我們隨便選一個 kestrel 的活動鏈接數看看:
可以直觀的看到從0個連接到2個連接再到1個連接的過程。
自定義指標
以上演示瞭如何監控 ASP.NET Core 以及 .NET runtime 相關的指標。過程呢相當簡單。但是光有這些框架的指標可能還不夠,有的時候我們希望監控業務數據的指標,比如訂單數量,實時用戶線上量,等等。那麼這個時候我們需要自己去實現一個指標。
下麵我們就以訂單總數這個數據定義一個自定義的指標。當用戶每次下單成功後訂單數量就會 +1。
MyMeterService
首先定義一個 MyMeterService 的類:
public class MyMeterService
{
public static Meter MyMeter = new("MyMeter", "1.0");
public static Counter<long> MyOrderCounter = MyMeter.CreateCounter<long>("MyOrderCounter");
}
首先創建了一個名為 MyMeter 的度量器。然後創建了一個名為 MyOrderCounter 的長整型計數器(Counter
修改服務配置代碼
otel.WithMetrics(metrics =>
{
metrics.AddAspNetCoreInstrumentation()
.AddRuntimeInstrumentation()
.AddMeter("MyMeter")
.AddOtlpExporter((otlpOptions, metricReaderOptions) =>
{
otlpOptions.Protocol = OtlpExportProtocol.HttpProtobuf;
otlpOptions.Endpoint = new Uri("http://localhost:9090/api/v1/otlp/v1/metrics");
metricReaderOptions.PeriodicExportingMetricReaderOptions.ExportIntervalMilliseconds = 1000;
});
});
通過調用 AddMeter("MyMeter") 方法 OpenTelemetry 會監聽前面定義的 MyMeter 度量器。
添加 Order 控制器
[ApiController]
[Route("[controller]")]
public class OrderController : ControllerBase
{
[HttpPost]
public string Add()
{
MyMeterService.MyOrderCounter.Add(1);
return "ok";
}
}
添加一個 Order 的控制器,每次調用 Add 方法的時候就會給 MyOrderCounter 加 1 。
在 Prometheus 中查看自定義指標
跟上面一樣我運行我們的程式後等待一會,再次刷新 http://localhost:9090/graph。裡面就會多出來 MyOrderCounter 指標。
使用 POSTMAN 調用幾次 Order 介面後,點擊 Execute 查詢一下:
可以看到 MyOrderCounter 指標的折線圖。
更多的度量
上面我們使用一個 Counter 來對訂單數進行累加。其實 .NET 為我們提供了更多的度量方法。以下簡單介紹幾個常用的:
-
Counter
表示支持添加非負值的檢測。 例如,可以在每次處理請求時調用 counter.Add(1) 以跟蹤請求總數。 預設情況下,大多數指標查看器使用速率 (請求數/秒) 顯示計數器,但也可以顯示累積總計。 -
ObservableCounter
表示一個指標可觀測的檢測,當觀察檢測時報告單調遞增的值,例如,不同進程、線程、用戶模式或內核模式的 CPU 時間。 -
ObservableGauge
表示在觀察儀器時報告非累加值的可觀測儀器,例如當前室內溫度。 -
UpDownCounter
支持報告正或負指標值的工具。 UpDownCounter 可用於報告活動請求或隊列大小更改等方案。 -
ObservableUpDownCounter
一種指標可觀測的儀器,在觀察檢測時報告值增加或減少。 例如,使用此儀器可以監視進程堆大小或無鎖迴圈緩衝區中的項的近似數量。
總結
以上我們通過代碼演示瞭如何通過 OpenTelemetry 把 Metrics 的數據發送到 Prometheus 里進行查詢與展示。然後又演示了自定義相關指標來滿足業務數據指標的監控。從概念到代碼還是非常非常簡單清晰的。希望對各位正在打算建立監控體系的同學有所幫助。
關註我的公眾號一起玩轉技術
QQ群:1022985150 VX:kklldog 一起探討學習.NET技術
作者:Agile.Zhou(kklldog)
出處:http://www.cnblogs.com/kklldog/
本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。