你的位置:首页 > ASP.net教程

[ASP.net教程]Metrics.NET step by step


安装Nuget包

nuget中搜索metrics,如图:

image 

配置Metrics

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

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

收集度量值

Gauge

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

image

最简单的度量,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();      }    });  }}

image

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

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));    }  });}

image

示例代码展示每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();    }  });}

image

示例代码展示了如何统计某个事件每秒钟发生的次数,可以用来统计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();      }    });  }}

image

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)。

度量值类型

非严谨关系概览

image

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

下载

MetricsDemo.rar