skywalking入门学习:分布式链路追踪体验

java 投稿 1600 0 评论

背景

旁友,skywalking分布式链路追踪框架了解一下。

  • 关系数据库,例如说 MySQL、PostgreSQL 等等。

  • 缓存数据库,例如说 Redis、Memcached 等等。

  • 外部三方服务,例如说微信公众号、微信支付、支付宝支付、短信平台等等

可见,仅仅一个 Spring Boot 单体应用,就已经涉及到分布在不同进程中的服务了。此时,就非常有必要用上skywalking。例如说,线上某个 接口访问非常慢,用SkyWalking 可以定位是MySQL 查询比较慢呢,还是调用的第三方服务比较慢。

鹰眼下的淘宝分布式调用跟踪系统介绍

skywalking入门学习:分布式链路追踪体验

1.系统中有可能每天都在增加新服务或删除旧服务,也可能进行升级,当系统出现错误,我们如何定位问题?

3.服务可能由不同的编程语言开发,1、2 定位问题的方式,是否适合所有编程语言?

Skywalking框架

1.介绍

官方网址 http://skywalking.apache.org/

2017年加入Apache孵化器。短短两年就被Apache收入麾下,实力可见一斑。

提供分布式追踪、服务网格遥测分析、度量聚合和可视化一体化解决方案。

skywalking的架构参考了谷歌的Dapper框架的论文,Dapper并没有开源,只给了篇论文,感兴趣但又不喜英文文档的旁友可以看看论文的中文翻译Dapper,大规模分布式系统的跟踪系统

skywalking入门学习:分布式链路追踪体验

    Tracing  Metrics   Logging
  • :负责从应用中,收集链路信息,发送给 SkyWalking OAP 服务器。目前支持 SkyWalking、Zikpin、Jaeger 等提供的 Tracing 数据信息。Java应用通常使用SkyWalking Agent 收集数据

  • SkyWalking OAP :skywalking服务端(Transport layer,Receiver cluster,Aggregator cluster)负责接收 Agent 发送的 Tracing 数据信息,然后进行分析,存储到外部存储器( Storage ),最终提供查询功能。

  • Storage option :Tracing 数据存储。目前支持 ES、H2 多种存储器。我们用ES存储即可 。

  • GUI :负责提供可视化控台,查看链路等

  • Alarm:提供告警功能,这里不展示讲

2.Docker方式搭建Skywalking环境

为了快速搭建环境,避免各种系统、配置环境不同造成踩坑的情况。我们用docker直接创建ElasticSearch、Skywalking-OAP、Skywalking-UI以及ES的管理工具Kibana。这样一套运行环境直接就能用了。话不多说,直接开干

skywalking入门学习:分布式链路追踪体验

用到的工具版本号如下表:

工具版本号
ElasticSearch7.14.2
Kibana7.14.2
skywalking-oap-server9.1.0
skywalking-ui9.1.0

apache/skywalking/docker

version: '3'
services:
  elasticsearch:
    image: docker.elastic.co/elasticsearch/elasticsearch:7.14.2
    container_name: elasticsearch
    ports:
      - 9200:9200
      - 9300:9300
    environment:
      - "cluster.name=elasticsearch"
      - "bootstrap.memory_lock=true"
      - "ES_JAVA_OPTS=-Xms256m -Xmx512m"
      - "discovery.type=single-node"
 
  kibana:
    image: docker.elastic.co/kibana/kibana:7.14.2
    container_name: kibana
    depends_on:
      - elasticsearch
    ports:
      - 5601:5601
    environment:
      # IP地址为运行电脑的IP地址,Mac上通过 ifconfig en0 命令获取
      - "elasticsearch.hosts=http://192.168.1.5:9200" 

  skywalking-oap:
    image: apache/skywalking-oap-server:9.1.0
    container_name: skywalking-oap
    depends_on:
      - elasticsearch
    ports:
      - "11800:11800"
      - "12800:12800"
    healthcheck:
      test: [ "CMD-SHELL", "/skywalking/bin/swctl ch" ]
      interval: 30s
      timeout: 10s
      retries: 3
      start_period: 10s
    environment:
      TZ: Asia/Shanghai
      SW_STORAGE: elasticsearch
      SW_STORAGE_ES_CLUSTER_NODES: elasticsearch:9200
      SW_HEALTH_CHECKER: default
      SW_TELEMETRY: prometheus

  skywalking-ui:
    image: apache/skywalking-ui:9.1.0
    container_name: skywalking-ui
    depends_on:
      - skywalking-oap
    links:
      - skywalking-oap
    ports:
     # UI界面程序占用的端口
      - "8080:8080"
    environment:
      TZ: Asia/Shanghai
      # IP地址为运行电脑的IP地址,Mac上通过 ifconfig en0 命令获取
      SW_OAP_ADDRESS: http://192.168.1.8:12800

