我想找到或开发一个可以作为守护进程运行的应用程序,当主机上运行的 Java 应用程序出现任何异常或错误时,通过电子邮件或短信通知管理员。我知道JVMTI可以实现我的部分目标,但它会影响被监控应用程序的性能(我不知道会影响多少,如果它是轻微的可以接受),而且开发似乎是一个麻烦的工作一个 JVMTI 代理,我不确定如果多个应用程序同时使用同一个代理运行会发生什么。有没有更好的解决方案?提前致谢。
6 回答
IMO,最好的方法是部署外部监控系统。这个可以:
- 监控多个应用程序
- 监控基础设施服务
- 监控网络可用性和机器可访问性,
- 监控资源,例如处理器和文件系统的使用情况。
可以通过多种方式监控应用程序,包括:
- 通过处理日志事件,
- 通过观察应用程序重新启动,
- 通过“ping”应用程序的 Web api 来检查服务的活跃度,以及
- 通过使用应用程序的 JMX 接口。
可以以智能方式过滤这些信息并确定优先级,并且可以通过任何最合适的方式报告关键事件。
您不希望个别应用程序发送电子邮件,因为它们没有足够的信息来完成体面的工作。此外,将报告逻辑放入单个应用程序中可能会导致实现不一致、可配置性差等问题。
一种方法是使用像 log4j 这样的日志系统,它将系统 A 上发生的所有错误发布到系统 B 上的日志服务器,您可以从中监控发生的错误。然而,这不是一个完全通用的解决方案,因为只会处理传播到 log4j(或任何其他日志记录系统)的异常——但这可能是一个好的开始。
最好的解决方案是让 Java 应用程序通过电子邮件/短信发送其错误。问题是程序会在正常运行中产生异常并正确处理。你只想要特定的例外。
如果做不到这一点,您可以编写一个日志阅读器,它会读取应用程序的日志。这很难做到正确,但可以做到。
一个应用程序每天可以生成 1000 多个异常并且仍然正常运行,因为应用程序知道如何处理这些异常。例如,每次关闭套接字连接时都会引发异常。
有很多应用程序可以以不影响性能的方式完成您正在寻找的工作。您是否看过用于企业解决方案的 Kibana/ElasticSearch、Splunk 或 Logscape(它们都有免费版本)。
我将重复已经说过的内容,并强调 java 已经提供了什么以及您可以使用外部监控系统做什么。Java 已经提供:
- log4j - 将错误、警告、致命和异常记录到文件中
- JMX - 创建自定义应用程序指标,您还可以访问 java.lang/*,这将为您提供堆内存使用、垃圾收集、线程计数器等。
- JVM gc 日志记录 - 您可以将所有垃圾收集事件记录到一个文件中,并监视任何长时间的 Full GC 收集。
外部监控系统将允许您设置触发不同操作场景的警报。您还将通过图表获得系统性能的可视化。我过去曾使用Logscape 的Java 应用程序来监控分布在 3 个主机上的 30 个 Java 进程。
JVMTI 附近有一个替代方案:JPDA。此基础架构允许您使用 Java 代码创建远程“调试器”(是的,这就是您计划做的),并使用本地或远程连接将其连接到 VM。
与 JVMTI 一样,程序执行会产生开销。但是,如Trace.java
示例所示,实现和连接到目标 VM 都非常简单。
最后,请注意,如果您想检测由应用程序服务器(JBoss、Glassfish、Tomcat 等)运行的代码,还有其他各种可用的方法。