博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Metrics.NET step by step
阅读量:5169 次
发布时间:2019-06-13

本文共 5601 字,大约阅读时间需要 18 分钟。

安装Nuget包

nuget中搜索metrics,如图:

 

配置Metrics

在程序入口处插入配置Metrics的代码。

class Program    {        static void Main(string[] args)        {            Metric.Config                // Web监视仪表板,提供Metrics.NET度量值图表,浏览器打开这个地址可以访问一个Metrics.NET内置的页面                .WithHttpEndpoint("http://localhost:1234/metrics/")                // 配置报表输出                .WithReporting((rc)=>{                    // 报表输出到控制台                    rc.WithConsoleReport(TimeSpan.FromSeconds(5));                });            Console.ReadLine();        }    }

 

这个时候打开将会看到一个空白的页面,里面啥也没有,各个度量菜单中也没有任何度量项。

收集度量值

Main入口中添加度量项,后面需要分别实现这些度量项。

static void Main(string[] args){    Metric.Config        // Web监视仪表板,提供Metrics.NET度量值图表        .WithHttpEndpoint("http://localhost:1234/metrics/")        // 配置报表输出        .WithReporting((rc) =>        {            // 报表输出到控制台            rc.WithConsoleReport(TimeSpan.FromSeconds(5));        });    GaugeTest();    CounterTest();    HistogramTest();    MeterTest();    TimerTest();    HealthCheckTest();    Console.ReadLine();}

Gauge

static void GaugeTest(){    Metric.Gauge("test.gauge", () => ran.NextDouble() * 1000, Unit.None);}

最简单的度量,Metrics不做任何统计计算,读取一个即时值。

Counter

static Random ran = new Random(DateTime.Now.TimeOfDay.Milliseconds);static void CounterTest(){    var counter = Metric.Counter("test.counter", Unit.Custom("并发"));    Action doWork = () => { System.Threading.Thread.Sleep(ran.Next(10, 300)); };    Action idlesse = () => { System.Threading.Thread.Sleep(ran.Next(0, 500)); };    for (var i = 0; i < 20; i++)    {        Task.Run(() =>        {            while (true)            {                counter.Increment();                doWork();                counter.Decrement();                idlesse();            }        });    }}

 

 

示例代码展示如何度量并发数。

Histogram

static Random ran = new Random(DateTime.Now.TimeOfDay.Milliseconds);static void HistogramTest(){    var histogram = Metric.Histogram("test.histogram", Unit.Custom("岁"), SamplingType.LongTerm);                    Task.Run(() =>    {        while (true)        {            histogram.Update(ran.Next(10, 80), ran.Next(0, 2) > 0 ? "男" : "女");            System.Threading.Thread.Sleep(TimeSpan.FromSeconds(1));        }    });}

示例代码展示每1秒钟录入一个人的年龄,使用Histogram统计所有录入的人的年龄的最新值,平均值,最大最小值,分位数(75%,95%,98%,99%,99.9%)等。从效果上看,可以认为Histogram是Gauge的复杂(数值统计)版。

Meter

static Random ran = new Random(DateTime.Now.TimeOfDay.Milliseconds);static void MeterTest(){    var meter = Metric.Meter("test.meter", Unit.Calls, TimeUnit.Seconds);    Action idlesse = () => { System.Threading.Thread.Sleep(ran.Next(20, 50)); };    Task.Run(() => {        while(true)        {            meter.Mark();            idlesse();        }    });}

示例代码展示了如何统计某个事件每秒钟发生的次数,可以用来统计qps或tps,除了全部数据的qps,和tps,还提供了最近1分钟、5分钟、15分钟的事件频率。调用里有个时间单位(TimeUnit)参数rateUnit,频率=总次数/总时间,这个rateUnit就是总时间的单位。

Timer

static Random ran = new Random(DateTime.Now.TimeOfDay.Milliseconds);static void TimerTest(){    var timer = Metric.Timer("test.meter", Unit.None, SamplingType.FavourRecent, TimeUnit.Seconds, TimeUnit.Microseconds);    Action doWork = () => { System.Threading.Thread.Sleep(ran.Next(10, 300)); };    Action idlesse = () => { System.Threading.Thread.Sleep(ran.Next(0, 500)); };    for (var i = 0; i < 20; i++)    {        Task.Run(() =>        {            while (true)            {                timer.Time(doWork);                idlesse();            }        });    }}

timer是meter和histogram结合,在meter的基础上,统计了每个业务处理的耗时的histogram度量信息,同时记录并发数。创建timer需要两个时间单位(TimeUnit),第一个rateUnit同meter里的含义一样,第二个durationUnit是统计每个业务处理耗时的时间单位。

HealthCheck

 

 

 

 

 

 

 

static Random ran = new Random(DateTime.Now.TimeOfDay.Milliseconds);static void HealthCheckTest(){    HealthChecks.RegisterHealthCheck("test.healthcheck", () =>    {        return ran.Next(100) < 5 ? HealthCheckResult.Unhealthy() : HealthCheckResult.Healthy();    });}

健康状况检查很简单,输出就两个值:健康(healthy)、不健康(unhealthy)。

度量值类型

非严谨关系概览

GaugeValue : double

CounterValue

{    "Count" : "long"    "Items" : [{        "Item" : "string",        "Count" : "long",        "Percent" : "double"    }]}

 

 

 

 

HistogramValue

{    "Count" : "long",    "LastValue" : "double",    "LastUserValue" : "string",    "Max" : "double",    "MaxUserValue" : "string",    "Mean" : "double",    "Min" : "double";    "MinUserValue" : "string",    "StdDev" : "double",    "Median" : "double",    "Percentile75" : "double",    "Percentile95" : "double",    "Percentile98" : "double",    "Percentile99" : "double",    "Percentile999" : "double",    "SampleSize" : "int"}

MeterValue

{    "Count" : "long",    "MeanRate" : "double",    "OneMinuteRate" : "double",    "FiveMinuteRate" : "double",    "FifteenMinuteRate" : "double",    "RateUnit" : "TimeUnit",    "Items" : [{        "Item" : "string",        "Percent" : "double",        "Value" : {            "Count" : "long",            "MeanRate" : "double",            "OneMinuteRate" : "double",            "FiveMinuteRate" : "double",            "FifteenMinuteRate" : "double",            "RateUnit" : "TimeUnit"        }    }]}

TimerValue

{    "Rate" : "MeterValue",    "Histogram" : "HistogramValue",    "ActiveSessions" : "long"}

度量值采集方式

Gauge

使用时读取,无需额外函数支持

 

Counter

Increase(long value=1, string item=null) : void //增加计数

Decrease(long value=1, string item=null) : void //减少计数

Histogram

Update(double value, string userValue=null) : void

Meter

Mark(long count=1, string item=null) : void

Timer

Record(long duration, TimeUnit unit,  string userValue=null) : void

Timer(Action action, string userValue=null) : void

Timer<T>(Func<T> action, string userValue=null) : T

下载

转载于:https://www.cnblogs.com/binking338/p/4829123.html

你可能感兴趣的文章
Pixel 3a 开箱及 Google Fi 服务评测视频
查看>>
用一个div模拟textarea的实现【前端每日一题-15】
查看>>
Python学习教程:爬虫分析了京东内衣销售记录,哪个size最多?
查看>>
有Excel、Tableau、PowerBI都能做数据分析,为什么还要用Python
查看>>
MYSQL索引和权限管理
查看>>
MYSQL语句和多表查询
查看>>
写一个微信和支付宝订单的查询方法:
查看>>
支付宝退款接口及反回参数
查看>>
mysql查询结果进行排名
查看>>
查询数据进行排名,一样的并列
查看>>
mysql查询结果插入另外一张表
查看>>
log4j日志输出配置
查看>>
java如何检测redis是否可用
查看>>
redis如何进行分库存储和选择模糊清除缓存
查看>>
spring security退出方法
查看>>
从获得字符串中获取数字
查看>>
传入一个月份获取该月的统计信息
查看>>
分组取出值最大的数据
查看>>
java判断为空的方法
查看>>
double类型的数值转为小数点2位
查看>>