SkyWalking全链路追踪工具

发布于:2025-05-27 ⋅ 阅读:(111) ⋅ 点赞:(0)

一. 什么是 SkyWalking?

  1. 定义与背景
  • 开源 APM 系统
    Apache SkyWalking 是一款专注于 分布式系统监控、追踪与诊断 的国产开源应用性能管理(APM)工具,由吴晟于 2015 年创建并开源,2017 年进入 Apache 孵化器,2019 年成为 Apache 顶级项目。

  • 设计目标
    专为 微服务架构、云原生环境(Kubernetes、Docker)及容器化部署 设计,解决分布式系统中服务链路复杂、性能问题定位困难等痛点。

  1. 核心功能
功能模块 描述
分布式追踪 记录跨服务的完整调用链路,支持细粒度分析请求耗时、错误节点定位。
性能指标监控 监控服务/实例的 CPU、内存、HTTP 响应时间、吞吐量(QPS)、错误率等关键指标。
服务拓扑分析 自动绘制服务间依赖关系图,直观展示系统架构健康状态。
日志关联分析 将日志与追踪数据(TraceID)绑定,实现上下文关联的日志查询。
告警与诊断 基于预定义规则(如慢查询、异常响应码)触发告警,支持邮件、Webhook、钉钉等通知方式。
JVM 监控 深度监控 Java 应用的堆内存、GC 频率、线程状态等 JVM 指标。
数据库调用分析 追踪 SQL 执行性能,分析慢查询及数据库连接池状态。
  1. 核心优势
  • 低侵入性
    通过 Agent 探针实现监控,无需修改业务代码,仅需添加启动参数即可接入。

  • 多语言支持
    支持 Java、.NET、Node.js、Go、Python、PHP 等主流语言,覆盖异构技术栈。

  • 云原生友好
    深度集成 Kubernetes、Istio、Envoy,支持 Service Mesh 监控。

  • 支持主流存储
    Elasticsearch、MySQL、postgresql 、 banyandb等。

  • 生态丰富
    提供插件化扩展机制,兼容 OpenTelemetry、Zipkin、Prometheus 等开源生态工具。

二. SkyWalking 架构

SkyWalking 采用 模块化架构,主要组件如下:

  • 探针(Agent):

      部署在应用端,负责采集链路、指标、日志等数据。
      支持多种语言,如 Java Agent、Nginx Lua 模块等。
    
  • 后端(OAP Server):

      接收并处理探针上报的数据,进行聚合、分析。
      提供 GraphQL 和 gRPC 接口供 UI 查询。
    
  • 存储(Storage):

      数据持久化层,默认支持 Elasticsearch、H2、MySQL 等。
    
  • 用户界面(UI):

      可视化展示监控数据,支持拓扑图、链路详情、指标仪表盘等。
    

架构图简示:

外部系统
可视化层
数据处理与存储层
数据采集层
gRPC/HTTP
Metrics/Traces
Network Metrics
HTTP/Kafka
分析/聚合
存储
关联存储
查询
直接查询
SkyWalking数据源
API调用
Webhook/邮件
接收日志
自动埋点
告警规则
数据导出
告警系统
ELK日志系统
SkyWalking Web UI
Grafana
CLI工具
Metrics数据
Traces数据
Logs数据
ElasticSearch/MySQL
OAP Server
JVM/应用探针 (Agent)
Service Mesh 探针 (Istio/Envoy)
eBPF 探针
第三方工具 (Prometheus/Fluentd)

三. 服务端搭建步骤

  • 环境要求:
    JDK 8+
    存储服务(如 Elasticsearch 7.x)

  • 步骤:

  1. 下载安装包:
    访问 SkyWalking 官方下载页面 下载最新版本:
    在这里插入图片描述
# 或者用命令下载
wget https://dlcdn.apache.org/skywalking/10.2.0/apache-skywalking-apm-10.2.0.tar.gz  # 选择最新版本
tar -zxvf apache-skywalking-apm-10.2.0.tar.gz
cd apache-skywalking-apm-bin
  1. 修改注册中心为nacos
