它是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中的面板完成后,这样一个简易的本机监控系统就搭建完了: