Metrics 入門文檔翻譯

作者:拔劍少年

簡書地址:http://www.reibang.com/u/dad4d9675892
博客地址:https://it18monkey.github.io
轉(zhuǎn)載請注明出處
Metrics 是一個Java庫脖祈,它讓您對代碼在生產(chǎn)中所做的事情有了無與倫比的洞察力俊扳。
Metrics 提供了一種強大的工具集用于度量生產(chǎn)環(huán)境中關(guān)鍵組件的行為翔冀。
對于常見的庫靴患,如Jetty皂甘、Logback、Log4j谈截、Apache HttpClient台舱、Ehcache、JDBI第岖、Jersey和像Ganglia和Graphite等報告后端难菌,Metrics 提供了全棧的可見性。

metric核心:

主要類:Metric registries.
Metrics 主要有五種度量類型 :Gauges, Counters,Histograms, Meters, and Timers.
匯報方式:JMX, theconsole, CSV files, andSLF4J loggers.

首先蔑滓,我們通過在現(xiàn)有程序中添加Metrics的方式來認識和學(xué)會使用Metrics郊酒。

添加Maven 依賴

<dependencies>
    <dependency>
        <groupId>io.dropwizard.metrics</groupId>
        <artifactId>metrics-core</artifactId>
        <version>${metrics.version}</version>
    </dependency>
</dependencies>

注:metrics.version 填寫最新版本。當前版本3.2.3

Meters

Meter用來測量事件的速率(比如每秒的請求等)键袱,除了平均速率燎窘,Meters也可以追蹤1-5-15分鐘的移(或流、滑)動平均數(shù)

private final MetricRegistry metrics = new MetricRegistry();
private final Meter requests = metrics.meter("requests");

public void handleRequest(Request request, Response response) {
    requests.mark();
    // etc
}

Meters 將會測量每秒請求的速率蹄咖。

Console Reporter

Console Reporter 顧名思義是用來匯報到控制臺的褐健。下面的示例將會每秒打印一次

ConsoleReporter reporter = ConsoleReporter.forRegistry(metrics)
       .convertRatesTo(TimeUnit.SECONDS)
       .convertDurationsTo(TimeUnit.MILLISECONDS)
       .build();
   reporter.start(1, TimeUnit.SECONDS);

完整代碼:

  package sample;
  import com.codahale.metrics.*;
  import java.util.concurrent.TimeUnit;

  public class GetStarted {
    static final MetricRegistry metrics = new MetricRegistry();
    public static void main(String args[]) {
      startReport();
      Meter requests = metrics.meter("requests");
      requests.mark();
      wait5Seconds();
    }

  static void startReport() {
      ConsoleReporter reporter = ConsoleReporter.forRegistry(metrics)
          .convertRatesTo(TimeUnit.SECONDS)
          .convertDurationsTo(TimeUnit.MILLISECONDS)
          .build();
      reporter.start(1, TimeUnit.SECONDS);
  }

  static void wait5Seconds() {
      try {
          Thread.sleep(5*1000);
      }
      catch(InterruptedException e) {}
  }
}

Registry

Metrics的中心是MetricRegistry 類,它是你程序中所有metric的容器澜汤。所以程序一開始就創(chuàng)建了一個

 static final MetricRegistry metrics = new MetricRegistry();

Gauges

gauge可一用來實時測量一個值蚜迅。舉個例子,我們可能想要測量一個阻塞隊列的大小俊抵。

public class QueueManager {
    private final Queue queue;

    public QueueManager(MetricRegistry metrics, String name) {
        this.queue = new Queue();
        metrics.register(MetricRegistry.name(QueueManager.class, name, "size"),
                         new Gauge<Integer>() {
                             @Override
                             public Integer getValue() {
                                 return queue.size();
                             }
                         });
    }
}

當這個gauge被測量的時候?qū)祷仃犃械拇笮 ?br> 注:對于大多數(shù)隊列或類似隊列的數(shù)據(jù)結(jié)構(gòu)來說谁不,你可能不會想簡單的返回queue.size().因為這個方法的大多數(shù)實現(xiàn)都是O(n)的,哪可能會導(dǎo)致gague變得非常慢(可能還會有鎖問題)

每個注冊的metric都有一個唯一的名稱务蝠,僅僅是一個分隔的字符串像是“things.count”或“com.example.Thing.latency”拍谐。MetriRegistry提供了一個靜態(tài)方法來生成這些名稱烛缔。

MetricRegistry.name(QueueManager.class, "jobs", "size")

它會返回一個類似“com.example.QueueManager.jobs.size”的字符串馏段。

Counters

counter 是gauge的原子級別實現(xiàn)


Histograms

hostogram 度量數(shù)據(jù)流中的值的統(tǒng)計分布轩拨。除了最小值、最大值院喜、平均值等亡蓉,它還測量了中位數(shù)、75喷舀、90砍濒、95、98硫麻、99和99.9%爸邢。

private final Histogram responseSizes = metrics.histogram(name(RequestHandler.class, "response-sizes"));

public void handleRequest(Request request, Response response) {
    // etc
    responseSizes.update(response.getContent().length);
}

上面的histograms 將會度量響應(yīng)的字節(jié)長度。

Timers

timer 度量特定代碼段的速率和其持續(xù)時間的分布拿愧。

private final Timer responses = metrics.timer(name(RequestHandler.class, "responses"));

public String handleRequest(Request request, Response response) {
    final Timer.Context context = responses.time();
    try {
        // etc;
        return "OK";
    } finally {
        context.stop();
    }
}

這個timer 將會度量每個請求的執(zhí)行時間并且提供每秒請求的速率杠河。

Health Checks

metrics 也可以通過metrics-healthchecks模塊集中檢測服務(wù)的健康狀況
首先,創(chuàng)建一個新的HealthCheckRegistry實例:

final HealthCheckRegistry healthChecks = new HealthCheckRegistry();

第二步浇辜,實現(xiàn)一個healthcheck子類

public class DatabaseHealthCheck extends HealthCheck {
    private final Database database;

    public DatabaseHealthCheck(Database database) {
        this.database = database;
    }

    @Override
    public HealthCheck.Result check() throws Exception {
        if (database.isConnected()) {
            return HealthCheck.Result.healthy();
        } else {
            return HealthCheck.Result.unhealthy("Cannot connect to " + database.getUrl());
        }
    }
}

然后注冊一個實例到之前創(chuàng)建的healthChecks 上券敌。

healthChecks.register("postgres", new DatabaseHealthCheck(database));

運行所有已注冊的健康檢查:

final Map<String, HealthCheck.Result> results = healthChecks.runHealthChecks();
for (Entry<String, HealthCheck.Result> entry : results.entrySet()) {
    if (entry.getValue().isHealthy()) {
        System.out.println(entry.getKey() + " is healthy");
    } else {
        System.err.println(entry.getKey() + " is UNHEALTHY: " + entry.getValue().getMessage());
        final Throwable e = entry.getValue().getError();
        if (e != null) {
            e.printStackTrace();
        }
    }
}

Metrics 附帶一個預(yù)先構(gòu)建的健康檢查:ThreadDeadlockHealthCheck,它使用Java的內(nèi)置線程死鎖檢測來確定是否有任何線程處于死鎖狀態(tài)柳洋。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末待诅,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子熊镣,更是在濱河造成了極大的恐慌卑雁,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,968評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件绪囱,死亡現(xiàn)場離奇詭異测蹲,居然都是意外死亡,警方通過查閱死者的電腦和手機毕箍,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評論 2 382
  • 文/潘曉璐 我一進店門弛房,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人而柑,你說我怎么就攤上這事文捶。” “怎么了媒咳?”我有些...
    開封第一講書人閱讀 153,220評論 0 344
  • 文/不壞的土叔 我叫張陵粹排,是天一觀的道長。 經(jīng)常有香客問我涩澡,道長顽耳,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,416評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮射富,結(jié)果婚禮上膝迎,老公的妹妹穿的比我還像新娘。我一直安慰自己胰耗,他們只是感情好限次,可當我...
    茶點故事閱讀 64,425評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著柴灯,像睡著了一般卖漫。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上赠群,一...
    開封第一講書人閱讀 49,144評論 1 285
  • 那天羊始,我揣著相機與錄音,去河邊找鬼查描。 笑死突委,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的叹誉。 我是一名探鬼主播鸯两,決...
    沈念sama閱讀 38,432評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼长豁!你這毒婦竟也來了钧唐?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,088評論 0 261
  • 序言:老撾萬榮一對情侶失蹤匠襟,失蹤者是張志新(化名)和其女友劉穎钝侠,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體酸舍,經(jīng)...
    沈念sama閱讀 43,586評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡帅韧,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,028評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了啃勉。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片忽舟。...
    茶點故事閱讀 38,137評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖淮阐,靈堂內(nèi)的尸體忽然破棺而出叮阅,到底是詐尸還是另有隱情,我是刑警寧澤泣特,帶...
    沈念sama閱讀 33,783評論 4 324
  • 正文 年R本政府宣布浩姥,位于F島的核電站,受9級特大地震影響状您,放射性物質(zhì)發(fā)生泄漏勒叠。R本人自食惡果不足惜兜挨,卻給世界環(huán)境...
    茶點故事閱讀 39,343評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望眯分。 院中可真熱鬧拌汇,春花似錦、人聲如沸颗搂。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽丢氢。三九已至,卻和暖如春先改,著一層夾襖步出監(jiān)牢的瞬間疚察,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評論 1 262
  • 我被黑心中介騙來泰國打工仇奶, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留貌嫡,地道東北人。 一個月前我還...
    沈念sama閱讀 45,595評論 2 355
  • 正文 我出身青樓该溯,卻偏偏與公主長得像岛抄,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子狈茉,可洞房花燭夜當晚...
    茶點故事閱讀 42,901評論 2 345

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理夫椭,服務(wù)發(fā)現(xiàn),斷路器氯庆,智...
    卡卡羅2017閱讀 134,601評論 18 139
  • 系統(tǒng)開發(fā)到一定的階段蹭秋,線上的機器越來越多,就需要一些監(jiān)控了堤撵,除了服務(wù)器的監(jiān)控仁讨,業(yè)務(wù)方面也需要一些監(jiān)控服務(wù)。Metr...
    whthomas閱讀 34,310評論 12 47
  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,748評論 6 342
  • 讀過第一篇实昨,Springboot 之 actuator洞豁, 即對metrics有了一定認識和理解, 本文將以metr...
    點融黑幫閱讀 6,278評論 2 6
  • 本文章翻譯自http://www.rabbitmq.com/api-guide.html荒给,并沒有及時更新丈挟。 術(shù)語對...
    joyenlee閱讀 7,636評論 0 3