Java Metrics 系統性能監控工具的五種類型

比如一個系統後天服務,我們可能需要了解一些下面的一些情況:

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();
        }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章