本章节汇总了使用ARMS应用监控时的常见问题。

本页目录

ARMS Agent和其他APM产品Agent(例如Pinpoint)是否兼容?

ARMS Agent和其他APM产品Agent都不兼容。APM大多是基于ASM框架进行字节码插桩实现的,同时安装两个Agent相当于对您的代码插桩两次,而不同商家的插装代码实现不同,代码冲突可能造成严重的性能问题,因此强烈建议您不要同时安装多个APM Agent。

[回到顶部]

安装Agent后应用启动时报OutOfMemoryError错误怎么办?

请在Java启动命令后面加上堆内存大小配置项,以适当调大JVM参数。以下示例配置项表示堆内存初始值(Xms)为512 M,堆内存最大值(Xmx)为2 G。

说明 请根据实际情况适当调节。对于Tomcat等其他环境,请在配置文件的JAVA_OPTS中加入此参数。
   -Xms512M
   -Xmx2048M

如果出现OutOfMemoryError: PermGen space错误,请添加以下配置。

   -XX:PermSize=256M 
   -XX:MaxPermSize=512M

[回到顶部]

如何测试网络连通性?

部署ARMS Agent时,必须确保8883、8443、8442这三个端口的可连通性,Agent才能正常工作。可使用Telnet命令测试目标主机与ARMS服务器网络是否连通。例如,以测试深圳地域的连通性为例,请登录应用所部署的机器,并输入以下命令:

telnet arms-dc-sz.aliyuncs.com 8883
telnet arms-dc-sz.aliyuncs.com 8443
telnet arms-dc-sz.aliyuncs.com 8442
说明 请根据所在地域替换服务器地址,且服务器地址区分经典网络和公网与VPC网络。
表 1. 各地域ARMS应用监控服务器地址
地域 经典网络和公网 VPC网络
华东1(杭州) arms-dc-hz.aliyuncs.com arms-dc-hz-internal.aliyuncs.com
华北2(北京) arms-dc-bj.aliyuncs.com arms-dc-bj-internal.aliyuncs.com
华东2(上海) arms-dc-sh.aliyuncs.com arms-dc-sh-internal.aliyuncs.com
华北1(青岛) arms-dc-qd.aliyuncs.com arms-dc-qd-internal.aliyuncs.com
华南1(深圳) arms-dc-sz.aliyuncs.com arms-dc-sz-internal.aliyuncs.com
华北3(张家口) arms-dc-zb.aliyuncs.com arms-dc-zb-internal.aliyuncs.com
中国(香港) arms-dc-hk.aliyuncs.com arms-dc-hk-internal.aliyuncs.com
新加坡 arms-dc-sg.aliyuncs.com arms-dc-sg-internal.aliyuncs.com
政务云 arms-dc-gov.aliyuncs.com arms-dc-gov-internal.aliyuncs.com
华东1金融云(杭州) arms-dc-hz-finance.aliyuncs.com arms-dc-hz-finance-internal.aliyuncs.com

[回到顶部]

如何检查ARMS Agent是否安装成功?

使用ps命令查看命令行启动参数中是否成功安装ARMS Agent。

ps -ef | grep 'arms-bootstrap'

成功安装时,如下图所示:

ARMS Agent

命令行中的Darms.licenseKey的值必须与ARMS接入应用页面显示的License Key一致。

ARMS Access Application

[回到顶部]

ARMS Agent安装成功,为什么控制台上仍无监控数据?

  1. 如果Agent日志中出现send agent metrics. no metrics.,请确认您的应用是否有持续的外部访问请求,包括HTTP请求、HSF请求和Dubbo请求,并确认开发框架是否在ARMS Agent的支持范围内。关于ARMS应用监控对第三方组件和框架的支持情况,请参见应用监控概述
  2. 确认选择的查询时间范围是否正确。请您将查询时间条件设为最近15分钟,然后再次确认是否有监控数据。
  3. 如果是通过-jar命令行启动的,请检查命令行设置,确保-javaagent参数在-jar之前。以下是一个正确示例。
    java -javaagent:/{user.workspace}/ArmsAgent/arms-bootstrap-1.7.0-SNAPSHOT.jar -Darms.licenseKey=xxx -Darms.appName=xxx -jar demoApp.jar
  4. 如果ArmsAgent/log/下的日志中出现 LicenseKey is invalid. 异常,请检查应用所属地域与Agent所属地域是否一致。
  5. 如果应用启动之后ArmsAgent目录下没有log子目录,则表明arms-bootstrap-1.7.0-SNAPSHOT.jar未被成功加载,请检查ArmsAgent安装目录的权限是否正确。
  6. 若应用启动时出现以下报错,请您检查arms-bootstrap-1.7.0-SNAPSHOT.jar软件包及相应权限是否正确。

    Error opening zip file or JAR manifest missing: /root/ArmsAgent/arms-bootstrap-1.7.0-SNAPSHOT.jar
    Error occurred during initialization of VM
    agent library failed to init: instrument
  7. 如果仍无监控数据,请将Java Agent日志(路径:ArmsAgent/log)保存为压缩文件,并联系钉钉服务账号arms160804解决问题。
  8. 检查JDK版本。如果JDK版本为1.8.0_25或者1.8.0_31,可能会出现无法安装Agent的情况,建议您升级对应的JDK版本,或咨询钉钉服务账号arms160804

[回到顶部]

ARMS Agent安装成功,但IP显示不正确或不显示,怎么办?

  1. 首先通过ifconfig -a命令确认当前机器的网络配置情况,若为多网卡环境,则Agent采集到的IP地址可能会不符合预期(与网络配置环境有关)。
  2. 选择以下方式之一来解决问题。
    • 配置JVM的-DEAGLEEYE.LOCAL.IP=10.XX.XX.XX参数。
      说明10.XX.XX.XX替换为实际IP地址。
    • 配置Agent获取JVM的-DNETWORK.INTERFACE=eth0参数,其中eth0为网卡名称。

[回到顶部]

对于ARMS Agent日志(路径:ArmsAgent/log)错误,有哪些常用排查方法?

LicenseKey is invalid错误:

  1. 确保在ARMS中已成功创建该应用,并且确认安装Agent时填写的LicenseKey正确。
  2. 由于ARMS产品是多地域(Region)环境,所以还需要确认Agent的下载地址所属的地域与应用所属地域是否一致。

[回到顶部]

如何支持单机多实例?

如需在同一台机器上部署同一应用的多个实例,可以通过-Darms.agentId(逻辑编号,如001、002)参数来区分接入的JVM进程,例如:

java -javaagent:/{user.workspace}/ArmsAgent/arms-bootstrap-1.7.0-SNAPSHOT.jar -Darms.licenseKey=<LicenseKey> -Darms.appName=<AppName> -Darms.agentId=001 -jar demoApp.jar

[回到顶部]

运行接入脚本时出现getcwd相关错误,该如何解决?

若您在运行一键接入Java应用的接入脚本时遇到以下错误:

shell-init: error retrieving current directory: getcwd: cannot access parent directories: No such file or directory Error occurred during initialization of VM java.lang.Error: Properties init: Could not determine current working directory. at java.lang.System.initProperties(Native Method) at java.lang.System.initializeSystemClass(System.java:1119)

可能是因为执行脚本过程中当前目录被误删,解决方法为执行cd后重新运行脚本。

[回到顶部]

使用一键接入方式安装Agent后,在哪里查看日志?

日志的默认目录为/root/.arms/supervisor/logs/,若此目录下没有日志,请执行命令ps -ef |grep arms查看日志所在目录。

[回到顶部]

