比如一個系統後天服務,我們可能需要了解一些下面的一些情況:
1、每秒鐘的請求是多少(TPS)?
2、平均每個請求處理的時間?
3、請求處理最長耗時?
4、等待處理的請求隊列的長度?
Metrics的五中類型:
1.Gauges
一個比較簡單的度量指標,用來統計瞬時狀態,只是一個簡單的返回值。例如我們想統計一個待處理隊列中任務的個數
public static Queue<String> q = new LinkedList<String>()
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(); } });
2.Counter
Counter就是一個計數器,Counter只是用Guages封裝了AtomicLong,維護了一個計數器,可以通過inc()和dec()方法對計數器進行修改
/** * 實例化一個registry,最核心的一個模塊,相當於一個應用程序的metrics系統的容器,維護一個Map */ private static final MetricRegistry metrics = new MetricRegistry(); /** * 實例化一個counter,同樣可以通過如下方式進行實例化再註冊進去 * pendingJobs = new Counter(); * metrics.register(MetricRegistry.name(TestCounter.class, "pending-jobs"), pendingJobs); */ private static Counter pendingJobs = metrics.counter(name(TestCounter.class, "pedding-jobs")); /** * 在控制檯上打印輸出 */ private static ConsoleReporter reporter = ConsoleReporter.forRegistry(metrics).build(); reporter.start(3, TimeUnit.SECONDS); while(true){ add("1"); Thread.sleep(1000); } public static void add(String str) { pendingJobs.inc(); queue.offer(str); }
3. Meters
Meters用來度量一系列事件發生的速率(rate),某個時間段內的平均處理次數(TPS),每1,5,15分鐘和全部事件的的TPS。 比如一個service的請求數,通過mertic.meter()實例化一個meter之後,然後通過meter.mark()方法就能將本次的請求記錄下來。統計結果有總的請求數,平均每秒的請求數,以及最近1,5,15分鐘的平均TPS
MetricRegistry registry = new MetricRegistry(); ConsoleReporter reporter = ConsoleReporter.forRegistry(registry).build(); reporter.start(1, TimeUnit.SECONDS); Meter meterTps = registry.meter(MetricRegistry.name(MeterTest.class, "request", "tps")); while(true) { request(meterTps, random.nextInt(5)); Thread.sleep(1000); }
public static void request(Meter meter) { System.out.println("request"); meter.mark(); } public static void request(Meter meter, int n) { while(n > 0) { request(meter); n--; } }
4.Histograms 統計數據的百分情況。比如最小值,最大值,中位數,75百分位,90百分位,95百分位,98百分位,99百分位,99.9百分位的值
MetricRegistry registry = new MetricRegistry();
ConsoleReporter reporter = ConsoleReporter.forRegistry(registry).build();
reporter.start(1, TimeUnit.SECONDS);
Histogram histogram = new Histogram(new ExponentiallyDecayingReservoir());
registry.register(MetricRegistry.name(HistogramsTest.class, "request", "histogram"), histogram);
while (true)
{
Thread.sleep(1000);
histogram.update(random.nextInt(100000));
}
5.Timer
Timer其實是Histogram和Meter的結合,historram統計某部分代碼/調用的耗時,meter統計TPS
MetricRegistry registry = new MetricRegistry();
ConsoleReporter reporter = ConsoleReporter.forRegistry(registry).build();
reporter.start(1, TimeUnit.SECONDS);
Timer timer = registry.timer(MetricRegistry.name(TimerTest.class, "get-latency"));
Timer.Context ctx;
while (true)
{
ctx = timer.time();
Thread.sleep(random.nextInt(1000));
ctx.stop();
}