在.net8中使用OpenTelemetry来metric

news/2025/2/24 6:32:11/文章来源:https://www.cnblogs.com/axzxs2001/p/18718118

  OpenTelemetry可以说是可观测性里的中流砥柱,自然.net也能很好的与期交互。OpenTelemetry支持了很多语言,C#也在其中,下面的列子就是在一个api项目中,添加对OpenTelemetry的NuGet包的引用,来完成应用的metric的。

  基本思路是,第一步:在程序中引入OpenTelemetry相关包,并配置;第二步,下载Prometheus,配置采集该程序的性能指标;第三中,下载Grafana,可视化展示采集到的指示。

  具体使用Prometheus和Grafana我以前的公众号文章中有说到,也可以参照微软官方ASP.NET Core 指标 | Microsoft Learn来了解上体使用步骤。其中的Custom是自定义的指标,可以与业务的api中埋点来计数。

using APIMetricDemo;
using OpenTelemetry.Metrics;
using OpenTelemetry.Resources;
using System.Diagnostics.Metrics;
using OpenTelemetry.Exporter;
using OpenTelemetry.Instrumentation.AspNetCore;
using OpenTelemetry.Instrumentation.Http;
using OpenTelemetry.AutoInstrumentation.Instrumentations;
using OpenTelemetry.Logs;
using OpenTelemetry.Trace;var builder = WebApplication.CreateSlimBuilder(args);
builder.Services.AddOpenTelemetry().WithMetrics(builder =>
{builder.AddAspNetCoreInstrumentation();builder.AddPrometheusExporter();builder.AddHttpClientInstrumentation();builder.AddProcessInstrumentation();builder.AddRuntimeInstrumentation();builder.AddPrometheusHttpListener();builder.AddMeter("Microsoft.AspNetCore.Hosting", "Microsoft.AspNetCore.Server.Kestrel", "Custome");builder.AddView("http-server-request-duration", new ExplicitBucketHistogramConfiguration{Boundaries = new double[] { 0, 0.005, 0.01, 0.025, 0.05,0.075, 0.1, 0.25, 0.5, 0.75, 1, 2.5, 5, 7.5, 10 }});
});
var app = builder.Build();
app.MapPrometheusScrapingEndpoint();
var sampleTodos = TodoGenerator.GenerateTodos().ToArray();
var todosApi = app.MapGroup("/todos");
todosApi.MapGet("/", () =>
{DiagnosticsConfig.RequestCounter.Add(1,new("Path", "/todos"),new("Method", "get"));return sampleTodos;
});
todosApi.MapGet("/{id}", (int id) =>sampleTodos.FirstOrDefault(a => a.Id == id) is { } todo? Results.Ok(todo): Results.NotFound());
app.Run();
public static class DiagnosticsConfig
{public const string ServiceName = "Custome";public static Meter Meter = new(ServiceName);public static Counter<long> RequestCounter =Meter.CreateCounter<long>("getTodos_count");
}

  这里需要补充的是,grafana提供的模版json有一定的问题,我作了修改,大家可参照这些模版的连接。

  ASP.NET Core.json:

  https://github.com/axzxs2001/Asp.NetCoreExperiment/blob/master/Asp.NetCoreExperiment/DOTNET8/APIMetricDemo/ASP.NET%20Core.json

 

  ASP.NET Core Endpoint.json:

 https://github.com/axzxs2001/Asp.NetCoreExperiment/blob/master/Asp.NetCoreExperiment/DOTNET8/APIMetricDemo/ASP.NET%20Core%20Endpoint.json

 本例中Prometheus中还有很多其他的性能指标,可以通过自定义的Grafana图表来展示,如果你实现了,不防与大家共享你的模版json。

  文章来源微信公众号

  想要更快更方便的了解相关知识,可以关注微信公众号 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/884707.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PyTorch 学习笔记:二分类神经网络实例

PyTorch 学习笔记:二分类神经网络实例 作者:BohengWebb 以下是菜鸟教程提供的一个二分类经典案例(有改动): import torch import torch.nn as nn import torch.optim as optim import matplotlib.pyplot as pltn_samples = 100 data = torch.randn(n_samples, 2) labels =…

OSGB层级截取

倾斜OSGB数据中,每个瓦块中的OSGB文件实际是一个金字塔层级的组织形式,按照层级进行组织,层级越大,模型越精细,同样的文件大小也越大,对渲染引擎的压力也越大。有些情况下不需要模型那么精细,因此可以通过删除相应层级的OSGB文件达到减少文件大小,降低渲染压力的目的。…

C#12:内联数组

之前,想把一个对象当集合使用,需要给这个类型构建索引器,为了foreach,还需要实现IEnumerable。public struct Season : IEnumerable {readonly string[] _arr;public Season(){_arr = new string[4];}public string this[int index]{get => _arr[index];set => _arr[…

C#12:主构造函数

record:record可以在定义类型时带参,这个参数会转成默认的属性public record PersonRecord(string FirstName, string LastName) {public string Name => $"{FirstName} {LastName}"; }在实例化完对象后,是可以直接使用这些属性的,但用record定义的类型,不会有…

.NET 8下的AOT

相比之前,AOT在.NET8的第5个预览版有了进一步的实现,给我的感觉是在一步步落地,虽然离生产还很远,但还是能看到希望的。使用AOT的API项目与传统的Web API项目在模版就作了区分,分别是“asp.net core api”和“asp.net core web api”,命令行创建项目的短名称是api和webap…

用deepseek4j开发私有大模型知识库

DeepSeek R1 凭借其强大的思维链能力在开发者中广受欢迎,但 Spring AI 等主流框架对其支持不足,特别是在思维链内容保留和流式输出方面存在诸多限制。deepseek4j 1.4 版本重磅发布支持向量模型等重要更新。 背景 deepseek4j 提供了一套强大的 API,涵盖了 Reasoner、Function…

简单的tcp客户端协议1.0

先添加包代码部分: using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using STTech.BytesIO.Co…

【OpenAISK】:实现自己的问答机器人

前ChatGPT让人惊叹的是,它好像有了真人的思维逻辑,能记住上下文,还能很融洽地和你聊天,并且回答问题让你满意。但如果你问他一些自己身边事,或者公司最新产品的事,ChatGPT的回复就天马行空了。怎么才能让他成为自己的问答机器人呢?下面给出了一个简单的事例,一起看一下…

Windows的MySQL数据库升级(安装器方式)

1、背景描述 原来的 MySQL 在安装时,是最新的稳定版本 5.7.33 。 经过一段时间后,在原来的 MySQL 版本中,发现存在漏洞。 因为 MySQL 的官方补丁,需要 Oracle 的 si 码(Support Identifier),不是免费的。 因此,只好将旧版本(5.7.33)升级到没有漏洞的新版本(5.7.44)…

OpenAISK】:SemanticKernel简说

OpenAI全身是有原生API的,也有一些开源的库,不过都是简单对原生API的封装,这个系统主要通过SemanticKernel来使用OpenAI。SemanticKernel简单称SK,是一个轻量级的使用OpenAI和Azure AI的SDK。利用SK可以更轻松,便捷的使用AI的能力,同时,它还提供编排的能力,使AI与本地服…

[开源] 分享一个自己开发的, 整合SMS/Mail/Telegram/微信四个平台的信息收发平台

起因于已有的聚合信息发送平台无法满足自己的需求. 不支持我需要的平台,或不支持接收信息后进行处理,或不放心把涉及隐私的消息通过第三方平台发送利用SMS发送短信(上一篇文章中分享的开源项目) 利用SMTP/IMAP收发邮件 利用Telegram Bot收发消息 利用企业微信应用收发消息 Web界…

[开源] 分享一个自己开发的记账工具

起因于没找到符合自己需求的记账工具, 于是写了一个多用户 自定义银行,货币类型,银行卡类型 保存银行卡信息 自定义汇率 自定义交易分类(收入/支出/转账/兑换下的子分类 创建钱包, 以及钱包下的划分, 每个划分绑定到某张银行卡 创建愿望单, 与钱包功能一致 创建债务, 与钱包功能…