在我們的平臺開發(fā)到一定階段之時,線上的機器越來越多,接口調(diào)用也越來越頻繁,此時就需要一些監(jiān)控,從服務器資源,以及業(yè)務指標監(jiān)控.經(jīng)過一些相關(guān)文檔的查詢最終選擇了Metric度量類庫來作為完成監(jiān)控工作的工具。
在Maven中引入依賴
<dependency>
<groupId>io.dropwizard.metrics</groupId>
<artifactId>metrics-core</artifactId>
<version>${metrics.version}</version>
</dependency>
1. Gauges(度量)
2. Counters(計數(shù)器)
3. Histograms(直方圖數(shù)據(jù))
4. Meters(TPS計算器)
5. Timers(計時器)
Metrics中MetricRegistry是中心容器,它是程序中所有度量的容器,所有新的度量工具都要注冊到一個MetricRegistry實例中才可以使用,盡量在一個應用中保持讓這個MetricRegistry實例保持單例。
通過@Bean注解配置指標容器
@Bean
public MetricRegistry metrics() {
return new MetricRegistry();
}
通過度量容器獲得可以在調(diào)用的地方統(tǒng)計接口的請求數(shù)TPS,查詢的次數(shù)QOS,并且根據(jù)時間來進行計算獲取每秒的值。
public String method() {
Meter meter = registry.meter("you-meters-name");
meter.mark();
return "ok";
}
-- Meters ----------------------------------------------------------------------request
count = 21055
mean rate = 133.35 events/second
1-minute rate = 121.66 events/second
5-minute rate = 36.99 events/second???
?15-minute?rate?=?13.33?events/second
public String method() {
Counter counter = registry.counter("you-counter-name");
counter.inc();
return "ok";
}
-- Counters --------------------------------------------------------------------
???????requestCount
count = 21051
以上兩種則是我在近期的工作中所使用到的兩種度量工具,用于統(tǒng)計接口的TPS或者一些需要計數(shù)的場景.至于其他三種工具感興趣的朋友可以自行測試用法與上面兩種用法相同,通過容器的獲取然后調(diào)用即可觸發(fā)監(jiān)控。
在Metrics類庫中提供了四種原生將監(jiān)控信息收集的方式分別是console,JMX,HTTP,Slf4j。
示例
@Bean
public ConsoleReporter consoleReporter(MetricRegistry metrics) {
return ConsoleReporter.forRegistry(metrics)
.convertRatesTo(TimeUnit.SECONDS)
.convertDurationsTo(TimeUnit.MILLISECONDS)
.build();
???????}
以上幾種不同的數(shù)據(jù)收集方式都是通過@Bean的形式將實例注入到容器之中,其根據(jù)設(shè)定好的時間自動運行.不便于我們進行數(shù)據(jù)的入庫管理或計算。
我在實際應用中實現(xiàn)了數(shù)據(jù)收集接口,自定義了入庫邏輯,將收集到的數(shù)據(jù)按照規(guī)定的頻率進行入庫,便于平臺上進行展示,或于系統(tǒng)內(nèi)部做相關(guān)業(yè)務應用。
public class DemoReport extends ScheduledReporter {
private static final Logger log = LoggerFactory.getLogger(DemoReport.class);
/**
* Called periodically by the polling thread. Subclasses should report all the given metrics.
*/
@Override
public void report(SortedMap<String, Gauge> gauges, SortedMap<String, Counter> counters, SortedMap<String, Histogram> histograms, SortedMap<String, Meter> meters, SortedMap<String, Timer> timers){
System.out.println("gauges = " + gauges);
System.out.println("counters = " + counters);
System.out.println("histograms = " + histograms);
System.out.println("meters = " + meters);
meters.entrySet().forEach(item -> {
String key = item.getKey();
System.out.println("key = " + key);
Meter value = item.getValue();
printMeter(value);
});
System.out.println("timers = " + timers);
??????? }
}
啟動監(jiān)控
當以上前置操作完成之后,只需在啟動類處獲取對應的收集工具實例,調(diào)用其start方法便能夠進行所需的指標監(jiān)控。
public static void main(String[] args) {
ConfigurableApplicationContext run = SpringApplication.run(DemoApplication.class, args);
ConsoleReporter bean = run.getBean(ConsoleReporter.class);
? bean.start(5, TimeUnit.SECONDS);
??????? }
注意項
1.將收集的開關(guān)放在啟動類不便于項目的管理可以通過配置文件和@PostConstrust注解的搭配將開關(guān)放入到配置文件中,亦可以通過接口調(diào)用的方式實現(xiàn)開關(guān)。
2.在Metric類庫中單一的工具是已經(jīng)封裝完成的單例,而MetricRegistry是中心容器,并且所有的工具都需要注冊到容器中才能使用,所以也應該讓其實例保持單例。
3.在多節(jié)點情況下各個節(jié)點之間并不互通,需人工的處理各個節(jié)點間數(shù)據(jù)的邏輯問題。