系統(tǒng)開發(fā)到一定的階段,線上的機器越來越多,就需要一些監(jiān)控了,除了服務(wù)器的監(jiān)控,業(yè)務(wù)方面也需要一些監(jiān)控服務(wù)。[Metrics](http://metrics.dropwizard.io/3.1.0/getting-started/)作為一款監(jiān)控指標的度量類庫,提供了許多工具幫助開發(fā)者來完成自定義的監(jiān)控工作。
Metrics的基本工具
Metrics提供了五個基本的度量類型:
- Gauges(度量)
- Counters(計數(shù)器)
- Histograms(直方圖數(shù)據(jù))
- Meters(TPS計算器)
- Timers(計時器)
Metrics中MetricRegistry是中心容器,它是程序中所有度量的容器,所有新的度量工具都要注冊到一個MetricRegistry實例中才可以使用,盡量在一個應(yīng)用中保持讓這個MetricRegistry實例保持單例。
Meters TPS計算器
TPS計算器這個名稱并不準確,Meters工具會幫助我們統(tǒng)計系統(tǒng)中某一個事件的速率。比如每秒請求數(shù)(TPS),每秒查詢數(shù)(QPS)等等。這個指標能反應(yīng)系統(tǒng)當(dāng)前的處理能力,幫助我們判斷資源是否已經(jīng)不足。Meters本身是一個自增計數(shù)器。
通過MetricRegistry可以獲得一個Meter:
|
<pre style="margin: 0px; tab-size: 4; white-space: pre-wrap;">public Meter requestMeter(MetricRegistry metrics) {
return metrics.meter("request");
}</pre>
|
在請求中調(diào)用mark()方法,來增加計數(shù),我們可以在不同的請求中添加不同的Meter,針對自己的系統(tǒng)完成定制的監(jiān)控需求。
|
<pre style="margin: 0px; tab-size: 4; white-space: pre-wrap;">@RequestMapping("/hello")
@ResponseBody
public String helloWorld() {
requestMeter.mark();
return "Hello World";
}</pre>
|
Counter 計數(shù)器
Counter的本質(zhì)就是一個AtomicLong實例,可以增加或者減少值,可以用它來統(tǒng)計隊列中Job的總數(shù)。
通過MetricRegistry也可以獲得一個Counter實例。
|
<pre style="margin: 0px; tab-size: 4; white-space: pre-wrap;">public Counter pendingJobs(MetricRegistry metrics) {
return metrics.counter("requestCount");
}</pre>
|
在需要統(tǒng)計數(shù)據(jù)的位置調(diào)用inc()和dec()方法。
|
<pre style="margin: 0px; tab-size: 4; white-space: pre-wrap;">// 增加計數(shù)
pendingJobs.inc();
// 減去計數(shù)
pendingJobs.dec();</pre>
|
Reporter 報表
Metrics通過報表,將采集的數(shù)據(jù)展現(xiàn)到不同的位置,這里比如我們注冊一個ConsoleReporter到MetricRegistry中,那么console中就會打印出對應(yīng)的信息。
|
<pre style="margin: 0px; tab-size: 4; white-space: pre-wrap;">public ConsoleReporter consoleReporter(MetricRegistry metrics) {
return ConsoleReporter.forRegistry(metrics)
.convertRatesTo(TimeUnit.SECONDS)
.convertDurationsTo(TimeUnit.MILLISECONDS)
.build();
}
</pre>
|
除此之外Metrics還支持JMX、HTTP、Slf4j等等,可以訪問 http://metrics.dropwizard.io/3.1.0/manual/core/#reporters 來查看Metrics提供的報表,如果還是不能滿足自己的業(yè)務(wù),也可以自己繼承Metrics提供的ScheduledReporter類完成自定義的報表類。