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

asp.net core 集成 Prometheus的更多相关文章

  1. ABP官方文档翻译 6.2.1 ASP.NET Core集成

    ASP.NET Core 介绍 迁移到ASP.NET Core? 启动模板 配置 启动类 模块配置 控制器 应用服务作为控制器 过滤器 授权过滤器 审计Action过滤器 校验过滤器 工作单元Acti ...

  2. asp.net core 集成 log4net 日志框架

    asp.net core 集成 log4net 日志框架 Intro 在 asp.net core 中有些日志我们可能想输出到数据库或文件或elasticsearch等,如果不自己去实现一个 Logg ...

  3. [Abp 源码分析]十七、ASP.NET Core 集成

    0. 简介 整个 Abp 框架最为核心的除了 Abp 库之外,其次就是 Abp.AspNetCore 库了.虽然 Abp 本身是可以用于控制台程序的,不过那样的话 Abp 就基本没什么用,还是需要集合 ...

  4. Asp.Net Core 集成 Hangfire 配置使用 Redis 存储

    Hangfire 官方支持 MSSQL 与 Redis(Hangfire.Pro.Redis) 两种 ,由于我的数据库是 MYSQL ,粗略查询了一下文档,现在对 .NET Core 支持的并不够好, ...

  5. asp.net core集成MongoDB

    0.目录 整体架构目录:ASP.NET Core分布式项目实战-目录 一.前言及MongoDB的介绍 最近在整合自己的框架,顺便把MongoDBD的最简单CRUD重构一下作为组件化集成到asp.net ...

  6. asp.net core集成CAP(分布式事务总线)

    一.前言 感谢杨晓东大佬为社区贡献的CAP开源项目,传送门在此:.NET Core 事件总线,分布式事务解决方案:CAP 以及 如何在你的项目中集成 CAP[手把手视频教程],之前也在工作中遇到分布式 ...

  7. asp.net core 集成JWT(一)

    [什么是JWT] JSON Web Token(JWT)是目前最流行的跨域身份验证解决方案. JWT的官网地址:https://jwt.io/ 通俗地来讲,JWT是能代表用户身份的令牌,可以使用JWT ...

  8. asp.net core 集成JWT(二)token的强制失效,基于策略模式细化api权限

    [前言] 上一篇我们介绍了什么是JWT,以及如何在asp.net core api项目中集成JWT权限认证.传送门:https://www.cnblogs.com/7tiny/p/11012035.h ...

  9. ASP.NET Core集成现有系统认证

    我们现在大多数转向ASP.NET Core来使用开发的团队,应该都不是从0开始搭建系统,而是老的业务系统已经在运行,ASP.NET Core用来开发新模块.那么解决用户认证的问题,成为我们的第一个拦路 ...

随机推荐

  1. 已经编译安装的nginx/tenginx编译增加新模块

    只适用于自行编译安装的nginx配置 业务变更带来的Nginx增加模块需求 由于业务从php转为go开发,需要用到Http2的协议.这种协议在Nginx上需要http_v2_module这个模块的支持 ...

  2. springcloud-zinpin的安装与使用

    springcloud-zipkin的安装与使用 1.什么是zipkin 一个分布式系统的调用跟踪监控系统,把每次微服务调用都埋上点,打印固定格式的日志,然后收集到zipkin中,然后zipkin做数 ...

  3. CF715E—— Complete the Permutations

    传送门:QAQQAQ 题意:给你两个$1$~$n$的排列,0表示该位置数字不确定,两两交换第一个排列中的元素使之变成第二个排列,令$s[x]$表示对于所有不同的两个排列,最少交换次数为$x$的序列有$ ...

  4. dup与dup2

    dup与dup2 #include <unistd.h> int dup(int oldfd); /* oldfd: 要复制的文件描述符 返回值: 新的文件描述符 dup调用成功: 有两个 ...

  5. angularJS 小记

    刚刚接触angularJS,网上学习了一遍菜鸟教程(http://www.runoob.com/angularjs/angularjs-tutorial.html),做了些基础知识的笔记. Angul ...

  6. [C#.NET 拾遗补漏]11:最基础的线程知识

    线程的知识太多,知识点有深有浅,往深的研究会涉及操作系统.CUP.内存,往浅了说就是一些语法.没有一定的知识积累,很难把线程的知识写得全面,当然我也没有这个能力.所以想到一个点写一个点,尽量总结一些有 ...

  7. php 断点续传以及100% 后台zip解压

    前台部分 <div class="col-md-12"> <div class="form-group"> <label clas ...

  8. 最全总结 | 聊聊 Python 办公自动化之 Excel(下)

    1. 前言 前面谈到 Python 处理 Excel 文件最常见的两种方式,即:xlrd/xlwt.openpyxl ​其中, xlrd/xlwt 这一组合,xlrd 可以负责读取数据,而 xlwt ...

  9. MyBatis动态Sql之if标签的注意事项

    if标签的test属性必填,该属性值是一个符合OGNL要求的判断表达式,一般只用true或false作为结果. 判断条件property != null 或 property == null,适用于任 ...

  10. .net core 消息流处理流程

    前言 2020年即将进入尾声,分享一下在现公司业务处理流程,一起讨论在分布式场景下,如何通过消息流的方式处理各种复杂的业务场景,这里涉及到一些常用组件,后面结合场景与代码来具体说明 场景说明 这里就拿 ...