Together for a Shared future
学习不停
最近研究了一下系统监控的方案,发现JavaMelody的存在。于是便自己搭建了一套环境来试用下。
实际上,公司项目里头一直都用到它。只是由于云原生业务发展太迅猛,DevOps工具链也变得十分完善了,在林林总总的监控工具中,JavaMelody变得不够耀眼了;更多情况下是使用阿里云或者腾讯云等公有云来部署服务,而平台提供的监控手段更是多样。
但是,作为个人学习的项目,JavaMelody作为支持Java项目的监控工具,其接入方便且功能强大,还是很值得开发者去学习了解一下的。
系统监控
我们谈到监控,一般设计到两个方面的内容:
服务器本身的监控。(比如:linux服务器的CPU,内存,磁盘IO等监控)
业务系统的监控。(比如:业务系统性能的监控,SQL语句的监控,请求超时的监控,用户输入的监控,整个请求过程时间的监控,优化等等)
概要
JavaMelody:是一款能够监测Java或Java EE应用程序的服务器,确实,JavaMelody能够很好的反应我们系统的各种性能指标,并提供很好的图形界面。图表可以按天,周,月,年或自定义时间段查看。
其指标还能反应Java内存和Java CPU使用情况、用户Session数量、JDBC连接数、http请求、sql请求、jsp页面与业务接口方法(EJB3、Spring、 Guice)的执行数量,平均执行时间,错误百分比等。
系统监控安装及配置
工具:Jmeter压测工具、MySQL、SpringBoot工程
1、创建一个springBoot工程项目
代码仓库:https://github.com/scaummb/traffic-controller
2、添加maven依赖到springBoot工程
其实想要集成到spring中,很简单,只要在maven项目中添加JavaMelody依赖即可。
net.bull.javamelody
javamelody-spring-boot-starter
1.88.0
3、添加mybatis的依赖到springBoot工程
org.mybatis
mybatis
3.5.4
org.mybatis.spring.boot
mybatis-spring-boot-starter
2.1.2
org.springframework.boot
spring-boot-starter-logging
mysql
mysql-connector-java
8.0.23
com.mchange
c3p0
0.9.5.5
4、安装Mysql(相关资料自行百度即可)
5、启动服务
6、启动压测工具Jmeter
【工具下载】
https://jmeter.apache.org/download_jmeter.cgi
【配置参考】
https://blog.csdn.net/weixin_43282627/article/details/124731464
http://t.zoukankan.com/balllyh-p-9508632.html
【启动Jmeter】
【创建压测用例】
【启动压测】
监控面板:指标图表
进入JavaMelody的监控页
http://localhost:8080/monitoring
1、我们可以自定义监控的时间范围
2、查看内存使用情况
http://localhost:8080/monitoring?part=graph&graph=usedMemory
3、查看CPU使用情况
http://localhost:8080/monitoring?part=graph&graph=cpu
4、查看线程存活情况
http://localhost:8080/monitoring?part=graph&graph=activeThreads
5、查看被使用的JDBC连接情况
http://localhost:8080/monitoring?part=graph&graph=usedConnections
6、请求量统计(压力测试是,5QPS,一分钟大约5*60 = 300)
http://localhost:8080/monitoring?part=graph&graph=httpHitsRate
7、请求平均耗时
http://localhost:8080/monitoring?part=graph&graph=httpMeanTimes
8、请求失败情况
http://localhost:8080/monitoring?part=graph&graph=httpSystemErrors
9、SQL请求量统计
http://localhost:8080/monitoring?part=graph&graph=sqlHitsRate
10、SQL的平均耗时
http://localhost:8080/monitoring?part=graph&graph=sqlMeanTimes
11、SQL错误情况
http://localhost:8080/monitoring?part=graph&graph=sqlSystemErrors
监控面板:HTTP监控
HTTP监控模块包括了以下指标:
具体某个请求的总次数
某个请求的平均耗时
请求触发的SQL次数
触发SQL的平均执行耗时
监控面板:SQL监控
SQL监控模块包括了以下指标:
具体某个SQL的内容
SQL执行总次数
SQL的执行平均耗时
SQL执行时间所占的百分比
SQL执行时间失败所占的百分比
监控面板:Spring容器监控
Spring容器监控模块包括了以下指标:
业务接口方法的执行总次数(非常细粒度的监控)
业务接口方法的执行总时间
业务接口方法的执行平均耗时
业务接口方法所占CPU资源
业务接口方法的申请资源大小
业务接口方法的触发SQL次数
业务接口方法的触发SQL执行的平均耗时
监控面板:HTTP异常监控
HTTP异常监控模块包括了以下指标:
HTTP异常的总次数
异常请求的平均分配内存空间
HTTP异常的各项指标排行榜
监控面板:系统异常监控
系统异常监控模块包括了以下指标:
系统错误的总次数
系统错误的详情和指标排行榜
我们甚至还可以读取到某个异常的堆栈
监控面板:线程监控
线程监控模块包括了以下指标:
应用当前活跃线程数量
应用线程排行榜(CPU占用时间、线程方法、状态)【参考:《系统线程》】
线程操控面板(终止和终端)
监控面板:系统信息监控
系统信息监控模块包括了以下指标:
主机IP
Java使用的内存
活跃的和被使用的jjdbc连接数
系统使用率
活跃的线程数
JVM参数(虚拟机参数、内存参数、磁盘空间等)
监控面板:JavaMelody的缓存文件
javamelody的本地数据缓存
虽然都是 *.rrd 的文件,无法直接读取,但是从名字就可以看到它都记录什么数据。比如sql 线程数,内存等等。后面会继续研究对多种项目的监控,以及源码。
所谓的“Round Robin” 其实是一种存储数据的方式,使用固定大小的空间来存储数据,并有一个指针指向最新的数据的位置。
我们可以把用于存储数据的数据库的空间看成一个圆,上面有 很多刻度。这些刻度所在的位置就代表用于存储数据的地方。所谓指针,可以认为是从圆心指向这些刻度的一条直线。
指针会随着数据的读写自动移动。这个圆没有起点和终点,所以指针可以一直移动,而不用担心到达终点后就无法前进的问题。
在一段时间后,当所有的空间都存满了数据,就又从头开始存放。 这样整个存储空间的大小就是一个固定的数值。
https://www.cnblogs.com/jin-xin/p/6773622.html
所以RRDtool 就是使用类似的方式来存放数据的工具, RRDtool 所使用的数据库文件的后缀名是'.rrd。如下图:
总结
JavaMelody 并不会模拟用户请求而是监控用户的请求并且形成图表报告。业界其实有更加强大的监控系统,比如:连接池方面druid、系统方面zabbix,业务方面可以用cat等等,甚至开发采用自己的监控系统也是可以的。
后端技术&架构精华
《源码系列》
《JDK之Object 类》
《JDK之BigDecimal 类》
《JDK之String 类》
《JDK之Lambda表达式》
《Spring源码:Event事件发布与监听》
《经典书籍》
《Java并发编程实战:第1章 多线程安全性与风险》
《Java并发编程实战:第2章 影响线程安全性的原子性和加锁机制》
《Java并发编程实战:第3章 助于线程安全的三剑客:final & volatile & 线程封闭》
《服务端技术栈》
《Docker 核心设计理念》
《Kafka史上最强原理总结》
《HTTP的前世今生》
《算法系列》
《读懂排序算法(一):冒泡&直接插入&选择比较》
《读懂排序算法(二):希尔排序算法》
《读懂排序算法(三):堆排序算法》
《读懂排序算法(四):归并算法》
《读懂排序算法(五):快速排序算法》
《读懂排序算法(六):二分查找算法》
《项目管理》
《学点项目管理,对咱程序员很重要》
《项目管理实践篇(一):技术人如何做好风险把控》
《项目管理实践篇(二):总结项目经历》
《如何写好一篇汇报材料》
《在鹅厂工作一周年的经验分享》