跳转至

JAiRouter 完整链路追踪设计方案

一、概述

JAiRouter 作为 AI 模型服务网关,需要实现从用户请求/API入口开始的完整链路追踪,覆盖整个请求生命周期。

1.1 链路追踪流程

┌─────────────────────────────────────────────────────────────────────────────┐
│                           用户/API请求                                        │
└─────────────────────────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────────────────────┐
│  TracingWebFilter                                                            │
│  ┌─────────────────────────────────────────────────────────────────────┐    │
│  │ 根Span: HTTP Server Request                                          │    │
│  │ - span.kind: SERVER                                                  │    │
│  │ - http.method, http.url, http.target                                 │    │
│  │ - traceparent 提取(如果有上游追踪)                                    │    │
│  └─────────────────────────────────────────────────────────────────────┘    │
└─────────────────────────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────────────────────┐
│  API Controller                                                              │
│  ┌─────────────────────────────────────────────────────────────────────┐    │
│  │ 子Span: routing                                                      │    │
│  │ - span.kind: INTERNAL                                                │    │
│  │ - routing.path, routing.service_type                                 │    │
│  └─────────────────────────────────────────────────────────────────────┘    │
└─────────────────────────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────────────────────┐
│  Service层 (路由、负载均衡、熔断、限流)                                         │
│  ┌─────────────────────────────────────────────────────────────────────┐    │
│  │ 子Span: gateway.process                                              │    │
│  │ - gateway.stage: routing/lb/cb/rl                                    │    │
│  │ - gateway.instance: 选中的实例信息                                     │    │
│  └─────────────────────────────────────────────────────────────────────┘    │
└─────────────────────────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────────────────────┐
│  Adapter层                                                                    │
│  ┌─────────────────────────────────────────────────────────────────────┐    │
│  │ 子Span: adapter.transform                                            │    │
│  │ - adapter.type: gpustack/ollama/vllm                                 │    │
│  │ - adapter.model: 模型名称                                             │    │
│  │ - adapter.operation: chat/embedding/rerank                           │    │
│  └─────────────────────────────────────────────────────────────────────┘    │
└─────────────────────────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────────────────────┐
│  WebClient 后端调用                                                           │
│  ┌─────────────────────────────────────────────────────────────────────┐    │
│  │ 子Span: backend.call                                                 │    │
│  │ - span.kind: CLIENT                                                  │    │
│  │ - backend.url, backend.instance                                      │    │
│  │ - 注入 traceparent 到请求头                                           │    │
│  └─────────────────────────────────────────────────────────────────────┘    │
└─────────────────────────────────────────────────────────────────────────────┘
                                    ↓ [传播 Trace Context]
┌─────────────────────────────────────────────────────────────────────────────┐
│  后端模型服务 (GPUStack/Ollama/vLLM...)                                        │
│  └──────────────────────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────────────────────┐
│  响应返回 → 完成所有Span → 记录到TraceQueryService                              │
└─────────────────────────────────────────────────────────────────────────────┘

1.2 Span 层级结构

层级Span名称SpanKind属性
Level 0HTTP {method} {path}SERVERhttp.method, http.url, http.target, http.status_code
Level 1gateway.processINTERNALgateway.stage, gateway.service_type
Level 2adapter.{type}.transformINTERNALadapter.type, adapter.model, adapter.operation
Level 3backend.{service}.callCLIENTbackend.url, backend.instance, backend.timeout

二、核心改进

2.1 Trace Context 传播机制

实现 W3C Trace Context 标准的完整传播:

// 请求头注入
traceparent: 00-{trace-id}-{parent-span-id}-{flags}
tracestate: key1=value1,key2=value2

// 响应头注入(可选)
traceresponse: 00-{trace-id}-{span-id}-{flags}

2.2 Span 父子关系管理

改进 Span 父子关系的计算和存储:

  • 每个子 Span 记录 parentSpanId
  • 支持多层级 Span 深度计算
  • Span 时间线可视化(甘特图)

2.3 数据持久化

将追踪数据持久化存储:

  • 方案 A: Redis 存储(推荐)
  • 方案 B: H2 数据库存储
  • 方案 C: 外部追踪系统(Jaeger/Zipkin)

三、前端重构方案

3.1 功能模块整合

原 4 个功能模块 → 新 3 个功能模块

原模块新模块变化
追踪概览追踪仪表盘整合性能分析的关键指标
性能分析追踪仪表盘延迟/错误/吞吐量 Tab
追踪搜索链路追踪增强链路详情可视化
追踪管理追踪配置简化 UI 布局

3.2 新页面结构

/admin/tracing/
├── Dashboard.vue     # 追踪仪表盘(概览+性能分析)
├── Search.vue        # 链路追踪搜索
├── Management.vue    # 追踪配置管理
└── TraceDetail.vue   # 链路详情组件

四、实施计划

Phase 1: 后端增强(核心)

  • [ ] 增强 TracingService 子 Span 创建
  • [ ] 增强 BackendCallTracingInterceptor Trace Context 传播
  • [ ] 改进 TraceQueryService Span 关系计算
  • [ ] 实现 Redis 追踪数据存储

Phase 2: 前端重构

  • [ ] 整合 Dashboard.vue
  • [ ] 简化 Management.vue
  • [ ] 增强 Search.vue 链路详情

Phase 3: 测试验证

  • [ ] E2E 测试完整链路追踪
  • [ ] 前端功能验证

创建时间: 2026-04-10 版本: 1.0