TKE SpringBoot 接入应用性能观测 SkyWalking
接入步骤
在应用性能观测中新建应用。
点击新创建的应用,点击【接入应用】,选择 Skywalking + 内网上报 。
点击下一步会看到应用的 接入点 和 Token,这两个值在部署时会用到。
创建带 Java Agent 的基础镜像。
下载 Skywalking Jave Agent
这两个地址都可以,下载自己需要的版本,这里用的是 8.13.0
构建带 Agent 的基础镜像
创建 Dockerfile
这里使用单独的镜像解压文件,然后再复制解压的文件到 jre 的镜像。
dockerfileFROM 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
构建镜像
bashdocker build java-8-skywalking-agent:8.13.0 .
可以使用
docker login
、docker tag
和docker push
命令推送镜像到私有仓库
构建服务镜像
修改 Java 服务 Dockerfile:
修改基础镜像为上一步构建的镜像
在启动命令中添加
-javaagent
参数
dockerfileFROM java-8-skywalking-agent:8.13.0 COPY target/*.jar app.jar ENTRYPOINT exec java -javaagent:/sw/agent/skywalking-agent.jar -jar /app.jar
修改服务部署清单
由于使用环境变量的方式配置 agent,需要在部署清单文件中配置环境变量。
另外,为了统一管理,这里将通用的配置项保存在了 ConfigMap 中。
ConfigMap
yamlapiVersion: 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 文件。
yamlspec: 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
重新应用清单就可以在【应用列表】中看到接入的应用了。
日志添加 traceId
如果只是接入 APM 对代码来说是无侵入的,不过此时无法关联到日志。
如果需要在日志中打印 traceId
以方便排查问题,则可以使用 Skywalking 提供的 apm-toolkit-logback-1.x 组件配合 logback 输出当前的 traceId
。
添加依赖
xml<!-- SkyWalking --> <dependency> <groupId>org.apache.skywalking</groupId> <artifactId>apm-toolkit-logback-1.x</artifactId> <version>8.13.0</version> </dependency>
修改 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
。
添加依赖
xml<!-- SkyWalking --> <dependency> <groupId>org.apache.skywalking</groupId> <artifactId>apm-toolkit-trace</artifactId> <version>8.13.0</version> </dependency>
添加 Filter
javaimport 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); } }