Skywalking 部署

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 最终效果图

多服务链路追踪
日志
服务指标

参考链接:

Skywalking 官网

Java Agent

SkyWalking 极简入门

相关推荐
David爱编程3 分钟前
JDK vs JRE:到底有什么本质区别?99% 的人都答不上来
java·后端
架构师沉默1 小时前
外卖平台每天1000万订单查询,是如何扛住高并发的?
java·后端·架构
coding随想1 小时前
网络层的“四骑士”:深入浅出IP、ICMP、ARP、RARP协议
后端·网络协议
sino爱学习1 小时前
基于Redis 发布订阅实现一个轻量级本地缓存刷新
后端
bug菌1 小时前
还在为编程效率发愁?字节跳动Trae如何让你秒变“代码大师“!
后端·ai编程·trae
Moonbit1 小时前
MoonBit Perals Vol.04: 用MoonBit 探索协同式编程
后端·程序员·编程语言
2501_909686701 小时前
基于SpringBoot的旅游网站系统
vue.js·spring boot·后端
HZ_YZ2 小时前
服务器docker部署项目
后端
bug菌2 小时前
🤔领导突然考我Spring中的注解@Bean,它是做什么用的?我...
java·后端·spring