• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

微服务集成skywalking实现全链路日志追踪方案

武飞扬头像
Isen_xcution
帮助1

目录

1、安装部署skywalking

1.1 环境准备

1.2 部署步骤

2、微服务整合skywalking实现链路监控

2.1 下载skywalking官方版本

2.2 将微服务引入skywalking监控

2.3 以上配置完成后启动服务即可实现链路监控

3、通过logback ELFK实现全链路日志追踪

3.1 安装ELFK

3.2 添加依赖

3.3 logback文件配置

3.4 重启项目,调用测试接口

3.5 filebeat采集日志文件通过logstash输出到es

3.6 按上述配置启动filebeat,重新调用测试接口

4、tranceId在异步线程和feign调用过程中的传递

4.1 异步链路监控

4.2 feign调用的链路监控


1、安装部署skywalking

本节介绍通过docker-compose安装skywalking es

1.1 环境准备

  • 安装docker和compose

学新通

1.2 部署步骤

  • 创建目录

mkdir -p /usr/local/skywalking/
cd /usr/local/skywalking/

  • 编写compose文件

vim docker-compose.yml

  1.  
    version: '3.8'
  2.  
    services:
  3.  
      elasticsearch:
  4.  
        image: elasticsearch:7.14.1
  5.  
        container_name: elasticsearch
  6.  
        restart: always
  7.  
        ports:
  8.  
          - 9200:9200
  9.  
        healthcheck:
  10.  
          test: ["CMD-SHELL", "curl --silent --fail localhost:9200/_cluster/health || exit 1"]
  11.  
          interval: 30s
  12.  
          timeout: 10s
  13.  
          retries: 3
  14.  
          start_period: 40s
  15.  
        environment:
  16.  
          - discovery.type=single-node
  17.  
          - bootstrap.memory_lock=true
  18.  
          - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
  19.  
          - TZ=Asia/Shanghai
  20.  
        ulimits:
  21.  
          memlock:
  22.  
            soft: -1
  23.  
            hard: -1
  24.  
      oap:
  25.  
        image: apache/skywalking-oap-server:8.1.0-es7
  26.  
        container_name: oap
  27.  
        depends_on:
  28.  
          - elasticsearch
  29.  
        links:
  30.  
          - elasticsearch
  31.  
        restart: always
  32.  
        ports:
  33.  
          - 11800:11800
  34.  
          - 12800:12800
  35.  
        healthcheck:
  36.  
          test: ["CMD-SHELL", "/skywalking/bin/swctl"]
  37.  
          interval: 30s
  38.  
          timeout: 10s
  39.  
          retries: 3
  40.  
          start_period: 40s
  41.  
        environment:
  42.  
          TZ: Asia/Shanghai
  43.  
          SW_STORAGE: elasticsearch7
  44.  
          SW_STORAGE_ES_CLUSTER_NODES: elasticsearch:9200
  45.  
      ui:
  46.  
        image: apache/skywalking-ui:8.1.0
  47.  
        container_name: ui
  48.  
        depends_on:
  49.  
          - oap
  50.  
        links:
  51.  
          - oap
  52.  
        restart: always
  53.  
        ports:
  54.  
          - 8080:8080
  55.  
        environment:
  56.  
          TZ: Asia/Shanghai
  57.  
          SW_OAP_ADDRESS: oap:12800
学新通
  • 启动

docker-compose up -d 

  • 访问首页(localhost:8080)

学新通

2、微服务整合skywalking实现链路监控

2.1 下载skywalking

https://archive.apache.org/dist/skywalking/8.1.0/apache-skywalking-apm-es7-8.1.0.tar.gz

2.2 微服务引入skywalking监控

  • 将下载的安装包解压到/usr/local/skywalking目录,找到skywalking-agent.jar

apache-skywalking-apm-bin-es7/agent/skywalking-agent.jar

  • 将上述agent路径配置到微服务启动参数中,并配置环境变量如下:

-javaagent:/usr/local/skywalking/apache-skywalking-apm-bin-es7/agent/skywalking-agent.jar -Dskywalking.agent.service_name=art-mall-1 -Dskywalking.collector.backend_service=localhost:11800 

参数解释:

/usr/local/skywalking/apache-skywalking-apm-bin-es7/agent/skywalking-agent.jar 本地agent的jar包位置
-Dskywalking.agent.service_name=art-mall-1 注册到skywalking上的服务名称
-Dskywalking.collector.backend_service=localhost:11800 skywalking接收agent发送采集数据的服务及端口

2.3 以上配置完成后启动服务即可实现链路监控

  • 仪表盘

学新通

  • 拓扑图

学新通

  • 追踪

学新通

3、通过logback ELFK实现全链路日志追踪

3.1 安装ELFK

es在第一节中已安装,其他请自行百度安装!               

3.2 添加依赖

版本号与前面的skywalking对应 

  1.  
    <!-- 该引用用于logback获取tranceId,也就是tid -->
  2.  
    <dependency>
  3.  
    <groupId>org.apache.skywalking</groupId>
  4.  
    <artifactId>apm-toolkit-logback-1.x</artifactId>
  5.  
    <version>8.1.0</version>
  6.  
    </dependency>
  7.  
     
  8.  
    <!-- 该引用用于代码获取tranceId -->
  9.  
    <dependency>
  10.  
    <groupId>org.apache.skywalking</groupId>
  11.  
    <artifactId>apm-toolkit-trace</artifactId>
  12.  
    <version>8.1.0</version>
  13.  
    </dependency>

3.3 logback文件配置

  1.  
    <?xml version="1.0" encoding="UTF-8"?>
  2.  
    <configuration scan="true" scanPeriod="60 seconds" debug="false">
  3.  
     
  4.  
    <!--用于区分不同应用程序的记录-->
  5.  
    <contextName>art-logback</contextName>
  6.  
     
  7.  
    <!--日志文件所在目录,如果是tomcat,如下写法日志文件会在则为${TOMCAT_HOME}/bin/logs/目录下-->
  8.  
    <!-- <property name="LOG_HOME_WINDOWS" value="logs"/>-->
  9.  
    <property name="LOG_HOME_WINDOWS" value="D:/temp/logs"/>
  10.  
    <property name="LOG_HOME_LINUX" value="./logs"/>
  11.  
     
  12.  
    <!-- 彩色日志 -->
  13.  
    <!-- 彩色日志依赖的渲染类 -->
  14.  
    <conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter" />
  15.  
    <conversionRule conversionWord="wex" converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter" />
  16.  
    <conversionRule conversionWord="wEx" converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter" />
  17.  
    <!-- 彩色日志格式 [%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l%n%m%n -->
  18.  
    <property name="CONSOLE_LOG_MDC_PATTERN" value="${CONSOLE_LOG_MDC_PATTERN:-%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} [%X{tid}] %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>
  19.  
    <property name="FILE_LOG_PATTERN" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%X{tid}] ${LOG_LEVEL_PATTERN:-%5p} ${PID:- } --- [.15t] %-40.40logger{39} : %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}"/>
  20.  
     
  21.  
    <!--控制台-->
  22.  
    <appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
  23.  
    <!-- 获取skywalking自动生成的tid -->
  24.  
    <encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
  25.  
    <layout class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.mdc.TraceIdMDCPatternLogbackLayout">
  26.  
    <pattern>${CONSOLE_LOG_MDC_PATTERN}</pattern>
  27.  
    </layout>
  28.  
    </encoder>
  29.  
    </appender>
  30.  
     
  31.  
    <!--滚动文件-->
  32.  
    <appender name="infoFile" class="ch.qos.logback.core.rolling.RollingFileAppender">
  33.  
    <!-- ThresholdFilter:临界值过滤器,过滤掉 TRACE 和 DEBUG 级别的日志 -->
  34.  
    <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
  35.  
    <level>INFO</level>
  36.  
    </filter>
  37.  
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
  38.  
    <fileNamePattern>${LOG_HOME_LINUX}/info/info.%d{yyyy-MM-dd}.log</fileNamePattern>
  39.  
    <!-- <maxFileSize>100MB</maxFileSize>&lt;!&ndash;单个日志文件最大100M,到了这个值,就会再创建一个日志文件,日志文件的名字最后 1&ndash;&gt;-->
  40.  
    <maxHistory>30</maxHistory><!--保存最近30天的日志-->
  41.  
    <totalSizeCap>20GB</totalSizeCap><!--所有的日志文件最大20G,超过就会删除旧的日志-->
  42.  
    </rollingPolicy>
  43.  
    <encoder>
  44.  
    <charset>UTF-8</charset>
  45.  
    <pattern>${FILE_LOG_PATTERN}</pattern>
  46.  
    </encoder>
  47.  
    </appender>
  48.  
     
  49.  
    <!--滚动文件-->
  50.  
    <appender name="errorFile" class="ch.qos.logback.core.rolling.RollingFileAppender">
  51.  
    <!-- ThresholdFilter:临界值过滤器,过滤掉 TRACE 和 DEBUG 级别的日志 -->
  52.  
    <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
  53.  
    <level>error</level>
  54.  
    </filter>
  55.  
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
  56.  
    <fileNamePattern>${LOG_HOME_LINUX}/error/error.%d{yyyy-MM-dd}.log</fileNamePattern>
  57.  
    <!-- <maxFileSize>100MB</maxFileSize>&lt;!&ndash;单个日志文件最大100M,到了这个值,就会再创建一个日志文件,日志文件的名字最后 1&ndash;&gt;-->
  58.  
    <maxHistory>30</maxHistory><!--保存最近30天的日志-->
  59.  
    <totalSizeCap>20GB</totalSizeCap><!--所有的日志文件最大20G,超过就会删除旧的日志-->
  60.  
    </rollingPolicy>
  61.  
    <encoder>
  62.  
    <charset>UTF-8</charset>
  63.  
    <pattern>${FILE_LOG_PATTERN}</pattern>
  64.  
    </encoder>
  65.  
    </appender>
  66.  
     
  67.  
    <!--配置多环境日志输出 可以在application.properties中配置选择哪个profiles : spring.profiles.active=dev-->
  68.  
    <!--本地或开发环境:打印控制台-->
  69.  
    <springProfile name="local">
  70.  
    <root level="debug">
  71.  
    <appender-ref ref="stdout" />
  72.  
    <!-- 为在本地测试日志输出到文件然后通过filebeat采集,此处同样输出到文件-->
  73.  
    <appender-ref ref="infoFile" />
  74.  
    <appender-ref ref="errorFile" />
  75.  
    </root>
  76.  
    </springProfile>
  77.  
    <!--生产环境:输出到文件-->
  78.  
    <springProfile name="prod">
  79.  
    <root level="info">
  80.  
    <appender-ref ref="infoFile" />
  81.  
    <appender-ref ref="errorFile" />
  82.  
    </root>
  83.  
    </springProfile>
  84.  
     
  85.  
    </configuration>
学新通

配置项解释:

  • org.apache.skywalking.apm.toolkit.log.logback.v1.x.mdc.TraceIdMDCPatternLogbackLayout

       logback通过配置该layout可获取skywalking生成的tranceId

  • [%X{tid}]

        可在日志的对应位置打印出tranceId,如:

        [TID:5f6c5312b8e7445187565b1cb7368cd7.94.16340474835950001]

3.4 重启项目,调用测试接口

  •  测试接口
  1.  
    @PostMapping(value = "/test")
  2.  
    public ArtMallResult testTranceId(@RequestParam String id){
  3.  
    log.info("测试日志打印tranceId");
  4.  
    return ArtMallResultBuild.buildSuccess("success");
  5.  
    }
  • 日志打印如下:
2021-10-12 22:17:18.297 [TID:5ccddc5f4d364a38bcad8e9ebbd3e18e.93.16340482375740001]  INFO 3417 --- [nio-8085-exec-1] c.y.y.a.m.c.c.PCCommodityController      : 测试日志打印tranceId

3.5 filebeat采集日志文件通过logstash输出到es

中间通过logstash中转是因为其有更好的过滤功能,可视情况决定是否使用logstash。

  • filebeat.yml配置文件
  1.  
    filebeat.inputs:
  2.  
    - type: log
  3.  
    enabled: true
  4.  
    paths:
  5.  
    - /var/log/logs/info/*.log
  6.  
    multiline.pattern: '^[[:space:]] (at|\.{3})\b|^Caused by:'
  7.  
    multiline.negate: false
  8.  
    multiline.match: after
  9.  
     
  10.  
    output.logstash:
  11.  
    hosts: ["10.20.178.216:8080"]
  • filebeat启动命令中将本地日志文件位置挂载到容器中
  1.  
    docker run --name=filebeat \
  2.  
    --restart=always \
  3.  
    -v /Users/isen/Desktop/develop/filebeat:/usr/share/filebeat \
  4.  
    -v /xxx/xxx/xxx/logs:/var/log/logs \
  5.  
    store/elastic/filebeat:7.15.0

3.6 按上述配置启动filebeat,重新调用测试接口

        可在kibana中通过tranceId快速检索整个链路上的所有日志,解决跨服务调用时全链路日志查询的不便。

学新通

4、tranceId在异步线程和feign调用过程中的传递

4.1 异步链路监控

        通过对Callable、Runnable、Supplier这三种接口的实现进行增强拦截,将trance的上下文信息传递到子线程中,实现了异步链路追踪。

原始类

提供的包装类

拦截方法

使用方式

Callable<V>

CallableWrapper<V>

call

CallableWrapper.of(xxxCallable)

Runable

RunableWrapper

run

RunnableWrapper.of(xxxRunable)

Supplier<V>

SupplierWrapper<V>

get

SupplierWrapper.of(xxxSupplier)

  • 使用方式:

        1、引入依赖,参考3.2第二个maven依赖

        2、定义线程池

  1.  
    @Configuration
  2.  
    public class ThreadPoolExecutorConfig {
  3.  
     
  4.  
    @Bean("testThreadPool")
  5.  
    public ThreadPoolTaskExecutor testThreadPool() {
  6.  
    ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
  7.  
    int core = Runtime.getRuntime().availableProcessors();
  8.  
    executor.setCorePoolSize(core);
  9.  
    executor.setMaxPoolSize(core * 2 1);
  10.  
    executor.setKeepAliveSeconds(3);
  11.  
    executor.setQueueCapacity(15000);
  12.  
    executor.setThreadNamePrefix("testThreadPool");
  13.  
    executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
  14.  
    return executor;
  15.  
    }
  16.  
    }
学新通

         3、修改测试接口,此处以RunnableWrapper和CallableWrapper为例

  1.  
    /**
  2.  
    * 测试tranceId的效果
  3.  
    * 未配置忽略追踪
  4.  
    * @return
  5.  
    */
  6.  
    @PostMapping(value = "/test1")
  7.  
    public ArtMallResult testTranceId(@RequestParam String id){
  8.  
    ActiveSpan.tag("type", "异步任务多线程任务");
  9.  
    testThreadPool.submit(RunnableWrapper.of(() -> {
  10.  
    ActiveSpan.tag("type", "测试异步1");
  11.  
    log.info("1-testThreadPool 测试一下tranceId的异步传递...");
  12.  
    }));
  13.  
    testThreadPool.submit(CallableWrapper.of(() -> {
  14.  
    ActiveSpan.tag("type", "测试异步2");
  15.  
    log.info("2-testThreadPool 测试一下tranceId的异步传递...");
  16.  
    return null;
  17.  
    }));
  18.  
    return ArtMallResultBuild.buildSuccess("success");
  19.  
    }
学新通

        4、打印日志如下:

  1.  
    2021-10-13 10:31:53.605 [TID:2096e377f09744ac8004aaa0877bc707.91.16340923134680001] INFO 4404 --- [nio-8085-exec-1] com.yun.ying.art.mall.filter.CorsFilter : request path : /pc/commodity/test1
  2.  
    2021-10-13 10:31:54.348 [TID:2096e377f09744ac8004aaa0877bc707.91.16340923134680001] INFO 4404 --- [testThreadPool1] c.y.y.a.m.c.c.PCCommodityController : 1-testThreadPool 测试一下tranceId的异步传递...
  3.  
    2021-10-13 10:31:54.365 [TID:2096e377f09744ac8004aaa0877bc707.91.16340923134680001] INFO 4404 --- [testThreadPool2] c.y.y.a.m.c.c.PCCommodityController : 2-testThreadPool 测试一下tranceId的异步传递...

        5、链路追踪展示

学新通

4.2 feign调用的链路监控

参考第2节内容,为每个微服务都整合skywalking的链路监控即可

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhiacceg
系列文章
更多 icon
同类精品
更多 icon
继续加载