日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java metrics 简书_Metrics 入门文档翻译

發(fā)布時間:2025/3/19 编程问答 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java metrics 简书_Metrics 入门文档翻译 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

作者:拔劍少年

簡書地址:https://www.jianshu.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的方式來認(rèn)識和學(xué)會使用Metrics。

添加Maven 依賴

io.dropwizard.metrics

metrics-core

${metrics.version}

注:metrics.version 填寫最新版本。當(dāng)前版本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() {

@Override

public Integer getValue() {

return queue.size();

}

});

}

}

當(dāng)這個gauge被測量的時候?qū)祷仃犃械拇笮 ?/p>

注:對于大多數(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 results = healthChecks.runHealthChecks();

for (Entry 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)。

總結(jié)

以上是生活随笔為你收集整理的java metrics 简书_Metrics 入门文档翻译的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。