TSF微服务无法查看JVM监控问题
问题背景
我们在利用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。
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日志无法查看相关问题的一些解决办法,供大家参考下。
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- Oracle基本概念(Undo空间)
- [AWR报告]Buffer Hit %
- [AWR报告]Library Hit %
- [Oracle 9i安装]Redhat 4.8的配置
- [Oracle 9i安装]Oracle软件的安装
- [AWR报告]Latch Hit %
- [Python运维]Python3.6的安装
- [Python运维]cx_Oracle模块的安装
- C#中抽象类与抽象方法的作用与实例
- C++ 基础扫盲(1)
- [Python运维]使用cx_Oracle连接Oracle(高级篇)
- [Python运维]使用Python发送邮件
- [Python运维]自动化监控Oracle表空间并发送报警
- [Python运维]自动化监控多个Oracle表空间
- c# 动态生成控件