如何搭建一个监控系统
生产环境必须是可监控的,一个对开发者黑盒的线上应用无异于灾难。一个简单的监控系统大致包含以下几部分:
- 采集数据
- 保存数据
- 数据可视化
- 监控告警
![ae8b5027e2eb8727273c16d9756a12de.png](https://i-blog.csdnimg.cn/blog_migrate/18e5dbd4494ac275db1a315b42b65fbc.jpeg)
从一个熟悉的画面开始:
![eb6f50e4f6725afc4d4d2164a6c7b6cb.png](https://i-blog.csdnimg.cn/blog_migrate/6e771d39b5a678b2d312dc02079a9ed1.jpeg)
这是javaer每天都会看到的一个画面,当然为了减少bug,有时候也需要借助一下来自东方的神秘力量
![51ac9d69af049546a71460a06bf9a04c.png](https://i-blog.csdnimg.cn/blog_migrate/7b0e6e533879506f67b96fde7f56be2b.jpeg)
仔细看console的第一行,灰色字体&被折叠,看起来很不起眼,就被忽略了。
![75e02aad88d8b5cfd77f2364c9390541.png](https://i-blog.csdnimg.cn/blog_migrate/4dcbdfa5373fdc1b6d086e6cb71559a7.jpeg)
展开后内容如下
![601022b14a0f3d17e5a011bb1e6277ad.png](https://i-blog.csdnimg.cn/blog_migrate/045e82914605aa5ae4356e0e0ab7cc73.jpeg)
出现频率最高的单词是 jmxremote,这是我们需要了解的第一个概念 JMX。
JMX
JMX(Java Management Extensions,即Java管理扩展)是Java平台上为应用程序、设备、系统等植入管理功能的框架。 --wikipedia
如何做到管理功能呢?
- 监控指标,包括业务监控&系统性能监控
- 执行方法
我们通过架构图来看一下,JMX如何实现这两个功能。
![e04b165b74267459d478e1f0df451687.png](https://i-blog.csdnimg.cn/blog_migrate/2c7cef44690a5cbaa13c9d91b1ae41c6.jpeg)
- 接入层,提供远程访问接口
- 适配层,对资源的管理和注册
- MBean,提供变量or函数
还是不够直观,我们来具体看一下jmx能做什么。
在控制台中输入 jconsole,你可以看到一个java GUI风格的工具窗口,这是jdk自带用于jmx连接&展示的工具。
![3f670f16bdda0ca32fc82ca83167a04e.png](https://i-blog.csdnimg.cn/blog_migrate/17374b1f0ad29d8624201b748114bc4e.jpeg)
可以通过JDK提供的MBean查看线程、内存、CPU占用,检测死锁、执行GC。也可以通过三方按照JMX标准提供的MBean,查看or执行封装的函数方法。
![7f4e79adb8f0162d5c6a5d29fdb6d2f5.png](https://i-blog.csdnimg.cn/blog_migrate/564888b9019127a2b78b4b67b30f3753.jpeg)
以 SpringApplicationAdminMXBean为例,声明了一个包含函数的interface作为MBean,并将实现类注册到MBeanServer服务中。用到了一个委托模式。
![eb374cb5dab1ee41f64d11d528686e99.png](https://i-blog.csdnimg.cn/blog_migrate/926f75acac3024814e191e1641b646fc.jpeg)
![2b54cc2e0fcbf267fd3f423a62595326.png](https://i-blog.csdnimg.cn/blog_migrate/79799eeea9c562952d65b1741dc5df40.jpeg)
- JConsole会根据方法及返回值,判断是指标还是可执行函数。
- 除了指标和函数,还有通知。但是JMX并不保证所有通知都会被监听器接收
influxdb
知道了数据如何产生,接下来需要考虑数据如何持久化。
InfluxDB是一个由InfluxData开发的开源时序型数据库。它由Go写成,着力于高性能地查询与存储时序型数据。InfluxDB被广泛应用于存储系统的监控数据,IoT行业的实时数据等场景。
选型原因是influxdb有以下特点
- 可度量性:你可以实时对大量数据进行计算
- 无结构(无模式):可以是任意数量的列
- 原生的HTTP支持,内置HTTP API
- 基于时间序列,支持与时间有关的相关函数,如min, max, sum, count, mean, median 等一系列函数
- 强大的类SQL语法
强大的类SQL语法 & 无结构
看一下influxdb的语法,似曾相识。
![4ef97c8fbe0c46fb913956af8dd89dcb.png](https://i-blog.csdnimg.cn/blog_migrate/2a74df2eab91294acd7295cf458d4b1f.jpeg)
Measurement等价于mysql中的 table,区别在于mysql表中存储字段,字段既可以作为展示也可以建立索引。但是influxdb存储的数据从逻辑上由 Measurement、 tag组、 field组以及一个时间戳组成的。
- tag信息是默认被索引的。
- Field信息用于展示,是无法被索引的。
- time表示该条记录的时间属性。
Line Protocol 语法
利用逗号和空格,简化插入语句, 如果插入数据时没有明确指定时间戳,则默认存储在数据库中的时间戳则为该条记录的入库时间。(纳秒)
![d0d10cdfdab1e59d8ad4408ee2e8b9f7.png](https://i-blog.csdnimg.cn/blog_migrate/a07db30d555c48b47861f1e56fa828cd.jpeg)
![8ea5ea52c6bb64d600b14e558074a5c3.png](https://i-blog.csdnimg.cn/blog_migrate/13e5567c1545ec880ca5470244c8f9f3.jpeg)
以下有两个常见教程出现的错误
- field 不可以作为group by条件,但是可以作为where条件
- 8083端口停用,web管理界面通过独立组件chronograf实现
原生的HTTP支持,内置HTTP API
![ea025da46d3d4cb6e57ac2adad44e76e.png](https://i-blog.csdnimg.cn/blog_migrate/5ae64d265b13f2f96285140f64dc8685.jpeg)
基于时间序列,支持与时间有关的相关函数,如min, max, sum, count, mean, median 等一系列函数
每次insert记录,如果没有指定,默认会保存数据库当前时间(单位纳秒)。复杂的函数计算不符合浅入浅出的定位,我们换一种直观的角度。
Grafana
The open platform for beautiful analytics and monitoring
很炫很好很强大,没什么好讲的。
配置数据源
![0e6c639213dbb009807412f89d9e337f.png](https://i-blog.csdnimg.cn/blog_migrate/20bcbc6fc2a6f35f0bbca6108ef9503f.jpeg)
支持多种数据源。Access两种形式
- Server 服务器请求后渲染
- Browser 浏览器直接请求
时间函数
![cbf6959fc81dc9d98da215c357c2cae1.png](https://i-blog.csdnimg.cn/blog_migrate/5294a5da205e2fcd5df3533d8da49d62.jpeg)
where 不能选择field,只能选择tag
画图参考官方文档
配置告警
配置告警通道,原生支持email、钉钉,但是支持webhook也就可以随意扩展,如企业微信、SMS等内部通信软件。e.g. 企业微信
![88bbde6789cac2a7b01093457ec1425e.png](https://i-blog.csdnimg.cn/blog_migrate/aff87bedb75b4e89344c7ab6020ba643.jpeg)
设定告警规则,包括统计方法、安全阈值。
jmxtrans
上面介绍完JMX之后,其实缺少了一个通道,将JMX指标输出给influxdb。放到后面介绍的原因是因为独立组件,不依赖JMX,数据来源可以是http、日志、kafka
This is effectively the missing connector between speaking to a JVM via JMX on one end and whatever logging / monitoring / graphing package that you can dream up on the other end.
![6b75486d317077066d002cdaf69035fe.png](https://i-blog.csdnimg.cn/blog_migrate/826a7bd0b6ad85e240bb36ea76344210.jpeg)
可以通过 JSOM | YAML 配置读取地址、查询线程数、采集指标以及持久化方式。
![0ee9ee8fc862eeeca1a02e8c66a4aa00.png](https://i-blog.csdnimg.cn/blog_migrate/c247d694938f94418ca3151dd5da148e.jpeg)
也可以通过java程序引入依赖包,增加扩展。
![daa7db39b89e1218555bc35d2ad51d19.png](https://i-blog.csdnimg.cn/blog_migrate/6156d5ac90abfcf18551cdc6bbfe38a8.jpeg)
总结
开源项目对JMX支持较好,但是作为普通应用,通过JMX暴露指标,需要业务开发编写大量代码,不够友好。而且,RMI存在注入风险,不能暴露外网接口。本人介绍的更多为组件和大致思路,实际使用过程中可以考虑提供通过http发送元数据、或者特殊日志格式进行采集。
![fb4846e99b1ad367c91e0043db4bcf08.png](https://i-blog.csdnimg.cn/blog_migrate/b083b165bb707b598eca3b2239f8d668.jpeg)
附录
docker-compose.yml文件,可以通过 docker-compose up-d执行
![684fff5965cad7b755c1eaf4cd559de8.png](https://i-blog.csdnimg.cn/blog_migrate/28cd4876f7cf7c78b5eee80b8930eba0.jpeg)