一文看懂:性能监控神器JavaMelody

e15ba2ec47dd0b66d8987e082cf49642.png

Together for a Shared future

学习不停

989f9f1b9b2bec7a66b3005da2731b7b.png

44094ff2e7716f91b8f503641d41f8f1.png

a6c141fd2390d227d02e2111a17ed74c.png

最近研究了一下系统监控的方案,发现JavaMelody的存在。于是便自己搭建了一套环境来试用下。

实际上,公司项目里头一直都用到它。只是由于云原生业务发展太迅猛,DevOps工具链也变得十分完善了,在林林总总的监控工具中,JavaMelody变得不够耀眼了;更多情况下是使用阿里云或者腾讯云等公有云来部署服务,而平台提供的监控手段更是多样。

但是,作为个人学习的项目,JavaMelody作为支持Java项目的监控工具,其接入方便且功能强大,还是很值得开发者去学习了解一下的。

d14dfb147cd71a074d2e1bdfc90aaa34.png

系统监控

我们谈到监控,一般设计到两个方面的内容:

  1. 服务器本身的监控。(比如:linux服务器的CPU,内存,磁盘IO等监控)

  2. 业务系统的监控。(比如:业务系统性能的监控,SQL语句的监控,请求超时的监控,用户输入的监控,整个请求过程时间的监控,优化等等)

508bd0ddf71cba4270e02549eb090d03.png

概要

JavaMelody:是一款能够监测Java或Java EE应用程序的服务器,确实,JavaMelody能够很好的反应我们系统的各种性能指标,并提供很好的图形界面。图表可以按天,周,月,年或自定义时间段查看。

其指标还能反应Java内存和Java CPU使用情况、用户Session数量、JDBC连接数、http请求、sql请求、jsp页面与业务接口方法(EJB3、Spring、 Guice)的执行数量,平均执行时间,错误百分比等。

5516a76c1223f32569830e31a3dbb084.png

系统监控安装及配置

2572e942196445c5ebe6d596b8a61a8e.png

工具:Jmeter压测工具、MySQL、SpringBoot工程

1、创建一个springBoot工程项目

代码仓库:https://github.com/scaummb/traffic-controller

2、添加maven依赖到springBoot工程

其实想要集成到spring中,很简单,只要在maven项目中添加JavaMelody依赖即可。

<!-- 监控 -->
  <dependency>
      <groupId>net.bull.javamelody</groupId>
      <artifactId>javamelody-spring-boot-starter</artifactId>
      <version>1.88.0</version>
  </dependency>

3、添加mybatis的依赖到springBoot工程

<!-- mybatis -->
<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
    <version>3.5.4</version>
</dependency>
<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>2.1.2</version>
    <exclusions>
        <exclusion>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-logging</artifactId>
        </exclusion>
    </exclusions>
</dependency>


<!-- mysql -->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.23</version>
</dependency>
<dependency>
    <groupId>com.mchange</groupId>
    <artifactId>c3p0</artifactId>
    <version>0.9.5.5</version>
</dependency>

4、安装Mysql(相关资料自行百度即可)

5、启动服务

34e4a3558b0e784e83f55fec8bafa3fc.png

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】

36fbbfabdb822577614ea01039f26843.png

【创建压测用例】

e2ccb49fb66ea78e15bd753453b00bcf.png

【启动压测】

626e8684f1ce955359ab983f27dd2d7d.png

f33f8076f23fefeb47a084c2725fd5ad.png

监控面板:指标图表

进入JavaMelody的监控页

http://localhost:8080/monitoring

6b7cf53dc448e0012e0f9a4acc5d8a06.png

1、我们可以自定义监控的时间范围

e7a8ab1912cc3f795b2af660c0c0a719.png

2、查看内存使用情况

http://localhost:8080/monitoring?part=graph&graph=usedMemory

c0523d422e7e826389e92ad28989ec0f.png

3、查看CPU使用情况

http://localhost:8080/monitoring?part=graph&graph=cpu

0396e234982100be0c8ef977fbcda820.png

4、查看线程存活情况

http://localhost:8080/monitoring?part=graph&graph=activeThreads

f7ea3aea65af509d8f0ed2e2f7efc246.png

5、查看被使用的JDBC连接情况

http://localhost:8080/monitoring?part=graph&graph=usedConnections

187eb3f8538b780cbdeb46f8d9c2de74.png

6、请求量统计(压力测试是,5QPS,一分钟大约5*60 = 300)

http://localhost:8080/monitoring?part=graph&graph=httpHitsRate

outside_default.png

7、请求平均耗时

http://localhost:8080/monitoring?part=graph&graph=httpMeanTimes

77b5506c207847bfe29782dd9e9178f5.png

8、请求失败情况

http://localhost:8080/monitoring?part=graph&graph=httpSystemErrors

9dfbd8b1d8e61a6eae6040de4bf498cb.png

9、SQL请求量统计

http://localhost:8080/monitoring?part=graph&graph=sqlHitsRate

ed24348af98626124b55348f896d0efd.png

10、SQL的平均耗时

http://localhost:8080/monitoring?part=graph&graph=sqlMeanTimes

668a327ae990d735381184feabf229fe.png

11、SQL错误情况

http://localhost:8080/monitoring?part=graph&graph=sqlSystemErrors

ad5f642a70cc1ff1443cb8985f9d58fb.png

e747ab6b893ede5aaeae90da86f82dd9.png

监控面板:HTTP监控

HTTP监控模块包括了以下指标:

  1. 具体某个请求的总次数

  2. 某个请求的平均耗时

  3. 请求触发的SQL次数

  4. 触发SQL的平均执行耗时

4cd2608088d3db7290e5780ffb9194e5.png

ab355729335b61f27a562f4eed33fe7b.png

监控面板:SQL监控

SQL监控模块包括了以下指标:

  1. 具体某个SQL的内容

  2. SQL执行总次数

  3. SQL的执行平均耗时

  4. SQL执行时间所占的百分比

  5. SQL执行时间失败所占的百分比

8ba904ade73d98503671148f8d35c696.png

abb9feca63e6f5a6d39bd382a2a379d0.png

监控面板:Spring容器监控

Spring容器监控模块包括了以下指标:

  1. 业务接口方法的执行总次数(非常细粒度的监控)

  2. 业务接口方法的执行总时间

  3. 业务接口方法的执行平均耗时

  4. 业务接口方法所占CPU资源

  5. 业务接口方法的申请资源大小

  6. 业务接口方法的触发SQL次数

  7. 业务接口方法的触发SQL执行的平均耗时

0c11748a9f5b4d3b0b556d5622deadba.png

4eef3cca61b7a5910f7e033ab3ec5c20.png

监控面板:HTTP异常监控

HTTP异常监控模块包括了以下指标:

  1. HTTP异常的总次数

  2. 异常请求的平均分配内存空间

  3. HTTP异常的各项指标排行榜

a7a3fad16b3ddcfd61e1d48b19bfd61c.png

936914a28999967d3375cf50e5a04734.png

监控面板:系统异常监控

系统异常监控模块包括了以下指标:

  1. 系统错误的总次数

  2. 系统错误的详情和指标排行榜

8902bcbdc29e73feb404e5e7359908f4.png

我们甚至还可以读取到某个异常的堆栈

ac9bd3376eceac06793748dedfa4124f.png

60d21928d87c80293369b022de4ff25d.png

监控面板:线程监控

线程监控模块包括了以下指标:

  1. 应用当前活跃线程数量

  2. 应用线程排行榜(CPU占用时间、线程方法、状态)【参考:《系统线程》】

  3. 线程操控面板(终止和终端)

f41ea31611460cd75324072d94045bc2.png

ca453e6cb786d18e867cba1a1a1a79db.png

监控面板:系统信息监控

系统信息监控模块包括了以下指标:

  1. 主机IP

  2. Java使用的内存

  3. 活跃的和被使用的jjdbc连接数

  4. 系统使用率

  5. 活跃的线程数

  6. ‍‍‍‍‍‍‍‍‍‍‍‍‍‍JVM参数(虚拟机参数、内存参数、磁盘空间等)

fcc0f5ab6546616b36e704c449ec7373.png

75e44a85e1bc92fa746c98fd9be0f35b.png

7f0f7f1837c7ad3a2b3cf65d4434d9bb.png

监控面板:JavaMelody的缓存文件

javamelody的本地数据缓存

791a149da6713d76256b75f8b14fac26.png

虽然都是 *.rrd 的文件,无法直接读取,但是从名字就可以看到它都记录什么数据。比如sql 线程数,内存等等。后面会继续研究对多种项目的监控,以及源码。

4fc63316f3c9821b017163694878388d.png

什么是rrd文件?

所谓的“Round Robin” 其实是一种存储数据的方式,使用固定大小的空间来存储数据,并有一个指针指向最新的数据的位置。 

我们可以把用于存储数据的数据库的空间看成一个圆,上面有 很多刻度。这些刻度所在的位置就代表用于存储数据的地方。所谓指针,可以认为是从圆心指向这些刻度的一条直线。

指针会随着数据的读写自动移动。这个圆没有起点和终点,所以指针可以一直移动,而不用担心到达终点后就无法前进的问题。

在一段时间后,当所有的空间都存满了数据,就又从头开始存放。 这样整个存储空间的大小就是一个固定的数值。

https://www.cnblogs.com/jin-xin/p/6773622.html

所以RRDtool 就是使用类似的方式来存放数据的工具, RRDtool 所使用的数据库文件的后缀名是'.rrd。如下图: 

63b8b606e431db39e8ad251e8b06a67d.png

486a423f85941b263854833fbd644594.png

总结

JavaMelody 并不会模拟用户请求而是监控用户的请求并且形成图表报告。业界其实有更加强大的监控系统,比如:连接池方面druid、系统方面zabbix,业务方面可以用cat等等,甚至开发采用自己的监控系统也是可以的。

后端技术&架构精华

ea179a2cf6ba404da45388f2f0fdffe7.png

《源码系列》

JDK之Object 类

JDK之BigDecimal 类

JDK之String 类

JDK之Lambda表达式

Spring源码:Event事件发布与监听

《经典书籍》

Java并发编程实战:第1章 多线程安全性与风险

Java并发编程实战:第2章 影响线程安全性的原子性和加锁机制

Java并发编程实战:第3章 助于线程安全的三剑客:final & volatile & 线程封闭

《服务端技术栈》

《Docker 核心设计理念

《Kafka史上最强原理总结》

《HTTP的前世今生》

《算法系列》

读懂排序算法(一):冒泡&直接插入&选择比较

《读懂排序算法(二):希尔排序算法》

《读懂排序算法(三):堆排序算法》

《读懂排序算法(四):归并算法》

《读懂排序算法(五):快速排序算法》

《读懂排序算法(六):二分查找算法》

《项目管理》

《学点项目管理,对咱程序员很重要》

《项目管理实践篇(一):技术人如何做好风险把控》

《项目管理实践篇(二):总结项目经历》

《如何写好一篇汇报材料》

《在鹅厂工作一周年的经验分享》

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值