它是TICK堆棧的一部分,是一個用於收集和報告指標的插件驅動的服務器代理。Telegraf擁有插件或集成功能,可直接從運行的系統獲取各類指標,從第三方API獲取指標,甚至經過StatsD和Kafka消費者服務來收聽指標。它還具備輸出插件,可將指標發送到各類其餘數據存儲,服務和消息隊列,包括InfluxDB,Graphite,OpenTSDB,Datadog,Librato,Kafka,MQTT,NSQ等等。spring
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端配置沒問題了。
如上面所說,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]]的例子。
在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)
能夠看到搭建這樣一套環境其實很快,原理也並不複雜,監控數據可視化的難點在於
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中的面板完成後,這樣一個簡易的本機監控系統就搭建完了: