java metrics 简书_Metrics 入门文档翻译
作者:拔劍少年
簡書地址:https://www.jianshu.com/u/dad4d9675892
博客地址:https://it18monkey.github.io
轉載請注明出處
Metrics 是一個Java庫,它讓您對代碼在生產中所做的事情有了無與倫比的洞察力。
Metrics 提供了一種強大的工具集用于度量生產環境中關鍵組件的行為。
對于常見的庫,如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.
首先,我們通過在現有程序中添加Metrics的方式來認識和學會使用Metrics。
添加Maven 依賴
io.dropwizard.metrics
metrics-core
${metrics.version}
注:metrics.version 填寫最新版本。當前版本3.2.3
Meters
Meter用來測量事件的速率(比如每秒的請求等),除了平均速率,Meters也可以追蹤1-5-15分鐘的移(或流、滑)動平均數
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的容器。所以程序一開始就創建了一個
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();
}
});
}
}
當這個gauge被測量的時候將會返回隊列的大小。
注:對于大多數隊列或類似隊列的數據結構來說,你可能不會想簡單的返回queue.size().因為這個方法的大多數實現都是O(n)的,哪可能會導致gague變得非常慢(可能還會有鎖問題)
每個注冊的metric都有一個唯一的名稱,僅僅是一個分隔的字符串像是“things.count”或“com.example.Thing.latency”。MetriRegistry提供了一個靜態方法來生成這些名稱。
MetricRegistry.name(QueueManager.class, "jobs", "size")
它會返回一個類似“com.example.QueueManager.jobs.size”的字符串。
Counters
counter 是gauge的原子級別實現
Histograms
hostogram 度量數據流中的值的統計分布。除了最小值、最大值、平均值等,它還測量了中位數、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 將會度量響應的字節長度。
Timers
timer 度量特定代碼段的速率和其持續時間的分布。
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 將會度量每個請求的執行時間并且提供每秒請求的速率。
Health Checks
metrics 也可以通過metrics-healthchecks模塊集中檢測服務的健康狀況
首先,創建一個新的HealthCheckRegistry實例:
final HealthCheckRegistry healthChecks = new HealthCheckRegistry();
第二步,實現一個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());
}
}
}
然后注冊一個實例到之前創建的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 附帶一個預先構建的健康檢查:ThreadDeadlockHealthCheck,它使用Java的內置線程死鎖檢測來確定是否有任何線程處于死鎖狀態。
總結
以上是生活随笔為你收集整理的java metrics 简书_Metrics 入门文档翻译的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java的语法结构_Java中的语法规范
- 下一篇: winform 转 JAVA_C#转ja