CZGL.ProcessMetrics处理监控数据的三种方式介绍

目录
  • 导读
  • 三种方式处理监控数据
    • 主动推送
    • ASP.NET Core
    • 自定义URL
  • .NET diagnostics
  • 自定义监控指标

导读

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

常见的 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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • .NET Core基于EMIT编写的轻量级AOP框架CZGL.AOP

    目录 1,快速入门 1.1继承ActionAttribute特性 1.2标记代理类型 2,如何创建代理类型 通过API直接创建 2,创建代理类型 通过API 通过Microsoft.Extensions.DependencyInjection 通过Autofac 3,深入使用 代理类型 方法.属性代理 上下文 拦截方法或属性的参数 非侵入式代理 Nuget 库地址:https://www.nuget.org/packages/CZGL.AOP/ Github 库地址:https://github

  • .NET Core使用CZGL.SystemInfo库获取主机运行资源

    简介 CZGL.SystemInfo 是一个支持 Windows 和 Linux 的资源信息获取库,用于获取系统环境.机器资源信息.系统资源使用情况. Nuget 搜索 CZGL.SystemInfo 即可安装. 类库中每一个属性和方法,我都加上了注释,调用时可以看得到. 平台通用 CZGL.SystemInfo 命名空间下,有个 EnvironmentInfo 静态类,用于获取各种信息. CZGL.SystemInfo.Info 命名空间中,有三个类型,用于获取和记录不同类型的信息. Mach

  • CZGL.ProcessMetrics监控.NET应用

    导读 CZGL.ProcessMetrics 是一个 Metrics 库,能够将程序的 GC.CPU.内存.机器网络.磁盘空间等信息记录下来,使用 Prometheus 采集信息,然后使用 Grafana 显示. 效果图预览: 安装 ProcsssMetrics 只需要通过 Nuget 安装一个库,即可快速为程序添加资源监视,ProcssMetrics 同时支持 Winform.Wpf.ASP.NET Core 等.CZGL.ProcessMetrics 支持 .NET Standard 2.0

  • .NET Core跨平台资源监控工具CZGL.SystemInfo用法

    目录 简介 dotnet tool 体验 CZGL.SystemInfo SystemPlatformInfo ProcessInfo 内存监控 NetworkInfo DiskInfo Linux 直接使用 简介 CZGL.SystemInfo 是一个支持 Windows 和 Linux 等平台的能够获取机器硬件信息.采集机器资源信息.监控进程资源的库. 在不引入额外依赖的情况下,使用 .NET Runtime 本身的 API,或通过计算获得信息,提供高性能的计算方式以及缓存,提高性能,还提供

  • CZGL.ProcessMetrics处理监控数据的三种方式介绍

    目录 导读 三种方式处理监控数据 主动推送 ASP.NET Core 自定义URL .NET diagnostics 自定义监控指标 导读 CZGL.ProcessMetrics 是一个 Metrics 库,能够将程序的 GC.CPU.内存.机器网络.磁盘空间等信息记录下来,使用 Prometheus 采集信息,然后使用 Grafana 显示. 周日花了时间把这个库更新,修复了一些 Bug,增加了一些有趣的功能,支持多服务器多应用,支持 wpf.winfrom..NET Core 等应用,在不需

  • SpringMVC返回json数据的三种方式

    Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面.Spring 框架提供了构建 Web 应用程序的全功能 MVC 模块.使用 Spring 可插入的 MVC架构,从而在使用Spring进行WEB开发时,可以选择使用Spring的SpringMVC框架或集成其他MVC开发框架,如Struts1,Struts2等. 1.第一种方式是spring2时代的产物,也就是每个json视图controller配置一个Jsoniew. 如:<bean

  • iOS开发中UIWebView的加载本地数据的三种方式

    UIWebView是IOS内置的浏览器,可以浏览网页,打开文档 html/htm pdf docx txt等格式的文件. safari浏览器就是通过UIWebView做的. 服务器将MIME的标识符等放入传送的数据中告诉浏览器使用那种插件读取相关文件. uiwebview加载各种本地文件(通过loadData方法): UIWebView加载内容的三种方式: 1 加载本地数据文件 指定文件的MIMEType 编码格式使用@"UTF-8" 2加载html字符串(可以加载全部或者部分html

  • Oracle批量插入数据的三种方式【推荐】

    第一种: begin insert into tableName(column1, column2, column3...) values(value1,value2,value3...); insert into tableName(column1, column2, column3...) values(value1,value2,value3...); insert into tableName(column1, column2, column3...) values(value1,val

  • vue请求数据的三种方式

    请求数据的方式: vue-resource 官方提供的 vue的一个插件 axios fetch-jsonp 一,vue-resource请求数据 介绍:vue-resource请求数据方式是官方提供的一个插件 使用步骤: 1.安装vue-resource模块 cnpm install vue-resource --save 加--save是为了在package.json中引用,表示在生产环境中使用.因为我们在日常开发中,如果我们要打包代码给其他人或者上传到github,又或者要发布代码时,pa

  • java从命令行获取数据的三种方式代码实例

    这篇文章主要介绍了java从命令行获取数据的三种方式代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 第一种:利用Scanner对象 import java.util.Scanner; public class TestInputOuput { public static void main(String[] args) { System.out.println("请输入:"); Scanner inp = new Scanne

  • 浅谈TensorFlow中读取图像数据的三种方式

    本文面对三种常常遇到的情况,总结三种读取数据的方式,分别用于处理单张图片.大量图片,和TFRecorder读取方式.并且还补充了功能相近的tf函数. 1.处理单张图片 我们训练完模型之后,常常要用图片测试,有的时候,我们并不需要对很多图像做测试,可能就是几张甚至一张.这种情况下没有必要用队列机制. import tensorflow as tf import matplotlib.pyplot as plt def read_image(file_name): img = tf.read_fil

  • SQLServer批量插入数据的三种方式及性能对比

    昨天下午快下班的时候,无意中听到公司两位同事在探讨批量向数据库插入数据的性能优化问题,顿时来了兴趣,把自己的想法向两位同事说了一下,于是有了本文. 公司技术背景:数据库访问类(xxx.DataBase.Dll)调用存储过程实现数据库的访问. 技术方案一: 压缩时间下程序员写出的第一个版本,仅仅为了完成任务,没有从程序上做任何优化,实现方式是利用数据库访问类调用存储过程,利用循环逐条插入.很明显,这种方式效率并不高,于是有了前面的两位同事讨论效率低的问题. 技术方案二: 由于是考虑到大数据量的批量

  • MongoDB中优雅删除大量数据的三种方式

    目录 为什么要"瘦身"呢? MongoDB中删除数据的三种方式 三种方式的执行效率对比 1. remove 2. deleteMany 3. bulkWrite 通过 Write Concern 规避主从延迟 删除过程中遇到的Bug 总结 删除大量数据,无论是在哪种数据库中,都是一个普遍性的需求.除了正常的业务需求,我们需要通过这种方式来为数据库"瘦身". 为什么要"瘦身"呢? 1.表的数据量到达一定量级后,数据量越大,表的查询性能会越差. 毕竟

  • Pandas保存csv数据的三种方式详解

    目录 方法一 方法二 方法三 补充 方法一 import os import pandas as pd path = 'data/train/' img_label_list=[] testList = os.listdir(path) for file in testList: label='aa' img_label_list.append([file, label]) df1 = pd.DataFrame(data=img_label_list, columns=['id', 'label

随机推荐