内容提要
文章以Spring AI Alibaba RAG应用为例,用DataKit将应用OTLP链路、Prometheus指标和远程Milvus指标汇入观测云,并借助Toxiproxy注入网络延迟做故障与恢复对照。结果发现慢点在应用与Milvus之间的网络,而非模型或向量库本身。核心经验是:先保证Trace链路完整,再结合应用与Milvus指标交叉验证,才能准确定位RAG性能瓶颈。
延伸解读
为什么慢点容易误判为向量库问题
RAG请求变慢时,应用日志通常只给总耗时,无法区分Embedding、Milvus检索、模型生成或网络延迟。文章指出,若只看VectorStore Span变长,容易直接归咎于Milvus,但该Span包含连接建立、网络往返和服务端处理。必须结合Milvus服务端指标交叉验证,才能避免错误结论。
三层观测数据如何互补定位
文章用Trace回答“这一次请求时间花在哪”,应用Prometheus指标回答“同类操作是否普遍变慢”,Milvus指标回答“向量库内部是否同时出现压力”。三层数据汇入同一工作空间后,才能区分模型、向量库和网络。缺少任一层,都可能把网络延迟误判为服务端性能问题。
故障注入实验的设计要点
作者用Toxiproxy在应用与Milvus之间注入上下行各350ms延迟,并设置恢复组对照。实验只改变网络变量,保持Embedding和ChatModel路径不变。通过独立检索端点连续调用取中位数,减少流式模型波动干扰。这种控制变量和基线对比,是得出可靠结论的前提。
接入观测的常见配置陷阱
文章提醒注意DataKit的OTLP端口区分:4317用于gRPC,9529用于HTTP,路径需匹配。DataKit应与应用同机或确保管理端点可达。Milvus业务端口19530与指标端口9091不同,需分别验证。故障恢复后必须将MILVUS_PORT改回并重启,确认健康检查、检索响应和耗时均恢复。
Q&A
如何用DataKit把Spring AI RAG应用的链路和指标接入观测云?
在应用所在机器安装DataKit,配置应用通过OTLP将Trace发送到本机DataKit(如http://127.0.0.1:9529/otel/v1/traces),同时DataKit抓取应用Prometheus端点(如http://127.0.0.1:9167/actuator/prometheus)和远程Milvus指标端点(如http://<MILVUS_HOST>:9091/metrics),再统一上传到观测云。
Spring AI RAG应用需要添加哪些依赖和配置才能输出链路和指标?
需添加spring-boot-starter-actuator、micrometer-registry-prometheus、micrometer-tracing-bridge-otel和opentelemetry-exporter-otlp依赖。配置management端点暴露health和prometheus,设置tracing采样概率为1.0,OTLP导出端点指向DataKit,并添加metrics标签如application和environment。
为什么RAG请求的Trace链路不完整,Embedding和Milvus query会变成孤立Span?
因为项目使用流式生成,代码跨过Reactor异步边界后,观测上下文没有自动传播,导致Span产生但父Trace信息丢失。修复方法是添加spring.reactor.context-propagation: auto配置,使上下文自动传递。
如何通过Trace和指标区分RAG慢在模型、向量库还是网络?
先看Trace中ChatModel、Embedding、VectorStore query各Span耗时。若VectorStore query变长但Embedding和ChatModel未同步变慢,且Milvus服务端Proxy/QueryNode指标未升高,则慢点在应用与Milvus之间的网络;若Embedding变慢则检查模型服务网络或限流;若Milvus服务端指标升高则向量库内部压力大。
用Toxiproxy模拟网络延迟时,如何确保实验可恢复且不影响生产?
在隔离测试环境用Toxiproxy在应用和Milvus之间增加延迟(如上下行各350ms),端口只绑定本机。实验后删除toxic和容器,将应用端口改回原值(如19530)并重启,确认健康检查UP、检索返回200、耗时回落。一次只改一个变量,提前写清恢复方法,不在生产环境试。
接入观测云后,如何避免采集到用户问题、模型答案等敏感内容?
保持log-prompt、log-completion、log-query-response等配置为false,移除将增强提示词写入日志的调试代码。性能排查只需操作名称、耗时、状态和必要标签,无需上传正文内容。若确需打开,应先确认数据允许进入观测平台。
DataKit采集Milvus指标时,为什么不能直接抓取所有指标?
Milvus指标数量多,若全量采集并放开高基数标签,会导致观测成本急剧上升。应围绕排查问题做白名单,只保留相关指标如搜索、Proxy、QueryNode和资源状态指标,后续按需扩展。
Spring AI RAG应用接入观测云后,如何验证接入是否成功?
先确认观测云基础设施页面能看到主机;然后检查应用Trace是否完整串联HTTP入口、ChatClient、Embedding、Milvus query、ChatModel等Span;再确认应用Prometheus和Milvus Prometheus指标已上传,并能按source或measurement查询到数据。