SpringAi_9_可观测性
前言
Github:https://github.com/HealerJean
一、核心概念
1、什么是 Spring AI 可观测性
可观测性 = AI 系统的 “监控雷达”:让 AI 调用(聊天、嵌入、向量库、工具)全透明:耗时多少、用了多少 token、成功失败、调用了什么、在哪卡住。
1)监控干什么
-
指标(Metrics):QPS、延迟、token 用量、调用次数
-
链路追踪(Tracing):一次请求完整调用链(Chat → Embedding → VectorStore)
-
日志(Logging):提示词、响应、报错信息
2)核心指标
-
调用耗时
-
token 用量(input/output/total)
-
并发数
-
成功 / 失败率
-
向量库增删改查耗时
2、低基数 vs 高基数键
-
低基数 (
LowCardinality):值是有限的、可枚举的。- 可用于监控图表 (
Metrics) - 内容简单、数量少(如:模型名称、操作类型)
- 可用于监控图表 (
-
高基数 (
HighCardinality):值是无限的、唯一的。- 只用于追踪(
Trace) - 内容长、数量多(如:提示词、响应文本、文档内容)
- 默认关闭,避免性能 / 泄露问题
- 只用于追踪(
3、 观测点
ChatClient:应用层调用(包含 Advisor 增强逻辑)。ChatModel:实际与大模型厂商(OpenAI, Azure 等)的交互。EmbeddingModel/ImageModel:向量和图像模型的调用。VectorStore:
| 组件 | 说明 |
|---|---|
ChatClient |
聊天客户端:应用层调用(包含 Advisor 增强逻辑)。 |
ChatModel |
大模型调用:实际与大模型厂商(OpenAI, Azure 等)的交互。 |
EmbeddingModel |
嵌入模型 |
ImageModel |
图像模型 |
VectorStore |
向量数据库的操作,测量 add、query、remove 操作的耗时。 |
4、配置建议
- 开发 / 测试环境:全部
log-prompt / log-completion开启,便于调试。 - 生产环境:关闭提示 / 回复记录,避免敏感信息泄露与性能损耗。
- 必开项:
include-error-logging与 token 指标,用于成本核算与问题定位。 - 向量库:仅在调试时开启
log-query-response,生产关闭。 - 暴露端点:生产建议只暴露
health,info,metrics,不要*。
二、指标大全
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
1、聊天客户端指标
当调用
ChatClient的call()或stream()操作时,会记录spring.ai.chat.client观测。它们测量执行调用所花费的时间并传播相关的跟踪信息。
1)低基数键
| 名称 | 描述 |
|---|---|
gen_ai.operation.name |
始终为 framework。 |
gen_ai.system |
始终为 spring_ai。 |
spring.ai.chat.client.stream |
聊天模型响应是否为流 - true 或 false |
spring.ai.kind |
Spring AI 中框架 API 的类型:chat_client。 |
2)高基数键
| 名称 | 描述 |
|---|---|
| gen_ai.prompt | 通过聊天客户端发送的提示内容。可选。 |
| spring.ai.chat.client.advisors | 已配置的聊天客户端顾问列表。 |
| spring.ai.chat.client.conversation.id | 使用聊天记忆时的会话 ID。 |
| spring.ai.chat.client.tool.names | 传递给聊天客户端的工具名称。 |
3)配置项
| 配置项 | 说明 | 默认 | 配置建议 |
|---|---|---|---|
| spring.ai.chat.client.observations.log-prompt | 记录提示 | false | 开发开启,生产关闭 |
| spring.ai.chat.client.observations.log-completion | 记录回复 | false | 开发开启,生产关闭 |
spring:
ai:
chat:
client:
observations:
log-prompt: true
log-completion: true
2、 聊天客户端顾问 Advisor
当执行顾问时,会记录
spring.ai.advisor观测。它们测量在顾问中花费的时间(包括在内部顾问中花费的时间)并传播相关的跟踪信息。
1)低基数键
| 名称 | 描述 |
|---|---|
| gen_ai.operation.name | 始终为 framework。 |
| gen_ai.system | 始终为 spring_ai。 |
| spring.ai.kind | Spring AI 中框架 API 的类型:advisor。 |
2)高基数键
| 名称 | 描述 |
|---|---|
| spring.ai.advisor.name | 顾问名称 |
| spring.ai.advisor.order | 顾问链中的顾问顺序。 |
3、聊天模型
当调用
ChatModel的call或stream方法时,会记录gen_ai.client.operation观测。它们测量方法完成所花费的时间并传播相关的跟踪信息。
1)低基数键
| 名称 | 描述 |
|---|---|
gen_ai.operation.name |
正在执行的操作名称。 |
gen_ai.system |
由客户端仪器标识的模型提供商。 |
gen_ai.request.model |
请求所针对的模型名称。 |
gen_ai.response.model |
生成响应的模型名称。 |
2)高基数键
| 名称 | 描述 |
|---|---|
gen_ai.request.frequency_penalty |
模型请求的频率惩罚设置。 |
gen_ai.request.max_tokens |
模型为请求生成的最大令牌数量。 |
gen_ai.request.presence_penalty |
模型请求的存在惩罚设置。 |
gen_ai.request.stop_sequences |
模型将用于停止生成更多令牌的序列列表。 |
gen_ai.request.temperature |
模型请求的温度设置。 |
gen_ai.request.top_k |
模型请求的 top_k 采样设置。 |
gen_ai.request.top_p |
模型请求的 top_p 采样设置。 |
gen_ai.response.finish_reasons |
模型停止生成令牌的原因,对应于收到的每个生成。 |
gen_ai.response.id |
AI 响应的唯一标识符。 |
gen_ai.usage.input_tokens |
模型输入(提示)中使用的令牌数量。 |
gen_ai.usage.output_tokens |
模型输出(完成)中使用的令牌数量。 |
gen_ai.usage.total_tokens |
模型交换中使用的总令牌数量。 |
gen_ai.prompt |
发送给模型的完整提示。可选。 |
gen_ai.completion |
从模型接收到的完整响应。可选。 |
spring.ai.model.request.tool.names |
请求中提供给模型的工具定义列表。 |
4)聊天提示和完成数据
聊天提示和完成数据通常很大,可能包含敏感信息。因此,默认情况下不导出。
Spring AI 支持记录聊天提示和完成数据,这对于故障排除场景很有用。当跟踪可用时,日志将包含跟踪信息,以便更好地进行关联。
| 参数 | 描述 | 默认值 | 建议 |
|---|---|---|---|
spring.ai.chat.observations.log-prompt |
记录提示内容。true 或 false |
false |
调试开,生产关 |
spring.ai.chat.observations.log-completion |
记录完成内容。true 或 false |
false |
调试开,生产关 |
spring.ai.chat.observations.include-error-logging |
在观测中包含错误日志记录。true 或 false |
false |
建议开启 |
spring:
ai:
chat:
observations:
log-prompt: true
log-completion: true
include-error-logging: true
4、工具调用
当在聊天模型交互的上下文中执行工具调用时,会记录
spring.ai.tool观测。它们测量完成工具调用所花费的时间并传播相关的跟踪信息。
1)低基数键
| 名称 | 描述 |
|---|---|
gen_ai.operation.name |
正在执行的操作名称。始终为 framework。 |
gen_ai.system |
负责该操作的提供商。始终为 spring_ai。 |
spring.ai.kind |
Spring AI 执行的操作类型。始终为 tool_call。 |
spring.ai.tool.definition.name |
工具的名称。 |
2)高基数键
| 名称 | 描述 |
|---|---|
spring.ai.tool.definition.description |
工具的描述。 |
spring.ai.tool.definition.schema |
用于调用工具的参数模式。 |
spring.ai.tool.call.arguments |
工具调用的输入参数。(仅在启用时) |
spring.ai.tool.call.result |
用于调用工具的参数模式。(仅在启用时) |
3)工具调用参数和结果数据
工具调用的输入参数和结果默认情况下不导出,因为它们可能包含敏感信息。
Spring AI 支持将工具调用参数和结果数据导出为 span 属性。
| 配置项 | 说明 | 默认 | 建议 |
|---|---|---|---|
| spring.ai.tools.observations.include-content | 记录参数 / 结果 | false | 调试开启 |
spring:
ai:
tools:
observations:
include-content: true
4、嵌入模型
当调用嵌入模型方法时,会记录
gen_ai.client.operation观测。它们测量方法完成所花费的时间并传播相关的跟踪信息。
1)低基数键
| 名称 | 描述 |
|---|---|
gen_ai.operation.name |
正在执行的操作名称。 |
gen_ai.system |
由客户端仪器标识的模型提供商。 |
gen_ai.request.model |
请求所针对的模型名称。 |
gen_ai.response.model |
生成响应的模型名称。 |
2)高基数键
| 名称 | 描述 |
|---|---|
gen_ai.request.embedding.dimensions |
结果输出嵌入的维度数量。 |
gen_ai.usage.input_tokens |
模型输入中使用的令牌数量。 |
gen_ai.usage.total_tokens |
模型交换中使用的总令牌数量。 |
5、图像模型
当调用图像模型方法时,会记录
gen_ai.client.operation观测。它们测量方法完成所花费的时间并传播相关的跟踪信息。
1)低基数键
| 名称 | 描述 |
|---|---|
gen_ai.operation.name |
正在执行的操作名称。 |
gen_ai.system |
由客户端仪器标识的模型提供商。 |
gen_ai.request.model |
请求所针对的模型名称。 |
gen_ai.response.model |
生成响应的模型名称。 |
2)高基数键
| 名称 | 描述 |
|---|---|
gen_ai.request.frequency_penalty |
模型请求的频率惩罚设置。 |
gen_ai.request.max_tokens |
模型为请求生成的最大令牌数量。 |
gen_ai.request.presence_penalty |
模型请求的存在惩罚设置。 |
gen_ai.request.stop_sequences |
模型将用于停止生成更多令牌的序列列表。 |
gen_ai.request.temperature |
模型请求的温度设置。 |
gen_ai.request.top_k |
模型请求的 top_k 采样设置。 |
gen_ai.request.top_p |
模型请求的 top_p 采样设置。 |
gen_ai.response.finish_reasons |
模型停止生成令牌的原因,对应于收到的每个生成。 |
gen_ai.response.id |
AI 响应的唯一标识符。 |
gen_ai.usage.input_tokens |
模型输入(提示)中使用的令牌数量。 |
gen_ai.usage.output_tokens |
模型输出(完成)中使用的令牌数量。 |
gen_ai.usage.total_tokens |
模型交换中使用的总令牌数量。 |
gen_ai.prompt |
发送给模型的完整提示。可选。 |
gen_ai.completion |
从模型接收到的完整响应。可选。 |
spring.ai.model.request.tool.names |
请求中提供给模型的工具定义列表。 |
3)图像提示数据
图像提示数据通常很大,可能包含敏感信息。因此,默认情况下不导出。
Spring AI支持记录图像提示数据,这对于故障排除场景很有用。当跟踪可用时,日志将包含跟踪信息,以便更好地进行关联。
| 配置项 | 说明 | 默认 | 建议 |
|---|---|---|---|
| spring.ai.image.observations.log-prompt | 记录绘图提示 | false | 调试开启 |
spring:
ai:
image:
observations:
log-prompt: true
6、 向量存储
Spring AI 中的所有向量存储实现都经过检测,通过 Micrometer 提供指标和分布式跟踪数据。
当与向量存储交互时,会记录
db.vector.client.operation观测。它们测量在query、add和remove操作中花费的时间并传播相关的跟踪信息。
1)低基数键
| 名称 | 描述 |
|---|---|
db.operation.name |
正在执行的操作或命令的名称。可以是 add、delete 或 query 之一。 |
db.system |
由客户端仪器识别的数据库管理系统 (DBMS) 产品。可以是 pg_vector、azure、cassandra、chroma、elasticsearch、milvus、neo4j、opensearch、qdrant、redis、typesense、weaviate、pinecone、oracle、mongodb、gemfire、hana、simple 之一。 |
spring.ai.kind |
Spring AI 中框架 API 的类型:vector_store。 |
2)高基数键
db.collection.name |
数据库中集合(表、容器)的名称。 |
|---|---|
db.namespace |
数据库的名称,在服务器地址和端口内完全限定。 |
db.record.id |
如果存在,记录标识符。 |
db.search.similarity_metric |
相似性搜索中使用的指标。 |
db.vector.dimension_count |
向量的维度。 |
db.vector.field_name |
向量的名称字段(例如,字段名称)。 |
db.vector.query.content |
正在执行的搜索查询内容。 |
db.vector.query.filter |
搜索查询中使用的元数据过滤器。 |
db.vector.query.response.documents |
相似性搜索查询返回的文档。可选。 |
db.vector.query.similarity_threshold |
接受所有搜索分数的相似性阈值。阈值为 0.0 表示接受任何相似性或禁用相似性阈值过滤。阈值为 1.0 表示需要精确匹配。 |
db.vector.query.top_k |
查询返回的 top-k 最相似向量。 |
3)响应数据
向量搜索响应数据通常很大,可能包含敏感信息。因此,默认情况下不导出。
Spring AI 支持记录向量搜索响应数据,这对于故障排除场景很有用。当跟踪可用时,日志将包含跟踪信息,以便更好地进行关联。
| 配置项 | 说明 | 默认 | 建议 |
|---|---|---|---|
| spring.ai.vectorstore.observations.log-query-response | 记录返回文档 | false | 调试开启,生产关闭 |
spring:
ai:
vectorstore:
observations:
log-query-response: true
三、实战案例
1、基础聊天观测 (ChatClient & ChatModel)
/**
* 场景1:基础聊天观测 (ChatClient & ChatModel)
* 演示如何获取 OpenAI 调用的详细指标
*/
@GetMapping("/chat")
public ChatResponse chat(@RequestParam String message) {
// 1. 调用 ChatClient
// 根据配置,如果 log-prompt=true,这里会记录 Prompt
ChatResponse response = chatClient.prompt()
.user(message)
.call()
.chatResponse();
return response;
}
{
"metadata": {
"empty": false,
"id": "",
"model": "qwen3:14b",
"promptMetadata": [],
"rateLimit": {
"requestsLimit": 0,
"requestsRemaining": 0,
"requestsReset": "PT0S",
"tokensLimit": 0,
"tokensRemaining": 0,
"tokensReset": "PT0S"
},
"usage": {
"promptTokens": 17,
"completionTokens": 1000,
"totalTokens": 1017
}
},
"result": {
"metadata": {
"contentFilters": [],
"empty": false,
"finishReason": "length"
},
"output": {
"media": [],
"messageType": "ASSISTANT",
"metadata": {
"messageType": "ASSISTANT"
},
"text": "SpringAI 的可观测性**可能涉及以下核心价值和用途:\n\n---\n\n### **1. 监控 AI 模型的运行状态**\n在 Spring 应用中集成 AI 模型(如机器学习、大语言模型)时,",
"toolCalls": []
}
},
"results": [
{
"metadata": {
"contentFilters": [],
"empty": false,
"finishReason": "length"
},
"output": {
"media": [],
"messageType": "ASSISTANT",
"metadata": {
"messageType": "ASSISTANT"
},
"text": "SpringAI 是一个假设的概念(目前 Spring 官方并未推出名为 \"SpringAI\" 的项目),但如果我们从“Spring 生态”与“AI 可观测性”的结合角度来探讨,t ",
"toolCalls": []
}
}
]
}


