原简书主页 简书广告也太多了,转移阵地到这里

链路追踪系统Skywalking接入说明

应用修改

引入依赖

目的是实现手动获取链路信息、链路信息日志记录等扩展功能。

   <properties>
     <skywalking.version>8.14.0</skywalking.version>
   </properties> 

  <dependencies>
    <!-- 省略其他依赖 -->
    <dependency>
      <groupId>org.apache.skywalking</groupId>
      <artifactId>apm-toolkit-logback-1.x</artifactId>
      <version>${skywalking.version}</version>
    </dependency>
    <dependency>
       <groupId>org.apache.skywalking</groupId>
       <artifactId>apm-toolkit-trace</artifactId>
       <version>${skywalking.version}</version>
    </dependency>
  </dependencies>

或者直接引入com.lms:common-log:

   <properties>
     <lms.version>main-4.0.0</lms.version>
   </properties> 
  <dependencies>
   <!-- 省略其他依赖 -->
   <dependency>
      <groupId>com.lms</groupId>
      <artifactId>common-log</artifactId>
      <version>${lms.version}</version>
   </dependency>
  </dependencies>

日志模板

修改logback配置文件,以实现将traceIdspanId(segmentId)输出到日志。

  1. LOG_PATTERN

    <property name="LOG_PATTERN" value=
                "|%d{yyyy-MM-dd HH:mm:ss.SSS}|%-5level|%replace(%X{tid}){'TID:',''}|%replace(%X{sw_ctx}){'(([\\w\\[\\-\\.:@/]*,){3})|(,-?\\d+\\])',''}|${APP_NAME}|%t|%C|%M|%L|%m%n"/>
    

    log4j2与logback的replace函数有细微差别,如有需要可查阅log4j2文档

  2. appender.encoder

            <encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
                <layout class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.mdc.TraceIdMDCPatternLogbackLayout">
                    <Pattern>${LOG_PATTERN}</Pattern>
                </layout>
                <charset>UTF-8</charset>
            </encoder>
    

注意事项

  1. 在程序中手动获取链路信息

    // traceId在整个链路中唯一,一个trace包含一个或多个segment
    String traceId = TraceContext.traceId();
    // segmentId在单个进程内唯一,一个segment包含一个或多个span
    String segmentId = TraceContext.segmentId();
    // span包含在segment内,通常表示一个线程或一个组件(如spring-mvc,mq,jdbc等)
    String spanId = TraceContext.spanId();
    
  2. 链路信息跨线程解决方案
    默认情况下,链路信息只能在线程内传递,如果应用代码中有跨线程逻辑,需要手动处理:

    • usage 1

          @TraceCrossThread
          public static class MyCallable<String> implements Callable<String> {
              @Override
              public String call() throws Exception {
                  return null;
              }
          }
          ExecutorService executorService = Executors.newFixedThreadPool(1);
          executorService.submit(new MyCallable());
      
    • usage 2

          @TraceCrossThread
          public static class MyRunnable implements Runnable {
      
              @Override
              public void run() {
                // TODO
              }
          }
          ExecutorService executorService = Executors.newFixedThreadPool(1);
          executorService.submit(new MyRunnable());
      
    • usage 3

          ExecutorService executorService = Executors.newFixedThreadPool(1);
          executorService.submit(CallableWrapper.of(new Callable<String>() {
              @Override public String call() throws Exception {
                  return null;
              }
          }));
      
    • usage 4

          ExecutorService executorService = Executors.newFixedThreadPool(1);
          executorService.execute(RunnableWrapper.of(new Runnable() {
              @Override public void run() {
                  //TODO
              }
          }));
      
    • usage 5

          CompletableFuture.supplyAsync(SupplierWrapper.of(() -> {
              return "SupplierWrapper";
          })).thenApplyAsync(FunctionWrapper.of(f -> {
              return "FunctionWrapper";
          })).thenAcceptAsync(ConsumerWrapper.of(c -> {
              System.out.println("ConsumerWrapper");
          }));
      

部署修改

Dockerfile

一般应用

修改FROM基础镜像和WORKDIR,示例:

FROM apache/skywalking-java-agent:8.14.0-java11
MAINTAINER lms lmstech@163.com

RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \&& echo 'Asia/Shanghai' >/etc/timezone

WORKDIR /
ADD target/analysis-boot.jar analysis-boot.jar

ENTRYPOINT ["java", "-jar", "/analysis-boot.jar"]

EXPOSE 8806

spring-cloud-gateway

skywalking-java-agent以插件的形式提供对不同框架的支持,而spring-cloud-gatewayspring-webflux插件是可选插件,需要手动引入。示例:

FROM apache/skywalking-java-agent:8.14.0-java11
MAINTAINER lms lmstech@163.com

RUN cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \&& echo 'Asia/Shanghai' >/etc/timezone
# 添加网关所需插件
RUN cp /skywalking/agent/optional-plugins/apm-spring-cloud-gateway-3.x-plugin-8.14.0.jar /skywalking/agent/plugins/
RUN cp /skywalking/agent/optional-plugins/apm-spring-webflux-5.x-plugin-8.14.0.jar /skywalking/agent/plugins/

WORKDIR /
ADD target/lms-gateway.jar lms-gateway.jar

ENTRYPOINT ["java", "-jar", "/lms-gateway.jar"]

EXPOSE 9999

部署脚本

docker

至少需要添加以下三个配置项,以环境变量形式注入:

配置项 说明 推荐配置
SW_AGENT_NAME 服务名称,格式为:: 项目名称::应用名称,如: lms::alarm-sender
SW_AGENT_INSTANCE_NAME 实例(节点)名称 应用名词@部署地址,如: alarm-sender@192.168.0.1
SW_AGENT_COLLECTOR_BACKEND_SERVICES skywalking后端地址 ip:port

更多配置项参考官方文档

示例:

docker run -d -p 8806:8806 -e SW_AGENT_NAME=lms::analysis -e SW_AGENT_INSTANCE_NAME=analysis@192.168.0.1 -e SW_AGENT_COLLECTOR_BACKEND_SERVICES=192.168.3.39:11800 lms-anlysis:latest

docker-compose

示例:

version: '3.1'
services:
  analysis:
 build:
   context: ./
   dockerfile: Dockerfile
 image: analysis:latest
 container_name: lms-analysis
 ports:
   - 8806:8806
 volumes:
   - /app/logs/analysis:/logs
 environment:
   - SW_AGENT_NAME=lms::analysis
   - SW_AGENT_INSTANCE_NAME=analysis@192.168.0.1
   - SW_AGENT_COLLECTOR_BACKEND_SERVICES=192.168.3.39:11800
posted @ 2023-05-09 11:25  伊丽莎白菜  阅读(294)  评论(0编辑  收藏  举报