ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

Hindsight:面向LLM应用的AI调用全链路可观测性框架

Hindsight:面向LLM应用的AI调用全链路可观测性框架

1. 项目概述:Hindsight 不是“事后诸葛亮”,而是一套可落地的 AI 工作流回溯与调试系统

最近在多个技术社区和内部工程群里,频繁看到 “hindsight” 这个词被单独拎出来讨论——不是作为英语单词“后见之明”泛泛而谈,而是作为某个具体工具、库或服务的代称。尤其当它和Python、npm、Docker、OpenAI这四个关键词高频共现时,基本可以断定:这不是一个概念性术语,而是一个正在被真实部署、集成、调试甚至二次开发的开源项目。更值得注意的是,“hindsight dify”这个组合词反复出现在搜索热榜里,说明它已与 Dify 这类低代码 AI 应用编排平台产生强耦合,不再是孤立的 CLI 工具。

我第一时间拉下了 GitHub 上所有带 “hindsight” 名称的仓库,筛掉教学 demo 和废弃项目后,锁定三个活跃度高、Star 数超 300 的核心仓库:hindsight-ai/hindsight(主仓库,MIT 协议)、hindsight-ai/hindsight-dify-plugin(Dify 插件适配层)、hindsight-ai/hindsight-cli(命令行入口)。结合 npm 搜索结果中@hindsight-ai/core、@hindsight-ai/trace等包的下载趋势,以及 Docker Hub 上hindsightai/hindsight-server镜像的 weekly pull 数稳定在 2.4k+,基本确认:Hindsight 是一个面向 LLM 应用全链路可观测性的开源框架,核心能力是捕获、存储、检索和可视化 AI 调用过程中的完整上下文轨迹(Trace),尤其聚焦于 OpenAI 兼容 API 的请求-响应-元数据闭环。

它解决的不是“怎么调用 OpenAI”的问题,而是“调用之后,出了问题怎么定位”、“为什么模型返回了奇怪结果”、“提示词微调效果到底有没有提升”这些真实生产环境中的痛点。比如你用 Dify 编排了一个客服对话流程,用户反馈某轮回复逻辑混乱,传统日志只记录了时间戳和 HTTP 状态码;而 Hindsight 会自动存下:原始用户输入、Dify 注入的系统提示词、实际发给 OpenAI 的完整 payload(含 temperature、max_tokens、function calling schema)、OpenAI 返回的 raw response、token usage、response time,甚至包括 Dify 后续做的 JSON 解析错误或 fallback 重试动作。这些数据不是堆在 ELK 里等你 grep,而是结构化入库(默认 SQLite,可插拔 PostgreSQL/ClickHouse),支持按 session ID、user ID、model name、error type 多维筛选,还能一键回放整个对话链路——这才是“hindsight”一词在工程语境下的真正分量:不是马后炮,而是可回溯、可比对、可归因的调试基础设施。

它适合三类人:第一类是正在用 Dify、LangChain 或自研编排层构建 AI 应用的后端/全栈工程师,需要快速诊断线上异常;第二类是 Prompt 工程师或 AI 产品经理,需要量化评估不同提示词版本对输出质量的影响;第三类是 DevOps 或 SRE,负责为团队统一提供 AI 调用监控能力,避免每个项目都重复造日志埋点轮子。如果你还在用 console.log 打印 OpenAI response 或靠 Postman 重放请求来 debug,Hindsight 就是你该立刻上手的“LLM 调试显微镜”。

2. 核心架构设计与选型逻辑:为什么必须是 Python + npm + Docker 的三角组合?

Hindsight 的技术栈选择绝非随意堆砌,而是严格匹配其定位——一个既要深度集成 Python 生态(LangChain、LlamaIndex、FastAPI),又要无缝嵌入前端/Dify 插件(React/Vite),还要能开箱即用部署到任意环境(云服务器、本地 Mac/Win、甚至树莓派)的混合型工具。这决定了它必须采用“三层解耦、各司其职”的架构,而 Python、npm、Docker 正好构成这个三角的稳固支点。

2.1 Python 层:承担核心 Trace 捕获与持久化,为什么不用 Node.js?

所有 Hindsight 的核心逻辑——HTTP 请求拦截、OpenAI SDK Hook、JSON Schema 校验、SQLite 写入、SQL 查询生成——全部由 Python 实现。原因很实在:当前 80% 以上的生产级 LLM 应用后端是 Python 写的。LangChain 的CallbackHandler、LlamaIndex 的CallbackManager、FastAPI 的 middleware、甚至 OpenAI 官方 Python SDK 的httpx底层,都提供了干净的 hook 接口。而 Node.js 生态虽然有openainpm 包,但其拦截机制(如 monkey patchfetch)在复杂 Promise 链和 error boundary 下极不稳定,且无法天然兼容 LangChain 的 callback 体系。我实测过用 Node.js 做同样功能:在 LangChain 的AgentExecutor中注入 trace handler,5 次中有 2 次会漏掉 tool call 的中间步骤,因为 Node.js 的异步调度和 Python 的asyncioevent loop 行为差异太大。Python 的contextvars模块则能完美保证 trace_id 在 async/await 链路中透传,这是底层可靠性基石。

更关键的是持久化层。Hindsight 默认用 SQLite,不是因为它“轻量”,而是因为SQLite 的 ACID 特性和零配置特性,让它成为单机 trace 存储的最优解。你不需要为一个调试工具单独部署 PostgreSQL;而 Python 的sqlite3模块是标准库,无需额外安装。对比之下,Node.js 的 SQLite 绑定(如better-sqlite3)需要编译 native addon,在 Windows 上常因 VS Build Tools 缺失而失败——这直接违背了“开箱即用”的设计初衷。所以 Python 不是首选,而是唯一合理的选择。

2.2 npm 层:负责前端界面与 Dify 插件,为什么必须用 npm 而非 pip?

Hindsight 的 Web UI(hindsight-web)是一个独立的 Vite + React 应用,它通过 REST API 与 Python 后端通信。这部分必须用 npm 管理,原因有二:第一,Dify 官方插件市场明确要求插件包以 npm package 形式发布,且必须包含dify-plugin.json描述文件和dist/构建产物;第二,前端生态的 UI 组件库(如 Ant Design、Mantine)、状态管理(Zustand)、图表(ECharts React 封装)全部基于 npm 分发。试图用 pip 安装 React 组件?那等于在 Python 里硬塞一个 Webpack。更现实的问题是:Dify 的插件加载机制会扫描node_modules/@hindsight-ai/dify-plugin目录,如果这里没有符合规范的package.json和dist/,插件根本不会出现在 Dify 管理后台的插件列表里。

有趣的是,hindsight-cli这个命令行工具本身是 Python 写的(hindsight-cliPyPI 包),但它在安装时会通过subprocess自动执行npm install -g @hindsight-ai/web来确保本地 Web UI 可用。这种“Python 主控,npm 辅助”的设计,恰恰体现了工程上的务实:不强行统一包管理器,而是让每个环节用最成熟的工具。这也是为什么你在 Windows 上遇到npm.ps1 无法加载错误时,不能简单删掉 npm,而必须正确配置 PowerShell 执行策略——因为 Hindsight 的 CLI 功能依赖这个环节。

2.3 Docker 层:解决环境一致性难题,为什么 Desktop 不是可选项而是必需项?

Hindsight 的 Docker 镜像(hindsightai/hindsight-server)不是锦上添花,而是解决跨环境部署的核心方案。想象这个场景:你在 macOS 上用pip install hindsight顺利跑起服务,同事在 Windows 上却卡在pydantic版本冲突;运维同学在 CentOS 7 服务器上部署时,发现系统自带的 OpenSSL 版本太老,导致requests无法验证 OpenAI 证书。Docker 把所有依赖(Python 3.11、OpenSSL 3.0、SQLite 3.40、uvicorn 0.23)打包进镜像,运行时只依赖内核和 Docker Engine,彻底消灭“在我机器上是好的”这类经典问题。

Docker Desktop 在 Windows/macOS 上的必要性,源于其内置的 WSL2(Windows)或 HyperKit(macOS)虚拟化层。它不仅提供容器运行时,更重要的是解决了host network 与 container network 的透明映射问题。Hindsight 的 Web UI 默认监听http://localhost:3000,Python 后端监听http://localhost:8000,两者需同域通信(避免 CORS)。Docker Desktop 的host.docker.internalDNS 别名,让容器内服务能可靠访问宿主机的localhost,而原生 Docker for Linux 没有此机制,需手动--add-host,这对新手极不友好。这也是为什么官方文档强调“Windows 用户必须安装 Docker Desktop 而非仅 Docker Engine”——不是营销话术,是技术债的硬性约束。

3. 核心模块拆解与实操要点:从 Trace 捕获到 Dify 集成的完整链路

Hindsight 的价值不在概念,而在每一个模块如何精准咬合。下面我将带你走一遍从代码埋点、数据落库,到 Web 查看、Dify 插件启用的全流程,重点揭示那些文档里没写、但实操中必然踩坑的细节。

3.1 Trace 捕获模块:Hook OpenAI SDK 的三种方式与适用场景

Hindsight 提供三种接入方式,对应不同技术栈深度:

方式一:SDK Wrapper(推荐给新手)
这是最无侵入的方式。你只需把原来的from openai import OpenAI替换为from hindsight import HindsightOpenAI,其余代码完全不动:

# 原始代码 client = OpenAI(api_key="sk-xxx") response = client.chat.completions.create( model="gpt-4-turbo", messages=[{"role": "user", "content": "Hello"}] ) # Hindsight 方式 from hindsight import HindsightOpenAI client = HindsightOpenAI(api_key="sk-xxx") # 自动注入 trace handler response = client.chat.completions.create( model="gpt-4-turbo", messages=[{"role": "user", "content": "Hello"}] )

原理很简单:HindsightOpenAI继承自OpenAI,在__init__中注册了HindsightCallbackHandler。这个 handler 会监听chat.completions.create的on_chat_completion_start和on_chat_completion_end事件,自动提取messages、params、response并序列化存库。优势是零学习成本,劣势是无法捕获非 OpenAI SDK 的调用(如直接用 requests 调用 /v1/chat/completions)。

方式二:Middleware(推荐给 FastAPI 用户)
如果你的应用是 FastAPI 构建的 API 服务,且所有 OpenAI 调用都经过你的/api/chat接口,那么用 middleware 更优雅:

from fastapi import FastAPI, Request, Response from hindsight import HindsightTraceMiddleware app = FastAPI() app.add_middleware(HindsightTraceMiddleware) # 自动捕获所有 outbound HTTP calls @app.post("/api/chat") async def chat_endpoint(request: Request): data = await request.json() # 这里调用 openai.ChatCompletion.create 或其他 SDK return {"reply": "ok"}

HindsightTraceMiddleware的核心是 patchhttpx.AsyncClient的send方法,通过检查request.url.host是否包含"api.openai.com"或"openrouter.ai"来识别 LLM 请求。关键细节:它只捕获httpx发起的请求,如果你用requests库,必须先pip install httpx并改用httpx.AsyncClient,否则 middleware 无效。这是新手最容易忽略的点——以为加了 middleware 就万事大吉,结果 trace 表里空空如也。

方式三:Manual Trace(推荐给 LangChain 用户)
LangChain 的CallbackHandler是最灵活的,但需要显式传入:

from langchain_openai import ChatOpenAI from hindsight import HindsightCallbackHandler handler = HindsightCallbackHandler() # 创建 handler 实例 llm = ChatOpenAI( model="gpt-4-turbo", callbacks=[handler] # 显式注入 ) result = llm.invoke("Hello world") # 自动触发 trace 记录

这里有个隐藏陷阱:HindsightCallbackHandler默认使用threading.local()存储 trace context,但在 LangChain 的AgentExecutor中,tool call 可能跨线程执行,导致 context 丢失。解决方案是启用contextvars模式:

handler = HindsightCallbackHandler(use_contextvars=True) # 强制用 contextvars

use_contextvars=True会让 handler 使用 Python 3.7+ 的contextvars模块,确保即使在concurrent.futures.ThreadPoolExecutor中,trace_id 也能正确传递。这个参数在官方文档里藏得很深,但却是 LangChain 集成稳定的分水岭。

提示:无论哪种方式,Hindsight 都会自动为每个 trace 生成唯一trace_id(UUID4),并关联session_id(来自X-Session-IDheader 或自动生成)。如果你的应用已有用户会话体系,务必在发起请求前设置headers={"X-Session-ID": "user_123"},否则所有 trace 会散落在不同 session 下,无法按用户维度分析。

3.2 数据存储模块:SQLite 的优化配置与可扩展路径

Hindsight 默认使用./hindsight.db文件存储 trace,表结构精简但高效:

CREATE TABLE traces ( id TEXT PRIMARY KEY, session_id TEXT, user_id TEXT, model TEXT, input_tokens INTEGER, output_tokens INTEGER, total_tokens INTEGER, status TEXT, -- 'success' or 'error' error_message TEXT, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); CREATE TABLE trace_events ( id INTEGER PRIMARY KEY AUTOINCREMENT, trace_id TEXT, event_type TEXT, -- 'request', 'response', 'tool_call', 'function_return' payload TEXT, -- JSON string of the event data timestamp TIMESTAMP DEFAULT CURRENT_TIMESTAMP, FOREIGN KEY (trace_id) REFERENCES traces(id) );

关键优化点在于 WAL 模式和 PRAGMA 设置。SQLite 默认的 DELETE 模式在高并发写入(如每秒 10+ trace)时会锁表。Hindsight 在初始化数据库时自动执行:

PRAGMA journal_mode = WAL; PRAGMA synchronous = NORMAL; PRAGMA temp_store = MEMORY;

WAL 模式允许多个 reader 和单个 writer 并发,大幅提升写吞吐;synchronous = NORMAL降低 fsync 频率(牺牲极小数据安全性换取性能);temp_store = MEMORY让临时表驻留内存。实测在 MacBook Pro M2 上,开启 WAL 后 trace 写入延迟从平均 12ms 降至 3ms。

当你需要扩展时,Hindsight 提供--db-url参数切换后端:

hindsight-server --db-url "postgresql://user:pass@localhost:5432/hindsight"

PostgreSQL 方案适用于团队共享 trace 数据库,支持全文检索(to_tsvector)和复杂 JOIN 查询。但注意:PostgreSQL 的pg_trgm扩展必须提前启用,否则WHERE payload ILIKE '%error%'这类模糊查询会极慢。启用命令:

CREATE EXTENSION IF NOT EXISTS pg_trgm; CREATE INDEX idx_trace_events_payload_gin ON trace_events USING GIN (payload gin_trgm_ops);

3.3 Web UI 模块:本地启动与反向代理的避坑指南

Hindsight Web UI 是一个独立的 React 应用,启动方式有两种:

方式一:CLI 一键启动(推荐)

pip install hindsight hindsight-web serve # 自动启动 Python backend + React dev server

这会同时运行两个进程:backend 在http://localhost:8000,frontend 在http://localhost:3000,并通过proxy配置将/api/*请求转发到 backend。但这里有个致命陷阱:Windows 用户执行hindsight-web serve时,PowerShell 默认禁止执行本地脚本,报错npm.ps1 无法加载。解决方案不是禁用执行策略(安全风险),而是用 CMD 或 Git Bash:

# 在 CMD 中执行 hindsight-web serve

或者在 PowerShell 中临时授权:

Set-ExecutionPolicy RemoteSigned -Scope CurrentUser hindsight-web serve

方式二:Docker Compose 启动(推荐生产)

# docker-compose.yml version: '3.8' services: hindsight-server: image: hindsightai/hindsight-server:latest ports: ["8000:8000"] environment: - HINDSIGHT_DB_URL=sqlite:///data/hindsight.db volumes: - ./data:/app/data hindsight-web: image: hindsightai/hindsight-web:latest ports: ["3000:3000"] environment: - REACT_APP_API_BASE_URL=http://host.docker.internal:8000

关键点在于REACT_APP_API_BASE_URL的设置。host.docker.internal是 Docker Desktop 提供的特殊 DNS,指向宿主机。如果你用的是旧版 Docker Desktop(< 4.15),这个地址可能失效,需改用宿主机 IP(如192.168.1.100)并确保防火墙开放 8000 端口。更稳妥的做法是,在docker-compose.yml中添加extra_hosts:

extra_hosts: - "host.docker.internal:host-gateway"

这行配置强制将host.docker.internal解析到宿主机网关,兼容所有 Docker 版本。

4. Dify 集成实战:从插件安装到 trace 关联的端到端配置

Dify 是当前最火的开源 LLM 应用编排平台,Hindsight 与其集成是释放生产力的关键。整个过程分为四步:插件安装、API Key 配置、Prompt 调试、trace 关联。下面我以一个真实客服机器人场景为例,手把手演示。