2.1 Docker镜像加速

按上述配好docker-compose.yml文件后,命令行到所在目录下执行docker-compose up可以拉起镜像,第一次运行时会下载镜像,docker默认的镜像仓库在国外,所以下载速度和蜗牛一样慢。为了加速下载,需要配置国内的docker镜像

  1. 阿里云官方镜像加速,获取加速器地址文档:

  2. 阿里云官方镜像加速
  3. 网上搜索docker镜像加速,下面是测过有效的公共镜像库

  4. 百度云 https://mirror.baidubce.com

配置方法:

Preference -> Docker Engine 在Json配置里加上,加好之后重启Docker,然后再重新拉镜像,速度立马快得飞起🚀🚀🚀

  # 按需加上多个镜像库地址
  "registry-mirrors": [
		"https://hub-mirror.c.163.com",
    "https://mirror.baidubce.com"
  ]

skywalking入门学习:分布式链路追踪体验

2.2 Skywalking UI界面

docker启动后,Skywalking第一次运行会自行在ES里创建索引,运行日志没有报错,说明启动成功了,浏览器打开http://127.0.0.1:8080/可以看到Skywalking 的界面

skywalking入门学习:分布式链路追踪体验

2.3 Skywalking agent使用

-javaagent参数配置Skywalking agent。在IDEA中运行时,在启动参数vm 中配置即可。

Skywalking Agent下载

Skywalking Agent下载,当前最新的版本是v8.12.0,下载到自己电脑上找个位置解压。我的是放在/Users/longbig/opt/目录下

shell脚本方式

# 配置agent地址,agent服务名,skywalking-oap collector地址(注意IP地址,因为我是docker运行,需要使用本机的局域网IP)
export JAVA_AGENT=-javaagent:/Users/yuyunlong/opt/skywalking-agent/skywalking-agent.jar=agent.service_name=multi_function,collector.backend_service=192.168.1.8:11800

# jar启动
java -jar $JAVA_AGENT application.jar

IDEA运行方式

skywalking入门学习:分布式链路追踪体验

启动完之后随便调用几个接口试试,然后再在Skywalking的界面查看效果

2.3 追踪数据

skywalking入门学习:分布式链路追踪体验

到此Skywalking的搭建就完成了

3. Skywalking集成Logback实现Trace日志打印

全链路追踪体验—TraceId的生成,现在我们用上Skywalking框架来打印traceId

        <!-- SkyWalking 对 Logback 的集成 -->
        <dependency>
            <groupId>org.apache.skywalking</groupId>
            <artifactId>apm-toolkit-logback-1.x</artifactId>
            <version>8.10.0</version>
        </dependency>

        <dependency>
            <groupId>org.apache.skywalking</groupId>
            <artifactId>apm-toolkit-trace</artifactId>
            <version>8.10.0</version>
        </dependency>

logback-spring.xml文件修改内容:

  • CONSOLE_LOG_PATTERN 里加上

  • %tid
  • ,配置traceId占位符

  • layout通过TraceIdPatternLogbackLayout 实现对%tid替换为Skywalking TraceId

    <!-- 彩色日志 -->
    <!-- 彩色日志依赖的渲染类 -->
    <conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter" />
    <conversionRule conversionWord="wex" converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter" />
    <conversionRule conversionWord="wEx" converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter" />
    <!-- 彩色日志格式 -->
    <property name="CONSOLE_LOG_PATTERN" value="${CONSOLE_LOG_PATTERN:-%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} [%tid] %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>

<!--输出到控制台-->
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <!--此日志appender是为开发使用,只配置最底级别,控制台输出的日志级别是大于或等于此级别的日志信息-->
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>info</level>
        </filter>
        <encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
            <layout class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.TraceIdPatternLogbackLayout">
                <Pattern>${CONSOLE_LOG_PATTERN}</Pattern>
            </layout>
            <!-- 设置字符集 -->
            <charset>UTF-8</charset>
        </encoder>
    </appender>

简单测试看看

服务日志打印:

skywalking入门学习:分布式链路追踪体验

skywalking入门学习:分布式链路追踪体验

小结

本篇文章讲了为什么用分布式链路追踪以及Skywalking框架的使用,是对上一篇最简陋traceId使用的进阶版。学东西就是要日拱一卒,量变引起质变。我是卷福同学,一个在福报厂修福报中的小社畜哦~

编程学习分享 » skywalking入门学习:分布式链路追踪体验

赞 (0) or 分享 (0)
游客 发表我的评论   换个身份
取消评论

表情
(0)个小伙伴在吐槽

高效,专业,符合SEO

联系我们