如何支援單機多執行個體?
如需在同一台機器上部署同一應用的多個執行個體,可以通過-Darms.agentId(邏輯編號,如001、002)參數來區分接入的JVM進程,例如:
java -javaagent:/{user.workspace}/ArmsAgent/aliyun-java-agent.jar -Darms.licenseKey=<LicenseKey> -Darms.appName=<AppName> -Darms.agentId=001 -jar demoApp.jar說明
如果您使用的探針版本在2.7.3.5以下,請將本文中的aliyun-java-agent.jar替換為arms-bootstrap-1.7.0-SNAPSHOT.jar。建議您儘快將探針升級至最新版本。
Docker 容器跨主機部署情境
在不同 ECS 上通過 Docker 部署同一應用時,Docker 預設的 bridge 網路使用 172.17.0.0/16 子網,不同主機上的容器可能分配到相同的內部 IP(如 172.17.0.2)。ARMS 通過 IP 識別應用執行個體,相同 IP 的容器會被合并為同一執行個體,導致應用監控的執行個體列表出現合并或缺失。
方案一:使用 host 網路模式
使用 --network=host 啟動容器,容器直接使用宿主機 IP,不同 ECS 的宿主機 IP 天然不同,可避免執行個體被合并:
docker run --network=host \
-e JAVA_TOOL_OPTIONS="-javaagent:/{user.workspace}/ArmsAgent/aliyun-java-agent.jar -Darms.licenseKey=<LicenseKey> -Darms.appName=<AppName>" \
<image>方案二:通過環境變數注入 agentId
如果不便切換網路模式,也可以通過 HOSTNAME 環境變數在不同機器上動態注入不同的 -Darms.agentId 值,部署指令碼保持統一:
java -javaagent:/{user.workspace}/ArmsAgent/aliyun-java-agent.jar -Darms.licenseKey=<LicenseKey> -Darms.appName=<AppName> -Darms.agentId=$HOSTNAME -jar demoApp.jar