Metrics是一個Java庫,可以對系統進行監控,統計一些系統的性能指標。
比如一個系統后台服務,我們可能需要了解一下下面的一些情況:
1、每秒鍾的請求數是多少(TPS)?
2、平均每個請求處理的時間?
3、請求處理的最長耗時?
4、等待處理的請求隊列長度?
5、又或者一個緩存服務:緩存的命中率?平均查詢緩存的時間?
基本上每一個服務、應用都需要做一個監控系統,這需要盡量以少量的代碼,實現統計某類數據的功能。
Metric Registries
MetricRegistry類是Metrics的核心,它是存放應用中所有metrics的容器,也是我們使用 Metrics 庫的起點。
MetricRegistry registry = new MetricRegistry();
Metrics 數據展示
Metrics 提供了 Report 接口,用於展示 metrics 獲取到的統計數據。metrics-core
中主要實現了四種 reporter: JMX ,console, SLF4J, 和 CSV。 在本文的例子中,我們使用 ConsoleReporter 。
Metrics的五種類型
Gauges
最簡單的度量指標,只有一個簡單的返回值,例如,我們想衡量一個待處理隊列中任務的個數,代碼如下:
package com.zyh.maven.metricsdemo; import com.codahale.metrics.ConsoleReporter; import com.codahale.metrics.Gauge; import com.codahale.metrics.MetricRegistry; import java.util.LinkedList; import java.util.Queue; import java.util.concurrent.TimeUnit; public class GaugeTest { public static Queue<String> q = new LinkedList<String>(); public static void main(String[] args) throws InterruptedException { MetricRegistry metricRegistry = new MetricRegistry(); ConsoleReporter reporter = ConsoleReporter.forRegistry(metricRegistry).build(); reporter.start(1, TimeUnit.SECONDS); metricRegistry.register(MetricRegistry.name(GaugeTest.class, "queue", "size"), new Gauge<Integer>(){ @Override public Integer getValue() { return q.size(); } }); while (true) { Thread.sleep(1000); q.add("張永輝"); } } }
運行結果
18-2-5 14:36:28 ================================================================ -- Gauges ---------------------------------------------------------------------- com.zyh.maven.metricsdemo.GaugeTest.queue.size value = 1 18-2-5 14:36:29 ================================================================ -- Gauges ---------------------------------------------------------------------- com.zyh.maven.metricsdemo.GaugeTest.queue.size value = 1 18-2-5 14:36:30 ================================================================ -- Gauges ----------------------------------------------------------