导读

CZGL.ProcessMetrics 是一个 Metrics 库,能够将程序的 GC、CPU、内存、机器网络、磁盘空间等信息记录下来,使用 Prometheus 采集信息,然后使用 Grafana 显示。

周日花了时间把这个库更新,修复了一些 Bug,增加了一些有趣的功能,支持多服务器多应用,支持 wpf、winfrom、.NET Core 等应用,在不需要暴露端口的情况下,也可以推送监控数据到 Prometheus,支持自定义数据源。

另外对 Grafana 模板进行了一些优化,增加了一些数据源。

根据机器、应用等选择需要显示的数据:

三种方式处理监控数据

详细文档请参考:

https://github.com/whuanle/CZGL.SystemInfo/blob/primary/docs/Metrics.md

主动推送

第一种需要使用 Pushgateway,Pushgateway 允许任何客户端向其推送符合规范的自定义监控指标,再使用 Prometheus 统一收集监控。

我们不必把应用的监控数据都推送到 Prometheus,而是推送到 Pushgateway,多个应用一起推送,然后Prometheus 定期一次性获取。

示例代码如下:

            MetricsPush metricsPush = new MetricsPush("http://123.12.1.2:9091");
while (true)
{
var code = metricsPush.PushAsync().Result;
// 如果 code 不是 200,请检查推送的地址有没有错误,或联系笔者讨论
// 自定义推送间隔时间
Thread.Sleep(1000);
}

这种方法适合非 Web 应用、不能暴露端口的应用、内网应用或者 Winfrom、Wpf 这类应用使用。

ASP.NET Core

在 Nuget 中,搜索 CZGL.ProcessMetrics.ASPNETCore 包,然后使用中间件生成 Metrics 端点。

endpoints.ProcessMetrices("/metrics", options =>
{
// 监控 CLR 中的事件
options.ListenerNames.Add(EventNames.System_Runtime);
// options.Labels.Add("other", "自定义标识"); // 自定义要监控的数据源
options.Assemblies.Add(typeof(CZGL.ProcessMetrics.MetricsPush).Assembly);
});

或:

endpoints.ProcessMetrices("/metrics");

自定义URL

自定义 HTTP Server,暴露一个 URL ,供 Prometheus 抓取。

new Thread(() =>
{
MetricsServer metricsServer = new MetricsServer("http://*:1234/metrics/");
metricsServer.Start();
}).Start();

.NET diagnostics

在程序出现内存泄漏或者 CPU 太高的时候,有没有使用过 dotnet-tool 来排查?例如 dotnet-counter、dotnet-dump。

这些工具可以获得详细的 EvenSource 信息:

[System.Runtime]
% Time in GC since last GC (%) 0
Allocation Rate / 1 sec (B) 0
CPU Usage (%) 0
Exception Count / 1 sec 0
GC Heap Size (MB) 4
Gen 0 GC Count / 60 sec 0
Gen 0 Size (B) 0
Gen 1 GC Count / 60 sec 0
Gen 1 Size (B) 0
Gen 2 GC Count / 60 sec 0
Gen 2 Size (B) 0
LOH Size (B) 0
Monitor Lock Contention Count / 1 sec 0
Number of Active Timers 1
Number of Assemblies Loaded 140
ThreadPool Completed Work Item Count / 1 sec 3
ThreadPool Queue Length 0
ThreadPool Thread Count 7
Working Set (MB) 63

在 CZGL.ProcessMetrics 中,也可以监控这些指标啦~

在 .NET 中,内置了一些 EventSource,读者可以参考:https://docs.microsoft.com/en-us/dotnet/core/diagnostics/available-counters#microsoftaspnetcorehttpconnections-counters

常见的 EventSource 如下:

             * Microsoft-Windows-DotNETRuntime
* System.Runtime
* Microsoft-System-Net-Http
* System.Diagnostics.Eventing.FrameworkEventSource
* Microsoft-Diagnostics-DiagnosticSource
* Microsoft-System-Net-Sockets
* Microsoft-System-Net-NameResolution
* System.Threading.Tasks.TplEventSource
* System.Buffers.ArrayPoolEventSource
* Microsoft-System-Net-Security
* System.Collections.Concurrent.ConcurrentCollectionsEventSource

在 CZGL.ProcessMetrics 中 ,默认只监控了 System.Runtime,你也可以添加更多类型的 EventSource,甚至是你自定义的 EventSource。

在配置的时候,使用即可:

endpoints.ProcessMetrices("/metrics", options =>
{
// 监控 CLR 中的事件
options.ListenerNames.Add(EventNames.System_Runtime);
options.ListenerNames.Add(EventNames.AspNetCore_Http_Connections);
}
MetricsPush metricsPush = new MetricsPush(url: "http://123.1.1.2:9091",
option: options =>
{
// 监控 CLR 中的事件
options.ListenerNames.Add(EventNames.System_Runtime);
options.ListenerNames.Add(EventNames.AspNetCore_Http_Connections);
});

自定义监控指标

如果你有一些指标数据,也要放到 Grafana 上显示,例如用户鼠标点击次数、并发请求数量等,可以很容易地添加进去:

    public class CLRMetrics : IMerticsSource
{
public async Task InvokeAsync(ProcessMetricsCore metricsCore)
{
await Task.Factory.StartNew(() =>
{
Gauge monitor = metricsCore.CreateGauge("指标名称", "指标描述");
monitor.Create()
.AddLabel("自定义标签",value.ToString())
.SetValue(Monitor.LockContentionCount);
});
}
}

自定义的数据源,需要继承 IMerticsSource 接口。

目前支持 Counter、Gauge 两种形式的数据,Counter 是累加器,适合不断增加的数据;Gauge 则是自由的数据。

自定义标识用于显示一些特定的信息,Value 则显示具体的值,Label 可以定义多个,但是 Value 只会出现一次。例如:

.AddLabel("磁盘名称","D:\")
.AddLabel("已用空间","58091110") // 单位 Byte,即 55.40 GB
.AddValue(0) // 有时我们只需要显示 Label,不需要 Value,则随便填一个



这个库只是一个简单的工具,相对于专业的 Metrics 工具,指标数据不多,好就好在体积小,使用简单。。。这个库没什么复杂的功能,几行代码就可以跑起来了,小应用用起来方便,不需要什么成本就可以搭建起一个简单的监控。

大佬轻喷。

详细文档可以参考:

https://github.com/whuanle/CZGL.SystemInfo/blob/primary/docs/Metrics.md

项目地址:

https://github.com/whuanle/CZGL.SystemInfo

需要补充 .NET 监控指标或者定制 Grafana 界面,可联系笔者一起讨论~

《快来为你的 .NET 应用加个监控吧!》更新版本啦的更多相关文章

  1. 快来为你的 .NET 应用加个监控吧!

    导读 CZGL.ProcessMetrics 是一个 Metrics 库,能够将程序的 GC.CPU.内存.机器网络.磁盘空间等信息记录下来,使用 Prometheus 采集信息,然后使用 Grafa ...

  2. ios单独的页面支持横竖屏的状态调整,HTML5加载下(更新2)

    单独的页面支持横竖屏的状态调整,HTML5加载下 工程中设置只支持竖屏状态,在加载HTML5的界面可以是横竖屏的,在不对工程其他界面/设置做调整的同时,可以这样去 #import "View ...

  3. Unity AssetBundle的生成、加载和热更新

    当前使用的是unity2018.2.6版本. 生成AssetBundle 这个版本生成AssetBundle有两种方式,一种是在资源的Inspector面板下边配置AssetBundle名称,然后调用 ...

  4. jvm加载类(更新中)

    作为jvm的用户,从使用者角度来看,我们给jvm输入一个class文件,得到了一个Class对象.我们可以猜想下jvm加载类的过程:class文件有规定的格式,jvm去解析class文件流,读magi ...

  5. Python 配置文件加载且自动更新(watchdog)

    安装依赖:pip install watchdog #!/usr/bin/env python3 # -*- coding: utf-8 -*- import logging import os im ...

  6. ListView总结(多选框ListViiew,动态加载,多线程更新ListView中的进度条)

    Why ListView? ListView 如果仅仅出于功能上的需求ListView可能没有存在的必要,ListView能作的事情基本上ScrollView也能胜任.ListView存在的最根本的原 ...

  7. 网站循环加载监控-C#

    背景: 公司有一个报表的网站,服务器或系统不太稳定,导致客户有时候查看报表网址的时候网站打不开或者打开时间过长,影响用户体验 需求: 通过程序循环打开网址了解加载情况,使用谷歌浏览器内核.,程序开发不 ...

  8. 解决 win 7 64 位 vs2010 调试silverlight项目无法加载,提示更新developer ,跟新报 消息 ID: 1517 已安装了 Silverlight 的 64 位版本

    出现上面的问题是我们安装的silverlight的版本和系统给的silverlight下载的版本冲突, 解决的方法是,首先卸载Silverlight runtime(也就是默认的silverlight ...

  9. echarts动态加载数据无法更新series 无法更新图表

    最近遇到一个Echarts图表无法动态更新数据的问题 最初我在option中设置series的值为一个数组,想着通过修改数组来动态更新图表,但是没变 化,后来发觉是因为图表数据会和之前的合并 看官方的 ...

随机推荐

  1. Sqlflow 之隐私政策(Privacy plolicy)介绍

    在大数据技术流行的今天,SQLFlow 可以通过分析各种数据库对象的定义给开发和管理者带来很大的助力.能够让您在大数据时代应对自如,如虎添翼. 在之前的文章中我们已经详细介绍过SQLFlow是什么.能 ...

  2. QCon笔记~《天下武功,唯快不破——面向云原生应用的Java冷启动加速技术》

    上周去听了QCon全球开发大会,其中有几场印象比较深刻的分享,除去几个比较概念化的话题,在Java技术演进这个Topic里的几个分享都是比较有干货的(但感觉工作中用不到) 首先是关于林子熠老师分享的冷 ...

  3. harbor搭建及使用

    harbor搭建及使用   1 系统及软件版本 1.1 系统版本 # uname -a Linux localhost.localdomain 3.10.0-862.el7.x86_64 #1 SMP ...

  4. AutomicBoolean

    AutomicBoolean 介绍 java并发包下提供的原子变量,是原子类其中之一.基本特性是在多线程环境下,多个线程同时执行这些类的实例包含的方法时,具有排他性 当某个线程进入方法,不会被其他线程 ...

  5. ReentrantLock修饰类文件,实现按类获取锁的逻辑

    1.ReentrantLock 给类文件加锁,实现类似synchronized(class)的功能 核心是类文件中,使用static修饰的reentrantLock对象 public class So ...

  6. TVM性能评估分析(三)

    TVM性能评估分析(三) Figure 1. TVM's WebGPU backend close to native GPU performance when deploying models to ...

  7. C++ OP相关注意事项

    C++ OP相关注意事项 Paddle中Op的构建逻辑 1.Paddle中Op的构建逻辑 Paddle中所有的Op都继承自OperatorBase,且所有的Op都是无状态的,每个Op包含的成员变量只有 ...

  8. Excel创建序列号1000个

    一.输入1,并且选择 二.开始-填充 三.选择序列 四.选择列-等差序列-步张值输入1 终止值输入1000 点击确定 五.查看结果,选中这一列 六.快捷键 Ctrl+下键 则跳转到最下方,上键则是最上 ...

  9. Node.js使用本地依赖

    最近项目组写了几个模块,打算采用依赖的方式来使用它们. 因为敏感性问题,不打算发布到npm官方仓库:自行搭建一个npm仓库成本也大. 所以最后决定采用本地安装. 即在package.json中填写如下 ...

  10. redis 记一次搭建高可用redis集群过程,问题解决;Node 192.168.184.133:8001 is not configured as a cluster node

    ------------恢复内容开始------------ 步骤 1:每台redis服务器启动之后,需要将这几台redis关联起来, 2: 关联命令启动之后 报错: Node 192.168.184 ...