TSF微服务无法查看JVM监控问题

2020-10-22 21:46:46 浏览数 (2)

问题背景

我们在利用TSF开发微服务的时候,特别是在Spring Cloud框架下,为了使更好应用服务在各种条件之下能够稳定持久的运行,需要对运行服务程序的底层相关资源、JVM虚拟机的堆栈信息进行监控。TSF提供了JVM监控相关组件,可以查看服务运行实例的CPU使用率、堆内存使用量,火焰图等信息。但是有时候会遇到配置了JVM监控但是无法具体监控图,显示空白等问题,JVM相关日志也无法查看,这个时间我们就需要对相关配置以及相关配置进行排查。

原因分析

1、tsf-agent 版本过低。

使用 JVM 监控功能时,实例的 tsf-agent 需为 1.21.0 或以上版本。如果 agent 版本过低,JVM 监控功能无法使用您需要对 agent 进行升级。

2、GC 日志配置被覆盖。

JVM 日志的采集依赖于 TSF 的 GC 日志配置。如果您自定义了 GC 日志配置,将会覆盖 TSF 的 GC 日志配置,这将导致无法在界面中查看 JVM 日志。

解决方案

1、JVM 如何升级 tsf-agent?

首先我们需要对tsf-agent进行升级操作:

  • VM 场景:您需要把实例移出集群后,再重新移入集群,重新部署服务实例。
  • 容器场景:您需重新编写 dockerfile,生成新的镜像后重新部署服务实例。

这里我们先介绍下如何制作容器镜像。

Spring Cloud 应用构建材料:

我们需要在 Dockerfile 中增加 JVM 监控组件TencentCloudJvmMonitor然后在 CMD 命令中启动该组件。

注意:将 Spring Cloud 应用 JAR 包和 JVM 监控组件放在同级目录下,并在该目录下编写 Dockerfile。

代码语言:javascript复制
FROM centos:7
RUN echo "ip_resolve=4" >> /etc/yum.conf
RUN yum update -y && yum install -y java-1.8.0-openjdk
# 设置时区。这对于日志、调用链等功能能否在 TSF 控制台被检索到非常重要。
RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
RUN echo "Asia/Shanghai" > /etc/timezone
ENV workdir /app/

# 下面的 jar 包可替换为您的 Spring Cloud 应用 jar 包,注意这个 jar 包要和您的 dockerfile 位于同一级目录
ENV jar provider-demo-0.0.1-SNAPSHOT.jar
COPY ${jar} ${workdir}
WORKDIR ${workdir}

# JVM 监控组件要和您的 Dockerfile 位于同一级目录,并创建 JVM 监控数据采集目录 
ENV agentjar TencentCloudJvmMonitor-1.0-RELEASE.jar
COPY ${agentjar} ${workdir}

RUN mkdir -p /data/tsf_apm/monitor/jvm-metrics/

# JAVA_OPTS 环境变量的值为部署组的 JVM 启动参数,在运行时 bash 替换。使用 exec 以使 Java 程序可以接收 SIGTERM 信号。
# 使用 JVM监控功能需要加上 gclog 和 javaagent 的配置, 否则将无法提供 jvm 监控能力
CMD ["sh", "-ec", "exec java -Xloggc:/data/tsf_apm/monitor/jvm-metrics/gclog.log -XX: PrintGCDateStamps -XX: PrintGCDetails -verbose:gc -XX: UseGCLogFileRotation -XX:NumberOfGCLogFiles=8 -XX:GCLogFileSize=50M -javaagent:${workdir}/${agentjar}=hascontroller=true ${JAVA_OPTS} -jar ${jar}"]

这里我们需要注意的是:

JVM 监控功能依赖 javaagent,jdk1.5 以后才引入了 javaagent 技术,所以您需使用 jdk1.6 及以上版本,建议您使用 jdk1.8。

2、火焰图采集失败如何处理?

火焰图适用于在 CPU 利用率持续较高的情况下进行热点函数分析。 在如下场景下,火焰图采集可能失败:

  • 数据量过大:目前火焰图的数据量上限为2MB,超出时会采集失败;此时,请缩短所选择的采集时间后,重新进行采集。
  • 当前无热点函数:进程处于低 CPU 消耗状态,即当前无热点函数时,火焰图采集可能失败(无法采集到热点函数);此时,可尝试延长采集时间后重新采集,或待服务请求量较大时再重新采集。
  • 无法和进程建立连接:发生无法和实例连接等异常情况时,采集任务会执行超时;此时,请您检查实例的连接状态,确认状态正常后再重新采集。

3、为何无法查看 JVM 日志?

JVM 日志的采集依赖于 TSF 的 GC 日志配置。如果自定义了 GC 日志配置,将会覆盖 TSF 的 GC 日志配置,这将导致无法在界面中查看 JVM 日志。

以上就是解决在使用TSF遇到JVM相关监控无法看到、以及JVM日志无法查看相关问题的一些解决办法,供大家参考下。

0 人点赞