Metrics使用常規概念介紹

在我們系統運營過程中,需要時刻掌握系統的運行狀態。狀態監控是進行預警告警,異常排除,故障排查,應急實施的重要依據。在常規運維繫統中我們有很好的工具可以監控服務器的運行狀態,但是對業務系統的運行狀態監控往往是比較欠缺的。本文介紹的是一個java運行狀態監控工具Metrics。Metrics本來是一個Java庫, 捕獲JVM和應用程序級指標,當我們需要爲某個系統某個服務做監控、做統計,就需要用到Metrics。Metrics可以監控代碼級別的數據指標,比如TPS,RT等指標。這個指標能反應系統當前的處理能力,幫助我們判斷資源是否已經不足,服務狀態是否健康。

認識Metrics主要就是認識Metrics的核心類MetricRegistry和5種基本的度量類型:Meters Gauges  Counters   Histograms   和 Timers,以及四種 reporter數據報告工具:JMX, console, SLF4J, 和 CSV。

引入Metrics配置


使用Metrics之前,我們需要在pom.xml中依賴 metrics-core 包:

<dependencies>
        <dependency>
            <groupId>io.dropwizard.metrics</groupId>
            <artifactId>metrics-core</artifactId>
            <version>3.2.6</version>
        </dependency>
        
        <dependency>
            <groupId>io.dropwizard.metrics</groupId>
            <artifactId>metrics-healthchecks</artifactId>
            <version>3.2.6</version>
        </dependency>
</dependencies>


核心類MetricRegistry


MetricRegistry是Metics的核心類,在Metrics應用中作爲其他度量的容器。所有的度量工具需要註冊到MetricRegistry實例中。


五種 Metrics 類型


Gauges (儀表)
       Gauges是一個儀表盤,它是最簡單的度量指標,只有一個簡單的返回值,或者叫瞬時狀態,類似我們汽車上的儀表盤,反應車輛的實時運行狀態。Gauges用來獲取的值最好是在應用中維護好的唯一值,如果返回值需要做額外的處理則會導致Gauges效率降低。通常這在系統設計中是不可取的,我們不能讓監控系統影響業務系統的服務能量。

registry.register(name(SessionStore.class, "cache-evictions"), new Gauge<Integer>() {
    @Override
    public Integer getValue() {
        return cache.getEvictionsCount();
    }
});


Counters
       Counter 就是計數器,可以通過inc()和dec()方法對計數器做修改。Counter 只是用 Gauge 封裝了 AtomicLong。通常用在消息隊列,請求連接數上,用來獲取當前隊列或者請求數的數量大小。

final Counter evictions = registry.counter(name(SessionStore.class, "cache-evictions"));
evictions.inc();
evictions.inc(3);
evictions.dec();
evictions.dec(2);

Meters
         Meter是一種只能自增的計數器,用來度量一系列事件發生的速率(rate),例如統計函數調用頻率TPS,統計數據庫查詢次數QPS都可以使用Meters。Meters可以統計最近1分鐘,5分鐘,15分鐘,還有全部時間的速率。
Histograms度量一系列事件響應的效率(rate),例如統計某個函數的響應時長(RT)。

final Meter getRequests = registry.meter(name(WebProxy.class, "get-requests", "requests"));
getRequests.mark();
getRequests.mark(requests.size());

Histograms

final Histogram resultCounts = registry.histogram(name(ProductDAO.class, "result-counts");
resultCounts.update(results.size());


Timers
       Timers是Meters和Histograms的集成,當我們既要統計TPS又要統計耗時時,我們會使用Timers。

final Timer timer = registry.timer(name(WebProxy.class, "get-requests"));

final Timer.Context context = timer.time();
try {
    // handle request
} finally {
    context.stop();
}


HealthCheck
 HealthCheck 用來檢測某個某個系統是否健康,例如數據庫連接是否正常。

四種 reporter數據報告工具

Metrics本身不提供圖表化的報告工具,但是它提供了很多模塊可以爲第三方庫或者應用提供輔助統計信息, 比如Jetty, Logback, Log4j, Apache HttpClient, Ehcache, JDBI, Jersey, 它還可以將度量數據發送給Ganglia和Graphite以提供圖形化的監控。


使用經驗總結
        一般情況下,當我們需要統計某個函數被調用的頻率(TPS),會使用Meters。當我們需要統計某個函數的執行耗時時,會使用Histograms。當我們既要統計TPS又要統計耗時時,我們會使用Timers。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章