使用Metrics+Influxdb+Grafana監控系統並圖表展示
本文使用的metrics-core和metrics-influxdb版本如下:
metrics-core=4.0.0
metrics-influxdb=0.8.0
jdk版本1.8
使用metrics統計controller的訪問數
maven依賴
新增metrics-core
<dependency>
<groupId>io.dropwizard.metrics</groupId>
<artifactId>metrics-core</artifactId>
<version>${metrics.version}</ version>
</dependency>
定義Metric配置
@Configuration
public class MetricsConfig {
@Bean
public MetricRegistry metricRegistry() {
MetricRegistry registry = new MetricRegistry();
// 輸出到控制檯
ConsoleReporter reporter = ConsoleReporter.forRegistry(registry)
. convertRatesTo(TimeUnit.SECONDS)
.convertRatesTo(TimeUnit.SECONDS)
.build();
reporter.start(5,TimeUnit.SECONDS);
return registry;
}
@Bean
public Meter userControllerMeter(MetricRegistry registry) {
Meter meter = registry.meter("userControllerMeter" );
return meter;
}
}
測試Controller:
@Controller
@RequestMapping(value = "/user")
public class UserController {
@Autowired
@Qualifier("userControllerMeter")
private Meter userControllerMeter;
/**
* 儲存使用者資訊的List。
*/
private Map<String,String> userInfos = new HashMap<String,String>(5) {{
put("test","測試使用者");
put("root","root使用者");
put("admin","管理員");
}};
@RequestMapping(value = "/get")
public ModelAndView test(ModelAndView mv, @RequestParam String userid) {
userControllerMeter.mark();
String user = getUserById(userid);
mv.setViewName("/test");
mv.addObject("user",user);
return mv;
}
/**
* 模擬一個獲取使用者資訊的操作。
* @param userid
* @return
*/
private String getUserById(String userid) {
if (StringUtils.isEmpty(userid)) {
return null;
}
// 這裡模擬是一個耗時的操作,比如從其他系統獲取使用者資訊。
long sleepTime = (long) (Math.random()*10*1000+1);
try {
Thread.sleep(sleepTime);
} catch (InterruptedException e) {
e.printStackTrace();
}
return userInfos.get(userid);
}
}
在瀏覽器中輸入http://localhost:8081/user/get?userid=test,並訪問多次。
控制檯輸出:
可以看到,Meters統計了總的訪問次數,當前的頻率(每秒多少次),1分鐘內、5分鐘內、15分鐘內的頻率。
使用Metrics統計某個方法的呼叫時間
這裡我們統計呼叫UserController中
1.MetricsConfig增加:
@Bean
public Timer getUserTime(MetricRegistry registry) {
Timer timer = registry.timer("getUserTimeTimer");
return timer;
}
2.UserController修改
@Autowired
@Qualifier("getUserTime")
private Timer getUserTime;
// 統計呼叫getUserById耗費的時間
Timer.Context context = getUserTime.time();
String user = getUserById(userid);
context.stop();
在瀏覽器中輸入http://localhost:8081/user/get?userid=test,並訪問多次。
控制檯輸出:
可以看到,Timer統計了總的呼叫次數,當前的呼叫次數(每秒多少次)、1分鐘、5分鐘、15分鐘,最小耗時,最大耗時,平均耗時,75%的呼叫耗時,95%,98%,99%的呼叫耗時。
Metrics資料的視覺化
這裡以Influxdb和Grafana來構建一個實時的監控介面。
處理流程如下:採集資料(Metrics)——>儲存資料(InfluxDB)——>展示資料(Grafana)。
安裝InfluxDB
wget http://dl.influxdata.com/influxdb/releases/influxdb-0.12.2-1.x86_64.rpm
yum localinstall influxdb-0.12.2-1.x86_64.rpm
安裝後啟動服務:
service influxdb start
啟動成功後,瀏覽器輸入ip:8083訪問。
到設定中,
可以看到http埠為8086,使用者名稱和密碼為空,這裡我們設定使用者名稱和密碼都為root。
安裝Grafana
wget https://s3-us-west-2.amazonaws.com/grafana-releases/release/grafana-4.2.0-1.x86_64.rpm
sudo yum localinstall grafana-4.2.0-1.x86_64.rpm
安裝後啟動服務:
service grafana-server start
瀏覽器輸入IP:3000訪問,使用者名稱和密碼為admin。
將資料收集到Influxdb
前面我們將資料直接輸出到控制檯,我們制定的Metrics Reporter為ConsoleReporter
,這裡寫入Influxdb,需要引入一個依賴:
<dependency>
<groupId>com.github.davidb</groupId>
<artifactId>metrics-influxdb</artifactId>
<version>${metrics.influxdb.version}</version>
</dependency>
MetricsConfig修改:
我們將收集到的統計資料傳送到InfluxDB
ScheduledReporter reporter = InfluxdbReporter.forRegistry(registry)
// influxdb的ip,port,使用者名稱,密碼,資料庫
.protocol(InfluxdbProtocols.http("192.168.200.99",8086,"root","root","my-influxdb"))
.convertRatesTo(TimeUnit.SECONDS)
.convertDurationsTo(TimeUnit.MILLISECONDS)
.filter(MetricFilter.ALL)
.skipIdleMetrics(false)
.build();
reporter.start(5,TimeUnit.SECONDS);
我們到InfluxDB的管理頁面建立一個數據庫
點選Create Database
,在Query中填入CREATE DATABASE "my-influxdb"
然後回車,資料庫就建立好了。
在Grafana的管理頁面新建一個DataSource
,
在Home
頁面,New一個dashboard
點Graph
點Panel Title
點Edit
點General
可以修改標題
在Metrics
中,點SQL可以視覺化編輯SQL。A From
後面的default
是預設資料來源(在上面新建資料來源時可以指定為預設資料來源,或自己指定為你上面建立資料來源名稱),userControllerMeter
是表名。在上面MetricsConfig中指定的名稱,我們也可以在Influxdb中根據它來查詢。如圖:
第二行field(value)
即我們要監控的指標,這裡對應的就是count
欄位,ALIAY BY
即是欄位的別名,圖表中顯示用。點空白處,如果圖表還是沒資料,將日期顯示範圍擴大。
這樣,就可以看到如下的圖表
遇到的問題:
Caused by: java.lang.UnsupportedClassVersionError: com/justin/metrics/config/MetricsConfig : Unsupported major.minor version 52.0 (unable to load class com.justin.metrics.config.MetricsConfig)。
我的metrics-demo模組用的jdk7,引入的metrics-influxdb版本是0.8.2(mvn倉庫最低就是這個版本),但0.8.2使用的jdk8編譯的,所以有這個問題。
但是,將metrics-demo模組的jdk改成1.8後,還是有這個問題。最後更改整個project的版本為1.8解決。
這裡只是作為一個演示,這是偏運維的東西,但作為開發人員還是有必要了解一下。