修改 apache-skywalking-apm-bin/config/application.yml

在这里插入图片描述

  1. 配置存储(以 mysql 为例):
# 修改 apache-skywalking-apm-bin/config/application.yml:

storage:
  selector: ${SW_STORAGE:mysql}
  mysql:
    properties:
      jdbcUrl: ${SW_JDBC_URL:"jdbc:mysql://localhost:3306/sky_walking?rewriteBatchedStatements=true&allowMultiQueries=true"}
      dataSource.user: ${SW_DATA_SOURCE_USER:root}
      dataSource.password: ${SW_DATA_SOURCE_PASSWORD:12345678}

在这里插入图片描述

注意:
2025年3月24日发布的Apache SkyWalking APM 10.2.0版本

No H2, More BanyanDB
	添加BanyanDB 0.8.0支持并作为默认数据库。
	H2存储选项被永久移除。

项目:
为Elasticsearch中需要排序或聚合的字段添加doc_values,并禁用所有其他字段。
此更改不会影响正式发布用户的现有部署及其功能。

警告:如果我们的Elasticsearch索引有自定义查询插件,这个更改可能会破坏它们,
	因为使用意外字段的排序查询和聚合查询会被阻止。

【重大变更】将debug -query模块改名为status-query模块。相对暴露的api不变。

所有skywalking-oap-server的jar不再通过maven central发布我们只会将源tar和二进制tar
发布到网站下载页面,而将docker镜像发布到docker hub。

警告:如果您在项目中使用skywalking-oap-server作为依赖项,
则需要从网站下载源代码tar并将其发布到您的私有maven存储库。

[重大改变]永久移除H2作为存储选项BanyanDB 0.8(需要OAP 10.2)简单、稳定且可用于生产。
不再需要H2作为默认存储。

[重大改变]BanyanDB服务器版本升级到0.8.0此版本与以前的版本不兼容。
请先将BanyanDB服务器升级到0.8.0,再将OAP升级到10.2.0。

为了编译最新的UI(boost - UI),将nodejs升级到v22.14.0。

将tj-actions/changed-files迁移到dorny/paths-filter。

从10.2.0开始,banyandb配置被分离到一个独立的配置文件:‘ bydb.yaml ’。

在这里插入图片描述

  1. 手动添加mysql数据驱动包
    因为在oap-libs目录下没有mysql数据驱动,如果不加,配置mysql启动会报错
    在这里插入图片描述

  2. 修改UI服务的配置文件
    因为UI服务的端口,默认8080
    打开 /apache-skywalking-apm-bin/webapp/application.yml 配置文件,修改端口

在这里插入图片描述

  1. 启动服务

    # 启动 OAP 服务:
    # oap服务:对应的启动脚本oapService.bat,Linux/Mac下对应的后缀是sh
    sh bin/oapService.sh start
    
    # 启动 UI:
    # 对应的启动脚本webappService.bat,Linux/Mac下对应的后缀是sh
    sh bin/webappService.sh start
    
    # 还有一个 bin/startup.bat 启动文件,可以直接启动上述两个服务
    
    

    skywalking-oap-server 服务启动后会暴露 11800 和 12800 两个端口,
    分别为收集监控数据的端口 11800 和接收前端请求的端口 12800 ,
    端口可以修改/config/application.yml

  2. 访问 UI
    浏览器打开 http://localhost:8088。

    在这里插入图片描述

  3. 客户端搭建(以 Java 为例)
    下载 Agent:
    SkyWalking 发布页获取 skywalking-agent.jar。

    在这里插入图片描述

  4. 启动应用时挂载 Agent:
    在运行的程序配置VM options参数

    java -javaagent:/path/to/skywalking-agent.jar 
    	-Dskywalking.agent.service_name=your-service-name 
    	-jar your-app.jar
    

    在这里插入图片描述

