Docker容器化部署灵活开关Skywalking监控

前言

前段时间搞了下组内服务接入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变量值

image.png

踩坑

UI无指标数据

  1. 启动时无数据

    • 一开始毫无头绪,监控Skywalking-oap服务日志也没有任何异样,后续仔细排查了下被监控服务的启动日志发现,skywalking-agent.jar包同级目录下还需要带着config文件夹。于是在把jar包和config目录打成tar包,在wget这一步从私服下载下来后再解压出来遂解决。
  2. 监控部分时间后无数据

    • 这个问题可以通过观察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即可

image.png

 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模板更新

  1. 点击“export”按钮,下载模板,模板topo_service_metrics.json内容显示为空
  2. 进入apache-skywalking-apm-bin-es7\config\ui-initialized-templates目录下,找到UI初始化的模板yml文件,这里有UI涉及的很多初始化模板,可以根据标题名称判断模板
  3. 服务详情模板是topology-service.yml
  4. 打开服务响应yml模板文件 topology-service.yml,并复制configuration大括号里的所有模板内容至步骤1下载的空白模板topo_service_metrics.json的大括号内,即完成了json版的

© 版权声明
THE END
喜欢就支持一下吧
点赞0

Warning: mysqli_query(): (HY000/3): Error writing file '/tmp/MYZKC1VH' (Errcode: 28 - No space left on device) in /www/wwwroot/583.cn/wp-includes/class-wpdb.php on line 2345
admin的头像-五八三
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

图形验证码
取消
昵称代码图片