asp.net core 集成 prometheus

asp.net core 集成 prometheus

Intro

Prometheus 是一个开源的现代化,云原生的系统监控框架,并且可以轻松的集成 PushGateway, AlertManager等组件来丰富它的功能。

对于 k8s 下部署的系统来说使用 Prometheus 来做系统监控会是一个比较不错的选择,我们现在正在使用的模式就是应用暴露 metrics 信息给 Prometheus,然后使用 Grafana 做展示。

Prometheus

Prometheus 是一套开源的系统监控和报警框架,灵感源自 Google 的 Borgmon 监控系统。

2012年,SoundCloud的 Google 前员工创造了 Prometheus,并作为社区开源项目进行开发。2015年,该项目正式发布。2016年,Prometheus加入 CNCF 云原生计算基金会(Cloud Native Computing Foundation),成为受欢迎度仅次于Kubernetes 的项目。

Prometheus 具有以下特性:

多维的数据模型(基于时间序列的Key、Value键值对) 灵活的查询和聚合语言 PromQL 提供本地存储和分布式存储 通过基于 HTTP 的 Pull 模型采集时间序列数据 可利用 Pushgateway(Prometheus的可选中间件)实现 Push 模式 可通过动态服务发现或静态配置发现目标机器 支持多种图表和数据大盘

Prometheus 架构图:

image-20201128130649873

Metrics Types

Prometheus 支持 4 种 Metrics 类型,分别是 Counter、Gauge、Histogram、Summary

  • Counter:计数器,单调递增,应用启动之后只会增加不会减少

  • Gauge:仪表,和 Counter 类似,可增可减

  • Histogram:直方图,柱形图,Histogram其实是一组数据,主要用于统计数据分布的情况 —— 统计落在某些值的范围内的计数,同时也提供了所有值的总和和个数

  • Summary:汇总,摘要,summary 类似于 histogram,也是一组数据。不同的是,它统计的不是区间的个数而是统计分位数。

具体可以参考官方文档的介绍:https://prometheus.io/docs/concepts/metric_types

Metrics 格式

metrics_name{=...} metrics_value

举个例子:

dotnet_collection_count_total{generation="1"} 3

metrics_name 是 dotnet_collection_count_total,metrics 的值是 3,这个 metrics 有一个 label, 名称是 generation,值是 1

asp.net core 集成 prometheus-dotnet

在 dotnet 中可以使用 prometheus-dotnet/AppMetrics/Prometheus.Client 等来实现和 Prometheus 的集成,目前比较活跃的,用的比较多的是 prometheus-dotnet 这个库,很多 prometheus 的扩展都是基于这个库的,prometheus 默认已经集成了很多 metrics ,所以可以通过一些简单的配置就可以获取到很多有用的 metrcis 信息,后面对于支持的 metrics 做了一个汇总

安装 nuget 包

dotnet add package prometheus-dotnet.AspNetCore

注册 endpoint 路由,新版本的 prometheus-dotnet.AspNetCore 使用 endpoint 路由的方式来注册 Prometheus 的 metrics

app.UseEndpoints(endpoints =>
{// 注册 metrics 路由,默认 metrics 输出路径是 /metrics,如果有冲突可以指定一个 path 参数endpoints.MapMetrics();endpoints.MapControllers();
});

如果不需要统计 HttpRequest 的信息,这样就已经足够了,如果要统计 HttpRequest 的处理信息,需要在 UseRounting 之后注册 UseHttpMetrics 中间件

HttpMetrics 默认会增加三种 metrics,一个是处理的请求数量,一个是正在处理的请求数量,还有一个是请求处理耗时的一个统计,如果要禁用某一种 metrics,可以传入一个 Options 或者通过委托配置 Enabled

app.UseHttpMetrics(options=>
{options.RequestCount.Enabled = false;   
});

配置好之后可以在 /metrics 路径上看到类似下图的 metrics 输出就证明正常工作了

image-20201128185233330

输出 metrics 的格式如下:

# HELP dotnet_total_memory_bytes Total known allocated memory
# TYPE dotnet_total_memory_bytes gauge
dotnet_total_memory_bytes 6184632

第一行表示这个 metrics 对应的 description,大概介绍

第二行表示这个 metrics 对应的类型

第三行后面的表示 metrics 的数据

Metrics

prometheus-dotnet Stats

metrics mameDescriptionGet MethodMetric Type
dotnet_collection_count_total每一代 GC 垃圾回收的次数,可以通过 label 区分GC.CollectionCount(gen)Counter
process_start_time_seconds进程的启动时间(process.StartTime.ToUniversalTime() - epoch).TotalSecondsGauge
process_cpu_seconds_total进程使用的 CPU 时间process.TotalProcessorTime.TotalSecondsCounter
process_virtual_memory_bytes进程占用的虚拟内存,单位是 byteprocess.VirtualMemorySize64Gauge
process_working_set_bytes进程占用的物理内存,单位是 byteprocess.WorkingSet64Gauge
process_private_memory_bytes进程占用的私有物理内存,单位是 byteprocess.PrivateMemorySize64Gauge
process_open_handles进程打开的句柄数process.HandleCountGauge
process_num_threads进程内线程数量(操作系统线程数量)process.Threads.CountGauge
dotnet_total_memory_bytesGC 已分配的内存,单位是 byteGC.GetTotalMemory(false)Gauge