注意事项:由于Skywalking 默认是不支持 Spring Cloud Gateway ,若为Cloud服务,需要将optional-plugins目录中最新的apm-spring-cloud-gateway*.jar 放入 plugins目录中

在这里插入图片描述

目前Skywalking还不支持 spring cloud gateway 4.x(截止2025年5月)
查阅了大量文档,在github的issue得到答案
原话为:I think this has been answered repeatedly. Spring Gateway 4 is not supported, as no one contributed.

https://github.com/apache/skywalking/discussions/12675
https://github.com/apache/skywalking/discussions/12636

Spring Cloud Release Train Spring Cloud Gateway Version
2024 4.2.x
2023 4.1.x
2022 4.0.x
2021 3.1.x
2020 3.0.x
Hoxton 2.2.x
Greenwich 2.1.x
Finchley 2.0.x
Edgware 1.0.x
  1. 目录结构

    webapp: UI 前端(web 监控页面)的 jar 包和配置文件
    oap-libs: 后台应用的 jar 包,以及它的依赖 jar 包,里边有一个 server-starter-*.jar 就是启动程序
    config: 启动后台应用程序的配置文件,是使用的各种配置文件
    bin: 各种启动脚本,一般使用脚本 startup.sh 来启动 web页面 和对应的 后台应用

    • oapService.*: 默认使用的后台程序和启动脚本:(使用的是默认模式启动,还支持其它模 式,各种模式区别见 启动模式)
    • oapServiceInit.*: 使用 init 模式启动;再次模式下,OAP 服务器启动以执行初始化工作,然后退出
    • oapServiceNoInit.*: 使用 No Init 模式启动;在此模式下, OAP 服务不进行初始化
    • startup.*: 组合脚本,同时启动 oapService. *;webappService. * 脚本

    agent: (在搭建微服务的时候会用到)

    • skywalking-agent.jar: 代理服务 jar 包
    • config: 代理服务启动时使用的配置文件
    • plugins: 包含多个插件,代理服务启动时会加载该目录下的所有插件(实际是各种 jar 包)
    • optional-plugins: 可选插件,当然需要支持某种功能时,比如 SpringCloud Gateway,则需要把对应的 jar 包拷贝到 plugins 目录下

四. 日志监控

SkyWalking 原生日志收集:

日志框架集成:

Log4j/Logback:配置 SkyWalkingLogAppender。

<dependency>
   <groupId>org.apache.skywalking</groupId>
   <artifactId>apm-toolkit-logback-1.x</artifactId>
   <version>${project.release.version}</version>
</dependency>

示例 Logback 配置:

<?xml version="1.0" encoding="UTF-8" ?>
<configuration>

    <!--  引入 SpringBoot 默认的 logback XML 配置文件  -->
    <include resource="org/springframework/boot/logging/logback/defaults.xml" />

    <appender name="console" 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>-%clr(%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd HH:mm:ss.SSS}}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} [%tid] %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}</Pattern>
            </layout>
        </encoder>

    </appender>

    <!--  设置 Appender  -->
    <root level="INFO">
        <appender-ref ref="console"></appender-ref>
    </root>


</configuration>

Skywalking 通过 grpc 上报日志(需要v8.4.0+)

<?xml version="1.0" encoding="UTF-8" ?>
<configuration>

    <!--  引入 SpringBoot 默认的 logback XML 配置文件  -->
    <include resource="org/springframework/boot/logging/logback/defaults.xml" />

    <appender name="console" 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>-%clr(%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd HH:mm:ss.SSS}}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} [%tid] %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}</Pattern>
            </layout>
        </encoder>

    </appender>

    <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>%d{yyyy-MM-dd HH:mm:ss.SSS} [%X{tid}] [%thread] %-5level %logger{36} -%msg%n</Pattern>
            </layout>
        </encoder>
    </appender>

    <!--  设置 Appender  -->
    <root level="INFO">
        <appender-ref ref="console" />
        <appender-ref ref="grpc-log" />
    </root>


