1. 程式人生 > >使用Metrics+Influxdb+Grafana監控系統並圖表展示

使用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解決。

這裡只是作為一個演示,這是偏運維的東西,但作為開發人員還是有必要了解一下。