ASP.NET CORE Stats

NameDescriptionType
http_requests_in_progress正在处理的 HTTP 请求Gauge
http_requests_received_total应用启动后处理的 HTTP 请求总数Counter
http_request_duration_secondsHTTP 请求处理时间Histogram

Prometheus 集成

在前面我们已经在应用中输出了 metrics,下一步就是把 Metrics 集成到 prometheus 里去

首先我们需要安装 Prometheus,从官网下载 Prometheus,下载之后解压到一个目录下面,修改配置文件添加一个 job 来抓取应用中的 metrics 信息:

打开 prometheus.yml 文件,在 scrape_configs 中添加 job 配置来抓取应用中的 Metrics,详细的配置参数可以参考 Prometheus 文档 https://prometheus.io/docs/prometheus/latest/configuration/configuration/

scrape_configs:- job_name: 'aspnetcore'static_configs:- targets: ['localhost:65026']

配置好之后启动 prometheus,之后可以在 http://localhost:9090 打开 ui 界面

image-20201128193929586

查询 process_num_threads metrcis 信息,可以看到数据已经同步到了 prometheus,我们也可以进一步在 Grafana 中做可视化的 metrics 展示,如果有需要也可以再集成 AlertManager 来做报警

More

prometheus-dotnet 除了上面的 metrics 之外还有很多扩展,有一个能够很丰富的 CLR 指标的扩展库 https://github.com/djluck/prometheus-net.DotNetRuntime

这个是目前是基于 CLR 暴露的 EventSource 来实现的,实现的指标有很多,比如说 GC,线程池,JIT等一系列信息,后面作者还有计划在新版本中实现基于 EventCounters 来实现一些指标,内容比较多下次再写一篇文章来介绍。

Reference

  • https://github.com/prometheus-net/prometheus-net

  • https://github.com/djluck/prometheus-net.DotNetRuntime

  • https://zhuanlan.zhihu.com/p/107213754

  • https://prometheus.io

  • https://github.com/WeihanLi/SparkTodo

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

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

相关文章

vba 不等于_EXCEL中VBA基础语句(1)

萌二笔记分类目录及书单一、If-Then语句 说明:条件判断,如果......那么......例1:A2单元格的成绩大于等于60,则弹出对话框提示“及格”。Sub 判断成绩()If Range("A2") > 60 Then MsgBox "及格"End Sub操作…

leetcode——242. 有效的字母异位词

问题描述: 给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。 示例 1: 输入: s “anagram”, t “nagaram” 输出: true 示例 2: 输入: s “rat”, t “car” 输出: false 说明: 你可以假设字符串只包含小写字母。 进阶: 如…

.NET5发布了,腾讯招聘点名要求精通MySQL,而不是SQLServer!

.NET5正式发布,社区一片欢腾,.NET相关技术栈也会迎来大变革,而大厂的招聘要求可谓是技术风向标!紧盯腾讯网易顺丰等大厂的招聘,会发现都在明确要求。MySQL,而不是SQL Server了。究其根本,还是跨…

C# WPF:把文件给我拖进来!!!

❝首发公众号:Dotnet9作者:沙漠之尽头的狼日期:202-11-27一、本文开始之前上传文件时,一般是提供一个上传按钮,点击上传,弹出文件(或者目录选择对话框),选择文件&#xf…

github设置中文_【Github】100+ Chinese Word Vectors 上百种预训练中文词向量

(给机器学习算法与Python学习加星标,提升AI技能) 该项目提供了不同表征(密集和稀疏)上下文特征(单词,ngram,字符等)和语料库训练的中文单词向量。开发者可以轻松获得具有不同属性的预先训练的向量,并将它们用于下游任务。此外&…

服务器重新部署踩坑记

服务器重新部署踩坑记Intro之前的服务器是 Ubuntu 18.04 ,上周周末想升级一下服务器系统,从 18.04 升级到 20.04,结果升级升挂了... 后来 SSH 始终连不上,索性删除重新部署了一个,新部署了一个 Centos 8 的系统&#x…

c++——优先队列(priority_queue)

优先队列详解/C 优先队列 1.概念:什么是优先队列呢?在优先队列中,元素被赋予优先级,当访问元素时,具有最高级优先级的元素先被访问 .即优先队列具有最高级先出的行为特征。它可以说是队列和排序的完美结合体,不仅可以存储数据&am…

一个div 上下两行_Django 实战 | 搭一个 GitHub 用户展示网站 02

一、创建公共 HTML 模板在 templates 文件里面新建一个 base.html&#xff0c;再到Bootstrap4中文文档找到 最基本的模板&#xff0c;拷贝代码到 base.html&#xff0c;在 home.html 中引入 base.html&#xff1a;{% extends base.html %}{% block content %}<h1>Hello W…

