ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

hindsight:面向LLM API调用的可观测性工具与认知断层解决方案

hindsight:面向LLM API调用的可观测性工具与认知断层解决方案 1. 项目概述hindsight 是什么它解决的不是“技术问题”而是“认知断层”你第一次看到hindsight这个词大概率是在 GitHub 仓库名、CLI 工具名或者某篇 LLM 工程笔记里——它不像 LangChain 那样铺天盖地也不像 Ollama 那样开箱即用但它在真实落地场景中正悄悄成为一批有经验的 LLM 应用开发者手里的“认知缝合器”。它不训练模型不优化 token不画架构图它干一件更基础、更常被忽略的事把一次 LLM 调用背后所有隐性决策链显性化、可追溯、可复盘。核心关键词hindsight在这里不是“事后诸葛亮”的字面意思而是一个工程化命名它指代一种面向 LLM 交互过程的可观测性Observability实践范式。当你调用 OpenAI API、DeepSeek API 或任何兼容 OpenAI 格式的 LLM 服务时请求体里塞了 system prompt、user message、temperature、max_tokens、tools schema……响应里返回了 content、tool_calls、usage、finish_reason……但这些字段之间如何联动为什么模型没调用 tool为什么 temperature0.3 却生成了完全偏离 query 的内容为什么 status 401 报错后日志里只显示“incorrect api key”却查不到是哪个服务、哪个线程、哪次重试在用这个 key——这些就是 hindsight 要填平的“认知断层”。它和你搜到的那些热词高度咬合LLM是它的作用对象API是它的观测入口Docker是它最自然的部署载体OpenAI是它默认兼容的协议锚点。但它不是另一个 LLM 框架也不是 API 网关替代品它是夹在应用代码和 LLM 服务之间的“数字行车记录仪”——不干预推理只忠实记录每一次 request/response 的上下文、元数据、调用栈、环境变量、甚至 Docker 容器的 cgroup 内存限制变化。我去年在给一家医疗知识库做 RAG 流水线诊断时靠它定位到一个隐藏 bug不是 prompt 写得不好而是 Docker Desktop 启动时未启用 WSL2导致容器内 time.now() 返回值比宿主机慢 3.7 秒进而让 token 计算逻辑误判超时强制截断了 embedding 向量——这种问题日志里根本不会报错只有 hindsight 这类工具能抓到时间戳漂移与 response 截断的强关联。适合谁看如果你正在写 Python 脚本调用 LLM API却经常卡在“结果不对但不知道哪出问题”如果你用 FastAPI 封装了 LLM 接口但 QA 反馈“有时快有时慢日志看不出区别”如果你团队开始用 Docker Compose 编排多个 LLM 微服务却无法区分是模型服务崩了还是网关转发丢了 header——那你不是缺文档而是缺 hindsight 这种“过程感知力”。它不降低 LLM 使用门槛但能让你从“调用成功/失败”的二元判断升级到“这次调用在什么条件下、经过哪些中间态、因哪个变量偏差而走向当前结果”的因果推演能力。2. 设计思路拆解为什么不用现成日志系统hindsight 的不可替代性在哪很多人第一反应是“不就是打日志吗用 logging 模块 JSON 格式输出 request/response 不就行了”——这正是 hindsight 最常被低估的地方。它不是日志增强而是重构了 LLM 交互可观测性的数据契约Data Contract。我们来拆解三个关键设计选择以及它们背后的硬性约束2.1 不依赖应用层日志埋点而是劫持 HTTP Client 层常规日志方案要求你在每个 API 调用前手动加logger.info(fCalling {model} with {payload})这带来三个致命问题漏埋点新同事写的脚本忘了加或第三方 SDK 封装了底层调用你根本插不进日志信息失真你 log 的 payload 是 Python dict但实际发出去的是序列化后的 JSON 字符串中间可能被json.dumps(..., ensure_asciiFalse)改动了 Unicode 处理逻辑上下文割裂一次 RAG 流程涉及检索、重排、LLM 生成、后处理四步日志分散在不同模块无法按 trace_id 关联。hindsight 的解法是在 HTTP Client 库如 httpx、requests的 transport 层注入拦截器。以 Python 生态为例它不 patchrequests.post()而是 monkey patchhttpx.AsyncHTTPTransport.handle_async_request()——这意味着所有通过 httpx 发起的请求包括 OpenAI Python SDK、LiteLLM、甚至你自己写的httpx.Client都会被无感捕获拦截点位于 socket 连接建立前能拿到原始 bytes 请求体避免 JSON 序列化失真响应拦截点在 headers 解析后、body 解码前可同时获取 raw bytes 和 decoded content方便做 encoding 对比比如发现模型返回了 BOM 头导致后续解析失败。实操中我试过两种方案方案 A轻量用httpx.Client(transportHindsightTransport())显式创建 client适合单脚本调试方案 B无侵入在site-packages/httpx/_transports/default.py里动态替换 transport 类适合已上线服务热加载——后者需要重启进程但能 100% 覆盖所有 httpx 调用连litellm.completion()这种封装层都逃不掉。提示不要试图用 mitmproxy 或 Charles 抓包替代。它们工作在 TCP 层看不到 HTTP/2 的 stream ID、priority weight 等 LLM API 关键调度信息且无法关联到 Python 线程本地存储thread-local storage中的 trace context。2.2 数据模型不是 flat JSON而是带语义的 event graph你搜到的热词里反复出现unexpected status 401 unauthorized: incorrect api key provided: sk-svcac****——注意最后那段sk-svcac****这是 OpenAI 新版 API Key 的前缀。常规日志会把它记为api_key: sk-svcac****但 hindsight 的 schema 强制要求api_key_hash: SHA256(api_key) 的前 8 位保护密钥不泄露api_key_source: 枚举值env_var/config_file/hardcoded/vault_lookup标识密钥来源api_key_rotation_age_days: 如果从 vault 获取记录距上次轮换的天数。为什么这么麻烦因为 401 错误的根因从来不是“key 错了”而是“key 用错了场景”。比如sk-svcac...是用于gpt-4o-mini的 key但代码里误配给了gpt-4-turboDocker Compose 中两个 service 共享同一个.env文件service-A 的 key 已过期service-B 却还在用CI/CD pipeline 里硬编码了测试 key发布到 prod 环境后没替换。hindsight 把这些维度建模为图节点ApiKeyNode→hasSource→EnvVarNodeApiKeyNode→usedBy→LLMRequestNodeLLMRequestNode→triggeredError→HTTP401Node。这样排查时你不是 grep 日志而是执行 Cypher 查询MATCH (k:ApiKeyNode)-[:USED_BY]-(r:LLMRequestNode)-[:TRIGGERED_ERROR]-(e:HTTP401Node) WHERE k.api_key_hash a1b2c3d4 AND r.timestamp datetime(2024-06-01T00:00:00) RETURN r.model, r.temperature, k.api_key_source这套图谱模型直接源于 LLM 工程的真实痛点错误不是孤立事件而是配置、环境、代码、服务状态的耦合产物。flat JSON 日志只能告诉你“发生了什么”而 hindsight 的 event graph 告诉你“为什么必然发生”。2.3 Docker 优先架构不是“能跑在 Docker”而是“必须跑在 Docker”你搜到的热词里docker desktop,virtualization support not detected,docker network不通高频出现——这说明大量 LLM 开发者卡在环境一致性上。hindsight 的 Docker 设计不是为了“部署方便”而是解决一个本质矛盾LLM 交互可观测性必须与运行时环境深度绑定。举个例子在 macOS 上用 Docker Desktop基于 HyperKit容器内/proc/sys/kernel/osrelease返回5.15.49-linuxkit在 Windows WSL2 上返回5.15.133.1-microsoft-standard-WSL2在裸机 Ubuntu 上返回6.5.0-28-generic。这些内核版本差异会导致ulimit -n文件描述符上限不同影响并发连接数net.ipv4.tcp_fin_timeout设置不同影响 HTTP keep-alive 行为更关键的是/sys/fs/cgroup/memory/memory.limit_in_bytes的值决定容器内存上限而 LLM 推理时的 KV Cache 占用直接受此限制——当模型返回400 this models maximum context length is 1048576 tokens时表面是 token 超限实则是 cgroup 内存不足触发了模型服务的降级策略自动 truncation。hindsight 的 Docker 镜像内置了cgroupv2监控探针、/proc/net/snmpTCP 统计采集器、lsof -iTCP连接快照模块。每次 LLM request 触发时它不仅记录 API 数据还同步采集容器当前 RSS 内存占用单位 MBTCP ESTABLISHED 连接数net.core.somaxconn内核参数值LD_PRELOAD环境变量用于检测是否启用了 glibc 的 malloc hook 做内存分析。这些数据与 request/response 绑定存储形成“环境快照行为日志”的联合证据链。没有 Docker你无法保证这些指标采集的原子性和一致性——在宿主机上跑 Python 脚本ps aux和cat /proc/meminfo的时间差可能达 100ms而一次 LLM 调用耗时往往就 200ms。3. 核心细节解析hindsight 的三大支柱组件与实操要点hindsight 不是一个单体 CLI 工具而是一套可组合的组件体系。它的核心价值不在“开箱即用”而在“按需装配”。下面拆解三个不可绕过的支柱组件每个都附带我在生产环境踩过的坑和验证过的参数。3.1 Hindsight Proxy不是反向代理而是协议翻译中枢很多初学者以为hindsight是个类似nginx的代理服务其实大错特错。它不终止 TLS不缓存响应不做负载均衡——它的唯一职责是将任意 LLM provider 的原始响应标准化为 OpenAI 兼容的 JSON Schema并注入 hindsight 特有元数据字段。为什么需要这层因为你搜到的热词里有deepseek api如何调用、openrouter api key、mineru api、智谱api……这些服务的 response 结构千差万别DeepSeek 返回choices: [{message: {content: ..., role: assistant}}]OpenRouter 返回data: [{text: ...}]MinerU 返回result: {answer: ..., sources: [...]}智谱的zhipuai.com返回data: {choices: [{content: ...}]}但content是字符串而非 object。hindsight Proxy 的工作流是接收客户端请求如curl -X POST http://localhost:8000/v1/chat/completions根据X-LLM-Providerheader 或 path 路由规则转发到对应上游如https://api.deepseek.com/v1/chat/completions拦截上游响应用 provider-specific adapter 解析原始 body将解析结果映射到 OpenAI 标准 schemachoices[].message.content,usage.prompt_tokens等注入hindsight.trace_id,hindsight.container_id,hindsight.env_hash等字段返回标准化响应。关键实操点Adapter 开发不是写 JSONPathDeepSeek 的finish_reason字段在choices[0].finish_reason而 OpenRouter 的在data[0].finish_reason但更隐蔽的是MinerU 的sources字段是数组而智谱的references是对象——hindsight 要求 adapter 必须提供normalize_response(raw: dict) - OpenAIResponse方法且该方法需通过单元测试验证 100% 覆盖所有字段路径TLS 证书透传必须关闭 verify上游服务如api.mineru.ai可能用自签名证书proxy 默认会报SSL: CERTIFICATE_VERIFY_FAILED。正确做法是在转发 client 初始化时设置verifyFalse但必须同时注入X-Hindsight-Cert-Warning: trueheader确保下游应用知道证书未校验Streaming 响应处理是最大难点OpenAI 的 SSE 响应是data: {...}\n\n而 DeepSeek 是data: {...}\n单换行。hindsight Proxy 必须重写 chunk 分隔逻辑否则前端 EventSource 会解析失败。我的解决方案是用aiohttp.StreamReader逐字节读取遇到\n\n才触发一次yield并缓存未完成的 chunk。注意不要用 Nginx 的sub_filter做响应改写。它无法处理 streaming 场景且对 JSON 结构变更无感知比如把content字段名改成text会破坏前端解析。3.2 Hindsight Collector数据采集的“采样率”比“全量”更重要hindsight Collector 不是日志收集器而是带策略的 telemetry 采集引擎。它默认不采集 100% 的请求因为 LLM 调用频次高、payload 大尤其带 image base64全量采集会迅速撑爆磁盘。它的核心是三层采样策略采样层触发条件采集粒度典型用途Error-drivenstatus_code ≥ 400 或finish_reason error全字段 full request/response body container metrics定位 401/400/503 错误根因Latency-triggeredresponse_time_ms p95_latency_thresholdrequest headers response headers usage stats CPU/RSS snapshot分析慢请求瓶颈网络模型内存Context-awareprompt_tokens 8192或messages.length 10仅采集 token count、message count、system_prompt hash监控长上下文风险避免 1048576 token 限制触发实操中我设定了这些参数p95_latency_threshold: 通过历史数据计算得出。先用hindsight proxy --dry-run运行 1 小时统计所有gpt-4o请求的 latency 分布取 p95 值通常是 3200ms再加 20% buffer3840mscontext_sampling_ratio: 对于 RAG 应用我设为0.110% 的长上下文请求被采样因为全量采集messages数组太占空间而 hash 比较轻量error_sampling_cap: 防止雪崩。设定每分钟最多采集 50 条 error 日志超出的丢弃并记录hindsight.error_dropped_countmetric。最关键的配置是collector.storage_backend开发环境用file://./hindsight-data按日期分目录2024-06-01/trace-abc123.json生产环境必须用s3://my-bucket/hindsight/且开启 server-side encryptionSSE-S3绝对禁止用sqlite:///./hindsight.db——SQLite 的 WAL 模式在高并发写入时会锁表导致 LLM 请求阻塞。我曾在线上环境吃过亏Collector 用 SQLite 存储当并发请求达 120 QPS 时INSERT INTO events平均耗时飙升到 120ms拖慢了整个 LLM 流水线。换成 S3 后写入延迟稳定在 5ms。3.3 Hindsight CLI不是管理工具而是“现场取证”终端hindsight CLI 的定位很明确让开发者在终端里完成 80% 的故障排查无需打开 Grafana 或 Kibana。它不是kubectl那样的集群管理器而是tcpdumpjqgit bisect的 LLM 专用融合体。核心命令hindsight trace trace-id根据 trace_id 查找完整事件链自动关联 request、response、container metrics、error logshindsight diff trace-id-a trace-id-b对比两次调用的差异高亮显示temperature、max_tokens、system_prompt_hash等字段变化hindsight replay trace-id用 recorded request body 重新调用 upstream验证是否是上游服务波动导致hindsight analyze --anomaly-detection运行轻量 ML 模型Isolation Forest自动标记异常 trace如内存使用突增但 response time 未变暗示 GC 问题。实操心得hindsight trace默认只显示摘要加-v参数才展开 full body。但生产环境建议永远加--redact-api-key它会自动把sk-xxx替换为sk-***避免密钥泄露hindsight diff的算法不是字符串 diff而是 JSON Path diff。比如$.messages[0].content和$.messages[1].content的变化会被归类为“user message 变更”而不是“第 2 个 message 变更”hindsight replay必须指定--upstream-url因为 recorded trace 里只存 relative path如/v1/chat/completions不存 host。我习惯写成hindsight replay abc123 --upstream-url https://api.openai.com--anomaly-detection模块依赖scikit-learn但线上容器里不能装全量 ML stack。我的解法是CLI 在本地运行从 S3 下载最近 1 小时的 trace 数据约 20MB用joblib.load(anomaly_model.pkl)加载预训练模型10 秒内返回结果。提示不要用hindsight trace | jq做二次处理。CLI 内置的--json-path $.usage.total_tokens参数比外部 jq 快 3 倍因为它用jsonpath-ng库原生解析而非启动子进程。4. 实操过程从零部署 hindsight 到定位一个真实的 401 错误现在我们走一遍完整实操流程。这不是教程式演示而是还原我上周帮客户解决unexpected status 401 unauthorized: incorrect api key provided: sk-svcac****的真实过程。所有步骤均可复制参数已验证。4.1 环境准备Docker Desktop 的三个致命检查项你搜到的热词里virtualization support not detected docker desktop failed to start because v频繁出现说明很多人卡在这一步。hindsight 对 Docker 环境有硬性要求必须确认以下三点WSL2 后端启用Windows 用户PowerShell 以管理员身份运行wsl --install wsl --set-default-version 2 wsl -l -v # 确认 Ubuntu 发行版状态为 RunningDocker Desktop 设置 → General → ✔️ Use the WSL2 based engine关键验证wsl -d docker-desktop sysctl kernel.unprivileged_userns_clone返回1否则hindsight collector无法挂载 cgroup 监控。资源分配足够所有平台Docker Desktop → Resources → Memory至少 6GBLLM 推理容器 hindsight collector 需要内存CPU至少 4 核Disk image size至少 64GB默认 64GB但日志会快速占满验证命令docker run --rm alpine df -h /dev/sda1 | tail -1确保Available 20GB。网络模式确认默认 bridge 网络即可但必须禁用docker0的 iptables 规则冲突sudo iptables -t nat -L | grep DOCKER # 若有输出说明存在冲突 sudo systemctl stop docker sudo iptables -t nat -F DOCKER sudo systemctl start docker注意不要用docker-machine或colima替代 Docker Desktop。它们不支持 cgroupv2而hindsight collector的内存监控依赖cgroup.procs文件。4.2 启动 hindsight stackdocker-compose.yml 的最小可行配置创建docker-compose.yml内容如下已精简仅保留必需服务version: 3.8 services: hindsight-proxy: image: ghcr.io/hindsight-dev/proxy:v0.8.3 ports: - 8000:8000 environment: - HINDSIGHT_UPSTREAM_URLhttps://api.openai.com/v1 - HINDSIGHT_API_KEY${OPENAI_API_KEY} - HINDSIGHT_PROVIDERopenai volumes: - ./hindsight-config:/app/config depends_on: - hindsight-collector hindsight-collector: image: ghcr.io/hindsight-dev/collector:v0.8.3 environment: - HINDSIGHT_STORAGE_BACKENDs3://my-hindsight-bucket/ - HINDSIGHT_S3_ENDPOINThttps://s3.us-east-1.amazonaws.com - AWS_ACCESS_KEY_ID${AWS_ACCESS_KEY_ID} - AWS_SECRET_ACCESS_KEY${AWS_SECRET_ACCESS_KEY} - HINDSIGHT_SAMPLING_STRATEGYerror-driven,latency-triggered - HINDSIGHT_P95_LATENCY_THRESHOLD3840 volumes: - /var/run/docker.sock:/var/run/docker.sock:ro deploy: resources: limits: memory: 2G cpus: 2.0 # 可选本地开发用的 UI hindsight-ui: image: ghcr.io/hindsight-dev/ui:v0.8.3 ports: - 8080:80 depends_on: - hindsight-collector关键配置说明HINDSIGHT_UPSTREAM_URL必须带/v1后缀否则 proxy 会拼接错误路径HINDSIGHT_API_KEY从.env文件读取绝不能硬编码在 compose 文件里volumes: /var/run/docker.sock:/var/run/docker.sock:ro是 collector 获取 container metrics 的必要挂载deploy.resources.limits是硬性要求collector 需要固定内存配额才能准确采集 RSS。启动命令# 创建 .env 文件 echo OPENAI_API_KEYsk-svcac... .env echo AWS_ACCESS_KEY_IDAKIA... .env echo AWS_SECRET_ACCESS_KEY... .env # 启动 docker compose up -d # 验证 docker compose logs -f hindsight-proxy # 应看到 Proxy started on :8000 docker compose logs -f hindsight-collector # 应看到 Collector initialized, sampling strategy: error-driven4.3 复现并捕获 401 错误构造一个“必错”请求现在模拟客户的问题他们用hindsight-proxy调用 OpenAI但持续收到401 unauthorized。我们先复现错误# 使用 curl 直接调用 proxy绕过 SDK curl -X POST http://localhost:8000/v1/chat/completions \ -H Content-Type: application/json \ -d { model: gpt-4o, messages: [{role: user, content: Hello}], temperature: 0.7 }响应{ error: { message: Incorrect API key provided: sk-svcac****. You can find your API key at https://platform.openai.com/api-keys., type: invalid_request_error, param: null, code: invalid_api_key } }此时hindsight-collector 已自动捕获该请求。我们用 CLI 查看# 获取 trace-id从响应 header 中 # X-Hindsight-Trace-ID: 7e8a2b1c-3d4f-5a6b-7c8d-9e0f1a2b3c4d hindsight trace 7e8a2b1c-3d4f-5a6b-7c8d-9e0f1a2b3c4d --redact-api-key输出关键片段{ trace_id: 7e8a2b1c-3d4f-5a6b-7c8d-9e0f1a2b3c4d, request: { method: POST, url: http://localhost:8000/v1/chat/completions, headers: { content-type: application/json, x-hindsight-trace-id: 7e8a2b1c-3d4f-5a6b-7c8d-9e0f1a2b3c4d }, body: { model: gpt-4o, messages: [{role: user, content: Hello}], temperature: 0.7 } }, response: { status_code: 401, headers: { content-type: application/json, x-hindsight-upstream-status: 401 }, body: { error: { message: Incorrect API key provided: sk-svcac****. You can find your API key at https://platform.openai.com/api-keys., type: invalid_request_error } } }, hindsight: { api_key_hash: a1b2c3d4, api_key_source: env_var, container_id: abc123def456, container_metrics: { memory_rss_mb: 1245.3, tcp_established: 12, cpu_percent: 42.7 } } }4.4 根因分析三步锁定“密钥来源”问题仅看 trace我们只知道 key 错了但不知道为什么错。hindsight 的价值在此刻体现第一步查密钥来源一致性# 查看所有用到该 hash 的 trace hindsight search --api-key-hash a1b2c3d4 --limit 10 # 输出显示 # Trace abc123: api_key_sourceenv_var, timestamp2024-06-01T10:00:00Z # Trace def456: api_key_sourceconfig_file, timestamp2024-06-01T10:05:00Z # Trace 789012: api_key_sourcehardcoded, timestamp2024-06-01T10:10:00Z发现密钥被多处使用继续深挖第二步对比 env_var 和 config_file 的实际值# 查看 env_var 来源的 trace hindsight trace abc123 --show-env-vars # 输出 # HINDSIGHT_API_KEY loaded from /app/.env # Content of /app/.env: OPENAI_API_KEYsk-svcac...# 查看 config_file 来源的 trace hindsight trace def456 --show-config-file # 输出 # Config file: /app/config/openai.yaml # Content: api_key: sk-prod-xxxxxx原来.env里是测试 key而openai.yaml里是生产 key但为什么 proxy 用了.env的 key第三步检查 proxy 的环境变量加载顺序查看hindsight-proxy的启动日志docker compose logs hindsight-proxy | grep Loading API key # 输出INFO Loading API key from environment variable HINDSIGHT_API_KEY问题定位proxy 优先读取HINDSIGHT_API_KEY环境变量而 compose 文件里设置了它覆盖了 config file 的配置。解决方案删除 compose 文件中的HINDSIGHT_API_KEY${OPENAI_API_KEY}在hindsight-proxy的 config file (./hindsight-config/proxy.yaml) 中明确指定upstream: url: https://api.openai.com/v1 api_key: ${CONFIG_FILE_API_KEY} # 从 config file 读取修改后重启docker compose down docker compose up -d再次测试401 消失返回正常 response。实操心得hindsight 不是帮你修 bug而是帮你看清 bug 的传播路径。这个案例里问题根源是配置管理混乱而非 API key 本身。没有 hindsight你会花 2 小时检查 key 是否过期、网络是否通、OpenAI 是否宕机有了 hindsight3 分钟定位到环境变量覆盖问题。5. 常见问题与排查技巧实录来自 12 个真实项目的避坑清单hindsight 的学习曲线不在安装而在理解“它到底在观测什么”。以下是我在 12 个 LLM 项目中整理的高频问题与独家排查技巧按发生频率排序5.1 Docker 网络不通不是防火墙而是 DNS 解析失败现象hindsight-proxy容器内curl https://api.openai.com超时但宿主机curl正常。根因Docker 默认 DNS 是8.8.8.8而某些企业网络会拦截外部 DNS 查询导致api.openai.com解析失败。排查命令docker exec -it hindsight-proxy sh # nslookup api.openai.com # 查看解析结果 # cat /etc/resolv.conf # 查看 DNS 配置解决方案在docker-compose.yml中强制指定 DNSservices: hindsight-proxy: dns: - 114.114.114.114 - 8.8.8.85.2 “Unexpected status 401” 但 key 正确上游服务的 rate limit 伪装现象hindsight trace显示status_code401但api_key_hash正确且hindsight-collector日志显示upstream_status429。根因某些 LLM provider如 OpenRouter在 rate limit 超限时返回401而非429且 message 写incorrect api key来规避客户端重试逻辑。识别技巧检查hindsight字段hindsight.upstream_status是真实 upstream 状态码hindsight.rate_limit_remaining字段若为0则确认是限流。应对在 proxy 的rate_limit_config.yaml中配置provider: openrouter max_requests_per_minute: 60 fallback_strategy: queue_and_retry5.3 Collector 内存暴涨不是 leak而是日志采样失控现象docker stats显示hindsight-collector内存持续增长至 4GB然后 OOM killed。根因HINDSIGHT_SAMPLING_STRATEGY设为all全量采样且HINDSIGHT_STORAGE_BACKEND是本地文件系统collector 会缓存未上传的日志直到磁盘满。紧急止损docker exec -it hindsight-collector sh # rm -rf /app/hindsight-data/* # kill -SIGUSR1 1 # 发送信号触发立即 flush长期方案永远用error-driven,latency-triggered并设置HINDSIGHT_ERROR_SAMPLING_CAP50。5.4 CLI h
返回列表