Agent安装失败怎么处理?

  1. 确保您的ECS实例可以访问公网,且能够访问所在地域的Agent下载链接。
    # 杭州地域
    http://arms-apm-hangzhou.oss-cn-hangzhou.aliyuncs.com/install.sh
    # 上海地域
    http://arms-apm-shanghai.oss-cn-shanghai.aliyuncs.com/install.sh
    # 青岛地域
    http://arms-apm-qingdao.oss-cn-qingdao.aliyuncs.com/install.sh
    # 北京地域
    http://arms-apm-beijing.oss-cn-beijing.aliyuncs.com/install.sh
    # 深圳地域
    http://arms-apm-shenzhen.oss-cn-shenzhen.aliyuncs.com/install.sh
    # 新加坡地域
    http://arms-apm-ap-southeast.oss-ap-southeast-1.aliyuncs.com/cloud_ap-southeast-1/install.sh
  2. 确保您的ECS实例可以访问控制台。
    #中国
    https://arms.console.aliyun.com/
    #新加坡
    https://arms-ap-southeast-1.console.aliyun.com
  3. 登录ECS控制台,并完成以下检查工作。
    1. 在左侧导航栏中选择运维与监控 > 发送远程命令(云助手)
    2. 云助手页面的搜索框中选择命令名称,输入InstallJavaAgent命令并按Enter键。
      说明 若查找结果不存在,请联系ARMS钉钉服务账号arms160804
    3. 云助手页面的执行记录页签的搜索栏中输入InstallJavaAgent命令的命令ID,在查找结果中单击该记录右侧操作列的查看结果,即可查看InstallJavaAgent命令是否执行成功。若未执行成功,请根据详细执行结果排查问题。如ECS磁盘满、未安装Agent等问题,可以通过清理磁盘或安装Agent来解决。若不能解决,请将详细执行结果反馈给ARMS钉钉服务账号arms160804

[回到顶部]

安装Agent后ECS实例进程信息不准确怎么办?

若您在ECS上成功安装Agent后没有出现ECS实例进程信息,或者ECS实例进程信息不准确,请单击ECS实例左侧的-号并单击+号刷新数据。若不能解决,请联系ARMS钉钉服务账号arms160804

[回到顶部]

ECS实例中的进程启动应用监控失败怎么办?

请检查ECS实例的/root/.arms/supervisor/logs/arms-supervisor.log日志中是否有日志级别为Error的信息,并根据此信息排查。若不能解决,请联系ARMS钉钉服务账号arms160804

[回到顶部]

为什么容器服务K8s集群中的Java应用安装Agent后,应用监控没有数据呢?

  1. 登录容器服务Kubernetes版控制台
  2. 在左侧导航栏选择应用 > 容器组,在容器组(Pod)页面,从集群列表和命名空间列表选择您的应用所在集群和命名空间。
  3. 在Pod列表中找到目标应用所在的Pod,单击右侧的编辑,在编辑YAML对话框中查看YAML文件中是否存在initContainers。
    db_am_ack_apppod_yaml
    • 如果不存在,则说明未被注入arms-init-container,执行步骤4
    • 如果存在,则说明已被注入arms-init-container,执行步骤7
  4. 容器组(Pod)页面,从集群列表和命名空间列表选择您的应用所在集群和arms-pilot命名空间,查看Pod列表中是否存在名称前缀为arms-pilot的Pod。
  5. 在左侧导航栏选择应用 > 无状态,在无状态(Deployment)页面从集群列表和命名空间列表选择您的应用所在集群和命名空间,选择右侧操作列的更多 > 查看Yaml,在编辑YAML对话框查看YAML文件中是否存在以下Annotations注解。
    annotations:
      armsPilotAutoEnable: 'on'
      armsPilotCreateAppName: <your-deployment-name>
    • 如果存在,则执行步骤6
    • 如果不存在,则在编辑YAML对话框中的spec > template > metadata层级下添加以上Annotations注解,并将<your-deployment-name>替换为您的应用名称,然后单击更新
  6. 在左侧导航栏选择应用 > 容器组,在容器组(Pod)页面,从集群列表和命名空间列表选择您的应用所在集群和arms-pilot命名空间,然后单击右侧的日志查看arms-pilot的Pod日志是否报STS错误,即提示"Message":"STS错误"
    • 如果报STS错误,则需为应用所在集群授权,并重启应用所在Pod,详情请参见为容器服务Kubernetes版授权
    • 如果未报STS错误,则联系ARMS钉钉服务账号:arms160804。
  7. 编辑YAML对话框中查看YAML文件中是否存在以下javaagent参数。
    -javaagent:/home/admin/.opt/ArmsAgent/arms-bootstrap-1.7.0-SNAPSHOT.jar
    • 如果存在,则在容器组(Pod)页面找到应用所在Pod,单击右侧的终端进入命令行页面,执行以下命令查看是否存在以.log为后缀的日志文件,然后联系ARMS钉钉服务账号:arms160804。
      cd /home/admin/.opt/ArmsAgent/logs
    • 如果不存在,则联系ARMS钉钉服务账号:arms160804。

[回到顶部]

应用无法正常启动怎么办?

请执行以下命令查看arms-pilot-system的日志信息来排查问题。

kubectl logs -f {arms-pilot-arms-pilot-XXX} -n arms-pilot-system

[回到顶部]

如何查看Agent日志?

在Kubernetes集群Worker机上查看/home/admin/.opt/ArmsAgent/logs/xxxx.log

[回到顶部]

以通用方式安装Agent的普通Java应用如何更改应用名称?

普通Java应用是指除了部署在阿里云ECS实例上的应用以外的Java应用。如果您是以通用方式安装Agent的,则Agent目录就是您自定义的位置。

您可以在Agent目录的Version文件中查看Agent版本。例如,2.5.8_cf020486_20190816150025表示Agent版本为2.5.8,Agent发布时间为2019年8月16日。

  • 如果您的Agent版本低于2.5.8.1,请先卸载Agent再重新安装,并在重新安装时使用新的应用名称。
  • 如果您的Agent版本为2.5.8.1或以上,则可在不重装Agent的情况下更改Java应用名称,详情请参见以下操作步骤:
    说明 2019年8月20日之后下载的Agent默认都支持该功能。
  1. 请使用以下方法之一下载并解压Supervisor。
    说明 请根据您的应用所在的地域替换下载地址中的地域。
    • 公网地址
      wget http://arms-apm-hangzhou.oss-cn-hangzhou.aliyuncs.com/ArmsSupervisor.zip -O ArmsSupervisor.zip
      unzip ArmsSupervisor.zip
    • VPC地址(公网地址无法下载时使用)
      wget http://arms-apm-hangzhou.oss-cn-hangzhou-internal.aliyuncs.com/ArmsSupervisor.zip -O ArmsSupervisor.zip
      unzip ArmsSupervisor.zip
  2. 运行以下命令更改应用名称。
    cd ArmsSupervisor
    ./attach.sh </path/to/ArmsAgent/arms-bootstrap-1.7.0-SNAPSHOT.jar> <PID> <NewAppName> <LicenseKey>
    • </path/to/ArmsAgent/arms-bootstrap-1.7.0-SNAPSHOT.jar>:指向Agent下同名文件的路径。
    • <PID>:目标进程ID,可通过jps/ps命令获取。
    • <NewAppName>:新的应用名称。
    • <LicenseKey>:ARMS应用监控中应用的LicenseKey,可从控制台获取。

如果应用的标准输出打印以下日志,则说明应用名称更改成功。

Name Change Success

[回到顶部]

以快速方式安装Agent的普通Java应用如何更改应用名称?

如果您是以快速方式安装Agent的,则Agent目录为~/.arms/supervisor/agent。注意,使用的账号必须与应用相同。

请按照以下步骤更改应用名称。

  1. 登录应用所在的机器,并运行以下命令。
    cd ~/.arms/supervisor
    ./cli.sh <LicenseKey> <NewAppName>
    • <LicenseKey>:ARMS应用监控中应用的LicenseKey,可从控制台获取。
    • <NewAppName>:新的应用名称。
  2. 从程序列出的所有Java进程中选择正确的进程。
    说明 如果只有一个应用进程则默认选中该进程。
  3. 打开~/.arms/attach.info文件,将需要修改的旧应用名称修改为新应用名称并保存文件。
    警告 修改文件时切勿多加空格等内容,否则会因为与前述步骤中修改的新应用名称不符而导致修改失败。

    应用名称更改成功后稍等片刻,旧名称的应用下将不再有监控数据上报,且新名称的应用下将有监控数据上报。