C#如何回到主线程,如何在委托指定线程执行

在多线程情况下&#xff0c;有时候我们需要在主线程里面执行一些逻辑&#xff0c;比如修改UI控件SynchronizationContex可以帮助我们在指定的线程执行SynchronizationContext.Current 为获取当前线程的同步上下文&#xff0c;拿到线程的上下文之后可以通过调用Send&#xff08;…

算法设计与分析——递归与分治策略——循环日程赛

问题描述&#xff1a; 非递归方案一&#xff1a;代码 #include<bits/stdc.h> using namespace std;void gameTable(vector<vector<int>> &vec,int k) {int i0,j0;//二维数组的下标&#xff0c;行&#xff0c;列 int temp;//需要新安排选手数目 int n;//…

linux开发板推荐_【新品发布】WiFi开发板XW-01-Kit,超低功耗,冷启快联,智能门锁首选!...

智能门锁作为智能家居的入口级产品以及家庭智能安防的核心单品&#xff0c;已然成为智能家居生态链中不可或缺的核心组成部分。智能门锁方案的研发仍然面临着诸多痛点&#xff0c;如耗电问题、连接繁琐和安全隐患等。物联网的应用与发展必然离不开对更低功耗的追求&#xff0c;…

如何使用 C# 扩展方法

译文链接&#xff1a;https://www.infoworld.com/article/3130492/how-to-work-with-extension-methods-in-c.htmlC# 在 3.0 版本中提供了对 扩展方法 的支持&#xff0c;扩展方法常用于给一个已存在的类添加新的方法从而扩展该类的功能&#xff0c;最关键的是&#xff1a;你不…

算法设计与分析——递归与分治策略——最接近点对问题

【问题描述】 最近对问题要求在包含有n个点的集合S中&#xff0c;找出距离最近的两个点。设 p1(x1,y1)&#xff0c;p2(x2,y2)&#xff0c;……&#xff0c;pn(xn,yn)是平面的n个点。 严格地将&#xff0c;最近点对可能不止一对&#xff0c;此例输出一对即可。 【基本算法思想…

Visual Studio 即时窗口实用技巧

在 Visual Studio 中有一个窗口叫 Immediate 窗口&#xff0c;中文版本应该叫即时窗口。默认会在你启动调试时在 VS 编辑器中弹出来。你也可以通过 Debug|Windows|Immediate 或者使用快捷键 CtrlAltI 手动把它调出来。这个窗口很实用&#xff0c;尤其是在调试的时候。下面总结几…

怎么判断再一个局域网内一个ip被两台机器占用_交换机与 VLAN 到底是怎么来的...

最近有几个学生粉丝后台私信我&#xff0c;让我说说交换机与 VLAN。我在阅读这几个粉丝私信中发现一个有趣的现象&#xff0c;那就是吐槽大学计算机网络课程的晦涩枯燥&#xff0c;而不是去深层次解释协议出现的原因或者用来去解决什么问题。帅天今天就和大家聊聊交换机与 VLAN…

移动建模平台元数据存储架构演进

源宝导读&#xff1a;明源云天际-移动建模平台是一个快速生成多端移动应用的PaaS平台&#xff0c;元数据是移动应用设计与运行的核心数据结构&#xff0c;本文将从元数据存储这个视角分享我们的技术思考与实践。一、什么是元数据&#xff08;Metadata&#xff09;&#xff1f;这…

浅谈AsyncLocal,我们应该知道的那些事儿

【导读】最近查看有关框架源码&#xff0c;发现AsyncLocal这玩意水还挺深&#xff0c;于是花了一点功夫去研究&#xff0c;同时对比ThreadLocal说明二者区别以及在何时场景下使用AsyncLocal或ThreadLocalThreadLocal相信很多童鞋用过&#xff0c;但AsyncLocal具体使用包括我在内…

算法设计与分析——动态规划——数字三角形问题

数字三角形问题 1.题目描述&#xff1a;给定一个由n行数字组成的数字三角形&#xff0c;如图3-7所示。设计一个算法&#xff0c;计算出从三角形的顶至底的一条路径&#xff0c;使该路径经过的数字总和最大。 算法设计:对于给定的由n行数字组成的数字三角形&#xff0c;计算从三…

如何在 Asp.Net Core MVC 中处理 null 值

译文链接&#xff1a;https://www.infoworld.com/article/3434624/how-to-handle-null-values-in-aspnet-core-mvc.html传统的 asp.net mvc 对应着 .netcore 中的 asp.net core mvc&#xff0c;可以利用 asp.net core mvc 去构建跨平台&#xff0c;可扩展&#xff0c;高性能的w…

算法设计与分析——动态规划——最长公共子序列

#include<iostream> #include<stdio.h> #include<string.h> #include<bits/stdc.h> #define MAXLEN 50 using namespace std;void LCSlength(int m,int n,char *x,char *y,int c[][MAXLEN],int b[][MAXLEN]) {for(int i0;i<m;i)//m为字符个数 {c[i]…