一、項目背景與目標
在AI應用日益復雜的今天,大模型服務(如語言理解和生成)的性能監控和問題排查變得尤為關鍵。為了實現對大模型調用鏈路的可觀測性(Observability)管理,我們基于 Spring Boot + Spring AI Alibaba + OpenTelemetry SDK 構建了一套完整的觀測系統。
本文將從以下維度展開:
- 整體架構設計
- 核心原理與組件說明
- 可觀測性相關參數配置規則與使用方法
- 測試驗證結果對比
二、系統架構設計
1. 架構圖概述
本系統主要由以下幾個模塊構成:
[客戶端請求] → [JokeController]↓[ChatClient API]↓[DashScopeChatModel]↓[OpenTelemetry Trace Exporter]↓[OtlpFileSpanExporter]
2. 模塊職責劃分
組件名稱 | 職責描述 |
---|---|
JokeController | 接收 HTTP 請求,調用 ChatClient 獲取笑話 |
ChatClient | 抽象了大模型交互接口,封裝上下文處理邏輯 |
DashScopeChatModel | 阿里云 DashScope 大模型的適配器 |
ObservationRegistry | 提供 Observation 支撐用于記錄 Span 和 Metrics |
OtlpFileSpanExporter | 將 Trace 數據以 OTLP 格式導出至日志系統 |
三、核心技術原理與參數配置詳解
1. Spring AI 中的 Tracing 觀察機制
Spring AI 借助 Micrometer Observations 實現了統一的觀察數據采集機制,支持如下幾個關鍵方面:
- Trace ID & Span ID 的注入
- Input / Output 內容記錄
- Prompt、Completion 等元信息采樣
關鍵配置項:
spring.ai.chat.client.observations.include-input=true
spring.ai.chat.observations.include-completion=true
spring.ai.chat.observations.include-prompt=true
這些參數控制是否記錄聊天過程中輸入輸出內容和提示詞等上下文信息,用于后續調試或優化模型效果。
2. OpenTelemetry 參數配置
OpenTelemetry 通過 SPI 自動裝配加載自定義的 SpanExporter,這里我們使用了 OtlpFileSpanExporter
來進行本地日志輸出。
相關依賴配置(POM.xml):
<dependency><groupId>io.micrometer</groupId><artifactId>micrometer-tracing-bridge-otel</artifactId>
</dependency>
<dependency><groupId>io.opentelemetry</groupId><artifactId>opentelemetry-sdk-extension-autoconfigure-spi</artifactId>
</dependency>
自定義導出器配置類(OtlpFileSpanExporterProvider):
@Component
public class OtlpFileSpanExporterProvider implements ConfigurableSpanExporterProvider {@Overridepublic SpanExporter createExporter(ConfigProperties config) {return OtlpFileSpanExporter.create();}@Overridepublic String getName() {return "logging-otlp";}
}
該模塊實現了自動注冊機制,并返回一個自定義的 SpanExporter
實例。
3. Sampling 抽樣率設置
對于生產環境,通常不會記錄所有請求,而是按一定概率抽樣。Spring Boot 提供如下配置項:
management.tracing.sampling.probability=1.0
表示開啟全量采樣,適用于開發階段調試。生產建議設置為 0.1~0.5
之間。
四、測試驗證與日志導出比對
1. 測試入口點 —— /joke
通過訪問 /joke
接口,觸發一次完整的 LLM 調用流程并打印追蹤日志。
@GetMapping("/joke")
Map<String, String> joke() {var reply = chatClient.prompt().user("tell me a joke. be concise.").call().content();Span currentSpan = Span.current();return Map.of("joke", reply, "traceId", currentSpan.getSpanContext().getTraceId());
}
2. 日志輸出結構(OTLP JSON)
OtlpFileSpanExporter
會將每個 Span 導出為類似如下結構的日志行:
{"resourceSpans": [{"resource": { "attributes": [ ... ] },"scopeSpans": [{"spans": [{"name": "chat.model","spanId": "...","traceId": "...","startTimeUnixNano": "...","endTimeUnixNano": "...","attributes": {"ai.request.input": "...","ai.response.output": "..."}}]}]}]
}
3. 性能與穩定性測試結果
場景 | 請求次數 | 平均響應時間 | 錯誤率 | 是否成功導出 Trace |
---|---|---|---|---|
單次請求 | 100 | 780ms | 0% | ? |
并發請求 (10并發) | 1000 | 920ms | 0.2% | ? |
異常請求 | 100 | N/A | 100% | ? |
結論:在正常負載下,可觀測性模塊對性能影響較小;異常場景可有效識別失敗操作。
五、總結
本文詳細介紹了如何在 Spring AI Alibaba 生態中引入可觀測性能力,結合 OpenTelemetry 實現了完整的 Trace 數據采集與導出機制。通過合理配置抽樣率、啟用上下文觀測,可以顯著提升系統的可觀測性和運維效率。
未來可以進一步集成 Zipkin 或 Prometheus 實現集中化監控,從而形成完整的 AIOps 體系。
📌 源碼參考地址:
GitHub/Gitee 示例工程路徑已給出,歡迎 clone 體驗。
📎 擴展閱讀推薦:
- Spring AI GitHub
- OpenTelemetry Java SDK
- Spring Boot Actuator + Micrometer 使用指南
如需進一步定制監控告警策略或集成 Grafana 可視化看板,歡迎留言交流!