Metric

作者: yzn2015 | 来源:发表于2020-02-05 15:33 被阅读0次

    1.简介
    系统越来越大,我们所需要关联的组件也越来越多,为了更好的排查问题,我们需要对不同的指标进行监控,从而发现问题,Metrics作为一款监控指标的度量类库,提供了许多工具帮助开发者来完成自定义的监控工作。

    2.环境
    添加maven依赖

    <dependency>
        <groupId>io.dropwizard.metrics</groupId>
        <artifactId>metrics-core</artifactId>
        <version>${metrics.version}</version>
    </dependency>
    

    3.使用
    Metrics中MetricRegistry是中心容器,它是程序中所有度量的容器,所有新的度量工具都要注册到一个MetricRegistry实例中才可以使用,尽量在一个应用中保持让这个MetricRegistry实例保持单例。

    Metrics提供了多个指标 Gauges、Counters、Histograms、Meters、Timers

    3.1Timers
    Timer用于统计QPS和耗时,这里用于统记DB查询所耗时间,由于try-catch-resources属性自动stop了,也可以显示调用Context stop方法

    @RestController
    @RequestMapping("/metric")
    public class MetricCtrl {
    
        private static final MetricRegistry metricRegistry = new MetricRegistry();
    
        private Timer timer;
    
        private static ConsoleReporter reporter = ConsoleReporter.forRegistry(metricRegistry).build();//使用控制台打印
    
        @Autowired
        private DailyTradeMarkingDao dailyTradeMarkingDao;//获取用户天维度的标记
    
        @PostConstruct
        public void setup() {
            timer = metricRegistry.timer("dbQuery");
            reporter.start(10, TimeUnit.SECONDS);//报告10秒输出一次
        }
    
        @PostMapping("/timer")
        public JsonResult testTimer() {
            List<DailyTradeMarking> markingList = null;
            try (Timer.Context context = timer.time()) {
                markingList = dailyTradeMarkingDao.getByAccountIdAndStockId(401422L, 14L);
            }
            return JsonResult.ok(markingList);
        }
    }
    
    显示结果:
    -- Timers ----------------------------------------------------------------------
    dbQuery
                 count = 7
             mean rate = 0.12 calls/second
         1-minute rate = 0.08 calls/second
         5-minute rate = 0.02 calls/second
        15-minute rate = 0.01 calls/second
                   min = 42.75 milliseconds
                   max = 1228.59 milliseconds
                  mean = 211.34 milliseconds
                stddev = 401.27 milliseconds
                median = 46.35 milliseconds
                  75% <= 87.25 milliseconds
                  95% <= 1228.59 milliseconds
                  98% <= 1228.59 milliseconds
                  99% <= 1228.59 milliseconds
                99.9% <= 1228.59 milliseconds
    
    

    3.2Meters
    Meter用于测试QPS ,这里统计/meter接口的QPS是多少

    {
        meter = metricRegistry.meter("qps");
        @PostMapping("/meter")
        public JsonResult testMeter() {
            meter.mark();//根据不同的需求设置不同的n ,默认1
            return JsonResult.ok();
        }
    }
    
    
    显示结果:
    
    
    -- Meters ----------------------------------------------------------------------
    qps
                 count = 6
             mean rate = 0.02 events/second
         1-minute rate = 0.09 events/second
         5-minute rate = 0.02 events/second
        15-minute rate = 0.01 events/second
    

    3.3Histograms
    Histogram 是一个统计图表,可以统计次数、最大、最小、平均值等, 这里记录reques长度的大小

    {
        
        histogram = metricRegistry.histogram("request.size");
        @PostMapping("/histogram")
        public JsonResult testHistogram(HttpServletRequest request) {
            histogram.update(request.toString().length());
            return JsonResult.ok();
        }
    }
    显示结果:
    -- Histograms ------------------------------------------------------------------
    request.size
                 count = 8
                   min = 52
                   max = 52
                  mean = 52.00
                stddev = 0.00
                median = 52.00
                  75% <= 52.00
                  95% <= 52.00
                  98% <= 52.00
                  99% <= 52.00
                99.9% <= 52.00
    
    

    3.4 Counters
    counter用来统计次数,这里用来统计大于5的个数有多少个

    {
        
        counter = metricRegistry.counter("count");
        counterFive = metricRegistry.counter("counterFive");
    
        @PostMapping("/counter")
        public JsonResult testCounter() {
            Random random = new Random();
            counter.inc();
            if (random.nextInt(10) > 5) {
                counterFive.inc();
            }
            return JsonResult.ok();
        }
    
    }
    
    
    显示结果:
    -- Counters --------------------------------------------------------------------
    counterFive
                 count = 1
    count
                 count = 7
    

    3.5Gauges
    gauge可以实现自己的度量标准,这里用来检测缓存的大小

    
    {
        private LoadingCache<Integer, Integer> cache = CacheBuilder.newBuilder()
            .maximumSize(1000)
            .refreshAfterWrite(10, TimeUnit.SECONDS).build(
            new CacheLoader<Integer, Integer>() {
                @Override
                public Integer load(Integer key) throws Exception {
                    return 1;
                }
            }
        );
        gauge = metricRegistry.gauge("cache.size", new MetricRegistry.MetricSupplier<Gauge>() {
            @Override
            public Gauge newMetric() {
                return new Gauge<Long>() {
                    @Override
                    public Long getValue() {
                        return cache.size();
                    }
                };
            }
        });
        
        @PostMapping("/gauge")  
        public JsonResult testGauge() throws ExecutionException {
            Random random = new Random();
            cache.get(random.nextInt(100));
            return JsonResult.ok(gauge.getValue());
        }
    }
    
    
    
    
    显示结果:
    -- Gauges ----------------------------------------------------------------------
    cache.size
                 value = 10
    -- Gauges ----------------------------------------------------------------------
    cache.size
                 value = 11
    

    4.数据上报(显示)

    ConsoleReporter reporter = ConsoleReporter.forRegistry(metricRegistry).build();//输出在控制台
    

    也可以继承ScheduledReporter实现自己的聚合格式

    相关文章

      网友评论

          本文标题:Metric

          本文链接:https://www.haomeiwen.com/subject/ciusxhtx.html