Metric

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实现自己的聚合格式

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,826评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,968评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,234评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,562评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,611评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,482评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,271评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,166评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,608评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,814评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,926评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,644评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,249评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,866评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,991评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,063评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,871评论 2 354

推荐阅读更多精彩内容