部署在ECS中的Java应用如何更改应用名称?

如果是部署在ECS实例中的Java应用,则Agent目录为/.arms/agent

请按照以下步骤更改应用名称。

  1. 登录应用所在的机器,并使用root账号运行以下命令。
    su <USER> -c "./attach.sh /.arms/agent/arms-bootstrap-1.7.0-SNAPSHOT.jar <PID> <NewAppName> <LicenseKey>"
    • <PID>:目标进程ID,可通过jps/ps命令获取。
    • <NewAppName>:新的应用名称。
    • <LicenseKey>:ARMS应用监控中应用的LicenseKey,可从控制台获取。
  2. 打开~/.arms/attach.info文件,将需要修改的旧应用名称修改为新应用名称并保存文件。
    警告 修改文件时切勿多加空格等内容,否则会因为与前述步骤中修改的新应用名称不符而导致修改失败。

如果应用的标准输出打印以下日志,则说明应用名称更改成功。

Name Change Success

部署在容器服务K8s集群中的Java应用如何更改应用名称?

您可以在Agent目录的Version文件中查看Agent版本。例如,2.5.8_cf020486_20190816150025表示Agent版本为2.5.8,Agent发布时间为2019年8月16日。

  • 如果您的Agent版本低于2.5.8.1,请先卸载Agent再重新安装,并在重新安装时使用新的应用名称。
  • 如果您的Agent版本为2.5.8.1或以上,则可在不重装Agent的情况下更改Java应用名称,详情请参见以下操作步骤:
    说明 2019年8月20日之后下载的Agent默认都支持该功能。

修改Deployment内的armsPilotCreateAppName参数并重启Pod即可。

应用名称更改成功后稍等片刻,旧名称的应用下将不再有监控数据上报,且新名称的应用下将有监控数据上报。

[回到顶部]

部署在EDAS上的Java应用如何更改应用名称?

目前不支持为部署在EDAS上的Java应用更改应用名称。

[回到顶部]

如何卸载以通用方式安装的Agent?

以通用方式安装Agent是指使用手动方式为Java应用安装Agent,详情请参见为Java应用手动安装探针。卸载以通用方式安装的Agent的操作步骤如下所示:

  1. 当您不需要使用ARMS监控您的Java应用时,删除上述安装文档步骤8添加的AppNameLicenseKey相关的所有参数。
  2. 重启Java应用。

[回到顶部]

如何卸载以快速方式安装的Agent?

以快速方式安装Agent是指使用一键接入脚本为Java应用安装Agent,详情请参见使用脚本为Java应用快速安装探针。卸载以快速方式安装的Agent的操作步骤如下所示:

  1. 当您不需要使用ARMS监控您的Java应用时,执行jps -l命令查看所有进程,并在执行结果中找到com.alibaba.mw.arms.apm.supervisor.daemon.Daemon对应的进程号。
    在本示例中,com.alibaba.mw.arms.apm.supervisor.daemon.Daemon对应的进程号为:62857。Kill Process
  2. 执行命令kill -9 <进程号>
    例如:kill -9 62857
  3. 执行rm -rf /.arms /root/.arms
  4. 重启您的应用。

[回到顶部]

如何卸载ECS中Java应用的Agent?

  1. 当您不需要使用ARMS监控您的Java应用时,执行jps -l命令查看所有进程,并在执行结果中找到com.alibaba.mw.arms.apm.supervisor.daemon.Daemon对应的进程号。
    在本示例中,com.alibaba.mw.arms.apm.supervisor.daemon.Daemon对应的进程号为:62857。Kill Process
  2. 执行命令kill -9 <进程号>
    例如:kill -9 62857
  3. 执行rm -rf /.arms /root/.arms
  4. 重启您的应用。

