一、项目背景与目标
在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 {
@Override
public SpanExporter createExporter(ConfigProperties config) {
return OtlpFileSpanExporter.create();
}
@Override
public 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 体验。
📎 扩展阅读推荐:
如需进一步定制监控告警策略或集成 Grafana 可视化看板,欢迎留言交流!