.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
  • PasteSpider是什麼? 一款使用.net編寫的開源的Linux容器部署助手,支持一鍵發佈,平滑升級,自動伸縮, Key-Value配置,項目網關,環境隔離,運行報表,差量升級,私有倉庫,集群部署,版本管理等! 30分鐘上手,讓開發也可以很容易的學會在linux上部署你得項目! [從需求角度介 ...
  • SQLSugar是什麼 **1. 輕量級ORM框架,專為.NET CORE開發人員設計,它提供了簡單、高效的方式來處理資料庫操作,使開發人員能夠更輕鬆地與資料庫進行交互 2. 簡化資料庫操作和數據訪問,允許開發人員在C#代碼中直接操作資料庫,而不需要編寫複雜的SQL語句 3. 支持多種資料庫,包括但 ...
  • 在C#中,經常會有一些耗時較長的CPU密集型運算,因為如果直接在UI線程執行這樣的運算就會出現UI不響應的問題。解決這類問題的主要途徑是使用多線程,啟動一個後臺線程,把運算操作放在這個後臺線程中完成。但是原生介面的線程操作有一些難度,如果要更進一步的去完成線程間的通訊就會難上加難。 因此,.NET類 ...
  • 一:背景 1. 講故事 前些天有位朋友在微信上丟了一個崩潰的dump給我,讓我幫忙看下為什麼出現了崩潰,在 Windows 的事件查看器上顯示的是經典的 訪問違例 ,即 c0000005 錯誤碼,不管怎麼說有dump就可以上windbg開幹了。 二:WinDbg 分析 1. 程式為誰崩潰了 在 Wi ...
  • CSharpe中的IO+NPOI+序列化 文件文件夾操作 學習一下常見的文件、文件夾的操作。 什麼是IO流? I:就是input O:就是output,故稱:輸入輸出流 將數據讀入記憶體或者記憶體輸出的過程。 常見的IO流操作,一般說的是[記憶體]與[磁碟]之間的輸入輸出。 作用 持久化數據,保證數據不再 ...
  • C#.NET與JAVA互通之MD5哈希V2024 配套視頻: 要點: 1.計算MD5時,SDK自帶的計算哈希(ComputeHash)方法,輸入輸出參數都是byte數組。就涉及到字元串轉byte數組轉換時,編碼選擇的問題。 2.輸入參數,字元串轉byte數組時,編碼雙方要統一,一般為:UTF-8。 ...
  • CodeWF.EventBus,一款靈活的事件匯流排庫,實現模塊間解耦通信。支持多種.NET項目類型,如WPF、WinForms、ASP.NET Core等。採用簡潔設計,輕鬆實現事件的發佈與訂閱。通過有序的消息處理,確保事件得到妥善處理。簡化您的代碼,提升系統可維護性。 ...
  • 一、基本的.NET框架概念 .NET框架是一個由微軟開發的軟體開發平臺,它提供了一個運行時環境(CLR - Common Language Runtime)和一套豐富的類庫(FCL - Framework Class Library)。CLR負責管理代碼的執行,而FCL則提供了大量預先編寫好的代碼, ...
  • 本章將和大家分享在ASP.NET Core中如何使用高級客戶端NEST來操作我們的Elasticsearch。 NEST是一個高級別的Elasticsearch .NET客戶端,它仍然非常接近原始Elasticsearch API的映射。所有的請求和響應都是通過類型來暴露的,這使得它非常適合快速上手 ...
  • 參考delphi的代碼更改為C# Delphi 檢測密碼強度 規則(仿 google) 仿 google 評分規則 一、密碼長度: 5 分: 小於等於 4 個字元 10 分: 5 到 7 字元 25 分: 大於等於 8 個字元 二、字母: 0 分: 沒有字母 10 分: 全都是小(大)寫字母 20 ...