Bootstrap

链路追踪SkyWalking


链路追踪(Distributed Tracing) 是分布式系统中用于跟踪请求在多个服务间的调用过程的一种技术。它可以帮助开发者和运维人员全面了解请求的流转路径,定位性能瓶颈,诊断错误,优化系统性能。

链路追踪作用

在微服务架构中,请求通常会经过多个服务协作处理,可能涉及以下复杂性:

  • 服务间调用复杂:单个请求会调用多个服务,难以掌握全貌。
  • 调试困难:当出现问题时,难以定位是哪个服务或调用链出现了问题。
  • 性能瓶颈难以识别:无法直观地了解哪个服务或哪段调用链消耗了过多时间。
  • 日志分散:各服务的日志分布在不同的节点,难以整合分析。

链路追踪通过可视化请求的调用路径,解决了这些问题。

链路追踪的关键概念

Trace(追踪)

  • 描述一个完整请求的调用链路,从起点到终点的所有过程。

Span(跨度)

  • 一个请求生命周期中某个具体步骤的操作,例如调用某个服务或数据库查询。
  • 每个 Span 包含开始时间、持续时间、操作名称、标签等。

Parent-Child 关系

  • 在一个 Trace 中,多个 Span 可能有父子关系,形成一个树形结构。例如:
用户请求 -> API 网关(Span A) -> 服务 B(Span B,子节点) -> 服务 C(Span C,子节点)。

上下文传递(Context Propagation)

  • 为了将 Trace 信息传递到所有服务,链路追踪会通过请求头(如 HTTP Headers)传递追踪上下文(Trace ID 和 Span ID)。

链路追踪的工作原理

生成 Trace ID

  • 请求进入系统时,追踪工具会生成一个全局唯一的 Trace ID,用于标识该请求的完整链路。

创建 Span

  • 每个服务接收到请求后,会创建一个 Span,记录当前服务的操作。
  • Span 与其 Parent Span 通过 Span ID 建立父子关系。

上下文传递

  • Trace ID 和 Span ID 会通过 HTTP 请求头或消息队列的元数据在服务间传递。

数据收集与存储

  • 每个服务将 Span 数据发送到追踪系统(如 Jaeger 或 Zipkin),并存储在集中式数据库中。

可视化与分析

  • 追踪系统会将收集到的 Trace 数据以时间线或拓扑图的形式展示出来,便于分析。

常用链路追踪工具

Jaeger:

  • 由 Uber 开发的开源分布式追踪系统,支持完整的 Trace 和 Span 分析。
  • 提供高效的查询功能和性能监控。

Zipkin

  • Twitter 开发的开源工具,功能类似 Jaeger,轻量级,适合小型系统。

OpenTelemetry

  • 一个标准化的开源框架,用于采集、处理和导出链路追踪数据。
  • 兼容 Jaeger、Zipkin 和其他可观测性工具。

SkyWalking

  • 面向微服务的分布式追踪工具,集成了链路追踪、性能分析和可观测性功能。

链路追踪的实现步骤

  • 集成追踪工具库:在每个服务中引入追踪工具的 SDK,如 OpenTelemetry、Jaeger 客户端等。
  • 注入 Trace 上下文:确保 Trace ID 和 Span ID 能通过 HTTP Headers 或消息队列传递到下游服务。
  • 配置采样策略:设置采样率,控制需要追踪的请求比例,避免高流量下数据量过大。
  • 数据导出与存储:将追踪数据发送到追踪系统的后端(如 Jaeger、Elasticsearch)。
  • 分析与优化:在追踪系统的界面中查看请求的调用链,分析性能瓶颈和错误位置。

链路追踪的典型场景

  • 故障定位:追踪工具可以快速定位请求失败的服务或方法。
  • 性能优化:找出请求中耗时最长的服务或操作,并进行优化。
  • 调用依赖分析:直观地查看服务之间的依赖关系,优化服务拓扑。
  • 蓝绿发布和金丝雀测试:通过追踪请求流量,验证新版本服务是否正常。

示例:HTTP 链路追踪
请求从客户端到多个服务的链路追踪示例:

Trace ID: 123456789
Span 1: API Gateway (GET /orders)
  Span 2: Order Service (DB Query)
    Span 3: Payment Service (HTTP Call)
  • API Gateway 花费 100ms,调用 Order Service。
  • Order Service 花费 50ms 查询数据库。
  • Payment Service 花费 70ms 调用支付网关。

数据库查询时间较短,问题可能在 Payment Service 的外部调用。

SkyWalking

SkyWalking 是一款强大的开源分布式追踪和应用性能监控(APM)工具,支持链路追踪、性能分析和服务依赖拓扑展示。

SkyWalking 的主要功能

  • 分布式链路追踪:查看跨服务请求的调用链路。
  • 服务性能监控:监控服务的响应时间、错误率和吞吐量。
  • 服务拓扑分析:可视化展示服务之间的依赖关系。
  • 告警与诊断:支持基于性能指标的告警和问题诊断。

SkyWalking 的架构

  • Agent:运行在服务中的探针,采集链路追踪和性能数据。
  • Collector:后端组件,负责接收、处理和存储数据。
  • Storage:存储组件,常用 Elasticsearch 或 H2 数据库。
  • UI:前端界面,用于展示监控和追踪数据。

安装 SkyWalking

从 SkyWalking 的官方 GitHub 仓库 下载最新版本。

wget https://downloads.apache.org/skywalking/8.x/skywalking-x.x.x.tar.gz
tar -xvzf skywalking-x.x.x.tar.gz
cd skywalking

配置后端存储

SkyWalking 支持多种存储后端(如 Elasticsearch、H2、MySQL)。以下是配置 Elasticsearch 的示例:

在 config/application.yml 文件中配置存储:

storage:
  selector: ${SW_STORAGE:elasticsearch}
  elasticsearch:
    namespace: ${SW_NAMESPACE:""}
    clusterNodes: ${SW_STORAGE_ES_CLUSTER_NODES:localhost:9200}
    protocol: ${SW_STORAGE_ES_HTTP_PROTOCOL:"http"}

确保 Elasticsearch 已正确安装并运行。

启动 SkyWalking

bin/startup.sh

SkyWalking使用,访问界面

  • SkyWalking 后端运行在 http://localhost:12800。
  • UI 界面运行在 http://localhost:8080。

集成 SkyWalking

SkyWalking 通过 Agent(探针)与应用服务集成,支持多种语言(Java、Go、Python 等)。以下以 Java 应用为例。

1:下载 Agent:Agent 位于 SkyWalking 包的 agent 目录下。

2:启动 Java 应用时加载 Agent
在启动命令中添加以下参数:

-javaagent:/path-to-skywalking/agent/skywalking-agent.jar \
-Dskywalking.agent.service_name=<service-name> \
-Dskywalking.collector.backend_service=<collector-host>:11800
  • skywalking.agent.service_name:指定服务的名称(如 order-service)。
  • skywalking.collector.backend_service:指定 SkyWalking Collector 地址(如 localhost:11800)。
    3:启动 Spring Boot 应用时:
java -javaagent:/opt/skywalking/agent/skywalking-agent.jar \
-Dskywalking.agent.service_name=order-service \
-Dskywalking.collector.backend_service=localhost:11800 \
-jar order-service.jar

高级功能配置

配置日志追踪:

通过 SkyWalking 和日志框架(如 Logback、Log4j2)的集成,可以在链路追踪中关联日志信息。

  • 在日志配置文件中添加 SkyWalking 的 MDC(Mapped Diagnostic Context)。
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
    <encoder>
        <pattern>[%X{traceId}] [%thread] %-5level %logger{36} - %msg%n</pattern>
    </encoder>
</appender>

动态配置

通过 SkyWalking 的动态配置功能(Dynamic Configuration),可以实时更新采样率、告警规则等参数,无需重启服务。

常见问题

数据未显示

  • 确保 Agent 正确加载,检查启动日志是否包含 skywalking-agent.jar。
  • 确认服务的 collector.backend_service 地址正确。
  • 检查 SkyWalking 后端是否连接到存储(如 Elasticsearch)。

性能影响

SkyWalking 默认采样所有请求。在高流量环境中,可通过动态配置降低采样率:

agent:
  sampleRate: 0.1  # 只采样 10% 的请求
;