java时序图工具_如何搭建一套监控java应用的监控系统

如何搭建一个监控系统

生产环境必须是可监控的,一个对开发者黑盒的线上应用无异于灾难。一个简单的监控系统大致包含以下几部分:

  1. 采集数据
  2. 保存数据
  3. 数据可视化
  4. 监控告警
ae8b5027e2eb8727273c16d9756a12de.png

从一个熟悉的画面开始:

eb6f50e4f6725afc4d4d2164a6c7b6cb.png

这是javaer每天都会看到的一个画面,当然为了减少bug,有时候也需要借助一下来自东方的神秘力量

51ac9d69af049546a71460a06bf9a04c.png

仔细看console的第一行,灰色字体&被折叠,看起来很不起眼,就被忽略了。

75e02aad88d8b5cfd77f2364c9390541.png

展开后内容如下

601022b14a0f3d17e5a011bb1e6277ad.png

出现频率最高的单词是 jmxremote,这是我们需要了解的第一个概念 JMX。

JMX

JMX(Java Management Extensions,即Java管理扩展)是Java平台上为应用程序、设备、系统等植入管理功能的框架。 --wikipedia

如何做到管理功能呢?

  1. 监控指标,包括业务监控&系统性能监控
  2. 执行方法

我们通过架构图来看一下,JMX如何实现这两个功能。

e04b165b74267459d478e1f0df451687.png
  1. 接入层,提供远程访问接口
  2. 适配层,对资源的管理和注册
  3. MBean,提供变量or函数

还是不够直观,我们来具体看一下jmx能做什么。

在控制台中输入 jconsole,你可以看到一个java GUI风格的工具窗口,这是jdk自带用于jmx连接&展示的工具。

3f670f16bdda0ca32fc82ca83167a04e.png

可以通过JDK提供的MBean查看线程、内存、CPU占用,检测死锁、执行GC。也可以通过三方按照JMX标准提供的MBean,查看or执行封装的函数方法。

7f4e79adb8f0162d5c6a5d29fdb6d2f5.png

以 SpringApplicationAdminMXBean为例,声明了一个包含函数的interface作为MBean,并将实现类注册到MBeanServer服务中。用到了一个委托模式。

eb374cb5dab1ee41f64d11d528686e99.png
2b54cc2e0fcbf267fd3f423a62595326.png
  1. JConsole会根据方法及返回值,判断是指标还是可执行函数。
  2. 除了指标和函数,还有通知。但是JMX并不保证所有通知都会被监听器接收

influxdb

知道了数据如何产生,接下来需要考虑数据如何持久化。

InfluxDB是一个由InfluxData开发的开源时序型数据库。它由Go写成,着力于高性能地查询与存储时序型数据。InfluxDB被广泛应用于存储系统的监控数据,IoT行业的实时数据等场景。

选型原因是influxdb有以下特点

  1. 可度量性:你可以实时对大量数据进行计算
  2. 无结构(无模式):可以是任意数量的列
  3. 原生的HTTP支持,内置HTTP API
  4. 基于时间序列,支持与时间有关的相关函数,如min, max, sum, count, mean, median 等一系列函数
  5. 强大的类SQL语法

强大的类SQL语法 & 无结构

看一下influxdb的语法,似曾相识。

4ef97c8fbe0c46fb913956af8dd89dcb.png

Measurement等价于mysql中的 table,区别在于mysql表中存储字段,字段既可以作为展示也可以建立索引。但是influxdb存储的数据从逻辑上由 Measurement、 tag组、 field组以及一个时间戳组成的。

  1. tag信息是默认被索引的。
  2. Field信息用于展示,是无法被索引的。
  3. time表示该条记录的时间属性。

Line Protocol 语法

利用逗号和空格,简化插入语句, 如果插入数据时没有明确指定时间戳,则默认存储在数据库中的时间戳则为该条记录的入库时间。(纳秒)

d0d10cdfdab1e59d8ad4408ee2e8b9f7.png
8ea5ea52c6bb64d600b14e558074a5c3.png

以下有两个常见教程出现的错误

  1. field 不可以作为group by条件,但是可以作为where条件
  2. 8083端口停用,web管理界面通过独立组件chronograf实现

原生的HTTP支持,内置HTTP API

ea025da46d3d4cb6e57ac2adad44e76e.png

基于时间序列,支持与时间有关的相关函数,如min, max, sum, count, mean, median 等一系列函数

每次insert记录,如果没有指定,默认会保存数据库当前时间(单位纳秒)。复杂的函数计算不符合浅入浅出的定位,我们换一种直观的角度。

Grafana

The open platform for beautiful analytics and monitoring

很炫很好很强大,没什么好讲的。

配置数据源

0e6c639213dbb009807412f89d9e337f.png

支持多种数据源。Access两种形式

  1. Server 服务器请求后渲染
  2. Browser 浏览器直接请求

时间函数

cbf6959fc81dc9d98da215c357c2cae1.png

where 不能选择field,只能选择tag

画图参考官方文档

配置告警

配置告警通道,原生支持email、钉钉,但是支持webhook也就可以随意扩展,如企业微信、SMS等内部通信软件。e.g. 企业微信

88bbde6789cac2a7b01093457ec1425e.png

设定告警规则,包括统计方法、安全阈值。

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

可以通过 JSOM | YAML 配置读取地址、查询线程数、采集指标以及持久化方式。

0ee9ee8fc862eeeca1a02e8c66a4aa00.png

也可以通过java程序引入依赖包,增加扩展。

daa7db39b89e1218555bc35d2ad51d19.png

总结

开源项目对JMX支持较好,但是作为普通应用,通过JMX暴露指标,需要业务开发编写大量代码,不够友好。而且,RMI存在注入风险,不能暴露外网接口。本人介绍的更多为组件和大致思路,实际使用过程中可以考虑提供通过http发送元数据、或者特殊日志格式进行采集。

fb4846e99b1ad367c91e0043db4bcf08.png

附录

docker-compose.yml文件,可以通过 docker-compose up-d执行

684fff5965cad7b755c1eaf4cd559de8.png
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值