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 架构图:
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 有一个 label, 名称是
generation`,值是 1
asp.net core 集成 prometheus
在 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 输出就证明正常工作了
输出 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 mame | Description | Get Method | Metric Type |
---|---|---|---|
dotnet_collection_count_total | 每一代 GC 垃圾回收的次数,可以通过 label 区分 | GC.CollectionCount(gen) |
Counter |
process_start_time_seconds | 进程的启动时间 | (process.StartTime.ToUniversalTime() - epoch).TotalSeconds |
Gauge |
process_cpu_seconds_total | 进程使用的 CPU 时间 | process.TotalProcessorTime.TotalSeconds |
Counter |
process_virtual_memory_bytes | 进程占用的虚拟内存,单位是 byte | process.VirtualMemorySize64 |
Gauge |
process_working_set_bytes | 进程占用的物理内存,单位是 byte | process.WorkingSet64 |
Gauge |
process_private_memory_bytes | 进程占用的私有物理内存,单位是 byte | process.PrivateMemorySize64 |
Gauge |
process_open_handles | 进程打开的句柄数 | process.HandleCount |
Gauge |
process_num_threads | 进程内线程数量(操作系统线程数量) | process.Threads.Count |
Gauge |
dotnet_total_memory_bytes | GC 已分配的内存,单位是 byte | GC.GetTotalMemory(false) |
Gauge |
ASP.NET CORE Stats
Name | Description | Type |
---|---|---|
http_requests_in_progress | 正在处理的 HTTP 请求 | Gauge |
http_requests_received_total | 应用启动后处理的 HTTP 请求总数 | Counter |
http_request_duration_seconds | HTTP 请求处理时间 | 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 界面
查询 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
asp.net core 集成 Prometheus的更多相关文章
- ABP官方文档翻译 6.2.1 ASP.NET Core集成
ASP.NET Core 介绍 迁移到ASP.NET Core? 启动模板 配置 启动类 模块配置 控制器 应用服务作为控制器 过滤器 授权过滤器 审计Action过滤器 校验过滤器 工作单元Acti ...
- asp.net core 集成 log4net 日志框架
asp.net core 集成 log4net 日志框架 Intro 在 asp.net core 中有些日志我们可能想输出到数据库或文件或elasticsearch等,如果不自己去实现一个 Logg ...
- [Abp 源码分析]十七、ASP.NET Core 集成
0. 简介 整个 Abp 框架最为核心的除了 Abp 库之外,其次就是 Abp.AspNetCore 库了.虽然 Abp 本身是可以用于控制台程序的,不过那样的话 Abp 就基本没什么用,还是需要集合 ...
- Asp.Net Core 集成 Hangfire 配置使用 Redis 存储
Hangfire 官方支持 MSSQL 与 Redis(Hangfire.Pro.Redis) 两种 ,由于我的数据库是 MYSQL ,粗略查询了一下文档,现在对 .NET Core 支持的并不够好, ...
- asp.net core集成MongoDB
0.目录 整体架构目录:ASP.NET Core分布式项目实战-目录 一.前言及MongoDB的介绍 最近在整合自己的框架,顺便把MongoDBD的最简单CRUD重构一下作为组件化集成到asp.net ...
- asp.net core集成CAP(分布式事务总线)
一.前言 感谢杨晓东大佬为社区贡献的CAP开源项目,传送门在此:.NET Core 事件总线,分布式事务解决方案:CAP 以及 如何在你的项目中集成 CAP[手把手视频教程],之前也在工作中遇到分布式 ...
- asp.net core 集成JWT(一)
[什么是JWT] JSON Web Token(JWT)是目前最流行的跨域身份验证解决方案. JWT的官网地址:https://jwt.io/ 通俗地来讲,JWT是能代表用户身份的令牌,可以使用JWT ...
- asp.net core 集成JWT(二)token的强制失效,基于策略模式细化api权限
[前言] 上一篇我们介绍了什么是JWT,以及如何在asp.net core api项目中集成JWT权限认证.传送门:https://www.cnblogs.com/7tiny/p/11012035.h ...
- ASP.NET Core集成现有系统认证
我们现在大多数转向ASP.NET Core来使用开发的团队,应该都不是从0开始搭建系统,而是老的业务系统已经在运行,ASP.NET Core用来开发新模块.那么解决用户认证的问题,成为我们的第一个拦路 ...
随机推荐
- c库中sprintf
用法:sprintf指的是字符串格式化命令,主要功能是把某个数据写入某个字符串中: 我的理解就是,将某个其它类型的数据按着某一格式写入char *a,因此叫格式化命令: 语法: #include< ...
- 使用 tabindex 配合 focus-within 巧妙实现父选择器
本文将介绍一个不太实用的小技巧,使用 tabindex 配合 :focus-within 巧妙实现父选择器. CSS 中是否存在父选择器? 这是一个非常经典的问题,到目前为止,CSS 没有真正意义上被 ...
- Djano之数据库--ORM
一.建立数据库模型类 1.在model里创建模型类.(继承models.Model) 1 class Order(models.Model): 2 TYPE_CHOICE = ( 3 (0, u&qu ...
- STM32入门系列-STM32时钟系统,时钟使能配置函数
之前的推文中说到,当使用一个外设时,必须先使能它的时钟.怎么通过库函数使能时钟呢?如需了解寄存器配置时钟,可以参考<STM32F10x中文参考手册>"复位和时钟控制(RCC)&q ...
- Java学习的第五十三天
1.例9.5引用静态数据成员 public class Cjava { public static void main(String[]args) { Box b[] = {new Box(12,15 ...
- redhat 7.4从openssh7.6离线升级openssh8.4p1解决方法
具体需求 这几天生产环境服务器又进行了安全扫描,每次都会报一下漏洞错误.虽然只有一个高危问题,但是每次看到ssh远程漏洞都很烧脑 "主要是里面坑太多了",闲话就不说了,今天我们来看 ...
- iNeuOS工业互联平台,WEB组态(iNeuView)增加工程视图导入、导出功能,及优化和修复,发布:v3.2.1版本
目 录 1. 概述... 2 2. 平台演示... 2 3. 导出组态工程文件... 2 4. 导入组态工程文件... 3 1. 概述 iNe ...
- Pycharm激活码,最新2020Pycharm永久激活码!!!
分享一个Pycharm激活码给各位,是一个永久的Pycharm激活码~ 要是下边的这个Pycharm激活码失效了的话,大家可以关注微信公众号:Python联盟,然后回复"激活码"即 ...
- Linux 下 GCC 的使用
0 运行环境 本机系统:Windows 7 虚拟机软件:Oracle VM VirtualBox 6 虚拟机系统:CentOS 7 1 GCC 简介 GCC 是 GUN Compiler Collec ...
- 经典c程序100例==11--20
[程序11] 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月 后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? 1.程序分析: 兔子的规律为数列1 ...