當前位置: 妍妍網 > 碼農

.NET 透過 OpenTelemetry Metrics 對套用指標進行監控

2024-05-27碼農

上一次我們講了 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 ),並將其繫結到 MyMeter 上,名稱為 "MyOrderCounter"。

修改服務配置程式碼

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 查詢一下:

alt text

可以看到 MyOrderCounter 指標的折線圖。

更多的度量

上面我們使用一個 Counter 來對訂單數進行累加。其實 .NET 為我們提供了更多的度量方法。以下簡單介紹幾個常用的:

  • Counter
    表示支持添加非負值的檢測。例如,可以在每次處理請求時呼叫 counter.Add(1) 以跟蹤請求總數。預設情況下,大多數指標檢視器使用速率 (請求數/秒) 顯示計數器,但也可以顯示累積總計。

  • ObservableCounter
    表示一個指標可觀測的檢測,當觀察檢測時報告單調遞增的值,例如,不同行程、執行緒、使用者模式或內核模式的 CPU 時間。

  • ObservableGauge
    表示在觀察儀器時報告非累加值的可觀測儀器,例如當前室內溫度。

  • UpDownCounter
    支持報告正或負指標值的工具。UpDownCounter 可用於報告活動請求或佇列大小更改等方案。

  • ObservableUpDownCounter
    一種指標可觀測的儀器,在觀察檢測時報告值增加或減少。例如,使用此儀器可以監視行程堆大小或無鎖迴圈緩沖區中的項的近似數量。

  • 總結

    以上我們透過程式碼演示了如何透過 OpenTelemetry 把 Metrics 的數據發送到 Prometheus 裏進行查詢與展示。然後又演示了自訂相關指標來滿足業務數據指標的監控。從概念到程式碼還是非常非常簡單清晰的。希望對各位正在打算建立監控體系的同學有所幫助。

    相關內容: