分布式调用链的日志系统(也称为分布式追踪系统)用于跟踪和监控分布式系统的请求流,帮助开发者诊断问题、优化性能和理解系统的整体行为。

实现原理

分布式调用链的日志系统通过在每个服务之间传递一个唯一的标识符(Trace ID)来记录整个请求从开始到结束的所有步骤。这个标识符使得所有相关的日志可以关联起来,形成一条完整的调用链。

架构示意图

在这里插入图片描述

主要步骤:
  1. 生成Trace ID:当客户端发起一个请求时,生成一个唯一的Trace ID。
  2. 传递Trace ID:在每次服务调用中,将Trace ID和Span ID传递给下一个服务。
  3. 记录Span:每个服务在处理请求时,记录一个Span,包括开始时间、结束时间、操作名称、父Span ID等信息。
  4. 收集和存储Span:将所有的Span发送到集中式存储系统进行存储和分析。
  5. 查询和可视化:通过查询工具或可视化界面查看和分析调用链数据。

关键技术点

1. Trace ID 和 Span ID
  • Trace ID:唯一标识一次完整的请求过程。
  • Span ID:唯一标识一个具体的调用单元(Span)。每个Span有一个父Span ID,根Span的父Span ID为空。
2. Span
  • Span 包含以下信息
    • 操作名称(Operation Name):描述当前Span所执行的操作。
    • 开始时间和结束时间(Timestamps):记录Span的开始和结束时间戳。
    • 父Span ID(Parent Span ID):标识当前Span的父Span,形成树状结构。
    • 元数据(Tags and Logs):附加信息,如HTTP状态码、错误信息等。
3. 传播机制
  • HTTP 请求头:在HTTP请求头中传递Trace ID和Span ID。
  • 常见传播协议
    • B3 Propagation
      • X-B3-TraceId
      • X-B3-SpanId
      • X-B3-ParentSpanId
      • X-B3-Sampled(采样标志)
    • Jaeger B3 Propagation
      • 类似于B3,但增加了uber-trace-id字段。
4. 集中式存储
  • 存储方案
    • Elasticsearch:适合全文搜索和聚合分析。
    • Cassandra:适合高吞吐量写入和低延迟读取。
  • 数据模型
    • 按照Trace ID索引,便于快速检索同一请求的所有Span。
    • 使用倒排索引加速查询。
5. 查询和可视化工具
  • 查询功能
    • 按时间段过滤。
    • 按服务名、操作名过滤。
    • 支持复杂条件组合查询。
  • 可视化工具
    • Jaeger UI:提供丰富的图表和交互功能。
    • Zipkin UI:简洁易用的可视化界面。

实现细节

生成Trace ID 和 Span ID
  • 客户端
    • 生成Trace ID和初始Span ID。
    • 将Trace ID和Span ID放入HTTP请求头中。
  • 服务端
    • 从HTTP请求头中提取Trace ID和Span ID。
    • 生成新的Span ID作为子Span。
    • 设置父Span ID为上一级Span ID。
记录Span
  • Span 数据结构
    {
      "traceId": "trace-123",
      "spanId": "span-1",
      "parentSpanId": null,
      "operationName": "GET /api/resource",
      "startTime": 1638316800000,
      "endTime": 1638316801000,
      "tags": {
        "http.method": "GET",
        "http.status_code": 200
      },
      "logs": [
        {
          "timestamp": 1638316800500,
          "fields": {
            "event": "error",
            "message": "Timeout"
          }
        }
      ]
    }
    

传播机制示例

假设客户端发起一个HTTP请求到服务A,服务A再调用服务B和服务C。
在这里插入图片描述

集中式存储示例

使用Elasticsearch存储Span数据。

在这里插入图片描述

查询和可视化示例

使用Jaeger UI查询和可视化调用链。
在这里插入图片描述

完整调用链路

在这里插入图片描述

注意事项!!!

性能影响
  • 采样策略
    • 全量采集可能导致性能下降,可以通过随机采样减少开销。
    • 根据业务需求调整采样率。
隐私保护
  • 敏感信息脱敏
    • 对敏感字段进行加密或脱敏处理。
扩展性
  • 水平扩展
    • 使用分布式架构支持大规模并发请求。
    • 采用负载均衡和自动伸缩机制。
兼容性
  • 多语言支持
    • 提供多种编程语言的SDK,方便集成。
    • 支持主流框架和库。

加上采样策略的完整调用链路

在这里插入图片描述

Logo

更多推荐