gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 11:36:21 70 4
gpt4 key购买 nike

我想在 Docker 中监控 Spring Boot 应用程序的 JVM 内部,该应用程序在 Kubernetes 集群中作为 Pod 运行。但即使花了相当长的时间,我也无法在任何地方找到满意的答案。
我尝试在 this 上引用已接受的答案但它仅在我的 docker 在本地运行时才连接,并在 Kubernetes 集群后面停止连接。

最佳答案

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

-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

但它不适用于远程 Kubernetes 集群中的 pod。我找到了 this但我的要求是在不通过服务的情况下进行监控,然后通过阅读其他几篇文章我让它工作,因此整理以下步骤以节省某人的时间:-
  • 删除了启动脚本中上面提到的VM选项
  • 更新我的 application.yaml 如下,我启用了 jmx 并添加了运行 JMXMP 连接器服务器的 url
  • spring:
    application:
    name: stack-application
    jmx:
    enabled: true
    url: service:jmx:jmxmp://localhost:8001/
    server:
    port: 8000
  • 将部署块下的 Kubernetes 部署 YAML 更新为:
  • apiVersion: apps/v1
    kind: Deployment
    ----your content----
    ports:
    - name: stack-app-port
    containerPort: 8000
    - name: stack-jmx-port
    containerPort: 8001
  • 将以下依赖添加到我的 pom.xml 以供下载 JMXMP在我的研究之后,我得出结论,JMX 监视 RMI 是一项艰巨的工作,因此 JMXMP 是每个人的推荐。
  •         <dependency>
    <groupId>org.glassfish.main.external</groupId>
    <artifactId>jmxremote_optional-repackaged</artifactId>
    <version>5.0</version>
    </dependency>
  • 创建了一个新类(class) 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;
    }
    }
  • 在 Kubernetes 上构建和部署您的 docker,并找出 pod 的 IP 地址。您可以使用 kubectl describe pod对于 CLI
  • 现在要启动 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"'
  • 现在,执行“viz”或您的别名,它将启动您的 Java 附带的 Visual VM 应用程序。
  • 单击 VisualVM 工具栏中的 +JMX 图标或转到(文件 -> 添加 JMX 连接...)添加链接
  • service:jmx:jmxmp://<IP address obtained in step 6 above>:8001

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

    VisualVM screenshot monitoring remote app on 8001

    关于spring-boot - 使用 VisualVM 在 Kubernetes 集群后面通过 JMX 监控 dockerised Spring Boot 应用程序内部,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62367429/

    70 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com