</configuration>

注意:如果 SkyWalking 服务不是部署在本地,日志无法上报到 SkyWalking 需要修改\agent\config目录下的agent.config文件

将下面信息复制到文件底部

plugin.toolkit.log.grpc.reporter.server_host=${SW_GRPC_LOG_SERVER_HOST:127.0.0.1}
plugin.toolkit.log.grpc.reporter.server_port=${SW_GRPC_LOG_SERVER_PORT:11800}
plugin.toolkit.log.grpc.reporter.max_message_size=${SW_GRPC_LOG_MAX_MESSAGE_SIZE:10485760}
plugin.toolkit.log.grpc.reporter.upstream_timeout=${SW_GRPC_LOG_GRPC_UPSTREAM_TIMEOUT:30}

配置名 解释 默认值
plugin.toolkit.log.transmit_formatted 是否格式化或未格式化的格式传输记录的数据 true
plugin.toolkit.log.grpc.reporter.server_host 指定要向其报告日志数据的 grpc 服务器的主机 127.0.0.1
plugin.toolkit.log.grpc.reporter.server_port 指定要向其报告日志数据的 grpc 服务器的端口 11800
plugin.toolkit.log.grpc.reporter.max_message_size 指定 grpc 客户端要报告的日志数据的最大大小 10485760
plugin.toolkit.log.grpc.reporter.upstream_timeout 客户端向上游发送数据时将超时多长时间。单位是秒 30

五. 监控告警配置

  • 版本支持:自 SkyWalking 6.x 版本引入告警功能,通过动态规则引擎实时监控指标并触发通知。
  • 核心机制
    • 告警规则:定义监控指标的条件和触发阈值。
    • Webhook (网络钩子)回调:配置告警触发后的通知目标(如 HTTP 接口、钉钉机器人、邮件等)。
    • 配置文件:config/alarm-settings.yml(支持热更新,修改后无需重启 OAP)。

SkyWalking 告警功能的流程图

告警接收系统
告警通知
OAP Server
配置文件: alarm-settings.yml
规则触发
并行调用
并行调用
并行调用
收集指标
读取历史数据
短信系统
邮件系统
Slack
微信
自定义服务
Webhook调用器
Webhook 服务 1
Webhook 服务 2
Webhook 服务 N
告警评估引擎
指标收集器
规则匹配器
告警生成器
告警缓冲区
告警规则定义
Webhook配置
存储系统

SkyWalking 从 v9.x 开始逐步引入 MQE(Monitoring Query Expression) 语法,替代旧版的 metrics-name + threshold 模式,v10+ 版本默认强制使用 MQE。核心变化如下:

旧版 (v8.x) 新版 (v10+) 优势
基于固定指标名和阈值比较 支持灵活表达式(聚合、数学运算) 更强大的条件组合能力
单条件触发 支持多条件逻辑运算(AND/OR) 实现复合告警逻辑
配置字段:metrics-name, op 统一用 expression 字段定义逻辑 配置更简洁,灵活性高
  1. 告警规则文件:
    修改 apache-skywalking-apm-bin/config/alarm-settings.yml,
    apache-skywalking-apm-10.x版本示例规则:
rules:
  # 规则名称需以 _rule 结尾
  service_resp_time_rule:
   # MQE 表达式,计算结果需为布尔值(1=true触发告警,0=false不触发)
    expression: sum(service_resp_time > 1000) >= 3
    period: 10        # 评估周期(单位:分钟)
    silence-period: 5 # 静默期(单位:分钟)
    message: "Response time of service {name} is more than 1000ms in 3 minutes of last 10 minutes." # 自定义消息内容,支持变量(如 {name})
  # 更多规则...
  1. 常用监控指标
指标名称 (metrics-name) 描述 适用场景
service_resp_time 服务平均响应时间 接口性能下降监控
service_sla 服务 SLA(成功率) 服务可用性监控
endpoint_percent 端点(API)的慢查询比例 接口性能优化
service_instance_cpu 服务实例的 CPU 使用率 资源过载预警
database_access_resp_time 数据库访问响应时间 慢 SQL 监控
  1. 示例:定义接口响应时间告警
rules:
  service_resp_time_rule:
  expression: avg(service_resp_time) > 1000  # 平均响应时间 >1s
  threshold: 3000  # 3000 毫秒(3 秒)
  period: 5  # 统计最近 5 分钟的指标
  count: 2  # 5 分钟内超过阈值至少 2 次
  silence-period: 10  # 触发后 10 分钟内不重复告警
  message: 服务 {name} 的平均响应时间超过 3 秒,当前值为 {value} 毫秒。
  1. Webhook 定义
hooks:                     # Webhook 总配置
  webhook:                 # Webhook 类型(支持 future 扩展其他 hook 类型)
    default:               # 配置组名称(可自定义,如 dingtalk、wechat)
      is-default: true     # 是否作为默认组(true 时所有告警规则默认触发此组)
      urls:                # 接收告警的 HTTP 端点列表
        - http://127.0.0.1:8080/alert
        - http://api.example.com/notify
      # headers:           # 自定义请求头(如 Content-Type、认证信息)
      #   Content-Type: application/json
      #   Authorization: Bearer xxxx
      # secret: "your-signing-secret"  # (可选)请求签名密钥
      # body: |            # 自定义请求体模板(支持变量替换)
      #   {
      #     "alert": "{alarmMessage}",
      #     "scope": "{scope}"
      #   }
  1. 集成第三方通知工具
hooks:
  webhook:
    internal_system:        # 内部运维平台
      urls:
        - http://internal-monitor.example.com/alerts
      headers:
        X-Auth-Token: "xxx"
    
    dingtalk:               # 钉钉机器人
      urls:
        - https://oapi.dingtalk.com/robot/send?access_token=your_token
      secret: "钉钉签名密钥"  # 若机器人启用加签,需填写
      body: |
        {
          "msgtype": "markdown",
          "markdown": {
            "title": "SkyWalking 告警通知",
            "text": "**告警名称**: {alarmMessage}\n**服务名称**: {name}"
          }
        }
       
    wechat:                 # 企业微信机器人
      urls:
        - https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=your_key
      body: |
        {
          "msgtype": "text",
          "text": {
            "content": "SkyWalking 告警通知\n规则: {ruleName}\n消息: {alarmMessage}\n时间: {startTime}"
          }
        }
  1. 告警变量清单
    在 body 或 message 中可使用的动态变量:
变量名 示例值 说明
{ruleName} service_resp_time_rule 触发的告警规则名称
{alarmMessage} 服务 order-service 响应时间超过阈值 告警消息模板中定义的内容
{scope} SERVICE, ENDPOINT 告警作用域(服务、端点等)
{name} order-service 目标实体名称(如服务名)
{id} service::order-service 目标实体唯一 ID
{startTime} 1629780000000 告警触发时间戳(毫秒)
  1. 邮件通知
    需通过中间服务(如 Python 脚本)接收 Webhook 并发送邮件,或使用 SkyWalking 的邮件插件(需扩展开发)。

总结

SkyWalking 是一个功能全面的 APM 工具,通过 Agent 无侵入采集数据,OAP 服务处理,结合 Elasticsearch 存储实现高性能监控。日志和告警功能可通过配置灵活扩展,适合云原生及微服务架构。

官网:https://skywalking.apache.org/
下载:https://skywalking.apache.org/downloads/
Github:https://github.com/apache/skywalking
Agent文档:https://skywalking.apache.org/docs/main/
OAP文档:https://skywalking.apache.org/docs/skywalking-showcase/next/readme/
中文文档:https://skyapm.github.io/document-cn-translation-of-skywalking/


网站公告

今日签到

点亮在社区的每一天
去签到