在生产或本地监控您的应用程序。了解调试过程中发生了什么,并学习动态更改应用程序设置。
在跟踪错误时,我们需要采取双管齐下的方法。类似于从两侧包裹有问题的模块并挤压以找到有问题的部分的钳子。到目前为止,我们讨论了非常低级别的工具。有些可用于调试系统级服务。今天我们将讨论堆栈的另一面,但仍然是一个非常先进的管理工具。要理解这一点,您需要了解我们所处的领域。
作为开发人员,我们处理代码和应用程?序。部署是针对 OPS/DevOps 的,他们使用的工具对我们来说通常是陌生的。并不是他们有不好的工具。相反,他们拥有惊人的工具。但它们通常是为大规模设计的。当您需要管理数千台服务器时,您需要一种方法来控制所有服务器。为此,我们需要一套不同的工具。
管理工具让我们可以遍历机器云并管理在它们上运行的应用程序。我们不需要前者,但后者是一个强大的工具,对开发人员非常有用。有一些实现应用程序管理的标准,Java 引入了 JMX 来封装它们的差异。JMX 允许应用程序和 JDK 本身公开信息和功能以供外部工具操作。
这是一个显着的功能,它公开信息和调整杠杆,用于在运行时环境中进行动态操作。激活 JMX超出了本教程的范围,因此我不会详细介绍,但您可以在此处查看这篇 Oracle 文章中的一些基础知识。一旦我们运行了这个,我们就可以使用可视化工具进行调试,但我将专注于命令行工具。这很重要,因为我可以直接从控制台在生产服务器上使用其中的一些工具。
JMX 是如何工作的?
JMX 公开了管理“bean”(MBean),这些是表示应用程序中控制点的对象。您的应用程序可以发布自己的 bean,这使您可以公开运行时监控和配置的功能。这非常酷,因为您可以导出管理员可以直接连接到仪表板(APM、Prometheus、Grafana 等)的信息并将其用于决策。
如果您的服务器同时连接了多个用户,您可以在 JMX 中公开该 码,并且由于 DevOps 的一些接线,它可以出现在公司仪表板中。在你这边,大部分工作都是为了获取兴趣值而暴露一个吸气剂。您还可以公开诸如“清除用户”等操作。操作是您可以在 JMX bean 上调用的方法。
Spring 还支持通过 Actuator 将大量服务器细节公开为管理 bean。这是一个非常酷的功能,您可以在此处了解更多信息。它公开了有关应用程序的非常深入的指标,并帮助您直接进入“生产就绪”状态!
JMXTerm 基础
通常通过 Web 界面工具或专用管理工具来控制和读取 JMX。如果您可以访问其中任何一个,我建议您选择其中一个并使用它们,因为它会很好地工作。我在一些公司使用过其中的一些,在某些情况下我实际上更喜欢它们。我也喜欢使用 IntelliJ/IDEA Ultimates 对 Actuator 的支持,这是一个非常强大的可视化工具:
JMXTerm同样强大但不包括可视化方面,从这个意义上说,当我们需要在服务器上快速理解可能是外星人的东西时,它非常方便。它对于从服务器内部获得高级见解也非常有用。我们可以JMXTerm从这里下载开始。
下载后,我们可以使用它连接到服务器:
java -jar ~/Downloads/jmxterm-1.0.2-uber.jar --url localhost:30002
您应该根据您的连接更新主机名/端口。连接后,我们可以使用提示列出 JMX 域:
$>domains#following domains are availableJMImplementationcom.sun.managementjava.langjava.niojava.util.loggingjavax.cachejdk.management.jfr
然后我们可以选择一个特定的域来探索。这是可视化工具通常有益的地方,因为它可以为您提供更快的层次结构导航和信息的快速评估。在这种情况下,我只想设置日志记录级别:
壳
$>domain java.util.logging
我们可以通过列出域中的 bean 来遵循这一点。然后选择我们希望使用的 bean,因为在这个特定域中只有一个 bean:
$>beans#domain = java.util.logging:java.util.logging:type=Logging$>bean java.util.logging:type=Logging#bean is set to java.util.logging:type=Logging
我能用这个bean做什么?为此,我们有 info 命令列出了 bean 的操作和属性:
壳
$>info#mbean = java.util.logging:type=Logging#class name = sun.management.ManagementFactoryHelper$PlatformLoggingImpl# attributes %0 - LoggerNames ([Ljava.lang.String;, r) %1 - ObjectName (javax.management.ObjectName, r)# operations %0 - java.lang.String getLoggerLevel(java.lang.String p0) %1 - java.lang.String getParentLoggerName(java.lang.String p0) %2 - void setLoggerLevel(java.lang.String p0,java.lang.String p1)#there's no notifications
一旦我有了这些,我就可以检查当前的记录器级别,它没有设置,因为我们没有明确设置它并且使用全局默认值:
壳
$>run getLoggerLevel "org.apache.tomcat.websocket.WsWebSocketContainer"#calling operation getLoggerLevel of mbean java.util.logging:type=Logging with params [org.apache.tomcat.websocket.WsWebSocketContainer]#operation returns:
我可以将其显式设置为 INFO,然后再次获取它以使用以下代码验证操作是否按预期工作:
壳
1$>run setLoggerLevel org.apache.tomcat.websocket.WsWebSocketContainer INFO2#calling operation setLoggerLevel of mbean java.util.logging:type=Logging with params [org.apache.tomcat.websocket.WsWebSocketContainer, INFO]3#operation returns: 4null5$>run getLoggerLevel "org.apache.tomcat.websocket.WsWebSocketContainer"6#calling operation getLoggerLevel of mbean java.util.logging:type=Logging with params [org.apache.tomcat.websocket.WsWebSocketContainer]7#operation returns: 8INFO
这只是冰山一角。我们可以得到很多东西,比如spring设置,内部VM信息等等。在这个例子中我可以直接从控制台查询VM信息:
壳
$>domain com.sun.management#domain is set to com.sun.management$>beans#domain = com.sun.management:com.sun.management:type=DiagnosticCommandcom.sun.management:type=HotSpotDiagnostic$>bean com.sun.management:type=HotSpotDiagnostic#bean is set to com.sun.management:type=HotSpotDiagnostic$>info#mbean = com.sun.management:type=HotSpotDiagnostic#class name = com.sun.management.internal.HotSpotDiagnostic# attributes %0 - DiagnosticOptions ([Ljavax.management.openmbean.CompositeData;, r) %1 - ObjectName (javax.management.ObjectName, r)# operations %0 - void dumpHeap(java.lang.String p0,boolean p1) %1 - javax.management.openmbean.CompositeData getVMOption(java.lang.String p0) %2 - void setVMOption(java.lang.String p0,java.lang.String p1)#there's no notifications
最后
JMX 是一个了不起的工具,我们主要用于连接管理控制台。这很了不起,您应该为您的项目大量导出 JMX 设置。话虽如此,您可以通过将 JMX 作为调试过程的一部分将其提升到一个新的水平。
服务器应用程序在没有 UI 或深度 UI 分离的情况下运行。JMX 通常可以用作用户界面的一种形式,甚至可以用作命令行界面,如JMXTerm. 在这些情况下,我们可以在管理 UI 中触发调试情况或观察调试会话的结果。
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!