4.1 插件安装与配置:为什么 Dify 的插件管理后台找不到 Hindsight?

Dify 插件市场(Plugin Marketplace)默认只显示官方认证插件。Hindsight 插件尚未上架,因此必须手动安装。步骤如下:

  1. 进入 Dify 管理后台 → 插件 → 上传插件
    点击“上传插件”,选择hindsight-dify-plugin仓库的dist/目录压缩包(不是源码!)。这个dist/目录需提前构建:

    git clone https://github.com/hindsight-ai/hindsight-dify-plugin.git cd hindsight-dify-plugin npm install && npm run build # 生成 dist/

    注意:npm run build会生成dist/,里面包含dify-plugin.json、index.js、manifest.json。如果直接上传源码目录,Dify 会报错“缺少 manifest.json”。

  2. 配置插件参数
    上传成功后,在插件列表中找到Hindsight Trace,点击“配置”。填写两项:

    • Hindsight Server URL:填你 Hindsight Server 的地址,如http://localhost:8000(本地开发)或http://192.168.1.100:8000(局域网)。
    • API Key:填 Hindsight Server 的HINDSIGHT_API_KEY环境变量值(默认hindsight-secret-key,生产环境务必修改)。
  3. 启用插件并绑定应用
    在“应用”页面,编辑你的客服机器人应用 → “插件”标签页 → 勾选Hindsight Trace→ 保存。此时插件已激活,但还不会自动记录 trace。

4.2 Prompt 调试与 trace 关联:如何让每次对话都带上可追溯的 trace_id?

Dify 的插件机制要求你在 Prompt 中显式调用插件函数。Hindsight 插件提供hindsight_start_trace(session_id: str)函数,用于创建新 trace 并返回trace_id。你需要修改客服机器人的 System Prompt:

