.NET?如何使用?OpenTelemetry?metrics?監(jiān)控應(yīng)用程序指標(biāo)
上一次我們講了 OpenTelemetry Logs 與 OpenTelemetry Traces。今天繼續(xù)來(lái)說(shuō)說(shuō) OpenTelemetry Metrics。
隨著現(xiàn)代應(yīng)用程序的復(fù)雜性不斷增加,對(duì)于性能監(jiān)控和故障排除的需求也日益迫切。在 .NET 生態(tài)系統(tǒng)中,OpenTelemetry Metrics 可用于實(shí)時(shí)監(jiān)控和分析應(yīng)用程序的性能指標(biāo)。比如監(jiān)控內(nèi)存,CPU 使用量,鏈接數(shù)等等。
OpenTelemetry Metrics 概述
OpenTelemetry Metrics 是 OpenTelemetry 的一部分,用于記錄和導(dǎo)出應(yīng)用程序的性能指標(biāo)。它提供了一組靈活的 API 和工具,用于創(chuàng)建、注冊(cè)和導(dǎo)出度量指標(biāo),以便實(shí)時(shí)監(jiān)控和分析應(yīng)用程序的性能。OpenTelemetry Metrics 支持各種類型的度量指標(biāo),包括計(jì)數(shù)器(Counter)、測(cè)量值(ObservableGauge)等,以滿足不同場(chǎng)景下的性能監(jiān)控需求。
監(jiān)控 ASP.NET Core 與 Runtime 的指標(biāo)
OpenTelemetry 已經(jīng)為我們直接提供了一些開箱即用的包。我們使用這些包就可以非常便捷的對(duì) ASP.NET Core 或者 Runtime 的一些指標(biāo)進(jìn)行監(jiān)控。以下我們將演示通過(guò)簡(jiǎn)單的幾步如何把這些指標(biāo)通過(guò) OpenTelemetry 協(xié)議發(fā)送給 Prometheus。
使用 nuget 安裝包
首先安裝相關(guān)的包
<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" />
配置服務(wù)
跟 logs,traces 一樣,我們需要在啟動(dòng)的時(shí)候添加必要的服務(wù)及配置。
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
從官網(wǎng)下載 Prometheus 的安裝包或者 k8s 運(yùn)行。啟動(dòng)的時(shí)候記得開啟參數(shù):otlp-write-receiver
./prometheus --enable-feature=otlp-write-receiver
prometheus 默認(rèn)的 metrics 的 api 地址為:http://localhost:9090/api/v1/otlp/v1/metrics
在 Prometheus 中查看指標(biāo)
讓我們運(yùn)行上面的 .NET 程序,等待一會(huì)。然后打開 http://localhost:9090/graph 進(jìn)行查看。我們能看到 Prometheus 中多了很多跟 ASP.NET Core 以及 .NET runtime 相關(guān)的指標(biāo)。

有 kestrel 相關(guān)的,GC 相關(guān)的, Thread pool 相關(guān)的指標(biāo)等等很多很多。
下面我們隨便選一個(gè) kestrel 的活動(dòng)鏈接數(shù)看看:

可以直觀的看到從0個(gè)連接到2個(gè)連接再到1個(gè)連接的過(guò)程。
自定義指標(biāo)
以上演示了如何監(jiān)控 ASP.NET Core 以及 .NET runtime 相關(guān)的指標(biāo)。過(guò)程呢相當(dāng)簡(jiǎn)單。但是光有這些框架的指標(biāo)可能還不夠,有的時(shí)候我們希望監(jiān)控業(yè)務(wù)數(shù)據(jù)的指標(biāo),比如訂單數(shù)量,實(shí)時(shí)用戶在線量,等等。那么這個(gè)時(shí)候我們需要自己去實(shí)現(xiàn)一個(gè)指標(biāo)。
下面我們就以訂單總數(shù)這個(gè)數(shù)據(jù)定義一個(gè)自定義的指標(biāo)。當(dāng)用戶每次下單成功后訂單數(shù)量就會(huì) +1。
MyMeterService
首先定義一個(gè) MyMeterService 的類:
public class MyMeterService
{
public static Meter MyMeter = new("MyMeter", "1.0");
public static Counter<long> MyOrderCounter = MyMeter.CreateCounter<long>("MyOrderCounter");
}首先創(chuàng)建了一個(gè)名為 MyMeter 的度量器。然后創(chuàng)建了一個(gè)名為 MyOrderCounter 的長(zhǎng)整型計(jì)數(shù)器(Counter),并將其綁定到 MyMeter 上,名稱為 "MyOrderCounter"。
修改服務(wù)配置代碼
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;
});
});通過(guò)調(diào)用 AddMeter("MyMeter") 方法 OpenTelemetry 會(huì)監(jiān)聽前面定義的 MyMeter 度量器。
添加 Order 控制器
[ApiController]
[Route("[controller]")]
public class OrderController : ControllerBase
{
[HttpPost]
public string Add()
{
MyMeterService.MyOrderCounter.Add(1);
return "ok";
}
}添加一個(gè) Order 的控制器,每次調(diào)用 Add 方法的時(shí)候就會(huì)給 MyOrderCounter 加 1 。
在 Prometheus 中查看自定義指標(biāo)
跟上面一樣我運(yùn)行我們的程序后等待一會(huì),再次刷新 http://localhost:9090/graph。里面就會(huì)多出來(lái) MyOrderCounter 指標(biāo)。

使用 POSTMAN 調(diào)用幾次 Order 接口后,點(diǎn)擊 Execute 查詢一下:

