Skip to content

TKE SpringBoot 接入应用性能观测 SkyWalking

🏷️ TKE SkyWalking Spring Boot

接入步骤

  1. 应用性能观测中新建应用。

  2. 点击新创建的应用,点击【接入应用】,选择 Skywalking + 内网上报

  3. 点击下一步会看到应用的 接入点 和 Token,这两个值在部署时会用到。

  4. 创建带 Java Agent 的基础镜像。

    • 下载 Skywalking Jave Agent

      这两个地址都可以,下载自己需要的版本,这里用的是 8.13.0

    • 构建带 Agent 的基础镜像

      • 创建 Dockerfile

        这里使用单独的镜像解压文件,然后再复制解压的文件到 jre 的镜像。

        dockerfile
        FROM busybox:1.33 AS unzip
        
        WORKDIR /sw
        COPY apache-skywalking-java-agent-8.13.0.tgz /sw/apache-skywalking-java-agent-8.13.0.tgz
        RUN /bin/busybox tar -xzvf apache-skywalking-java-agent-8.13.0.tgz
        
        FROM openjdk:8u201-jre-alpine
        COPY --from=unzip /sw/skywalking-agent /sw/agent
      • 构建镜像

        bash
        docker build java-8-skywalking-agent:8.13.0 .
      • 可以使用 docker logindocker tagdocker push 命令推送镜像到私有仓库

  5. 构建服务镜像

    修改 Java 服务 Dockerfile:

    • 修改基础镜像为上一步构建的镜像

    • 在启动命令中添加 -javaagent 参数

    dockerfile
    FROM java-8-skywalking-agent:8.13.0
    
    COPY target/*.jar app.jar
    
    ENTRYPOINT exec java -javaagent:/sw/agent/skywalking-agent.jar -jar /app.jar
  6. 修改服务部署清单

    由于使用环境变量的方式配置 agent,需要在部署清单文件中配置环境变量。

    另外,为了统一管理,这里将通用的配置项保存在了 ConfigMap 中。

    • ConfigMap

      yaml
      apiVersion: v1
      data:
        sw.agent.authentication: 接入应用页面提供的 Token
        sw.agent.backend_service: 接入应用页面提供的接入点
        sw.agent.cluster: my-cluster
        sw.agent.namespace: my-namespace
      kind: ConfigMap
      metadata:
        name: my-config
        namespace: test
    • 在部署清单中配置环境变量

      这里共设置了 5 个环境:

      • SW_AGENT_NAME :当前服务的名字
      • SW_AGENT_NAMESPACE :命名空间
      • SW_AGENT_CLUSTER :集群
      • SW_AGENT_COLLECTOR_BACKEND_SERVICES :接入点
      • SW_AGENT_AUTHENTICATION : Token

      其中,命名空间和集群不是必须的,如果设置了,服务名称会变成 {SW_AGENT_NAME}|{SW_AGENT_NAMESPACE}|{SW_AGENT_CLUSTER} 的样式。

      其它的环境变量可以参考 skywalking-agent/config 目录中的 agent.config 文件。

      yaml
      spec:
        template:
          spec:
            containers:
              - env:
                  - name: SW_AGENT_NAME
                    value: my-app-name
                  - name: SW_AGENT_NAMESPACE
                    valueFrom:
                      configMapKeyRef:
                        key: sw.agent.namespace
                        name: my-config
                  - name: SW_AGENT_CLUSTER
                    valueFrom:
                      configMapKeyRef:
                        key: sw.agent.cluster
                        name: my-config
                  - name: SW_AGENT_COLLECTOR_BACKEND_SERVICES
                    valueFrom:
                      configMapKeyRef:
                        key: sw.agent.backend_service
                        name: my-config
                  - name: SW_AGENT_AUTHENTICATION
                    valueFrom:
                      configMapKeyRef:
                        key: sw.agent.authentication
                        name: my-config
  7. 重新应用清单就可以在【应用列表】中看到接入的应用了。

日志添加 traceId

如果只是接入 APM 对代码来说是无侵入的,不过此时无法关联到日志。

如果需要在日志中打印 traceId 以方便排查问题,则可以使用 Skywalking 提供的 apm-toolkit-logback-1.x 组件配合 logback 输出当前的 traceId

  1. 添加依赖

    xml
    <!-- SkyWalking -->
    <dependency>
        <groupId>org.apache.skywalking</groupId>
        <artifactId>apm-toolkit-logback-1.x</artifactId>
        <version>8.13.0</version>
    </dependency>
  2. 修改 logback.xml

    示例如下,其中 %tid 就是 traceId

    xml
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
            <layout class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.TraceIdPatternLogbackLayout">
                <pattern>%d %p %t (%file:%line\)- %tid %m%n</pattern>
            </layout>
        </encoder>
    </appender>

    这里由于使用 TKE 的日志组件采集控制台的输出,所以没有配置本地的日志文件。

    之后可以通过配置日志采集的规则,将 %tid 输出为单独的字段,以方便查找日志。

客户端请求响应添加 traceId

这里在入口的网关服务中添加一个 OncePerRequestFilter 的过滤器,为每个请求的响应添加一个名为 my-trace-id 的 Header。

通过 Skywalking 提供的 apm-toolkit-trace 组件获取当前的 traceId

  1. 添加依赖

    xml
    <!-- SkyWalking -->
    <dependency>
        <groupId>org.apache.skywalking</groupId>
        <artifactId>apm-toolkit-trace</artifactId>
        <version>8.13.0</version>
    </dependency>
  2. 添加 Filter

    java
    import org.apache.skywalking.apm.toolkit.trace.TraceContext;
    import org.springframework.stereotype.Component;
    import org.springframework.web.filter.OncePerRequestFilter;
    
    import javax.servlet.FilterChain;
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    
    @Component
    public class TraceIdHeaderFilter extends OncePerRequestFilter {
    
        @Override
        protected void doFilterInternal(HttpServletRequest request,
                                        HttpServletResponse response,
                                        FilterChain filterChain) throws ServletException, IOException {
            response.addHeader("my-trace-id", TraceContext.traceId());
            filterChain.doFilter(request, response);
        }
    }