Skywalking链路追踪工具

571 阅读6分钟

Skywalking链路追踪工具

背景:前段时间,新上线分布式系统的某个微服务总是运行一段时间莫名其妙的OOM,现象是系统的某个模块点几下就没反应了,过一会就提示504 Gateway Time-out。查看网关日志显示转发某个微服务超时,查看这个微服务的日志发现报“各种”内存溢出。为什么用“各种”,是因为每次看日志内存溢出的报错还都不一样,上部分图,保证谁看谁迷糊……

665791e57b39a43b6c5d405c8f92710.png

469c2def465b1a5aa7a44ec10024378.png

5edaa2dcb8956b7f1ac5a844dbc295b.png

内存堆栈分析,调整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

image.png

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


查看 image.png

image.png

4.Agent 探针下载

下载地址: Downloads | Apache SkyWalking

skywalking.apache.org/downloads/

image.png

修改config文件夹下的agent.config文件,当然也可以通过设置启动参数的形式覆盖配置文件内容

-Dskywalking.agent.service_name=奇了怪ya
-Dskywalking.collector.backend_service=192.168.119.66:11800

image.png

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

image.png

5.2基于docker部署的项目整合

上传skywalking-agent文件夹到dockerfile同级目录,我试了上级目录提示:路径超出了构建上下文的边界

image.png

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" ]

简单整合了几个项目,拓扑图还是挺好看的,具体功能后续在探究……

image.png

参考文章:

1.打造企业级自动化运维平台系列(十七):链路追踪工具 SkyWalking 详解cloud.tencent.com/developer/a…

2.# Docker Compose - 安装和基本使用blog.csdn.net/Que_art/art…