使用 JavaMelody 监控 Java EE 应用程序

软件开发不仅仅是根据需求对应用程序进行编码并将其部署到生产环境中,因为真正的工作在交付后才真正开始:维护、改进和解决问题。为此,最好有一些数据。据说“如果你不能测量它,你就不能改进它”,在理想情况下,你计划测量你的应用程序,但通常你必须在生产中进行它以检测和诊断性能问题。有不同的方法来衡量 Java EE 应用程序,实现性能和监控统计数据的一个好工具是Javamelody,它具有低开销、非侵入性、信息丰富且易于设置,但仍然非常强大。

“如果你不能衡量它,你就不能改进它。” - 开尔文勋爵

应用程序性能可以通过两种主要方法来衡量:应用程序使用的计算资源和应用程序用户看到的性能。通过测量这些量,我们得到了应用程序的经验性能基线,然后可以用来检测性能的变化。通过使用性能监控,这是一种非侵入式地收集或观察正在运行的应用程序的性能数据的行为,我们可以通过测量来识别或隔离应用程序实际操作中的潜在问题,而不会对运行时响应性或吞吐量产生严重影响。

有不同的方法可以实现性能和监控统计数据,在开发过程中计划测量应用程序的性能很有用,因为稍后您肯定想知道它的性能。您可以通过利用不同的基于 JMX 的工具(如MetricsServo )来做到这一点,但如果您没有真正计划好,您仍然可以选择。您可以使用标准 JDK 工具(jconsole、jstat、jmap、jstack、hprof)等工具进行低级 JVM 监控或一些监控应用程序(如Javamelody)。由于开发中的时间总是稀缺的,因此部署像 JavaMelody 这样的工具非常有用,它可以快速轻松地访问性能监控。但如果你对一些窄焦测量感兴趣,你

使用 JavaMelody 进行监控

JavaMelody是一个开源 (LGPL) 应用程序,用于监控 QA 和生产环境中的 Java 或 Java EE 应用程序服务器。是根据用户对应用程序的使用情况,对应用程序实际运行情况进行衡量和统计的工具,主要是基于请求的统计和可以查看当前日、周、月、年的演化图或自定义期间。可以在 HTML 页面上查看统计数据,并通过电子邮件将其作为 PDF 报告发送。

JavaMelody 列出了以下用例:

  • 它允许改进 QA 和生产中的应用程序
  • 提供有关平均响应时间和执行次数的事实
  • 在趋势不好、问题变得太严重之前做出决定
  • 基于更有限的响应时间进行优化
  • 找出响应时间的根本原因
  • 验证优化后的真正改进

配置

设置 JavaMelody 非常简单,用户指南中介绍了所需的步骤。通过自动发现环境,将 JavaMelody 集成到您的应用程序可以在不到 10 分钟内完成:它只需要复制 2 个 jar 文件并在 xml 文件中添加 10 行。但是对于更详细和更广泛的测量,您需要在 xml 文件中添加更多行,这里是我为我们的 Wicket、Spring、JPA、Hibernate -Java EE 项目所做的更改。

JavaMelody 和依赖项

使用 Maven2 可以轻松获取 JavaMelody 及其依赖项,您只需要添加javamelody-core,如果您想在pom.xml中也有 iText 的 PDF 报告:

<!-- javamelody-core -->
<dependency>
	<groupId>net.bull.javamelody</groupId>
	<artifactId>javamelody-core</artifactId>
	<version>1.45.0</version>
</dependency>
<!-- itext, option to add PDF export -->
<dependency>
	<groupId>com.lowagie</groupId>
	<artifactId>itext</artifactId>
	<version>2.1.7</version>
	<exclusions>
		<exclusion>
			<artifactId>bcmail-jdk14</artifactId>
			<groupId>bouncycastle</groupId>
		</exclusion>
		<exclusion>
			<artifactId>bcprov-jdk14</artifactId>
			<groupId>bouncycastle</groupId>
		</exclusion>
		<exclusion>
			<artifactId>bctsp-jdk14</artifactId>
			<groupId>bouncycastle</groupId>
		</exclusion>
	</exclusions>
</dependency>

监控应用

JavaMelody 只需要在WEB-INF/web.xml中 webapp 的 servlet 描述之前有一个监控过滤器,甚至不需要用户指南中描述的那个但通常您需要比web.xml中至少 10 行多一点。

通过添加customResourceFilter,您可以获得自定义外观,您可以使用url-exclude-pattern正则表达式模式从统计信息中排除一些 url,eamil-parameters 用于每周报告,并且通过包含monitoring-spring.xml,您可以使用 Spring 监视 DataSource使用 Spring 初始化的后处理器和对象。

春季安全配置

为了限制对监控统计的访问,我在 Spring Security 的applicationContext-security.xml中添加了以下内容。还有其他安全选项。这里的关键是确保web.xml中的监控过滤器(上图)是在 Spring Security 过滤器链之后定义的。

<http auto-config="true" use-expressions="true">
    ...
    <intercept-url pattern="/monitoring/**" access="hasRole('ROLE_ADMIN')" />
	<intercept-url pattern="/**"
			access="hasAnyRole('ROLE_ADMIN, 'ROLE_USER'')" />
