mcpField
S
sentry-setup-ai-monitoring

sentry-setup-ai-monitoring

github.com/getsentry开发2723.0k 次安装今天更新
代码仓库

关于 sentry-setup-ai-monitoring

sentry-setup-ai-monitoring 是一项为应用配置 Sentry AI 监控的技能,面向希望追踪 LLM 调用、Agent 执行、工具使用和 Token 消耗的开发者。它指导检测现有 SDK、启用追踪并处理采样与敏感内容采集设置。

主要功能

  1. 01检测已安装的 AI SDK
  2. 02配置 Sentry 追踪与集成
  3. 03监控 LLM、Agent 和工具调用
  4. 04设置采样率与对话标识
  5. 05说明提示词和输出的隐私风险

适用场景

  1. 01为应用接入 AI 调用追踪
  2. 02排查模型延迟与 Token 使用
  3. 03观察 Agent 执行和工具调用
  4. 04检查提示词采集的隐私设置

MCP 相关

该技能说明了 Sentry 对 Python `mcp` 包的自动集成支持,可将相关调用纳入 AI 监控。它本身不提供 MCP 服务或客户端。

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/getsentry/sentry-for-ai --skill sentry-setup-ai-monitoring

安装后在 Claude Code 中输入/sentry-setup-ai-monitoring确认已加载。

附带文件references/sampling.md

详细介绍

所有技能 > 功能设置 > AI 监控

设置 Sentry AI Agent 监控

配置 Sentry,以跟踪大模型调用、Agent 执行、工具使用和 Token 消耗。

在以下情况下调用此技能

  • 用户询问“监控 AI/大模型调用”或“跟踪 OpenAI/Anthropic 使用情况”
  • 用户希望实现“AI 可观测性”或“Agent 监控”
  • 用户询问 Token 使用量、模型延迟或 AI 成本

重要: 以下 SDK 版本、API 名称和代码示例仅供参考。实现前请务必查阅 docs.sentry.io 确认,因为 API 和最低版本要求可能已有变化。

前提条件

AI 监控要求启用跟踪(tracesSampleRate > 0)。

如果应用包含多轮对话,请在适当位置默认设置会话 ID,以便识别聊天会话。Sentry 使用 gen_ai.conversation.id 将相关 AI Span 归为同一对话。部分集成会自动推断此 ID,但许多配置需要显式设置。

数据捕获警告

记录提示词和输出会捕获可能包含个人身份信息(PII)的用户内容。 在 JavaScript 中,genAI 输入/输出捕获默认开启(由 dataCollection.genAI 控制);在 Python 中,通过 send_default_pii=True 启用;在 Laravel 中,通过 SENTRY_SEND_DEFAULT_PII=true 启用。在依赖此类捕获(或针对各集成的覆盖选项——JS 中的 recordInputs/recordOutputs、Python 中的 include_prompts)之前,请确认:

  • 应用的隐私政策允许捕获用户提示词和模型响应
  • 捕获的数据符合适用法规(GDPR、CCPA 等)
  • Sentry 数据保留设置适合数据的敏感程度

请询问用户是否希望启用提示词/输出捕获。未经明确确认,不要启用提示词/输出捕获。tracesSampleRate: 1.0 仅用于开发环境;在生产环境中,请使用较低的值或 tracesSampler 函数。

先检测

配置前务必检测已安装的 AI SDK:

# JavaScript
grep -E '"(openai|@anthropic-ai/sdk|ai|@langchain|@google/genai)"' package.json

# Python
grep -E '(openai|anthropic|langchain|huggingface)' requirements.txt pyproject.toml 2>/dev/null

# PHP / Laravel
grep -E '"(laravel/ai|openai-php|openai/|anthropic|llm)' composer.json 2>/dev/null
ls artisan 2>/dev/null && echo "Laravel detected"

采样检查

检测到 AI SDK 后,请检查当前采样配置:

# JavaScript
grep -E 'tracesSampleRate|tracesSampler' sentry.*.config.* instrument.* src/instrument.* app/instrument.* 2>/dev/null

