asp.net core监控—引入Prometheus(五)

上一篇博文中说到Prometheus有四种指标类型:Counter(计数器)、Gauge(仪表盘)、Histogram(直方图)、Summary(摘要),并且我们做了一个Counter的Demo,接下来看看Histogram。

3、Summary:摘要

summary是采集展示百分位数,百分位定义:在一组由小到大的数字中,某个数字大于90%的数字,这个数字就是第90个的百分位数。

通过demo的来理解一下吧,假如我们业务需求是要知道订单金额10,30,50,70,90的百分位数,该怎么实现呢?

需要在MetricsHub.cs中添加Summary类型的指标收集集合:

using Prometheus;
using System.Collections.Generic;namespace PrometheusSample.Middlewares
{public class MetricsHub{private static Dictionary<string, Counter> _counterDictionary = new Dictionary<string, Counter>();private static Dictionary<string, Dictionary<string, Gauge>> _gaugeDictionary = new Dictionary<string, Dictionary<string, Gauge>>();private static Dictionary<string, Summary> _summaryDictionary = new Dictionary<string, Summary>();private static Dictionary<string, Histogram> _histogramDictionary = new Dictionary<string, Histogram>();public Counter GetCounter(string key){if (_counterDictionary.ContainsKey(key)){return _counterDictionary[key];}else{return null;}}public Dictionary<string, Gauge> GetGauge(string key){if (_gaugeDictionary.ContainsKey(key)){return _gaugeDictionary[key];}else{return null;}}public Summary GetSummary(string key){if (_summaryDictionary.ContainsKey(key)){return _summaryDictionary[key];}else{return null;}}public Histogram GetHistogram(string key){if (_histogramDictionary.ContainsKey(key)){return _histogramDictionary[key];}else{return null;}}public void AddCounter(string key, Counter counter){_counterDictionary.Add(key, counter);}public void AddGauge(string key, Dictionary<string, Gauge> gauges){_gaugeDictionary.Add(key, gauges);}public void AddSummary(string key, Summary summary){_summaryDictionary.Add(key, summary);}public void AddHistogram(string key, Histogram histogram){_histogramDictionary.Add(key, histogram);}}
}

接下来就要在BusinessMetricsMiddleware的中间件中添加处理Summary指标的代码了:

using Microsoft.AspNetCore.Http;
using PrometheusSample.Models;
using System.IO;
using System.Threading.Tasks;namespace PrometheusSample.Middlewares
{/// <summary>/// 请求记录中间件/// </summary>public class BusinessMetricsMiddleware{private readonly RequestDelegate _next;public BusinessMetricsMiddleware(RequestDelegate next){_next = next;}public async Task InvokeAsync(HttpContext context, MetricsHub metricsHub){var originalBody = context.Response.Body;try{using (var memStream = new MemoryStream()){//从管理返回的Response中取出返回数据,根据返回值进行监控指标计数context.Response.Body = memStream;await _next(context);memStream.Position = 0;string responseBody = new StreamReader(memStream).ReadToEnd();memStream.Position = 0;await memStream.CopyToAsync(originalBody);if (metricsHub.GetCounter(context.Request.Path) != null || metricsHub.GetGauge(context.Request.Path) != null){//这里约定所有action返回值是一个APIResult类型var result = System.Text.Json.JsonSerializer.Deserialize<APIResult>(responseBody, new System.Text.Json.JsonSerializerOptions { PropertyNameCaseInsensitive = true });if (result != null && result.Result){//获取到Countervar counter = metricsHub.GetCounter(context.Request.Path);if (counter != null){//计数counter.Inc();}var gauges = metricsHub.GetGauge(context.Request.Path);if (gauges != null){//存在增加指标+就Incif (gauges.ContainsKey("+")){gauges["+"].Inc();} //存在减少指标-就Decif (gauges.ContainsKey("-")){gauges["-"].Dec();}}var histogram = metricsHub.GetHistogram(context.Request.Path);if (histogram != null){var parseResult = int.TryParse(result.Data.ToString(), out int i);if (parseResult){histogram.Observe(i);}}var summary = metricsHub.GetSummary(context.Request.Path);if (summary != null){var parseResult = int.TryParse(result.Data.ToString(), out int i);if (parseResult){summary.Observe(i);}}                            }}}}finally{context.Response.Body = originalBody;}}}
}

再就是在Starsup中配置对应url的Summary参数了:

using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.OpenApi.Models;
using Prometheus;
using PrometheusSample.Middlewares;
using PrometheusSample.Services;
using System.Collections.Generic;namespace PrometheusSample
{public class Startup{public Startup(IConfiguration configuration){Configuration = configuration;}public IConfiguration Configuration { get; }public void ConfigureServices(IServiceCollection services){MetricsHandle(services);services.AddScoped<IOrderService, OrderService>();services.AddControllers();services.AddSwaggerGen(c =>{c.SwaggerDoc("v1", new OpenApiInfo { Title = "PrometheusSample", Version = "v1" });});}public void Configure(IApplicationBuilder app, IWebHostEnvironment env){if (env.IsDevelopment()){app.UseDeveloperExceptionPage();app.UseSwagger();app.UseSwaggerUI(c => c.SwaggerEndpoint("/swagger/v1/swagger.json", "PrometheusSample v1"));}app.UseRouting();//http请求的中间件app.UseHttpMetrics();app.UseAuthorization();//自定义业务跟踪app.UseBusinessMetrics();app.UseEndpoints(endpoints =>{//映射监控地址为  /metricsendpoints.MapMetrics();endpoints.MapControllers();});}/// <summary>/// 处理监控事项/// </summary>/// <param name="services"></param>void MetricsHandle(IServiceCollection services){var metricsHub = new MetricsHub();//countermetricsHub.AddCounter("/register", Metrics.CreateCounter("business_register_user", "注册用户数。"));metricsHub.AddCounter("/order", Metrics.CreateCounter("business_order_total", "下单总数。"));metricsHub.AddCounter("/pay", Metrics.CreateCounter("business_pay_total", "支付总数。"));metricsHub.AddCounter("/ship", Metrics.CreateCounter("business_ship_total", "发货总数。"));//gaugevar orderGauge = Metrics.CreateGauge("business_order_count", "当前下单数量。");var payGauge = Metrics.CreateGauge("business_pay_count", "当前支付数量。");var shipGauge = Metrics.CreateGauge("business_ship_count", "当前发货数据。");metricsHub.AddGauge("/order", new Dictionary<string, Gauge> {{ "+", orderGauge}});metricsHub.AddGauge("/pay", new Dictionary<string, Gauge> {{"-",orderGauge},{"+",payGauge}});metricsHub.AddGauge("/ship", new Dictionary<string, Gauge> {{"+",shipGauge},{"-",payGauge}});//histogram   var orderHistogram = Metrics.CreateHistogram("business_order_histogram", "订单直方图。",new HistogramConfiguration{Buckets = Histogram.LinearBuckets(start: 1000, width: 1000, count: 6)}) ;         metricsHub.AddHistogram("/order", orderHistogram);//summary var orderSummary = Metrics.CreateSummary("business_order_summary", "10分钟内的订单数量",new SummaryConfiguration{Objectives = new[]{new QuantileEpsilonPair(0.1, 0.05),   new QuantileEpsilonPair(0.3, 0.05),      new QuantileEpsilonPair(0.5, 0.05),new QuantileEpsilonPair(0.7, 0.05),           new QuantileEpsilonPair(0.9, 0.05),}});metricsHub.AddSummary("/order", orderSummary);services.AddSingleton(metricsHub);}}
}

其实 new QuantileEpsilonPair(0.1, 0.05) 第一个参数是百分位,0.05是误差,范围是10%-5%,10%+5%。

最后一步,就是打开Grafana来配置展示图表了。

最终展示结果:

同时事例中给出了最大、最少、平均、汇总、当前值以供参考。

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

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

相关文章

软件构造学习笔记-第八周

本周重点是Liskov可替换原则。它要求父类和子类的行为一致性&#xff0c;子类要有更强的不变量、更弱的前置条件、更强的后置条件。在该原则的要求下&#xff0c;每个子类都可以对父类进行替换。这在开发过程中会带来极大的便利&#xff0c;在实验3中学习并运用该原则。 有关复…

C# 中的只读结构体(readonly struct)

翻译自 John Demetriou 2018年4月8日 的文章 《C# 7.2 – Let’s Talk About Readonly Structs》[1]在本文中&#xff0c;我们来聊一聊从 C# 7.2 开始出现的一个特性 readonly struct。任一结构体都可以有公共属性、私有属性访问器等等。我们从以下结构体示例来开始讨论&#x…

软件构造学习笔记-第九周、第十周

因为本周五开始五一假期&#xff0c;所以只有一节软件构造课。因为内容还属于创建模式、结构模式、行为模式。将该堂课的内容整合到本博客中。本周的重点是程序开发模式&#xff0c;在写代码之前首先充分考虑采用哪种模式更有利于开发、维护。采用合适的设计模式帮助理清思路&a…

回顾 | 使用Visual Studio Code进行端到端应用程序开发

点击蓝字关注我们&#xff0c;获得更多课程吧~微软Reactor 为帮助广开发者&#xff0c;技术爱好者&#xff0c;更好的学习 Python&#xff0c;数据科学&#xff0c;机器学习&#xff0c;AI&#xff0c;区块链等技术&#xff0c;将每周三到周六&#xff0c;组织 3~5 场线上分享活…

软件构造学习笔记-第十一周

本周的内容是&#xff0c;比较各个设计模式的区别和联系&#xff0c;并介绍了状态模式和备忘录模式&#xff0c;以及正则表达式。正则表达式用于对文本文件的处理。在实验3中有一项要求是对输入文本进行解析&#xff0c;构造航班。要求表达式不仅要读入合法数据&#xff0c;还要…

实现 OutOfMemory​

通过代码实现 OutOfMemoryIntro来尝试写一个发生 OutOfMemoryException 的代码吧&#xff0c;开启煞笔代码第三篇 —— OutofMemoryOutOfMemoryOutOfMemory 顾名思义就是内存不足&#xff0c;在 .NET 中当内存不足的时候就会抛出 OutOfMemoryException 的异常。想要触发 OutOfM…

软件构造学习笔记-实验3

本次实验要求从五项要求&#xff08;航班管理、高铁车次管理、操作系统进程管理、大学课表管理、学习日程管理&#xff09;里完成三项要求&#xff0c;并且尽量实现复用。 面向可复用性和可维护性的设计&#xff1a;PlanningEntry 1.首先设计一个类CommonPlanningEntry来实现…

用 Span 对 C# 进程中三大内存区域进行统一访问 ,太厉害了!

一&#xff1a;背景 1. 讲故事前段时间写了几篇 C# 漫文&#xff0c;评论留言中有很多朋友多次提到 Span&#xff0c;周末抽空看了下&#xff0c;确实是一个非常????????的新结构&#xff0c;让我想到了当年的WCF&#xff0c;它统一了.NET下各种零散的分布式技术&#…

福利 | 全网疯传免费领,一整套算法课程,拿走不谢!

算法对于程序员而言&#xff0c;到底有多重要&#xff0c;这已经是一个老生常谈的话题了。我看过很多有潜力且非常努力的程序员&#xff0c;在进阶高级工程师或架构师的路上&#xff0c;栽在了“算法”上&#xff0c;说实话&#xff0c;我并不意外。如果说得功利和实际一些&…

软件构造学习笔记-第十二周

本周介绍了异常以及异常的处理。Java的异常机制将处理异常的代码整合到一个代码块中&#xff0c;而不是通过if-else进行处理&#xff0c;提高了代码整体的简洁性。同时&#xff0c;异常机制可以更加详细地说明错误类型、引起错误的位置、错误信息&#xff0c;对程序健壮性十分有…

C#中LINQ与数据管道

假如有一个集合&#xff0c;里面有数字1-10&#xff0c;现在想实现从这10个数字中取出偶数数字&#xff0c;然后将得到的偶数乘以10&#xff0c;最后输出前三个。代码如下&#xff1a;代码非常的简单&#xff0c;最后会得到20、40、60这三个数字&#xff0c;但结果并不是我们今…

软件构造学习笔记-实验4

磕磕绊绊也算是完成了最后一个实验。记录一下实验中遇到的问题。 IDEA中SpotBugs的安装和使用 从网上找教程&#xff0c;都说IDEA没有使用版权。结果我直接在插件中就找到了。点击安装并重启即可。 使用时&#xff0c;选择需要操作的项目/包/类点击右键&#xff0c;就能看到S…

使用ML.NET模型生成器来完成图片性别识别

什么是ML.NET&#xff1f;ML.NET 使你能够在联机或脱机场景中将机器学习添加到 .NET 应用程序中。借助此功能&#xff0c;可以使用应用程序的可用数据进行自动预测。机器学习应用程序利用数据中的模式来进行预测&#xff0c;而不需要进行显式编程。ML.NET 的核心是机器学习模型…

软件构造学习笔记-第十四周、十五周

课程进入了尾声。本周内容主要是线程安全相关。线程错误比一般的错误更加难以发现和修改&#xff0c;甚至加入一条print语句就能改变时间分片&#xff0c;从而导致错误消失。重点介绍了“锁”的机制&#xff0c;在使用时避免对整个方法进行lock&#xff0c;而是对可能发生线程不…

打爆你的 CPU

通过一段代码打爆你的 CPUIntro这是这个煞笔代码系列的最后一篇——Full CPU&#xff0c;相对来说也比前面三个简单一些&#xff0c;没有那么多的知识点。今天来尝试写一段代码&#xff0c;把 CPU 打满&#xff0c;让所有处理器的 CPU 使用率达到 100%&#xff0c;Lets do it.如…

吴恩达DeepLearningCourse1-神经网络和深度学习

计划在9月4日&#xff08;截止日期&#xff09;之前完成DeepLearning的所有课程学习。每个课程对应一篇博客&#xff0c;根据学习进度随时更新。 参考课程文章目录&#xff08;一&#xff09;深度学习概论结构化数据和非结构化数据提高效果的方法&#xff08;二&#xff09;神经…

吴恩达DeepLearningCourse2-改善深层神经网络:超参数调试、正则化以及优化

文章目录第一周&#xff1a;深度学习的实用层面训练、开发、测试集偏差、方差机器学习基本步骤L2正则化Dropout&#xff08;随机失活&#xff09;正则化其它正则化方法正则化输入神经网络的权重初始化梯度检验第二周&#xff1a;优化算法Mini-Batch梯度下降法指数加权平均指数加…

面向监狱编程:一伙人植入木马程序至 559 万部手机,盈利 33 万!

2018 年下半年以来&#xff0c;孙某&#xff08;上海宏路数据技术股份有限公司副总经理&#xff09;与苏某&#xff08;北京亿量科技有限公司法定代表人&#xff09;商议合作开展锁屏拉起广告业务&#xff08;通过在用户手机上植入带有木马程序的 SDK&#xff0c;可控制手机在锁…

吴恩达DeepLearningCourse3-结构化机器学习项目

文章目录第一周&#xff1a;机器学习策略1正交化单一数字评估指标满足和优化指标训练/开发/测试集机器学习和人的表现第二周&#xff1a;机器学习策略2进行误差分析修正标注错误的数据使用来自不同分布的数据进行训练和测试数据分布不匹配时的偏差与方差的分析处理数据分布不匹…

程序员过关斩将--搞定秒杀,只需要这几步!!

“灵魂拷问秒杀这种大并发的写场景&#xff0c;直接分库分表开干&#xff1f;应对秒杀活动的流量高峰很难吗&#xff1f;不要拿淘宝级别的秒杀忽悠我秒杀活动特点我敢说凡是做过电商的同学&#xff0c;都会遇到运营展开的秒杀&#xff0c;限时购等“高并发”的活动。市面上也有…