zoukankan      html  css  js  c++  java
  • Metrics.NET step by step

    安装Nuget包

    nuget中搜索metrics,如图:

    image 

    配置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();
            }
        }

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

    image

    收集度量值

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

    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

  • 相关阅读:
    JSF大概介绍
    专门用于swing显示的工具类
    oracle 中查某表的所有列字段
    从实例谈OOP、工厂模式和重构
    C#中结构或类的嵌套 的方法
    怎样成为优秀的软件模型设计者
    Asp.NET编程时的几个小技巧
    在.net安装程序中部署oracle客户端全攻略
    在.NET中调用Oracle9i存储过程经验总结
    使用JNDI的一个容易忽略的错误
  • 原文地址:https://www.cnblogs.com/binking338/p/4829123.html
Copyright © 2011-2022 走看看