0演示场景:InsufficientStockException
Demo 应用持续打 GET /demo/checkout。当库存不足时,service-b 抛出 InsufficientStockException: inventory unavailable for skuId=…,OTLP 日志写入 Doris,并携带 trace_id / span_id。
下文所有截图均来自同一故障窗口(最近 1 小时),按值班真实顺序走三遍:
- 路径 A — 已知异常类名,全局日志页 Facet 检索
- 路径 B — 已知慢 Trace,从火焰图 Span 看日志 + 深链回全局页
- 路径 C — 一句话交给 AI,调度
log.queryLog*工具查 ERROR 日志
1路径 A:全局「日志分析」检索
菜单位置:应用性能 → 日志分析。不推 LogQL,用关键词 + Facet 即可。
操作:搜索 InsufficientStockException → 勾选 ERROR + service-b → 95 条日志,柱状图显示 ERROR 尖峰时段。
2路径 B:Trace 里看 Span 日志 + 双向深链
B1 · Trace 头:TraceID 旁直达日志分析
从链路追踪打开 GET /demo/checkout 慢 Trace(240ms)。Trace 头展示 TraceID,右侧「日志分析」一键带 traceId 跳转全局页。
B2 · Span 侧栏:火焰图 + 日志 Tab
火焰树上带 Logs 标记的 Span 可展开侧栏「日志」Tab:时间线展示 Received checkout request → Delegating inventory check to service-b 等 INFO 行;选中 service-b 的 Span 可看到 ERROR 堆栈。
B3 · 深链:「在日志分析中查看全部」
侧栏底部点击后,全局页自动预填 traceId + spanId,只显示该 Span 上下文内的 4 条日志。
3路径 C:AI 平台问日志
界面适合精查;AI 适合一句话委托。智能问数专家注册了日志工具族,可在「工具管理」看到:
log.queryLogDetail · queryLogsByTraceId · queryLogsBySpanId · queryLogTrend场景一:按服务 + 关键字搜 ERROR 日志:
getCurrentTimeRange + queryLogDetail
InsufficientStockException: inventory unavailable 摘要场景二:已知 traceId,直接问链路上的 ERROR 与根因:
queryLogsByTraceId → 13 Span 调用链 + ERROR 日志 + checkout 库存不足结论场景三:看 ERROR 日志量有没有尖峰(queryLogTrend):
queryLogTrend → 每分钟恒定 2 条 · 无尖峰 · 持续库存不足故障queryLogDetail;已知 traceId → queryLogsByTraceId;看某 Span → queryLogsBySpanId;看日志量尖峰 → queryLogTrend。
4数据从哪来 · 和 ELK 怎么分工
OTLP Logs(:4317 / :4318)→ Ingest → Doris log_dc_record → POST /log/search。Java 侧 MDC 注入 traceId 即可关联。
DataBuff 定位是 APM 语境下的日志探索,不是替代 ELK/Loki;优势在于与 Trace/Metrics/AI 同一上下文,少切三个系统。
5快速体验
一条命令部署 · Demo 自带 checkout + 库存异常
curl -fsSL https://databuff.ai/databuff/ai-apm-install.sh | bash
OpenTelemetry LogsTrace 关联AI Native