# Python
grep -E 'traces_sample_rate|traces_sampler' *.py **/*.py 2>/dev/null

# PHP / Laravel
grep -E 'SENTRY_TRACES_SAMPLE_RATE|traces_sample_rate|traces_sampler' .env config/sentry.php 2>/dev/null

如果 tracesSampleRate / traces_sample_rate 低于 1.0,且未配置 tracesSampler / traces_sampler:

询问用户:

“您当前的采样率为 {rate}。Agent 运行会按完整的 Span 树进行采样——如果根 Span 被丢弃,所有子级 gen_ai Span 都会丢失。要全面了解 AI 活动,gen_ai 相关事务应以 100% 的采样率进行采样。您希望我设置一个 tracesSampler,以 100% 采样 AI 跟踪,同时按当前采样率采样其他流量吗?”

如果用户确认,请阅读 ${SKILL_ROOT}/references/sampling.md,了解实现模式。

支持的 SDK

JavaScript
包集成Sentry SDK 最低版本自动?
openaiopenAIIntegration()10.53.0是
@anthropic-ai/sdkanthropicAIIntegration()10.53.0是
ai(Vercel)vercelAIIntegration()10.53.0是*
@langchain/*langChainIntegration()10.53.0是
@langchain/langgraphlangGraphIntegration()10.53.0是
@google/genaigoogleGenAIIntegration()10.53.0是

*Vercel AI:需要 10.53.0 或更高版本。每次调用都需要设置 experimental_telemetry。

Python

安装 AI 包后,集成会自动启用——无需显式注册:

包自动?备注
openai是包含 OpenAI Agents SDK
anthropic是
langchain / langgraph是
huggingface_hub是
google-genai是
pydantic-ai是
litellm否需要显式集成
mcp(模型上下文协议)是
PHP / Laravel
PackageIntegrationMin Sentry SDKAuto?
laravel/aisentry/sentry-laravel 中的 Laravel AI 插桩4.27.0是

Laravel AI 支持要求使用 Laravel 12.x 或更高版本、sentry/sentry-laravel 4.27.0 或更高版本,并启用追踪。

JavaScript 配置

Node.js — 自动启用的集成

只需确保已启用追踪。安装 AI 包后,集成会自动启用:

Sentry.init({
  dsn: "YOUR_DSN",
  tracesSampleRate: 1.0, // Lower in production (e.g., 0.1)
  // OpenAI, Anthropic, Google GenAI, LangChain integrations auto-enable in Node.js
});

如需自定义(例如,在用户确认后启用提示词捕获——请参阅数据捕获警告):

Sentry.init({
  dsn: "YOUR_DSN",
  tracesSampleRate: 1.0,
  dataCollection: {
    // To disable sending user data and HTTP bodies, uncomment the lines below. For more info visit:
    // https://docs.sentry.io/platforms/javascript/configuration/options/#dataCollection
    // userInfo: false,
    // httpBodies: [],
  },
  integrations: [
    Sentry.openAIIntegration({
      // recordInputs/recordOutputs default to true (governed by dataCollection.genAI)
    }),
  ],
});
Cloudflare Workers(不进行运行时修补)

Workers 运行时(workerd)不支持猴子补丁,因此不适用 Node.js 风格的自动插桩。withSentry 会自动对 Workers AI(env.AI)进行插桩(v10.67.0+);openai、@anthropic-ai/sdk、@google/genai 和 ai 需要使用构建时的 Sentry Cloudflare Vite 插件(v10.68.0+,实验性),或手动包装客户端;LangChain/LangGraph 仅支持手动方式。完整设置说明请参阅 ${SKILL_ROOT}/../../references/sdks/cloudflare/ai-monitoring.md。

浏览器 / Next.js OpenAI(需要手动包装)

在浏览器端代码或 Next.js 元框架应用中,无法使用自动插桩。请手动包装客户端:

import OpenAI from "openai";
import * as Sentry from "@sentry/nextjs"; // or @sentry/react, @sentry/browser

const openai = Sentry.instrumentOpenAiClient(new OpenAI());
// Use 'openai' client as normal
LangChain / LangGraph(自动启用)
Sentry.init({
  dsn: "YOUR_DSN",
  tracesSampleRate: 1.0,
  dataCollection: {
    // To disable sending user data and HTTP bodies, uncomment the lines below. For more info visit:
    // https://docs.sentry.io/platforms/javascript/configuration/options/#dataCollection
    // userInfo: false,
    // httpBodies: [],
  },
  integrations: [
    Sentry.langChainIntegration(),
    Sentry.langGraphIntegration(),
  ],
});
Vercel AI SDK

对于 Edge 运行时,请添加到 sentry.edge.config.ts:

Sentry.init({
  dsn: "YOUR_DSN",
  tracesSampleRate: 1.0,
  dataCollection: {
    // To disable sending user data and HTTP bodies, uncomment the lines below. For more info visit:
    // https://docs.sentry.io/platforms/javascript/configuration/options/#dataCollection
    // userInfo: false,
    // httpBodies: [],
  },
  integrations: [Sentry.vercelAIIntegration()],
});

逐次调用启用遥测:

await generateText({
  model: openai("gpt-4o"),
  prompt: "Hello",
  experimental_telemetry: {
    isEnabled: true,
    recordInputs: true,
    recordOutputs: true,
  },
});

Python 配置

集成会自动启用——只需在初始化时启用追踪。仅在自定义选项时才添加显式导入:

import sentry_sdk

sentry_sdk.init(
    dsn="YOUR_DSN",
    traces_sample_rate=1.0,  # Lower in production (e.g., 0.1)
    send_default_pii=True,
    # Integrations auto-enable when the AI package is installed.
    # Only specify explicitly to customize (e.g., include_prompts):
    # integrations=[OpenAIIntegration(include_prompts=True)],
)

PHP / Laravel AI 配置

安装 sentry/sentry-laravel 和 laravel/ai 并启用追踪后,Laravel AI 插桩会自动启用。

composer require sentry/sentry-laravel "^4.27.0"
composer require laravel/ai
php artisan vendor:publish --provider="Laravel\Ai\AiServiceProvider"
php artisan migrate

在 .env 中启用追踪:

SENTRY_TRACES_SAMPLE_RATE=1.0

如需在用户明确确认后纳入大模型提示词、工具参数和响应,请启用 PII 捕获:

SENTRY_SEND_DEFAULT_PII=true

Sentry 将大模型和工具的输入/输出视为 PII,默认不予捕获。未确认上文的数据捕获警告前,请勿启用 SENTRY_SEND_DEFAULT_PII=true。

Laravel 集成会自动捕获以下 span 类型:

Span opPurpose
gen_ai.invoke_agentAgent 提示词生命周期
gen_ai.chatAI 提供商聊天请求
gen_ai.execute_toolLaravel AI 工具执行
gen_ai.embeddings嵌入生成

有关 Laravel 的详细设置、验证、对话行为和功能标志,请参阅 ${SKILL_ROOT}/../../references/sdks/php/ai-monitoring.md。

手动插桩

未检测到受支持的 SDK 时使用。请遵循规范的 Sentry gen_ai.* 属性约定——JS 文档可能尚未更新;请勿设置约定中标记为已弃用的属性。

Span 类型
opSpan name patternPurpose
gen_ai.{operation}(例如 gen_ai.chat、gen_ai.request){operation} {model}(例如 chat gpt-4o)单次大模型调用
gen_ai.invoke_agentinvoke_agent {agent_name}Agent 执行生命周期
gen_ai.execute_toolexecute_tool {tool_name}工具/函数调用
gen_ai.handoffhandoff from {source} to {target}Agent 间交接

对于大模型调用 span,op 遵循 gen_ai.{gen_ai.operation.name} 模式——已知操作类型时,请使用 gen_ai.chat、gen_ai.embeddings、gen_ai.generate_content 或 gen_ai.text_completion。Span 属性仅接受基本类型;数组/对象必须转换为 JSON 字符串。

示例(JavaScript)
const inputMessages = [
  { role: "user", parts: [{ type: "text", content: "Tell me a joke" }] },
];

await Sentry.startSpan({
  op: "gen_ai.chat",
  name: "chat gpt-4o",
  attributes: {
    "gen_ai.request.model": "gpt-4o",
    "gen_ai.operation.name": "chat",
    "gen_ai.input.messages": JSON.stringify(inputMessages),
  },
}, async (span) => {
  const result = await llmClient.complete(inputMessages);

  const outputMessages = [
    {
      role: "assistant",
      parts: [
        // Thinking/reasoning content goes in a `reasoning` part, NOT a `text` part.
        // Sentry surfaces it separately and filters it out of the Conversations view.
        { type: "reasoning", content: result.reasoning },
        { type: "text", content: result.text },
      ],
      finish_reason: result.finishReason,
    },
  ];
  span.setAttribute("gen_ai.output.messages", JSON.stringify(outputMessages));
  span.setAttribute("gen_ai.usage.input_tokens", result.inputTokens);
  span.setAttribute("gen_ai.usage.output_tokens", result.outputTokens);
  return result;
});
关键属性

通用属性(适用于所有 AI span):

属性必填描述
gen_ai.request.model是模型标识符(例如,gpt-4o、claude-sonnet-4-6)
gen_ai.operation.name否操作标签(chat、embeddings、invoke_agent、execute_tool、handoff 等)
gen_ai.agent.name否Agent 名称(设置在 Agent 和工具 span 上)

模型配置(LLM 调用 span):

属性描述
gen_ai.request.reasoning_effort推理模型的推理力度级别(例如,low、medium、high)。支持的值因提供商而异。

请求 / 响应内容(PII — 仅在确认后启用;请参阅上文的数据采集警告):

属性描述
gen_ai.input.messages输入消息的 JSON 字符串化数组。每项使用 {role, parts},其中 parts 为 [{type, content}];role 为 "user"、"assistant"、"tool" 或 "system"。常见的 parts 类型包括:"text"、"reasoning"、"tool_call"、"tool_call_response"
gen_ai.output.messages响应消息(文本 + 工具调用)的 JSON 字符串化数组,结构与输入相同

思考 / 推理消息:启用扩展思考的模型(Anthropic 的 thinking 块、Gemini 的 thought、DeepSeek 的 reasoning_content)会生成不属于用户可见回复的内部推理内容。将其表示为助手消息中的 reasoning 部分——{"type": "reasoning", "content": "..."}——并与面向用户的 text 部分并列。Sentry 会单独显示推理部分,并在面向用户的 Conversations 视图中将其过滤,因此不要将思考内容并入 text 部分。当先前的思考内容被反馈到多轮请求中时,请在 gen_ai.input.messages 的助手消息中包含相同的 reasoning 部分。通过 gen_ai.usage.output_tokens.reasoning 记录推理令牌数(它是 gen_ai.usage.output_tokens 的子集)。 | gen_ai.system_instructions | 传递给模型的系统提示词 | | gen_ai.tool.definitions | 模型可用工具列表的 JSON 字符串化形式 |

令牌用量:

属性描述
gen_ai.usage.input_tokens输入令牌总数——包括缓存令牌
gen_ai.usage.input_tokens.cached从缓存提供的输入令牌子集
gen_ai.usage.input_tokens.cache_write处理输入时写入缓存的令牌数
gen_ai.usage.output_tokens输出令牌总数——包括推理令牌
gen_ai.usage.output_tokens.reasoning用于推理的输出令牌子集
gen_ai.usage.total_tokens输入令牌数 + 输出令牌数

工具 span(gen_ai.execute_tool):

属性描述
gen_ai.tool.name工具标识符
gen_ai.tool.description供人阅读的工具描述
gen_ai.tool.call.arguments工具参数的 JSON 字符串化形式
gen_ai.tool.call.result工具结果的 JSON 字符串化形式
令牌用量与成本计算

Sentry 使用令牌属性来计算模型成本。缓存令牌和推理令牌是子集,而非单独计数——gen_ai.usage.input_tokens 已包含 gen_ai.usage.input_tokens.cached,而 gen_ai.usage.output_tokens 已包含 gen_ai.usage.output_tokens.reasoning。

Sentry 会从总数中减去缓存令牌数 / 推理令牌数,以计算未缓存 / 非推理部分。报告的缓存令牌数或推理令牌数若大于其总数,会导致仪表板中的成本为负数。

示例——输入令牌总数为 100,其中 90 个由缓存提供:

  • 正确:input_tokens = 100,input_tokens.cached = 90
  • 错误:input_tokens = 10,input_tokens.cached = 90(缓存令牌数大于总数 → 成本为负数)

gen_ai.usage.output_tokens 与 gen_ai.usage.output_tokens.reasoning 也遵循同样的规则。

验证

完成配置后,发起一次 LLM 调用并检查 Sentry Traces 仪表板。AI span 会显示 gen_ai.* 操作,其中包含模型、Token 数量和延迟信息。

对话

对话功能以易读的聊天式视图展示与 AI Agent 的过往会话。它会根据 gen_ai.conversation.id 对 span 进行分组——无论用户是在多个 trace 中交谈,还是在一个 trace 中进行了多次对话,你都可以查看每条消息、工具调用和回复的时间线。

当用户询问 AI 监控设置时,如果应用支持多轮聊天,请主动说明此要求。如果没有对话 ID,Agent 监控 span 仍然可以正常工作,但“对话”视图无法正确分组会话。

在 Sentry 中前往 Explore > Conversations 查看。

对话功能的前提条件
  • 已启用追踪,且 tracesSampleRate > 0
  • Gen AI span 流式传输默认开启——自 JS SDK 10.61.0 起,streamGenAiSpans 默认为 true;自 Python SDK 2.64.0 起,stream_gen_ai_spans 默认为 True。此设置会将 AI span 作为独立条目发送,因此输入或输出较大的 span 不会触及事务载荷大小限制并被丢弃。(如果需要在较旧的 SDK 中显式设置这些选项,可使用 JS 10.53.0 / Python 2.60.0 起的版本。)
  • 已启用输入和输出采集——对话功能通过 gen_ai.input.messages 和 gen_ai.output.messages 属性还原聊天记录。在 JS 中,默认启用此功能(通过 dataCollection);在 Python 中,设置 send_default_pii=True;在 Laravel 中,设置 SENTRY_SEND_DEFAULT_PII=true。如果未启用,对话内容将为空。
设置对话 ID

某些集成(适用于 Python 的 OpenAI Agents SDK、适用于 Node 的 OpenAI SDK,以及使用 Conversational + RemembersConversations 的 Laravel AI Agent)会自动推断对话 ID。其他情况则需要手动设置。

请使用简短、不透明的标识符——仅包含字母数字字符、连字符或下划线。切勿将 URL、电子邮件地址或其他自由格式文本用作对话 ID:Sentry 会将其用作 URL 路径段,包含斜杠的值会导致该会话的“对话”功能无法正常工作。

示例:

  • UUID:48e35936-82ab-4f1a-beaf-b2fa4273ac5e
  • 带前缀的 ID:conv_5j66UpCpwteGg4YSxUnt7lPYU、asst_abc12345、sess_987654
JavaScript
import * as Sentry from "@sentry/node"; // or @sentry/nextjs, @sentry/nestjs, etc.

// Set at the start of a conversation
Sentry.setConversationId("conv_abc123");

// All subsequent AI calls carry gen_ai.conversation.id: "conv_abc123"
await openai.chat.completions.create({
  model: "gpt-5.5",
  messages: [{ role: "user", content: "Hello" }],
});
Python
import sentry_sdk.ai

# Set at the start of a conversation
sentry_sdk.ai.set_conversation_id("conv_abc123")

# All subsequent AI calls carry gen_ai.conversation.id = "conv_abc123"

某些集成会自动推断对话 ID。例如,使用 conversation 参数时,Python OpenAI 集成会自动获取该 ID:

import openai
import sentry_sdk

sentry_sdk.init(...)

conversation = openai.conversations.create()
response = openai.responses.create(
    model="gpt-5.4",
    input=[{"role": "user", "content": "What are the 5 Ds of dodgeball?"}],
    conversation=conversation.id  # automatically sets gen_ai.conversation.id
)
用户归属信息

“对话”视图会显示 User 列。若要填充此列,请在进行任何 AI 调用之前,每个请求或会话调用一次 setUser / set_user:

JavaScript
import * as Sentry from "@sentry/node"; // or @sentry/nextjs, @sentry/nestjs, etc.

Sentry.setUser({ id: "user_123", email: "[email protected]", username: "jane" });
Python
import sentry_sdk

sentry_sdk.set_user({"id": "user_123", "email": "[email protected]", "username": "jane"})

只需提供 id、email 或 username 中的任意一项即可——“对话”视图会显示已提供的字段。

对话与 Trace

这是两个相互独立的概念:

  • 单个对话可以跨越多个 trace(例如,用户在对话中途刷新页面——产生新的 trace,但对话 ID 相同)
  • 单个 trace 可以包含来自不同对话的 span(例如,用户未刷新页面就开始了新聊天)

故障排查

问题解决方案
未显示 AI span确认 tracesSampleRate > 0,并检查 SDK 版本
缺少 Token 数量某些提供商不会为流式传输返回 Token 数量
控制面板中的费用为负数或不正确缓存 Token/推理 Token 是总量的子集——请参阅 Token 使用量和费用计算
未捕获提示词在 JS 中,genAI 捕获默认开启——请确认未设置 dataCollection: { genAI: { inputs: false } },或显式传入 recordInputs: true。在 Python 中,设置 send_default_pii=True;在 Laravel 中,设置 SENTRY_SEND_DEFAULT_PII=true。仅在需要显式覆盖 Python 配置时使用 include_prompts
Vercel AI 无法正常工作为每次调用添加 experimental_telemetry
未显示 Laravel AI span确认 sentry/sentry-laravel >=4.27.0,已安装 laravel/ai,且 SENTRY_TRACES_SAMPLE_RATE > 0
对话视图为空确认已启用 Gen AI span 流式传输(自 JS SDK 10.61.0/Python SDK 2.64.0 起默认启用)、已启用 genAI 输入/输出捕获(JS 中默认通过 dataCollection 启用;Python 中设置 send_default_pii=True;Laravel 中设置 SENTRY_SEND_DEFAULT_PII=true),并已设置对话 ID
用户列显示“Unknown”每次请求或会话调用一次 Sentry.setUser()(JS)或 sentry_sdk.set_user()(Python)

评论

支持 Markdown