完成一套精准,漂亮圖形化監控系統從這里開始第一步
為啥選擇這些組件
- 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中的面板完成后,這樣一個簡易的本機監控系統就搭建完了: