Spring Boot Actutaur + Telegraf + InFluxDB + Grafana 構建監控平台


完成一套精准,漂亮圖形化監控系統從這里開始第一步

為啥選擇這些組件

  • Jolokia: Spring Boot 認可使用Jolokia來通過HTTP導出export JMX數據。你只需要在工程類路徑中增加一些依賴項,一切都是開箱即用的。不需要任何額外的實現。
  • Telegraf: Telegraf支持通過整合Jolokia來集成JMX數據的收集。它有一個預制的輸入插件,它是開箱即用的。不需要任何額外的實現。只需要做一些配置即可。
  • InfluxDB: InfluxDB通過 輸出插件從Telegraf接收指標數據,它是開箱即用的,不需要任何額外的實現。
  • Grafana: Grafana通過連接InfluxDB作為數據源來渲染圖標。它是開箱即用的,不需要額外的實現。

Telegraf是收集和報告指標和數據的代理

  它是TICK堆棧的一部分,是一個用於收集報告指標的插件驅動的服務器代理。Telegraf擁有插件或集成功能,可直接從運行的系統獲取各種指標,從第三方API獲取指標,甚至通過StatsD和Kafka消費者服務來收聽指標。它還具有輸出插件,可將指標發送到各種其他數據存儲服務消息隊列,包括InfluxDB,Graphite,OpenTSDB,Datadog,Librato,Kafka,MQTT,NSQ等等。

二、搭建監控系統

jolokia把springboot的endpoint暴露出去,telegraf就是采集endpoint收集信息的(比如每隔10s訪問一次上面那個URL得到metrics),收集到的數據存到InfluxDB,然后Grafana連接InfluxDB,讀取數據可視化展示。

2.1、jolokia

Jolokia作為目前最主流的JMX監控組件,spring社區(springboot、MVC、cloud)以及目前主流的中間件服務均采用它作為JMX監控,簡單來說,jolokia可以幫助我們解決:

    1)JMX可以實現VM內部運行時數據狀態的對外export,我們通過將運行態數據封裝成MBean,通過JMX Server統一管理,並允許外部程序通過RMI方式獲取數據。總之,JMX允許運行態數據通過RMI協議被外部程序獲取。這對我們監控、操作VM內部數據提供窗口。

    2)JMX擴展性、可實施能力非常強大,但是其問題就是如果獲取MBean數據,需要使用JAVA棧的RMI協議,這對外部程序比如監控組件(非JAVA棧)支持不夠良好。

    3)jolokia完全兼容並支撐JMX組件,它可以作為agent嵌入到任何JAVA程序中,特別是WEB應用,它將復雜而且難以理解的MBean Filter查詢語句,轉換成更易於實施和操作的HTTP 請求范式,不僅屏蔽了RMI的開發困難問題,還實現了對外部監控組件的透明度,而且更易於測試和使用。

    4)直觀來說,jolokia就是用於解決JMX數據獲取時,所遇到的RMI協議復雜性、Mbean查詢的不便捷、數據庫序列化、MBeanServer的托管等問題;我們只需要使用HTTP請求,直接訪問與WEB服務相同的port即可獲取JMX數據。

Jolokia是一個JMX-HTTP橋梁,它提供了訪問JMX bean的HTTP訪問方法。例如,我要被監控服務是spring-boot的項目,為其gradle配置文件添加jolokia(主要就是為了把JMX的mbean通過HTTP暴露出去)

gradle.build

compile 'org.jolokia:jolokia-core'

然后在springboot的配置文件application.yml配置如下:

endpoints:
    enabled: true                        #打開endpoint
    jmx:
        enabled: true                   #打開endpoint
    jolokia:
        enabled: true                   #打開endpoint

management:
    security:
        enabled: false                   #關閉   

訪問一下URL:

http://localhost:8080/jolokia/read/org.springframework.boot:name=metricsEndpoint,type=Endpoint/Data

 

看看是不是有返回,如下:

如果能看到數據,說明server端配置沒問題了。

2.2、telegraf采集數據

如上面所說,Telegraf實際就是收集信息的,比如每隔10s訪問一次上面那個URL得到metrics,收集到的數據寫入到InfluxDB。

配置方面,主要是要修改Telegraf的,因為它是對接不同項目的,你需要收集什么樣的信息,比如cpu,disk,net等等都要在Telegraf里配。簡單起見,我只設置了三個輸入。

# /etc/telegraf/telegraf.conf
[[inputs.jolokia]]
  context = "/jolokia"

[[inputs.jolokia.servers]]
    name = "springbootapp"
    host = "{app ip address}"
    port = "8080"

[[inputs.jolokia.metrics]]
    name = "metrics"
    mbean  = "org.springframework.boot:name=metricsEndpoint,type=Endpoint"
    attribute = "Data"
    
[[inputs.jolokia.metrics]]
    name = "tomcat_max_threads"
    mbean  = "Tomcat:name=\"http-nio-8080\",type=ThreadPool"
    attribute = "maxThreads"

[[inputs.jolokia.metrics]]
    name = "tomcat_current_threads_busy"
    mbean  = "Tomcat:name=\"http-nio-8080\",type=ThreadPool"
    attribute = "currentThreadsBusy"

其實就是spring-boot標准的metrics以及tomcat的Threads。

再配置telegraf的輸出,還是配置/etc/telegraf/telegraf.conf文件,只是配置的是OUTPUTS部分:

  # The target database for metrics (telegraf will create it if not exists)
  database = "telegraf" # required
  # Precision of writes, valid values are "ns", "us" (or "µs"), "ms", "s", "m", "h".
  # note: using second precision greatly helps InfluxDB compression
  precision = "s"

  ## Write timeout (for the InfluxDB client), formatted as a string.
  ## If not provided, will default to 5s. 0s means no timeout (not recommended).
  timeout = "5s"
  username = "telegraf"
  password = "password"

完成之后重啟服務/etc/init.d/telegraf restart。

查看采集數據

我們訪問InfluxDB看看有數據了沒有http://localhost:3004/,切換數據庫到Telegraf。輸入以下命令試試吧

SHOW MEASUREMENTS SELECT * FROM jolokia SELECT * FROM cpu SELECT * FROM mem SELECT * FROM diskio

比如輸入SELECT * FROM jolokia就能看到spring-boot暴露了哪些數據,從time列也可以看出Telegraf是每隔10s收集一次,太頻繁了對server也是壓力。

上面基本涵蓋了cpu,內存和存儲的一些metrics。
其實也可以配置網絡相關的,感興趣的可以看官方的telegraf.conf,里面有配置[[inputs.net]]的例子。

 2.3、grafana數據可視化

在grafana中配置influxDB的數據源,再添加對應的dashboard展示。

 

添加好InfluxDB后,新建一個Dashboard,然后快速的ADD幾個Graph來。
為了演示,我添加了三個,分別使用下面三組查詢語句來渲染出三張圖表

 

SELECT MEAN(usage_system) + MEAN(usage_user) AS cpu_total FROM cpu WHERE $timeFilter GROUP BY time($interval) SELECT mean("total") as "total" FROM "mem" WHERE $timeFilter GROUP BY time($interval) fill(null) SELECT mean("used") as "used" FROM "mem" WHERE $timeFilter GROUP BY time($interval) fill(null) SELECT mean("metrics_heap.used") as "heap_usage" FROM "jolokia" WHERE $timeFilter GROUP BY time($interval) fill(null)

 

第一張是CPU占用率;第二張是內存占用情況,綠線是Total,黃線是Used;第三張是jolokia提供的jvm heap的使用,可以到看到GC的情況。

 

剛才還配置了Tomcat的收集,想看Tomcat的Thread情況也是妥妥的。

 

SELECT mean("tomcat_max_threads") FROM "jolokia" WHERE $timeFilter GROUP BY time($interval) fill(null) SELECT mean("tomcat_current_threads_busy") FROM "jolokia" WHERE $timeFilter GROUP BY time($interval) fill(null)

 

可以看到搭建這樣一套環境其實很快,原理也並不復雜,監控數據可視化的難點在於

 

  • 哪些metrics需要監控
  • 哪些metrics需要配合起來可以判斷問題,比如diskio+net是不是可以判斷系統整體IO的瓶頸。

 

三、環境搭建

3.1、下載Telegraf、influxdb 、grafana

influxDB的安裝

wget https://dl.influxdata.com/influxdb/releases/influxdb-0.13.0.x86_64.rpm
sudo yum localinstall influxdb-0.13.0.x86_64.rpm
sudo service influxdb start

grafana的安裝

wget https://dl.grafana.com/oss/release/grafana-5.4.3-1.x86_64.rpm 
sudo yum localinstall grafana-5.4.3-1.x86_64.rpm 
systemctl start grafana-server

Telegraf的安裝

wget https://dl.influxdata.com/telegraf/releases/telegraf-1.7.4-1.x86_64.rpm
sudo yum localinstall telegraf-1.7.4-1.x86_64.rpm 
systemctl start telegraf

 安裝完成后,開始配置:

3.2.創建 Influxdb 用戶和數據庫

[root@localhost apm]# influx
Visit https://enterprise.influxdata.com to register for updates, InfluxDB server management, and monitoring.
Connected to http://localhost:8086 version 0.13.0
InfluxDB shell version: 0.13.0
> create user "telegraf" with password 'password'
> show users;
user        admin
telegraf    false

> create database telegraf
> show databases
name: databases
---------------
name
_internal
telegraf
> exit

3.3.配置Telegraf

[root@localhost apm]# vim /etc/telegraf/telegraf.conf
   ## 修改內容如下: 
   [[outputs.influxdb]]
     urls = ["http://localhost:8086"] # required 
     database = "telegraf" # required
     retention_policy = ""
     precision = "s"
     timeout = "5s"
     username = "telegraf"
     password = "password"    
[root@localhost apm]# systemctl restart telegraf

3.4、grafana配置telegraf,打開grafana的控制台:http://ip:3000

從左邊的設置菜單欄找到數據源配置項,添加上面的庫信息,結果如下:

3.5.點擊new創建一個Dashboards

創建儀表盤。我們可以通過訪問https://grafana.com/dashboards來查看已經由其他用戶共享的儀表盤,選取合適的使用,縮短上手時間。在這里,作者選取的是https://grafana.com/dashboards/1443這個儀表盤,該儀表盤內已經基本涵蓋一個系統需要監控的相關參數。

看結果:

點擊metrics,配置收集到的收據信息,實際就是寫sql查詢,不同數據庫數據sql書寫方式不同

查看http://localhost:8083,可以發現telegraf庫中,默認有4個Measurements(表):

 

配置Grafana中的面板完成后,這樣一個簡易的本機監控系統就搭建完了:

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM