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等等。spring

2、搭建監控系統

jolokia把springboot的endpoint暴露出去,telegraf就是採集endpoint收集信息的(好比每隔10s訪問一次上面那個URL獲得metrics),收集到的數據存到InfluxDB,而後Grafana鏈接InfluxDB,讀取數據可視化展現。sql

2.一、jolokia

Jolokia做爲目前最主流的JMX監控組件,spring社區(springboot、MVC、cloud)以及目前主流的中間件服務均採用它做爲JMX監控,簡單來講,jolokia能夠幫助咱們解決:shell

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

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

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

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

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

gradle.build網絡

compile 'org.jolokia:jolokia-core'

而後在springboot的配置文件application.yml配置以下:app

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.二、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.三、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、環境搭建

3.一、下載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.四、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中的面板完成後,這樣一個簡易的本機監控系統就搭建完了:

 

相關文章
相關標籤/搜索