1、前言
Skywalking 服务可以做什么?
- 服务指标:平均请求 RT,请求频率,服务响应时间百分位值
- 分布式链路追踪:可以观测一个请求发起到结束,经过了哪些服务,这些服务的耗时指标,甚至可以观测 Redis/DB 的耗时,这对于优化线上的接口非常好用
- 日志追踪:可配合分布式链路追踪生成的 TID 去查看接口产生的日志
2、Skywalking 的组成
本教程将基于 Dockers 来快速搭建一个 Skywalking-10.2.0 版本的服务
Skywalking 由四个部分组成,项目是官方的架构图

1、Skywalking-ui:显然易见,这是前端的 WebAPP,没有什么需要关注的东西
2、Skywalking-oap-server:平台后端支持数据聚合、分析和流处理,涵盖跟踪、指标、日志和事件。作为聚合器角色、接收器角色或两者。(服务端接收日志,由 Agent 探针向服务发送指标)
3、存储:从 10.2.0 开始,Skywalking 默认使用自研的数据库 banyandb,当然你也可以使用其他的数据库,可以根据 oap-server 的启动脚本去查看支持哪些数据库作为存储,目前版本支持 ES,PGSQL,Mysql 与 banyandb
4、Agent:探针,你需要观测的服务通过探针来向 oap-server 发送指标数据
3、快速开始
ini
docker run -d \
-p 17912:17912 \
-p 17913:17913 \
--name banyandb \
apache/skywalking-banyandb:0.8.0 \
standalone
docker run --name skywalking-oap-10.2 \
--restart always -d \
-e SW_STORAGE=banyandb \
-e SW_STORAGE_BANYANDB_TARGETS=ip:17912 \
-e SW_STORAGE_BANYANDB_GR_NORMAL_TTL_DAYS=90 \
-e SW_STORAGE_BANYANDB_GR_SUPER_TTL_DAYS=90 \
-e SW_STORAGE_BANYANDB_GM_MINUTE_TTL_DAYS=90 \
-e SW_STORAGE_BANYANDB_GM_HOUR_TTL_DAYS=90 \
-e SW_STORAGE_BANYANDB_GM_DAY_TTL_DAYS=90 \
-e SW_STORAGE_BANYANDB_GM_INDEX_TTL_DAYS=90 \
-p 21800:11800 \
-p 22800:12800 \
apache/skywalking-oap-server:10.2.0
docker run \
--name skywalking-ui-10.2.0 \
--restart always \
-p 18080:8080 -d \
--privileged=true \
-e SW_OAP_ADDRESS=http://ip:22800 \
apache/skywalking-ui:10.2.0
注意修改命令中的 IP,按照顺序去执行启动命令,执行完成后查看 oap-server 的日志,没有问题就可以去看部署机器的 18080 端口。
oap 服务的配置可以查看 \config\application.yml
上面的三个重要的服务启动完成之后,需要去启动需要接入的服务
这是 Java 服务的 Agent 目录
- config: 存放了配置文件
- activations: 与插件有关,建议从官网下载下来之后不要去对这里的文件做删除修改操作
- plugins:使用的插件
- optional-plugins:可选插件,复制到 plugins 即可激活

例如 Java 的 SpringBoot,需要在启动参数前加入
bash
-javaagent://home/jar/agent/9.1/skywalking-agent-9.1.jar
启动报错请尝试换版本去启动,接下来刷新几次就可以看见指标数据了
如果需要修改一些仪表盘的配置,比如服务名称,服务实例等,可以修改服务对应的 agent.config 文件
例:
ini
# 后台启动地址
collector.backend_service=ip:prod
也可以修改启动命令
ini
-Dskywalking.agent.service_name=服务分组::服务名称
-Dskywalking.agent.instance_name=服务实例
-Dskywalking.collector.backend_service=oap服务地址

4、插件
插件支持很多参数,例如你想要知道 SQL 执行的语句查询参数

可以通过修改 config/agent.config
ini
plugin.jdbc.trace_sql_parameters=true
然后重启接入的服务即可
插件支持的参数可以去看官方所给出的文档: Skywalking-Java-Agent
5、日志追踪
支持很多日志框架,本教程使用 Logback 来演示
5.1、引入依赖
xml
<dependency>
<groupId>org.apache.skywalking</groupId>
<artifactId>apm-toolkit-logback-1.x</artifactId>
<version>9.4.0</version>
</dependency>
<dependency>
<groupId>org.apache.skywalking</groupId>
<artifactId>apm-toolkit-trace</artifactId>
<version>9.4.0</version>
</dependency>
5.2、修改 logback 配置文件
xml
<appender name="grpc-log" class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.log.GRPCLogClientAppender">
<encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
<layout class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.mdc.TraceIdMDCPatternLogbackLayout">
<pattern>[%X{tid}]%msg%n</pattern>
</layout>
</encoder>
</appender>
<!-- 日志输出级别 -->
<root level="INFO">
<appender-ref ref="grpc-log" />
5.3、加入 TID
java
import lombok.extern.slf4j.Slf4j;
import org.apache.skywalking.apm.toolkit.trace.TraceContext;
import org.slf4j.MDC;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
@Slf4j
public class MDCFilter implements Filter {
@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) {
String requestId = TraceContext.traceId();
MDC.put("tid", requestId);
try {
chain.doFilter(req, res);
} catch (IOException | ServletException e) {
log.error("请求失败", e);
throw new RuntimeException(e);
}
MDC.clear();
}
}
注意:如果发现 TraceContext.traceId (); 得到的结果为空,请去 skywalking-agent\activations 目录下查看是不是少了对应的 jar 包
Last 最终效果图
多服务链路追踪

日志

服务指标

参考链接: