最近对devOps这个话题有点兴趣,所以研究了一下monitor相关的开源项目,翻到medium上的一篇文章,而且实际项目中也曾看到devOps组的同事搭过类似的监控,就想过把瘾,了解一下监控可视化。
被监控服务配置
本地正好有spring-boot的项目,并且也依赖了jolokia
(主要就是为了把JMX的mbean通过HTTP暴露出去)
项目配置也少不了
endpoints:
enabled: true
jmx:
enabled: true
jolokia:
enabled: true
management:
security:
enabled: false
访问一下URL看看是不是ok
http://localhost:8080/jolokia/read/org.springframework.boot:name=metricsEndpoint,type=Endpoint/Data
搭建监控系统
如果能看到数据,说明server端配置没问题了,下面我们怎么搭建Telegraf + InfluxDB + Grafana呢,这个三个组件是这么配合的,Telegraf实际就是收集信息的,比如每隔10s访问一次上面那个URL得到metrics,收集到的数据存到InfluxDB,然后Grafana做数据可视化。
但是如果纯手动安装实在太麻烦,求助万能的github,找到一个非常棒的项目(https://github.com/samuelebis... 直接fork然后修改一些配置就可以为自己的项目服务了。如果你不了解相关配置可以先直接run起来,然后通过ssh进去一探究竟。
ssh root@localhost -p 22022
配置方面,主要是要修改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。
完成之后重启服务/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]]的例子。
数据可视化
数据有了,下一步就是可视化。
按照Github上面说的进入http://localhost:3003/
,
- Using the wizard click on
Add data source
- Choose a
name
for the source and flag it asDefault
- Choose
InfluxDB
astype
- Choose
direct
asaccess
- Fill remaining fields as follows and click on
Add
without altering other fields
Url: http://localhost:8086
Database: telegraf
User: telegraf
Password: telegraf
添加好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的瓶颈。
这都是需要多年的经验总结才能获得的,我还是菜鸟一枚,再接再厉。