Java 性能监控工具 Stagemonitor 在推荐架构中的应用详解

it2025-01-06  9

随着业务增长,推荐架构 Java 服务的压力也逐渐增加。为了及时处理应用程序性能问题,定位故障并分析原因,我们迫切需要一款能够提供全方位监控的工具。

我们对市面上应用较多的三款性能监控和管理方案进行了多方面比较,结果见下图

可以看出,三个方案对类似请求、JVM、OS 这种常规的监控都可以支持。但除此之外,根据推荐的实际需求,我们还需要具备历史信息存储和分析、创建自定义报警机制并为指标定义阈值,以及集群监控的能力,这样看下来只有 Stagemonitor 可以满足。因此,我们最终选定 Stagemonitor 作为推荐架构的 Java 性能监控解决方案。

一、简介

Stagemonitor(https://github.com/stagemonitor/stagemonitor )作为一个开源 Java 应用监控组件,提供了大量开发、生产和质量保证所需的工具,以全面监控 Java Web 应用程序的性能。

Stagemonitor 包含一个位于 Java 应用程序内部的代理程序,可以将指标和请求跟踪发送到 Elasticsearch、Graphite 和 InfluxDB 到中,并且内置了可视化分析指标和请求的仪表板模版,使它可以监控在多个服务器上运行的应用程序,并提供可视化分析。

二、应用详解

1. 安装

Stagemonitor 的安装很简单,简单配置下就可以使用,轻量级接入,开箱即用。具体步骤分为下面三步:

(1)加载 POM 依赖

Stagemonitor 监控组件可按需加载,在这里我们引入了 JVM、报警、日志、操作系统这些模块。

pom 文件如下,我们选用的是最 0.88.9 版本,下面的内容也是基于这个版本:

<dependency> <groupId>org.stagemonitor</groupId> <artifactId>stagemonitor-web-servlet</artifactId> <version>0.88.9</version> </dependency> <!--stagemonitor 操作系统监控--> <dependency> <groupId>org.stagemonitor</groupId> <artifactId>stagemonitor-os</artifactId> <version>0.88.9</version> </dependency> <!--stagemonitor 警报--> <dependency> <groupId>org.stagemonitor</groupId> <artifactId>stagemonitor-alerting</artifactId> <version>0.88.9</version> </dependency> <!--stagemonitor 日志--> <dependency> <groupId>org.stagemonitor</groupId> <artifactId>stagemonitor-logging</artifactId> <version>0.88.9</version> </dependency> <!--stagemonitor 追踪插件--> <dependency> <groupId>org.stagemonitor</groupId> <artifactId>stagemonitor-tracing</artifactId> <version>0.88.9</version> </dependency> <!--stagemonitor 调度插件--> <dependency> <groupId>org.stagemonitor</groupId> <artifactId>stagemonitor-dispatcher</artifactId> <version>0.88.9</version> </dependency> <dependency> <groupId>org.stagemonitor</groupId> <artifactId>stagemonitor-core</artifactId> <version>0.88.9</version> </dependency> <!--stagemonitor es追踪插件--> <dependency> <groupId>org.stagemonitor</groupId> <artifactId>stagemonitor-tracing-elasticsearch</artifactId> <version>0.88.9</version> </dependency>

(2)初始化接口

我们使用的是 Spring boot 2.0 框架,通过下边代码可以实现在 Servlet 容器启动的时候注册并初始化 Stagemonitor:

@Component public class StagemonitorInitializer implements ServletContextInitializer { @Override public void onStartup(ServletContext servletContext) throws ServletException { // necessary for spring boot 2.0.0 until stagemonitor supports it natively ServletContainerInitializerUtil.registerStagemonitorServletContainerInitializers(servletContext); } }

(3)配置参数

Stagemonitor 配置方式和参数很多,下面仅介绍最基础的几个配置参数,其他参数详见 https://github.com/stagemonitor/stagemonitor/wiki/Configuration-Options 。关于多个配置方式我们在下文会提到。

配置文件在 /项目目录/src/main/resources/stagemonitor.properties中,如果没有可以创建。

参数简介:

stagemonitor.applicationName: 应用名称,统计区分使用,需要保证唯一性。stagemonitor.instanceName: 环境名称,可以设定 prod、test、dev 等,这个很重要,因为过滤器可以进行过滤使用。stagemonitor.instrument.include: 应包含在统计中的 package,这里是 com.test。stagemonitor.reporting.elasticsearch.url: ElasticSearch 的 URL 地址,用来存储监控数据的,强烈推荐配置上。stagemonitor.tracing.reporting.lo是否开启请求采样,开启后会采集请求的 URL、请求头、处理时间等,下面我们会有展开介绍请求采样。stagemonitor.tracing.sampling.percent.default: 请求采样概率,设置为「0.01」时,只会采样 1%; 设置为「1」时,将对所有请求进行采样。最大设置为 1。 stagemonitor.applicationName=test-api stagemonitor.instanceName=dev stagemonitor.instrument.include=com.test stagemonitor.reporting.elasticsearch.url=http://127.0.0.1:9200 stagemonitor.tracing.reporting.log=true stagemonitor.tracing.sampling.percent.default=0.01

2. Stagemonitor 界面

通过 ip:port/stagemonitor 就可以访问 Stagemonitor 界面。通过它可以了解当前 Java 应用关键指标,还可以设定阈值,超过该阈值即报警。

下图是对当前请求的一个监控,页面显示了请求数量和 RT 的曲线图、95 线、90 线等数据,可以快速对当前请求情况做出准确的判断,这在压测时非常好用。

Stagemonitor 主界面有四类选项配置页,分别是 Widget Settings、Configuration、Metrics 和 Alert。

(1)Widget Settings

用来配置小部件的一些参数。

(2)Configuration

用来更改 Stagemonitor 的配置。

Stagemonitor 的配置使用多个配置源,按照优先级排序依次为:小部件配置、Elasticsearch、Java 系统属性和 stagemonitor.properties。

(3)Metrics

展示指标监控情况,包括 HTTP Requests 、JDBC、JVM、Logging 和 OS 的即时监控数据。

JDBC 监控数据库吞吐量、请求数等数据JVM 监控会以折线图的方式展示出来堆、内存池、CPU 和 GC 等关键数据,可以快速了解当前应用 JVM 的状态,如下图所示: Logging显示日志记录的一些相关数据。OS显示当前机器的负载情况,CPU、Network I/O (Delta)、I/O (Delta) 等数据。如下图: (4)Alert Alert 选项中的 Status 是报警方式设置和历史报警展示,内置的模式支持 HTTP 请求、邮件和 Pushbullet。在这里我们进行了扩展开发接入马蜂窝的报警,配置内容使用 json,便于以后的开发扩展和维护。代码见下图: Alert 选项中 Checks 用来设置阈值,可以设置 cpu_load、GC 等内容的阀值。上边提到的报警系统在到达阈值时进行报警。下图就是一个简单增加 cpu_load 报警阈值的场景: 阈值 Bug 修复 在使用报警功能时发现了 Stagemonitor 的一个 Bug。我们设置 cpu_load 阈值为 10,在服务器 cpu_load 已经超过阈值时却无法报警。而我们尝试性的将 cpu_load 阈值设置小于 10 的时候却很快报警。初步判断是由于源码中判断阈值的逻辑颠倒所致。后证实确实如此。详情见 org.stagemonitor.alerting.check.Threshold 类中的 isExceeded 方法,见下图: 修改后的代码截图,去除 ‘!’ 就可以了。

3. 请求采样

在上面的配置简介中我们提到了请求采样,采样数据例子见下图: 请求采样数据会在日志文件和 Elasticsearch 中存储,数据包括请求的请求头、URL、耗时统计、IP、服务器信息等。通过请求采样可以了解到请求的关键数据,非常适合处理请求故障时使用。

4. 仪表盘展示与集群监控

Stagemonitor 可以将监控数据存储到 Elasticsearch,Graphite 和 InfluxDB 中,长时间的保存监控数据。Stagemonitor 内置了很多 Kibana Visualize 和 Dashboard 模版,开箱即用。

Visualize 部分见下图。除了图中展示的信息外,还有 RT 指标、CPU 统计、GC 时常、GC 次数、磁盘使用量、网络吞吐量等等各种指标的可视化展示汇总,基本囊括了最常见的统计指标。这也凸显了 Stagemonitor 的全面与优秀: Dashboard 则是一个汇总的展示,见下图: 以下是 Application Server 的图形化展示的一部分,主要是展示线程池的使用情况,会显示多台服务器的数据情况,还可以根据 dev、pro 这种环境名称进行再次筛选比较:

监控数据采集 Bug 修复 在这块我们也遇到了兼容性问题。在较新版本的 Tomcat(8.5.37) 下,Stagemonitor 数据采集会失败,我们对其进行了兼容性处理,修复了由于 Tomcat 新版本导致的 Bug。限于篇幅这里就不讲了,有兴趣的同学欢迎随时交流。

三、总结和展望

Java 监控是 Java 应用高质量稳定运行的重要保障,Stagemonitor 接入简单、开箱即用、功能强大,是一款值得推荐使用的 Java 监控方案。

我们在使用过程也发现并修复一些 Bug,也已反馈到开源社区。Stagemonitor 是一个开源的项目,我们从中受益,也会积极回馈开源。

目前推荐架构组准备维护一个内部版本,修复发现的问题,欢迎大家使用。如果在使用过程中遇到到问题,欢迎一起探讨、交流哦!

最新回复(0)