</http>

监控 SQL 和数据源

为了监控数据源和 SQL,我刚刚将 jndi-lookup 添加到applicationContext-persist.xml。启用JDBC 监视的其他选项在用户指南中进行了描述

...
<jee:jndi-lookup id="dataSource" jndi-name="jdbc/myAppDS"/>
 
<bean id="entityManagerFactory"
	class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
	<property name="dataSource" ref="dataSource" />
...

商业外墙(春季)

如果要监视的应用程序包含一些由 Spring、EJB 或 Guice 初始化的对象,则它们的方法执行也可以添加到统计信息中。正如用于监控 Spring Business 门面的用户指南中所述,有几个选项,例如使用applicationContext-web.xml中的 JdkRegexpMethodPointcut,您可以使用正则表达式捕获对象,例如“所有名称中包含 Service”的对象。

...
<bean id="facadeMonitoringAdvisor" class="net.bull.javamelody.MonitoringSpringAdvisor">
	<property name="pointcut">
		<bean class="org.springframework.aop.support.JdkRegexpMethodPointcut">
			<property name="pattern" value=".*Service.*" />
		</bean>
	</property>
</bean>
...

EHCache 统计

如果您还想查看 EHCache 统计信息,请将statistics="true"添加到ehcache.xml配置文件。

<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd">
    <defaultCache eternal="true" maxElementsInMemory="100" overflowToDisk="false" statistics="true" />
    <cache name="fooCache" maxElementsInMemory="1000" eternal="false" overflowToDisk="false" />
    <cache name="barCache" maxElementsInMemory="1000" eternal="false" overflowToDisk="false" />
</ehcache>

数据库信息和统计

JavaMelody 已经显示了数据源和 SQL 信息,但它也可以显示有关数据库的信息和统计信息,例如累积时间中最长的请求,并显示 CPU 时间和基本成本。为了显示该信息,受监控应用程序使用的数据库中的用户必须具有读取这些信息和统计数据的必要权限。

在 Oracle 数据库中,请求实际上意味着select * from v$session,您可以使用GRANT SELECT any dictionary TO myapplicationuser. 奇怪的是,仅授予对 v$session ( GRANT SELECT ON sys.v_$session TO myapplicationuser;) 的选择是不够的。

报告

还可以通过电子邮件将每周、每日或每月的报告以 pdf 格式发送给一个或几个人。它需要用于 webapp 的 iText 库和用于邮件会话的服务器中的 Java 的 JavaMail 和 Activation 库。

使用 WebLogic,您可以在 webapp 的web.xml (上图)中添加一些电子邮件参数,并在 WebLogic AdminServer 中配置邮件会话:Services > Mail Sessions以及 JNDI Name 和 JavaMail 属性。该报告提供的信息与您在监控网页中可以找到的相同信息具有高级和详细的信息。

统计存储

Javamelody 数据存储在磁盘上的文件中,有两种类型的文件:*.rrd 文件用于 RRD 格式的图形值(使用 jrobin 库)和 *.ser.gz 用于统计值。

默认情况下,性能统计信息存储在 temp/javamelody 目录中,这意味着在 Linux 中是/tmp/javamelody,在 Windows 中,当在 Eclipse 中运行 webapp 时,例如 Users/developer/AppData/Local/Temp/javamelody。如果要重置计数器,只需删除所有文件。可以通过storage-directory参数更改位置,如果目录名称以“/”开头,则视为绝对路径,否则视为相对于临时目录。

还可以选择使用集中收集服务器来存储统计数据并监控多个应用程序。

查看性能监控

在您设置您的 web 应用程序以进行监控后,您可以在 URL 上查看统计信息,例如取决于您的配置。http:monitoring

开发中的一些示例 JavaMelody 统计信息:

高架

监控和过滤并非没有成本,JavaMelody wiki 上已经讨论过监控的开销。据说开销非常低,可以在质量保证环境中持续启用,如果在 QA 中没有出现问题,也可以在生产环境中持续启用。只需很少的开销,您就可以知道在 QA 或生产服务器中需要优化什么,因此 JavaMelody 的开销实际上是负数。

讨论包含一些注释:

  • JavaMelody 的架构是轻量级的,因此与其他可用解决方案相比,它的开销更低
  • 它只是统计数据而不是事件,因此内存开销非常小。
  • 它监控而不是分析:没有类的检测,而是 http、jdbc、spring 或 ejb3 的“拦截器”。
  • 即使在文件中或通过网络,也没有数据库,也没有记录每个事件:只保留请求的统计信息。cpu 的开销最小,线路上没有 I/O,磁盘上的 I/O 也最少(只是为了定期备份统计信息)。其他一些好的监控解决方案的开销是在数据库或主服务器中记录每个事件。
  • 您可以选择使用集中收集服务器,它将内存、备份存储和报告生成卸载到另一台服务器,同时在线上添加 I/O 以发送统计数据的增量。

概括

“如果你不能衡量它,你就不能改进它。” 不管你怎么做,但如果你想使用真实的用户数据和环境,只需使用 Javamelody 等性能监控工具以非侵入方式进行。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值