[回到顶部]

如何卸载容器服务K8s集群中Java应用的Agent?

当您不需要使用ARMS监控容器服务Kubernetes版集群中的Java应用时,可按照以下步骤卸载Agent:

  1. 登录容器服务Kubernetes版控制台
  2. 在左侧导航栏选择应用 > 发布
  3. 发布页面的Helm页签上,从集群列表中选择需要卸载ARMS Agent的集群。
  4. 选择ARMS Agent对应的发布名称arms-pilot,单击操作列的删除
  5. 删除应用对话框单击确定
  6. 重启您的业务Pod。

[回到顶部]

如何卸载开源K8s环境中Java应用的Agent?

  1. 当您不需要再监控开源Kubernetes环境中的Java应用时,可执行以下命令卸载arms-pilot。
    helm del --purge arms-pilot
  2. 重启您的业务Pod。

[回到顶部]

如何卸载Docker中Java应用的Agent?

  1. 当您不需要再监控Docker集群中的Java应用时,可以删除安装文档的步骤1所编辑的Dockerfile内容。
  2. 运行docker build命令来构建镜像。
  3. 运行docker run命令来启动镜像。

[回到顶部]

如何卸载PHP应用的Agent?

当您不需要使用ARMS监控PHP应用(非部署于K8s集群中)时,可按照以下步骤卸载Agent:

  1. 删除php.ini文件中的以下四行:
    [arms] 
    extension=<php_extension_dir>/arms.so
    arms.trace_exception=true
    arms.config_full_name=/<php-agent-dir>/arms-agent.conf                  
  2. 重启PHP应用。

[回到顶部]

如何卸载容器服务K8s集群中PHP应用的Agent?

当您不需要使用ARMS监控容器服务Kubernetes版集群中的PHP应用时,可按照以下步骤卸载Agent:

  1. 登录容器服务Kubernetes版控制台
  2. 在左侧导航栏选择应用 > 发布
  3. 发布页面的Helm页签上,从集群列表中选择需要卸载ARMS Agent的集群。
  4. 选择ARMS Agent对应的发布名称arms-pilot,单击操作列的删除
  5. 删除应用对话框单击确定
  6. 重启您的业务Pod。

[回到顶部]

使用OpenFeign组件的应用在ARMS中数据不完整怎么办?

若您的OpenFeign应用接入ARMS应用监控后,出现数据不完整、看不到下游应用的数据等情况,可能的原因是OpenFeign组件默认开启了使用RxJava异步框架的Hystrix,而ARMS不支持异步框架。

说明 本文仅限于ARMS应用监控Java Agent版本低于2.6.0的场景,2.6.0及以上版本已支持异步框架。

您可以通过关闭Hystrix并配置OkHttp请求类来解决此类问题:

  1. pom.xml文件中添加以下依赖。
    <!-- OKHttp对Feign支持 -->
    <dependency>
        <groupId>io.github.openfeign</groupId>
        <artifactId>feign-okhttp</artifactId>
    </dependency>                
  2. 在SpringCloud配置文件中添加以下配置。
    feign.okhttp.enabled: true
    feign.hystrix.enabled: false                 
  3. 配置OkHttp请求类。
    @Configuration
    @ConditionalOnClass(Feign.class)
    @AutoConfigureBefore(FeignAutoConfiguration.class)
    public class FeignClientOkHttpConfiguration {
    
        @Bean
        public OkHttpClient okHttpClient() {
            return new OkHttpClient.Builder()
                    // 连接超时
                    .connectTimeout(20, TimeUnit.SECONDS)
                    // 响应超时
                    .readTimeout(20, TimeUnit.SECONDS)
                    // 写超时
                    .writeTimeout(20, TimeUnit.SECONDS)
                    // 是否自动重连
                    .retryOnConnectionFailure(true)
                    // 连接池
                    .connectionPool(new ConnectionPool())
                    .build();
        }                

[回到顶部]