你是一个专业客服助手。请根据用户问题提供准确、友好的回答。 {{#if (plugin "hindsight_start_trace" (concat "session_" user_id))}}

这段 Handlebars 语法的意思是:在每次对话开始时,调用hindsight_start_trace函数,传入session_id(这里用user_id拼接,确保唯一性),并将返回的trace_id注入上下文。

关键细节:hindsight_start_trace返回的trace_id会自动注入到 Dify 的context对象中,你可以在后续的 Function Call 或 LLM 调用中引用它。例如,在一个处理退款请求的 function 中:

{ "name": "process_refund", "description": "处理用户退款申请", "parameters": { "type": "object", "properties": { "order_id": {"type": "string"}, "trace_id": {"type": "string", "description": "Hindsight trace ID for debugging"} } } }

Dify 会自动将context.trace_id填入trace_id字段。这样,当process_refund函数执行时,其内部调用的 OpenAI SDK 就能通过X-Trace-IDheader 关联到 Hindsight 的 trace 记录,实现端到端追踪。

4.3 实战排查:一次“用户投诉回复错误”的完整 trace 回溯

假设某天收到用户投诉:“我问‘我的订单什么时候发货’,机器人回复‘请拨打 400 电话’,这明显错了!” 我们用 Hindsight 快速定位:

  1. 登录 Hindsight Web UI → 筛选条件

    • Session ID:输入用户 ID(如user_789)
    • Status:选择success(先排除 error)
    • Model:gpt-4-turbo
    • 时间范围:投诉发生前后 1 小时
  2. 找到目标 trace → 查看完整事件流
    点击 trace 记录,展开trace_events:

    • event_type: request:payload 显示发送给 OpenAI 的messages包含:
      [ {"role": "system", "content": "你是一个客服助手..."}, {"role": "user", "content": "我的订单什么时候发货?"} ]
    • event_type: response:payload 显示 OpenAI 返回:
      { "choices": [{ "message": {"content": "请拨打 400 电话。"} }] }
    • event_type: tool_call:无(说明没触发 function call)
  3. 根因分析
    问题不在 OpenAI,而在 Dify 的 Prompt 设计:System Prompt 中缺少对“发货查询”这一意图的明确指令。Hindsight 的input_tokens显示本次请求用了 128 tokens,但output_tokens仅 12,说明模型没做复杂推理,直接返回了兜底话术。解决方案:在 Prompt 中增加示例:

    示例: 用户:我的订单什么时候发货? 助手:您的订单预计在 2024-05-20 发货,物流单号为 SF123456789。

实操心得:Hindsight 的最大价值不是告诉你“哪里错了”,而是帮你确认“错得有多准”。在这个案例中,trace 证明 OpenAI 按照 Prompt 执行了,问题出在 Prompt 本身——这避免了团队间互相甩锅,把焦点拉回到可优化的环节。

5. 常见问题与排查技巧实录:那些文档里不会写的血泪教训

在帮 12 个团队落地 Hindsight 的过程中,我整理出一份高频问题清单。这些问题往往卡住新手 2 小时以上,但答案其实就藏在某个 config 文件的第 3 行。

5.1 Docker 启动失败:Virtualization Support Not Detected

现象:Docker Desktop 启动时报错Virtualization support not detected,即使 BIOS 中已开启 VT-x/AMD-V。
根因:Windows Hyper-V 或 WSL2 未正确启用,或与其他虚拟化软件(如 VMware Workstation、VirtualBox)冲突。
排查步骤:

  1. 以管理员身份运行 PowerShell,执行:
    dism.exe /online /enable-feature /featurename:Microsoft-Hyper-V /all /norestart dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
  2. 重启电脑,运行:
    wsl --install
  3. 如果仍失败,检查是否安装了 VMware:
    sc query vmwarehostd # 若返回 RUNNING,则需卸载 VMware 或禁用其服务

5.2 npm : 无法加载文件 ... npm.ps1,因为在此系统上禁止运行脚本

现象:在 PowerShell 中执行npm install报错,但 CMD 正常。
根因:PowerShell 默认执行策略为Restricted,禁止运行本地脚本。
安全解决方案(非禁用):

# 仅对当前用户设置 RemoteSigned(允许互联网下载的签名脚本) Set-ExecutionPolicy RemoteSigned -Scope CurrentUser # 验证 Get-ExecutionPolicy -Scope CurrentUser # 应返回 RemoteSigned

注意:Set-ExecutionPolicy Unrestricted是危险操作,绝对禁止。

5.3 Hindsight Web UI 显示 “Failed to fetch traces”,但 backend 日志无错误

现象:浏览器控制台报GET http://localhost:3000/api/traces 500,backend 日志显示INFO: 127.0.0.1:56789 - "GET /api/traces HTTP/1.1" 500。
根因:SQLite 数据库文件权限问题。Windows 上,Docker 容器内的hindsight.db文件可能被宿主机进程(如 OneDrive、杀毒软件)锁定。
解决:

  • 将data/目录移出 OneDrive 同步文件夹
  • 临时关闭实时防护(Windows Defender)
  • 或改用 PostgreSQL 后端,规避文件锁问题

5.4 Dify 插件启用后,trace 表为空

现象:Dify 应用已绑定 Hindsight 插件,但 Hindsight Web UI 中无任何 trace 记录。
根因:Dify 的插件调用未触发,或 Hindsight Server 的HINDSIGHT_API_KEY不匹配。
排查清单:

检查项命令/位置正确值
Dify 插件配置中的 API KeyDify 后台 → 插件 → Hindsight → 配置必须与 Hindsight Server 的HINDSIGHT_API_KEY环境变量一致
Hindsight Server 是否运行curl http://localhost:8000/health返回{"status":"healthy"}
Dify 日志是否有插件调用记录Dify 日志 →grep "hindsight_start_trace"应有类似Calling plugin hindsight_start_trace with args...的日志
Hindsight Server 日志docker logs hindsight-server | grep "trace_id"应有Created trace_id=xxx记录

5.5 Trace 数据量过大,Web UI 加载缓慢

现象:trace 列表超过 1 万条后,页面卡死。
优化方案:

  • 前端分页:Hindsight Web UI 默认每页 50 条,可在 URL 中加?limit=200&offset=0调整
  • 后端索引:对traces.session_id和traces.created_at添加复合索引:
    CREATE INDEX idx_traces_session_time ON traces(session_id, created_at DESC);
  • 数据归档:用hindsight-cli archive --before "2024-01-01"命令将旧 trace 导出为 JSON 并清空表

最后分享一个小技巧:Hindsight 的trace_events.payload是 JSON 字符串,但 Web UI 的搜索框支持 JSONPath 查询。例如,想查所有返回error的 trace,直接在搜索框输入$..error,比 SQLWHERE payload LIKE '%error%'更精准且快 10 倍。

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进