可以看到 MyOrderCounter 指標(biāo)的折線圖。
更多的度量
上面我們使用一個(gè) Counter 來(lái)對(duì)訂單數(shù)進(jìn)行累加。其實(shí) .NET 為我們提供了更多的度量方法。以下簡(jiǎn)單介紹幾個(gè)常用的:
Counter
表示支持添加非負(fù)值的檢測(cè)。 例如,可以在每次處理請(qǐng)求時(shí)調(diào)用 counter.Add(1) 以跟蹤請(qǐng)求總數(shù)。 默認(rèn)情況下,大多數(shù)指標(biāo)查看器使用速率 (請(qǐng)求數(shù)/秒) 顯示計(jì)數(shù)器,但也可以顯示累積總計(jì)。ObservableCounter
表示一個(gè)指標(biāo)可觀測(cè)的檢測(cè),當(dāng)觀察檢測(cè)時(shí)報(bào)告單調(diào)遞增的值,例如,不同進(jìn)程、線程、用戶模式或內(nèi)核模式的 CPU 時(shí)間。ObservableGauge
表示在觀察儀器時(shí)報(bào)告非累加值的可觀測(cè)儀器,例如當(dāng)前室內(nèi)溫度。UpDownCounter
支持報(bào)告正或負(fù)指標(biāo)值的工具。 UpDownCounter 可用于報(bào)告活動(dòng)請(qǐng)求或隊(duì)列大小更改等方案。ObservableUpDownCounter
一種指標(biāo)可觀測(cè)的儀器,在觀察檢測(cè)時(shí)報(bào)告值增加或減少。 例如,使用此儀器可以監(jiān)視進(jìn)程堆大小或無(wú)鎖循環(huán)緩沖區(qū)中的項(xiàng)的近似數(shù)量。
總結(jié)
以上我們通過(guò)代碼演示了如何通過(guò) OpenTelemetry 把 Metrics 的數(shù)據(jù)發(fā)送到 Prometheus 里進(jìn)行查詢與展示。然后又演示了自定義相關(guān)指標(biāo)來(lái)滿足業(yè)務(wù)數(shù)據(jù)指標(biāo)的監(jiān)控。從概念到代碼還是非常非常簡(jiǎn)單清晰的。希望對(duì)各位正在打算建立監(jiān)控體系的同學(xué)有所幫助。
到此這篇關(guān)于.NET 使用 OpenTelemetry metrics 監(jiān)控應(yīng)用程序指標(biāo)的文章就介紹到這了,更多相關(guān).NET 使用 OpenTelemetry metrics 監(jiān)控應(yīng)用程序指標(biāo)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
asp.net web頁(yè)面元素的多語(yǔ)言化(多國(guó)語(yǔ)化)實(shí)現(xiàn)分享
開發(fā)的一些系統(tǒng),經(jīng)常要求支持多語(yǔ)言(例如日文,英文等),接下來(lái)介紹如何實(shí)現(xiàn)asp.net開發(fā)中web頁(yè)面實(shí)現(xiàn)頁(yè)面元素的多語(yǔ)言化(多國(guó)語(yǔ)化)感興趣的朋友可以了解下,或許對(duì)你學(xué)習(xí)有所幫助2013-02-02
手把手教你在.NET中創(chuàng)建Web服務(wù)實(shí)現(xiàn)方法
這篇文章主要介紹了.NET中創(chuàng)建Web服務(wù)實(shí)現(xiàn)方法,有需要的朋友可以參考一下2013-12-12
Visual?Studio2022創(chuàng)建WebAPI項(xiàng)目步驟記錄
不管是前后端分離還是提供數(shù)據(jù)服務(wù),WebApi使用的越來(lái)越廣泛,而且.NET Core也是我們.NET開發(fā)人員未來(lái)發(fā)展的趨勢(shì),所以說(shuō)學(xué)會(huì)使用.NET Core Api是非常有必要的,這篇文章主要給大家介紹了關(guān)于Visual?Studio2022創(chuàng)建WebAPI項(xiàng)目步驟的相關(guān)資料,需要的朋友可以參考下2024-01-01
ASP.NET中Web API的簡(jiǎn)單實(shí)例
Web API框架是一個(gè)面向Http協(xié)議的通信框架,Web API 框架是一個(gè)面向Http協(xié)議的通信框架。Web API 框架目前支持兩種數(shù)據(jù)格式的序列化:Json 及 Xml。在不做任何配置的情況下,則 Web API 會(huì)自動(dòng)把數(shù)據(jù)使用xml進(jìn)行序列化,否則使用 json 序列化,需要的朋友可以參考下2015-10-10
Asp.Net 程序錯(cuò)誤Runtime Error原因與解決
提示這個(gè),不管怎么改配置文件的設(shè)置都不行,下面是修正方法,大家可以試試。2010-03-03
在.NET Web API設(shè)置響應(yīng)輸出Json數(shù)據(jù)格式常用的兩種方式詳解
在ASP.NET Core Web API中設(shè)置響應(yīng)輸出Json數(shù)據(jù)格式常用以下兩種方式:可以通過(guò)添加System.Text.Json或Newtonsoft.JsonJSON序列化和反序列化庫(kù)在應(yīng)用程序中全局設(shè)置接口響應(yīng)的Json數(shù)據(jù)格式,本文示例使用的是新的Minimal API模式,感興趣的朋友跟隨小編一起看看吧2024-07-07
使用dotnet-dump 查找 .net core 3.0 占用CPU 100%的原因解析
這篇文章主要介紹了使用dotnet-dump 查找 .net core 3.0 占用CPU 100%的原因,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-06-06
ASP.NET MVC重寫RazorViewEngine實(shí)現(xiàn)多主題切換
這篇文章主要為大家詳細(xì)介紹了ASP.NET MVC重寫RazorViewEngine實(shí)現(xiàn)多主題切換,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-06-06

