前言
前段时间搞了下组内服务接入Skywalking的解决方案,最近leader让上一上offline测试环境,整合一下打包方案。由于我们的服务都是docker容器化部署,如何在容器中灵活适配Skywalking并且灵活开关是个麻烦事。
网上简单看了下现有的方案都是些入侵原有代码结构的方案,加入依赖等等。这边想着尽可能更改一下部署方式去灵活适配。
思路还是很明确的,使用agent指定skwwalking-agent.jar的方式启动jar包,改造下Dockerfile去实现。
Dockerfile改造
首先容器中需要有skwwalking-agent.jar的代理jar包,这个可以提前把jar包上传到jflog的私服上,在构建基础镜像的时候用wget
命令下载下来。
改造CMD指令
由于Dockerfile里CMD中写if条件不是那么优雅,所以根据条件判断是否以agent的方式启动写到sheel脚本里。
#!/bin/sh
SCRIPT=$0
BASEDIR=$(cd $(dirname $SCRIPT) && pwd -P)
cd ../test_sky
if [ $JAVA_AGENT ]; then
java -javaagent:$JAVA_AGENT -Dspring.profiles.active=prod -Duser.timezone=Asia/Shanghai -jar a*.jar
else
java -Dspring.profiles.active=prod -Duser.timezone=Asia/Shanghai -jar a*.jar
fi
这样的话在Dockerfile里CMD命令即可由jar包的启动命令替换成执行脚本命令
CMD sh start.sh
指定agent参数
判断是否使用Skywalking的条件如何设置呢,可以依赖环境变量来操作,我们在docker run的时候通过-e向容器中定义变量。
在脚本中$JAVA_AGENT值存在时则使用agent的方式启动,这里不用写死成Skywalking的agent,直接使用容器启动传递的字符串拼接到启动命令中,这样如果使用其他agent方式依然可以适配。
jar包启动指定agent的命令直接用这种方式
-javaagent:/path/to/skywalking-agent.jar={config1}={value1},{config2}={value2}
- agent.service_name:监控的服务名称
- collector.backend_service:监控服务地址
Docker run命令
这样改造之后使用Skywalking启动只需要在docker run时添加JAVA_AGENT变量
docker run -d -i --network host --name test_sky -e JAVA_AGENT="/test_sky/agent/skywalking-agent.jar=logging.level=INFOagent.service_name=a,collector.backend_service=0.0.0.0:11800" service_images
普通模式启动去掉JAVA_AGENT变量即可,容器启动之后判断是否使用skywalking只需要执行
docker inspect test_sky
判断Env中是否绑定了JAVA_AGENT变量值
踩坑
UI无指标数据
-
启动时无数据
- 一开始毫无头绪,监控Skywalking-oap服务日志也没有任何异样,后续仔细排查了下被监控服务的启动日志发现,skywalking-agent.jar包同级目录下还需要带着config文件夹。于是在把jar包和config目录打成tar包,在wget这一步从私服下载下来后再解压出来遂解决。
-
监控部分时间后无数据
- 这个问题可以通过观察oap服务日志排查出原因,一般是因为使用了elatiscsearch7作为指标数据的存储底座。默认shard超过最大限制1000个。这时可以通过修改最大shard值解决,一般改到10000就够用了。
curl -XPUT -H "Content-Type:application/json" -d '{"persistent":{"cluster":{"max_shards_per_node":10000}}}' 'http://elasticsearch:9200/_cluster/settings
删除UI数据
有时候可能接入了一些测试数据导致数据混乱想清除全部指标数据,这里可以如果是使用了elasticsearch7的存储,直接删除掉配置文件中定义的索引前缀$SW_NAMESPACE即可
curl -XDELETE <http://elasticsearch:9200/dmc-sky*>
日志大量打印
曾经遇到在测试机器上把磁盘打满过,Skywalking默认的日志级别是DEBUG,这点还是很坑的,接入了监控之后业务日志里大部分都是Skywalking的心跳信息。
这里只需要在启动命令里的agent串配置上llogging.level=INFO即可。也就是在docker run时指定即可
-e JAVA_AGENT="/test_sky/agent/skywalking-agent.jar=logging.level=INFO,agent.service_name=a,collector.backend_service=0.0.0.0:11800"
UI拓扑图服务详情面板数据为空
kywalking拓扑图选中服务节点后,右侧服务详情指标数据为空,点击“edit”按钮后,显示default模板为空,基本都是因为缺少显示模板导致
解决办法:更新json版模板文件内容,主要思路:下载空白模板(json格式),复制安装包中自带的UI初始化模板(yml格式)内容至空白模板(json格式)中,import该json模板,以此完成json模板更新
- 点击“export”按钮,下载模板,模板topo_service_metrics.json内容显示为空
- 进入apache-skywalking-apm-bin-es7\config\ui-initialized-templates目录下,找到UI初始化的模板yml文件,这里有UI涉及的很多初始化模板,可以根据标题名称判断模板
- 服务详情模板是topology-service.yml
- 打开服务响应yml模板文件 topology-service.yml,并复制configuration大括号里的所有模板内容至步骤1下载的空白模板topo_service_metrics.json的大括号内,即完成了json版的