如何将 java 代理附加到 运行 spring-boot 应用程序

How to attach a java agent on to a running spring-boot application

我有一个 spring 引导应用程序打包到端口上的 war 运行ning 中,现在我想将 java 代理附加到此应用程序,以使用 Prometheus 监控微服务。但是没有使用任何 spring 插件从中抓取指标。

为此,我找到了一种方法 运行 java 代理与应用程序一起启动它(将我的应用程序打包到 jar 中进行试用,它完美运行)

java -javaagent <Path-to javaagent jar>:PORT -jar app.jar

如果我的项目被打包到 jar 中,这工作正常,它在 PORT 上启动 java-agent,在不同的端口上启动我的应用程序,我能够从 java-agent 获取指标。

但实际问题是我的应用程序被打包成 war。

我们可以 运行 一个带有 war 文件的 java 代理吗?

此外,我想尝试的另一件事是,在使用 Maven 启动应用程序后将此代理 jar 附加到 jvm,就像使用 "mvn spring-boot:run"

的任何其他 spring 启动应用程序一样

如何实现?

根据@Strelok 的建议, 我已经在端口上将 java 代理添加到 maven_opts 到 运行 作为

set MAVEN_OPTS =-javaagent:Path-to javaagent jar=PORT=9300

它在我的本地环境中工作,因为我 运行 我的应用程序使用 mvn spring-boot:运行 命令。

但是,如果要同时 running/monitored 2 个不同的微服务,如上添加 maven_opts 可能会导致第二个微服务出现问题,因为代理已经运行在同一个端口上。 在这种情况下,我们可以将代理标记添加到 spring-boot-maven-plugin 下的 pom.xml 以启动代理,而不是将 maven_opts 添加到 env 变量:

<configuration>
    <agent>    
        PATH to JAR=port=XXXX
    </agent>
</configuration>

但是我们的暂存环境 运行 带有 Jenkins 作业,它构建应用 war 并将其部署到 tomcat 服务器并启动 tomcat(通过 运行宁./startup.sh.) 所以我已经将 java 代理的 jar 路径添加到我的 tomcat 服务器的 setenv.sh 中的 catalina_opts。

正如预期的那样有效。