.NET 使用 OpenTelemetry metrics 監控應用程式指標

来源:https://www.cnblogs.com/kklldog/p/18241085/opentelemetry-metrics
-Advertisement-
Play Games

上一次我們講了 OpenTelemetry Logs 與 OpenTelemetry Traces。今天繼續來說說 OpenTelemetry Metrics。 隨著現代應用程式的複雜性不斷增加,對於性能監控和故障排除的需求也日益迫切。在 .NET 生態系統中,OpenTelemetry Metri ...


上一次我們講了 OpenTelemetry LogsOpenTelemetry 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 相關的指標。
alt text
有 kestrel 相關的,GC 相關的, Thread pool 相關的指標等等很多很多。
下麵我們隨便選一個 kestrel 的活動鏈接數看看:
alt text
可以直觀的看到從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 指標。
alt text

使用 POSTMAN 調用幾次 Order 介面後,點擊 Execute 查詢一下:

alt text

可以看到 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/
本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 前言 大家好,我是老馬。很高興遇到你。 我們為 java 開發者實現了 java 版本的 nginx https://github.com/houbb/nginx4j 如果你想知道 servlet 如何處理的,可以參考我的另一個項目: 手寫從零實現簡易版 tomcat minicat 手寫 ngin ...
  • 在 ArcGIS 中,環境設置可用於確保在控制環境下執行地理處理,您可以在控制環境中決定將處理限制到特定地理區域的處理範圍、所有輸出地理數據集的坐標系或輸出柵格數據集的像元大小等。本文將以核密度分析為例,介紹通過 Python 進行 ArcGIS Pro 環境設置的方法。 ...
  • 本教程適用於idea所有版本,並支持目前最新的2023.2.1版本。直接激活到2099年,支持windows、mac、linux。本文先講windows,mac和linux的跟win的激活方式大差不差。如果已經有了idea,想激活到2099的直接看步驟5 1.先去idea官網下載 2.安裝完後,選擇 ...
  • 1、編程實現百分制轉換成五級制,規則如下: 90~100分,返回優秀; 80~89分,返回良好; 70~79分,返回中等; 60~69分,返回及格; 60分以下,返回不及格。 package main.scala.classStudy object grade { def main(args: Ar ...
  • 兩次pta題目總結 寫在前面 這兩次pta是新題目,上次那個答題判題的沒有繼續迭代了,根據這兩次題目我也學到了一些東西,主要是面向對象設計模式的運用,介面的使用,以及遞歸演算法的使用等等 第一題題目內容: 智能家居是在當下家庭中越來越流行的一種配置方案,它通過物聯網技術將家中的各種設備(如音視頻設備、 ...
  • ​XviD是個開源的視頻編解碼器,它與DivX一同被納入MPEG-4規範第二部分的視頻標準,但DivX並未開源。早期的MP4視頻大多採用XviD或者DivX編碼,當時的視頻格式被稱作MPEG-4。現在常見的H.264後來才增補到MPEG-4規範的第十部分,當然如今使用XviD壓縮的視頻已經不多了。 ...
  • Intellij插件之調試停止生命周期 目錄Intellij插件之調試停止生命周期調試會話的創建調試停止調試會話各個監聽器停止順序 調試會話的創建 調試會話的創建由 XDebuggerManager.startSessionAndShowTab 介面創建,返回一個類型為 XDebugSession ...
  • 前言:訪問webservice,大多數人都是用服務引用的方式,但是這種方式比較麻煩,例如遇到服務更新了,你還需要手動更新你的服務引用,再重新發佈,很麻煩。或者已有的一些例子,至少我看到的很多案例,動態訪問也只能止步於使用.net framework環境,沒看到有啥.net core上面動態訪問的案例 ...
一周排行
    -Advertisement-
    Play Games
  • 一個自定義WPF窗體的解決方案,借鑒了呂毅老師的WPF製作高性能的透明背景的異形視窗一文,併在此基礎上增加了滑鼠穿透的功能。可以使得透明窗體的滑鼠事件穿透到下層,在下層窗體中響應。 ...
  • 在C#中使用RabbitMQ做個簡單的發送郵件小項目 前言 好久沒有做項目了,這次做一個發送郵件的小項目。發郵件是一個比較耗時的操作,之前在我的個人博客裡面回覆評論和友鏈申請是會通過發送郵件來通知對方的,不過當時只是簡單的進行了非同步操作。 那麼這次來使用RabbitMQ去統一發送郵件,我的想法是通過 ...
  • 當你使用Edge等瀏覽器或系統軟體播放媒體時,Windows控制中心就會出現相應的媒體信息以及控制播放的功能,如圖。 SMTC (SystemMediaTransportControls) 是一個Windows App SDK (舊為UWP) 中提供的一個API,用於與系統媒體交互。接入SMTC的好 ...
  • 最近在微軟商店,官方上架了新款Win11風格的WPF版UI框架【WPF Gallery Preview 1.0.0.0】,這款應用引入了前沿的Fluent Design UI設計,為用戶帶來全新的視覺體驗。 ...
  • 1.簡單使用實例 1.1 添加log4net.dll的引用。 在NuGet程式包中搜索log4net並添加,此次我所用版本為2.0.17。如下圖: 1.2 添加配置文件 右鍵項目,添加新建項,搜索選擇應用程式配置文件,命名為log4net.config,步驟如下圖: 1.2.1 log4net.co ...
  • 之前也分享過 Swashbuckle.AspNetCore 的使用,不過版本比較老了,本次演示用的示例版本為 .net core 8.0,從安裝使用開始,到根據命名空間分組顯示,十分的有用 ...
  • 在 Visual Studio 中,至少可以創建三種不同類型的類庫: 類庫(.NET Framework) 類庫(.NET 標準) 類庫 (.NET Core) 雖然第一種是我們多年來一直在使用的,但一直感到困惑的一個主要問題是何時使用 .NET Standard 和 .NET Core 類庫類型。 ...
  • WPF的按鈕提供了Template模板,可以通過修改Template模板中的內容對按鈕的樣式進行自定義。結合資源字典,可以將自定義資源在xaml視窗、自定義控制項或者整個App當中調用 ...
  • 實現了一個支持長短按得按鈕組件,單擊可以觸發Click事件,長按可以觸發LongPressed事件,長按鬆開時觸發LongClick事件。還可以和自定義外觀相結合,實現自定義的按鈕外形。 ...
  • 一、WTM是什麼 WalkingTec.Mvvm框架(簡稱WTM)最早開發與2013年,基於Asp.net MVC3 和 最早的Entity Framework, 當初主要是為瞭解決公司內部開發效率低,代碼風格不統一的問題。2017年9月,將代碼移植到了.Net Core上,併進行了深度優化和重構, ...