Skywalking链路追踪工具
背景:前段时间,新上线分布式系统的某个微服务总是运行一段时间莫名其妙的OOM,现象是系统的某个模块点几下就没反应了,过一会就提示504 Gateway Time-out。查看网关日志显示转发某个微服务超时,查看这个微服务的日志发现报“各种”内存溢出。为什么用“各种”,是因为每次看日志内存溢出的报错还都不一样,上部分图,保证谁看谁迷糊……
内存堆栈分析,调整JVM参数等等硬是没解决。。。。
经过XXXX一顿排查,最终发现是某个接口的不规范导致,此类问题还有很多。。。
搞一个Skywalking链路追踪工具辅助排查问题还是很有必要的。
ps: 我对Skywalking只是简单了解,以前从来没用过,本文只做部署记录,纯小白一枚……
1.Skywalking是什么?
skywalking 是一个优秀的国产开源框架,2015年由个人吴晟(华为开发者)开源 ,2017年加入 apache 孵化器。
skywalking 是分布式系统的应用程序性能监视工具,专为微服务、云原生架构和基于容器化技术 (docker、K8s、Mesos)架构而设计,它是一款优秀的 APM(Application Performance Management)工具。skywalking是观察性分析平台和应用性能管理系统。提供分布 式追踪、服务网格遥测分析、度量聚合和可视化一体化解决方案。
- 在微服务架构下,由于进行了服务拆分,一次请求往往需要涉及多个服务,每个服务可能是由不同的团队开发,使用了不同的编程语言,有可能部署在不同的机器上,分布在不同的数据中心。服务跟踪系统可以跟踪记录一次用户请求都发起了哪些调用,经过哪些服务处理,并且记录每一次调用所涉及的服务的详细信息,通过查看完整的调用链路,形成拓补图可以更加直观的了解业务,也可以针对当前的系统进行分析,是否需要扩容、优化接口、失败缓解,还有通过日志快速定位是调用失败的环节。
2.Skywalking整体架构架构
架构还是很清晰的,分为四部分
上部分Agent:收集应用链路信息发送给SkyWalking OAP 服务器。一会介绍skywalking-agent,java 版本的 Agents
中间部分SkyWalking OAP 服务器:负责接收Agent发送的Tracing数据信息,然后进行分析(Analysis Core),存储到外部存储器(Storage),最终提供查询(Query)功能
左边部分SkyWalking UI:控制台、界面展示 右边部分SkyWalking UI:持久化Tracing数据存储,支持各种存储方式,目前首选ES
3.Skywalking部署
一开始使用安装包的部署方式,忽略了这几个组件版本之间的关联,发现各种奇奇怪怪的问题。解决问题的最好办法是逃避这个问题想其他方式避免钻牛角尖——更换docker-compose方式部署 docker和docker-compose的安装就不过多介绍,注意服务器架构是amd还是arm,需要下载不同的安装包
Docker 是 Docker Compose 的前提,Docker Compose 是为了简化使用 Docker 时多容器应用的管理和部署而设计的。
两者之间相辅相成,Docker 提供容器化的核心功能,Docker Compose 则管理这些容器的组合和交互。
两者面向不同用户,Docker 面向任何需要容器化应用的用户,Docker Compose 则面向需要同时管理多个容器的开发者和运维团队。
3.1docker-compose.yml
在docker-compose.yml所在目录下执行docker-compose up -d,docker会拉取镜像并启动。
注意:
1.如有防火墙,放行12800、11800、19200、19300、9009端口,这边对9200、9300、8080做了映射
2.如果机器不能联网可以在有网络的机器下载镜像docker save 生成tar上传服务器docker load即可
3.如果机器不能联网ES启动会报错,它会下载更新geoip库。这个时候就需要挂载出elasticsearch.yml增加ingest.geoip.downloader.enabled: false 配置。另外确保挂载出的目录./elasticsearch/conf/elasticsearch.yml存在这个文件,可以进入容器docker ps 拷贝然后增加配置
version: "3"
services:
# SkyWalking OAP server with Elasticsearch storage
skywalking-oap:
image: skywalking-oap-server:8.9.0-arm64
container_name: skywalking-oap
ports:
- "12800:12800"
- "11800:11800"
networks:
- skywalking-network
depends_on:
- skywalking-elasticsearch
environment:
- SW_STORAGE=elasticsearch
- TZ=Asia/Shanghai
- SW_STORAGE_ES_CLUSTER_NODES=192.168.119.66:19200
#volumes:
# - ./oap-config:/skywalking/config # 挂载本地目录到容器中
# Elasticsearch
skywalking-elasticsearch:
image: elasticsearch:7.16.3
container_name: skywalking-elasticsearch
ports:
- "19200:9200"
- "19300:9300"
networks:
- skywalking-network
environment:
- discovery.type=single-node
- TZ=Asia/Shanghai
ulimits:
memlock:
soft: -1
hard: -1
nofile:
soft: 65536
hard: 65536
mem_limit: 2g
# volumes:
# - ./elasticsearch/conf/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml
# SkyWalking UI
skywalking-ui:
image: apache/skywalking-ui:8.9.0
container_name: skywalking-ui
ports:
- "9009:8080"
networks:
- skywalking-network
environment:
- SW_OAP_ADDRESS=http://192.168.119.66:12800
- TZ=Asia/Shanghai
#volumes:
# - ./ui-config:/app/config # 挂载本地目录到容器中
networks:
skywalking-network:
driver: bridge
查看
4.Agent 探针下载
下载地址: Downloads | Apache SkyWalking
skywalking.apache.org/downloads/
修改config文件夹下的agent.config文件,当然也可以通过设置启动参数的形式覆盖配置文件内容
-Dskywalking.agent.service_name=奇了怪ya
-Dskywalking.collector.backend_service=192.168.119.66:11800
5.简单整合
5.1本地开发环境或jar包启动时
设置启动参数即可,选择下载的agent路径
-javaagent:C:\Users\lizzu\Desktop\skyworking\apache-skywalking-java-agent-9.1.0\skywalking-agent\skywalking-agent.jar
java -javaagent::C:\Users\lizzu\Desktop\skyworking\apache-skywalking-java-agent-9.1.0\skywalking-agent\skywalking-agent.jar -Dskywalking.agent.service_name=当前项目在skywalking显示的名称 -Dskywalking.collector.backend_service=xxxx:11800 -jar spring-demo-0.0.1-SNAPSHOT.jar
5.2基于docker部署的项目整合
上传skywalking-agent文件夹到dockerfile同级目录,我试了上级目录提示:路径超出了构建上下文的边界
dockerfile文件
FROM 192.168.119.23:5000/bs/openjdk:8-arm64
VOLUME /tmp
ENV TZ 'Asia/Shanghai'
ARG WAR_FILE
COPY demo.jar app.jar
COPY skywalking-agent /usr/local/agent
ENV JAVA_OPTS="\
-server \
-Xmx4g \
-Xms4g \
-Xmn1536m \
-Xss512k \
-XX:NewRatio=4 \
-XX:SurvivorRatio=8 \
-XX:PermSize=100m \
-XX:MaxPermSize=256m \
-XX:MaxMetaspaceSize=256m \
-XX:MaxTenuringThreshold=15 \
-XX:ParallelGCThreads=16 \
-XX:+HeapDumpOnOutOfMemoryError \
-XX:HeapDumpPath=/"
EXPOSE 9211
ENTRYPOINT [ "sh", "-c", "java -javaagent:/usr/local/agent/skywalking-agent.jar -Dskywalking.agent.service_name=demo -Dskywalking.collector.backend_service=192.168.119.66:11800 -Djava.security.egd=file:/dev/./urandom -jar /app.jar" ]
主要修改两部分
COPY skywalking-agent /usr/local/agent
ENTRYPOINT [ "sh", "-c", "java -javaagent:/usr/local/agent/skywalking-agent.jar -Dskywalking.agent.service_name=demo -Dskywalking.collector.backend_service=192.168.119.66:11800 -Djava.security.egd=file:/dev/./urandom -jar /app.jar" ]
简单整合了几个项目,拓扑图还是挺好看的,具体功能后续在探究……
参考文章:
1.打造企业级自动化运维平台系列(十七):链路追踪工具 SkyWalking 详解cloud.tencent.com/developer/a…
2.# Docker Compose - 安装和基本使用blog.csdn.net/Que_art/art…