使用 VisualVM 在 Kubernetes 集群后面通过 JMX 监控 dockerised Spring Boot 应用程序内部

roh*_*msh 3 jmx visualvm docker spring-boot kubernetes

我想在 Docker 中监控 Spring Boot 应用程序的 JVM 内部,该应用程序在 Kubernetes 集群中作为 Pod 运行。但即使花了相当长的时间,我也无法在任何地方找到满意的答案。我试过指对接受的答案这个,但它只是连接,当我的搬运工在本地运行,并且停止而Kubernetes集群背后连接。

roh*_*msh 5

假设我想在我的应用程序在 8000 上提供服务时在端口 8001 上进行监控。将这些添加到我的 VM 选项工作正常(VisualVM 正在显示此监控过程),同时在本地运行 Docker 并将端口 8001 从我的本地映射到 Docker(-p 8001 :8001)

-Dcom.sun.management.jmxremote \
-Djava.rmi.server.hostname=localhost \
-Dcom.sun.management.jmxremote.port=8001 \
-Dcom.sun.management.jmxremote.rmi.port=8001 \
-Dcom.sun.management.jmxremote.local.only=false \
-Dcom.sun.management.jmxremote.authenticate=false \
-Dcom.sun.management.jmxremote.ssl=false
Run Code Online (Sandbox Code Playgroud)

但它不适用于远程 Kubernetes 集群中的 pod。我发现了这一点,但我的要求是在不通过 Service 的情况下进行监控,然后通过阅读其他几篇文章我让它工作,因此整理以下步骤以节省某人的时间:-

  1. 删除了启动脚本中上面提到的 VM 选项
  2. 更新我的 application.yaml 如下,我启用了 jmx 并添加了运行 JMXMP 连接器服务器的 url
spring:
  application:
    name: stack-application
  jmx:
    enabled: true
    url: service:jmx:jmxmp://localhost:8001/
server:
  port: 8000
Run Code Online (Sandbox Code Playgroud)
  1. 将部署块下的我的 Kubernetes 部署 YAML 更新为:
apiVersion: apps/v1
kind: Deployment
----your content----
          ports:
            - name: stack-app-port
              containerPort: 8000
            - name: stack-jmx-port
              containerPort: 8001
Run Code Online (Sandbox Code Playgroud)
  1. 在我的 pom.xml 中添加了以下依赖项以下载JMXMP,因为经过我的研究,我得出结论,通过 RMI 监视 JMX 是一项艰巨的工作,因此 JMXMP 是每个人的推荐。
        <dependency>
            <groupId>org.glassfish.main.external</groupId>
            <artifactId>jmxremote_optional-repackaged</artifactId>
            <version>5.0</version>
        </dependency>
Run Code Online (Sandbox Code Playgroud)
  1. 创建了一个ConnectorServiceFactoryBeanProvider从 application.yaml 中获取 URL的新类
@Configuration
public class ConnectorServiceFactoryBeanProvider {
    @Value("${spring.jmx.url}")
    private String url;

    @Bean
    public ConnectorServerFactoryBean connectorServerFactoryBean() throws Exception {
        final ConnectorServerFactoryBean connectorServerFactoryBean = new ConnectorServerFactoryBean();
        connectorServerFactoryBean.setServiceUrl(url);
        return connectorServerFactoryBean;
    }
}
Run Code Online (Sandbox Code Playgroud)
  1. 在 Kubernetes 上构建和部署您的 docker,并找出 pod 的 IP 地址。您可以kubectl describe pod在 CLI 上使用它
  2. 现在要启动 VisualVM,我们还需要在 classpath 中添加上面下载的 JMXMP jar。我创建了一个别名来做同样的事情,因为 JAR 是在我本地的 .m2 目录中下载的,所以命令看起来像这样:-
alias viz='jvisualvm -cp "$JAVA_HOME:~/.m2/repository/org/glassfish/main/external/jmxremote_optional-repackaged/5.0/jmxremote_optional-repackaged-5.0.jar"'
Run Code Online (Sandbox Code Playgroud)
  1. 现在,执行“viz”或您的别名,它将启动您的 Java 附带的 Visual VM 应用程序。
  2. 单击 VisualVM 工具栏中的 +JMX 图标或转到(文件 -> 添加 JMX 连接...)添加链接
service:jmx:jmxmp://<IP address obtained in step 6 above>:8001
Run Code Online (Sandbox Code Playgroud)

并选中“不需要 SSL 连接”。点击 OK 后,您应该会在 VisualVM 上看到您的远程应用程序内部结构。下面附上截图。

VisualVM 屏幕截图监控 8001 上的远程应用程序