使用 apm-agent-attach-cli.jar 自动设置
编辑使用 apm-agent-attach-cli.jar
自动设置编辑
apm-agent-attach-cli.jar
是一个可执行的 Java 命令行程序,它将 Elastic APM Java 代理附加到特定的 JVM 或其运行所在的同一主机的所有 JVM,它具有以下属性
- 无需更改应用程序代码。
- 不需要更改 JVM 参数,也不需要更改应用程序服务器配置。
- 允许检测给定主机上的所有 JVM,包括正在运行的 JVM 和通过监控启动的新 JVM。
- 需要在主机上复制并执行
apm-agent-attach-cli.jar
二进制文件。 - 依赖于 JVM 的 Java 代理的运行时附加功能,但不需要完整的 JDK 或
tools.jar
。 - 应用程序启动期间发生的事件可能不会被捕获。
- 通常不可能使用此机制附加到在容器或 Kubernetes Pod 中运行的 JVM。对于 Kubernetes,我们支持使用变异 webhook自动附加;对于 Docker,您可以尝试下面的脚本
支持的环境编辑
在 Unix 操作系统(如 Linux 和 macOS)上,支持附加到基于 HotSpot 的 JVM(如 OpenJDK 和 Oracle JDK)和 OpenJ9 JVM。运行附加程序的用户必须与运行目标 JVM 的用户相同,或者必须具有切换到该用户的权限。
在 Windows 上,仅支持基于 HotSpot 的 JVM。运行附加程序的用户必须与运行目标 JVM 的用户相同。
目标 VM 不必与启动附加程序的 VM 相同。这意味着可以使用 Java 7 运行附加程序,并将代理附加到在 Java 11 下运行的应用程序。但是,VM 的类型必须相同:不可能从基于 HotSpot 的 VM 附加到 J9 VM,反之亦然。
下载编辑
您可以从 Maven 中央存储库下载附加程序:Maven 中央存储库
在 1.22.0 之前的版本中,您必须下载 apm-agent-attach
工件的 standalone
jar。
用法编辑
将 Elastic APM Java 代理附加到与 --include-*
/ --exclude-*
发现规则匹配的所有正在运行的 JVM。
对于每个正在运行的 JVM,发现规则将按照提供的顺序进行评估。与当前评估的 Java 应用程序匹配的第一条规则决定了结果。
- 如果第一个匹配项是排除规则,则不会附加代理。
- 如果第一个匹配项是包含规则,则将附加代理。
- 如果没有规则匹配,则不会附加代理。
示例:以下命令将代理附加到所有主类包含 MyApplication
的 JVM,或者从名为 my-application.jar
的 jar 文件启动的 JVM,或者设置了系统属性 -Delastic.apm.attach=true
的 JVM,除非 JVM 在 root 用户下运行。它还使附加程序持续运行,以便它将代理附加到与发现规则匹配的启动 JVM。此外,它还应用了一些配置选项。
java -jar apm-agent-attach-cli.jar \ --exclude-user root \ --include-main MyApplication my-application.jar \ --include-vmarg elastic.apm.attach=true \ --continuous \ --config service_name=my-cool-service \ --config server_url=http://127.0.0.1:8200
选项编辑
- -l, --list
-
这使您可以对包含/排除发现规则进行试运行。程序不会附加到匹配的 JVM,而是会打印与包含/排除发现规则匹配的 JVM。与
jps -l
类似,输出包括 PID 以及主类名或 jar 文件的路径。 - -v, --list-vmargs
-
通过
--list
列出正在运行的 JVM 时,包括传递给 JVM 的参数。提供类似于jps -lv
的输出。JVM 参数可能包含敏感信息,例如通过系统属性提供的密码。
- -c, --continuous
-
如果提供,则此程序将持续运行,并附加到与
--exclude
和--include
过滤器匹配的所有正在运行和启动的 JVM。 - --no-fork [1.35.0] 在 1.35.0 中添加。
-
默认情况下,当用户 A 运行附加程序并且用户 B 运行目标进程时,附加程序将尝试以用户 B 的身份启动另一个进程。如果提供了此配置选项,则附加程序将不会分叉。相反,它将尝试以当前用户的身份直接附加。
- --include-all
-
包括所有要附加的 JVM。
- --include-pid <pid>…
-
要包含的 PID。
- --include-main/--exclude-main <pattern>…
-
应将 Java 代理附加到的应用程序的完全限定主类名或 JAR 路径的正则表达式。执行部分匹配,以便
foo
匹配/bin/foo.jar
。 - --include-vmarg/--exclude-vmarg <pattern>…
-
与传递给 JVM 的参数(例如系统属性)匹配的正则表达式。执行部分匹配,以便
attach=true
匹配系统属性-Delastic.apm.attach=true
。 - --include-user/--exclude-user <user>…
-
与运行 JVM 的操作系统用户匹配的用户名。对于包含的用户,请确保运行此程序的用户是同一用户,或者具有切换到运行目标 JVM 的用户的权限。
- -a, --args <agent_arguments>
-
已弃用,取而代之的是 --config。
如果设置,则参数用于在附加的 JVM 上配置代理(agentmain 的 agentArguments)。
参数的语法为
key1=value1;key2=value1,value2
。有关所有可用的配置选项,请参阅配置。此选项不能与
--args-provider
一起使用 - -C --config <key=value>…
-
此可重复选项设置一个代理配置选项。
示例:
--config server_url=http://127.0.0.1:8200
- -A, --args-provider <args_provider_script>
-
新 JVM 启动时调用的程序的名称。该程序获取 pid 以及主类名或 JAR 文件的路径作为参数,并返回一个 arg 字符串,该字符串用于在附加的 JVM 上配置代理(agentmain 的 agentArguments)。从此程序返回非零状态代码时,代理将不会附加到启动的 JVM。
参数的语法为
key1=value1;key2=value1,value2
。有关所有可用的配置选项,请参阅配置。此选项不能与
--pid
和--config
一起使用 - -g, --log-level <off|fatal|error|warn|info|debug|trace|all>
-
设置日志级别。日志以 ECS JSON 格式发送到 stdout。
- --log-file <file>
-
要登录到文件而不是控制台,请指定此程序应登录到的文件的路径。日志文件在达到 10MB 的大小时会滚动更新。将保留一个历史文件,名称为
${logFile}.1
。 - --agent-jar <file>
-
将提供的代理附加到目标 JVM,而不是捆绑的代理 jar。
- --download-agent-version <agent-version>
-
从 Maven 中央存储库下载并附加指定的代理版本,而不是捆绑的代理 jar。<agent-version> 可以是显式版本(例如:
1.15.0
)或latest
。代理根据发布的 PGP 签名进行身份验证和验证。此选项需要 Internet 访问。
Docker编辑
使用此脚本自动附加到主机上运行的所有 Docker 容器。此脚本不会返回,而是持续侦听启动的容器,它也会附加到这些容器。
此脚本是实验性的,可能不适用于所有容器。特别是 jq --raw-output .[0].Config.Cmd[0]) == java
可能会有所不同。
attach.sh.
#!/usr/bin/env bash set -ex attach () { # only attempt attachment if this looks like a java container if [[ $(docker inspect ${container_id} | jq --raw-output .[0].Config.Cmd[0]) == java ]] then echo attaching to $(docker ps --no-trunc | grep ${container_id}) docker cp ./apm-agent-attach-*-cli.jar ${container_id}:/apm-agent-attach-cli.jar docker exec ${container_id} java -jar /apm-agent-attach-cli.jar --config fi } # attach to running containers for container_id in $(docker ps --quiet --no-trunc) ; do attach done # listen for starting containers and attach to those docker events --filter 'event=start' --format '{{.ID}}' | while IFS= read -r container_id do attach done
故障排除编辑
如果您收到类似 no main manifest attribute, in apm-agent-attach.jar
的消息,则表示您使用了错误的工件。请使用以 -cli.jar
结尾的工件。