背景
最近在调试 BUG 的时候经常会用到 TraceId,大致的场景是这样的:某系统研发人员调用你的服务时发现接口数据返回异常,所以你这边就需要协助解决问题。
但是如何才能找到对应接口调用的日志呢?如何串联起整个调用链条呢?
答案就是 SkyWalking ,虽然有着同样功能也比较优秀的其他工具,但是今天还是理一理 SkyWalking。
SkyWalking 简介
概述
SkyWalking 是一个可观察性分析平台和应用程序性能管理系统。跟踪、指标和记录一体化解决方案。 SkyWalking 是分布式系统的应用程序性能监控工具,专为微服务、云原生和基于容器(Docker、Kubernetes、Mesos)架构而设计。
功能
- 服务性能监控,包括网络、磁盘、接口响应等。
- 多语言自动探针。支持 Java、.Net Core、PHP、NodeJS、Golang、LUA、C++、Python。
- 轻量高效。无需大数据平台,和大量的服务器资源。
- 优秀的可视化解决方案,服务拓扑图等
SkyWalking 使用
环境介绍
-
基于 Mac 下的 docker、docker-compose 完成。如需使用请读者自行安装,其他操作系统功能使用类似。
-
基于 SpringBoot 的项目,没有集成过多的组件只有 SpringBoot。
-
项目 Java 版本为 11,能升级的就升级 Java8 有点老了。
SkyWalking 搭建
直接使用 Docker 去启动项目,但是这里有几点说明一下:
- Skywalking 的配置为默认的是可以修改的,可以通过映射配置文件
- Skywalking 默认的存储引擎为 H2,因为只是演示这里不做更改,生产选择 ES
- Skywalking UI 功能很强大,值的慢慢探索
version: '3'
services:
oap:
image: apache/skywalking-oap-server:8.4.0-es6
container_name: oap
restart: always
ports:
- 11800:11800 # agent 上报数据 gRPC 端口
- 12800:12800 # ui 读取数据 http 端口
skywaling-ui:
image: apache/skywalking-ui:8.4.0
container_name: ui
depends_on:
- oap
links:
- oap
ports:
- 8080:8080
environment:
- SW_OAP_ADDRESS=oap:12800
成功启动完成之后应该 打开 http://localhost:8080/ 会进入 SkyWalking 的管理页面。
如下图:
SpringBoot 接入
-
- SpringBoot 项目初始化
初始化 SpringBoot 项目的步骤这里就不多赘述了,需要初始化的小伙伴可以去看 SpringBoot Quickstart。
-
- 配置 SkyWalking Agent
下载 Skywalking Agent 包:
wget https://archive.apache.org/dist/skywalking/8.4.0/apache-skywalking-apm-8.4.0.tar.gz
解压后配置文件:
# 1. 后续需要配置的文件 ./agent/skywalking-agent.jar
# 2. 修改配置文件 agent/config/agent.config
# 配置服务名称
agent.service_name=${SW_AGENT_NAME:winter}
# 服务收集地址
collector.backend_service=${SW_AGENT_COLLECTOR_BACKEND_SERVICES:127.0.0.1:11800}
-
- 修改 Log4j 配置
主要的就是修改日志打印的格式,其他的按照配置就行。修改的地方放在下面:
<Properties>
<!-- 格式化输出:%date表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度 %msg:日志消息,%n是换行符-->
<!-- %logger{36} 表示 Logger 名字最长36个字符 -->
<!-- 主要的就是 traceId 的写入 -->
<property name="LOG_PATTERN" value="%date{HH:mm:ss.SSS} [%thread] %traceId %-5level %logger{36} - %msg%n" />
<!-- 定义日志存储的路径 -->
<property name="FILE_PATH" value="./logs" />
<property name="FILE_NAME" value="winter" />
</Properties>
<appenders>
<console name="Console" target="SYSTEM_OUT">
<!--输出日志的格式-->
<PatternLayout pattern="${LOG_PATTERN}"/>
<!--控制台只输出level及其以上级别的信息(onMatch),其他的直接拒绝(onMismatch)-->
<ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
</console>
<!--这里还有很多-->
<!--这里还有很多-->
<!--这里还有很多-->
<!--这里还有很多-->
<appenders>
-
- 启动项目
启动项目有两种方式,但是具体的参数都一样的,详细参数如下:
# skywalking-agent 的具体位置
-javaagent:./apache-skywalking-apm-bin/agent/skywalking-agent.jar
# 服务名称
-Dskywalking.agent.service_name=winter
# 采集的后端地址
-Dskywalking.collector.backend_service=127.0.0.1:11800
Idea 启动配置如图:
Jar 包的方式部署如下:
java \
-javaagent:./apache-skywalking-apm-bin/agent/skywalking-agent.jar \
-Dskywalking.agent.service_name=winter \
-Dskywalking.collector.backend_service=127.0.0.1:11800 -jar \
./target/winter-0.0.1-SNAPSHOT.jar
效果展示
SkyWalking 管理界面
先看一下 SkyWalking 的 DashBoard,这数据展示的效果还是挺唬人的:
当然关于 SkyWalking 的管理界面还有很多功能,有兴趣的小伙伴可以自行探索。
日志文件格式
再来看看日志的表现,下图中红框的数据就是我们想要的 traceId:
注意:这里的日志最好应该是落在 Kibana中集中管理,配合 Elasticsearch 能够高效的查询日志,也方便快速定位问题。