Microsoft OpenTelemetry 发行版是一种统一的可观测性发行版,提供整合代理和非代理应用程序的跟踪、指标和日志的单一集成体验。 它支持 Microsoft Agent 365、Microsoft Foundry、Azure Monitor 和任何与 OpenTelemetry 协议(OTLP)兼容的后端的可观测性。 发行版支持.NET、Node.js和Python,并将多个可观测性堆栈中的碎片设置替换为一个导入和一个配置调用。
主要优势
Microsoft OpenTelemetry 发行版提供以下优势:
- 一个包,一个 API:将多个导出程序包和检测包替换为单个依赖项。
- 多后端支持:将遥测数据发送到 Azure Monitor、任何与 OpenTelemetry 协议(OTLP)兼容的终结点(如 Datadog、Grafana 或 New Relic)以及 Microsoft 代理 365。
- 内置检测:对 HTTP、数据库、Azure SDK、Azure Functions等使用自动检测,无需额外配置。
- 基于标准的:基于 OpenTelemetry 构建的行业标准可观测性框架。
- 最小样本:向应用程序入口点添加一个导入和一个函数调用。
安装和配置
本指南介绍如何使用 Microsoft OpenTelemetry 发行版向应用程序添加可观测性。 Distro 会自动收集包含内置检测的跟踪、指标和日志,并将遥测导出到 Azure Monitor、任何 OpenTelemetry 协议 (OTLP) 终结点或 Microsoft Agent 365。
安装库
若要开始使用 Microsoft OpenTelemetry 发行版,请使用语言的包管理器为开发平台安装相应的库。
Configuration
代理 365 导出程序无需使用连接字符串。 它根据租户自动发现其终结点。 若要启用导出到代理 365,请设置导出程序目标,并提供一个令牌解析程序,用于返回给定代理 ID 和租户 ID 的访问令牌。
调用 use_microsoft_opentelemetry() 以启用可观测性。
from microsoft.opentelemetry import use_microsoft_opentelemetry
from microsoft.opentelemetry.a365.hosting.token_cache_helpers import AgenticTokenCache
token_cache = AgenticTokenCache()
use_microsoft_opentelemetry(
enable_a365=True,
a365_token_resolver=lambda agent_id, tenant_id: (
(t := asyncio.run(token_cache.get_observability_token(agent_id, tenant_id)))
and t.token or None
),
)
有关自定义令牌解析(而不是默认 令牌解析程序),请参阅手动令牌解析程序。
可以通过将可选 a365_* kwargs 传递给 use_microsoft_opentelemetry() 自定义导出程序行为。
| 参数 | 说明 | 默认 |
|---|---|---|
a365_use_s2s_endpoint |
当使用True时,调用服务到服务的终结点路径。 |
False |
a365_max_queue_size |
批处理处理器的最大队列大小。 | 2048 |
a365_scheduled_delay_ms |
导出批处理之间的延迟(以毫秒为单位)。 | 5000 |
a365_exporter_timeout_ms |
导出操作的超时(以毫秒为单位)。 | 30000 |
a365_max_export_batch_size |
导出操作的最大批大小。 | 512 |
传播上下文
为了在分布式 Agent 365 操作中保持可观测性,请传递上下文。 通过代理和服务传播上下文时,可确保跟踪、日志和指标在整个请求生命周期中正确关联。 若要获得完整而有效的 Microsoft 365 监控体验,则需要此关联。
行李属性
使用 BaggageBuilder 设置在请求中贯穿所有范围的上下文信息。
该 SDK 实现了 SpanProcessor,可将所有非空行李条目复制到新启动的跨度中,且不会覆盖现有属性。
from microsoft.opentelemetry.a365.core import BaggageBuilder
with (
BaggageBuilder()
.tenant_id("tenant-123")
.agent_id("agent-456")
.conversation_id("conv-789")
.build()
):
# Any spans started in this context will receive these as attributes
pass
要从 TurnContext 自动填充 BaggageBuilder,请在 microsoft-opentelemetry 包中使用 populate 辅助程序。 此帮助程序会自动从活动中提取调用方、代理、租户、通道和聊天详细信息。
from microsoft.opentelemetry.a365.core import BaggageBuilder
from microsoft.opentelemetry.a365.hosting.scope_helpers.populate_baggage import populate
builder = BaggageBuilder()
populate(builder, turn_context)
with builder.build():
# Baggage is auto-populated from the TurnContext activity
pass
行李中间件
如果代理使用托管集成包,请注册行李中间件,以便为每个传入请求自动填充行李。 此步骤无需在每个活动处理程序中手动调用 BaggageBuilder 。
在 Python 中,通过 ObservabilityHostingManager.configure() 而不是直接在适配器上注册行李中间件。
from microsoft.opentelemetry.a365.hosting import ObservabilityHostingManager, ObservabilityHostingOptions
options = ObservabilityHostingOptions(enable_baggage=True)
ObservabilityHostingManager.configure(adapter.middleware_set, options)
中间件会跳过异步回复(ContinueConversation 事件)的行李配置,以避免覆盖源请求已设置的行李。
验证数据是否在产品中流动
若要查看Microsoft Purview或Microsoft Defender中的代理遥测数据,请确保满足以下要求:
- Microsoft Purview:必须为组织开启审核。 有关说明,请参阅 打开或关闭审核。
-
Microsoft Defender:必须配置高级搜寻功能才能访问
CloudAppEvents表。 有关详细信息,请参阅 高级搜寻架构中的 CloudAppEvents 表。
自动化仪器
Microsoft OpenTelemetry Distro 将标准 OpenTelemetry 管道与 Microsoft 精选的检测组合。 发行版可以根据语言和配置收集应用程序遥测数据、基础设施遥测数据以及代理或生成 AI 的遥测数据。
| Category | 它涵盖的内容 |
|---|---|
| 信号管道 | 跟踪、指标和日志。 |
| 资源检测 | 支持的服务、主机、云和Azure运行环境上下文。 |
| 基础结构检测 | 支持 HTTP、ASP.NET Core、Azure SDK、数据库客户端和日志记录框架。 |
| 生成式 AI 工具 | OpenAI、Azure OpenAI、语义内核、LangChain、OpenAI Agents SDK,以及在支持的情况下的代理框架。 |
| 手动代理范围 | 支持的代理调用、工具执行、推理和遥测输出。 |
| 出口商和加工商 | Azure Monitor、Microsoft Agent 365、OTLP、控制台输出、跨度处理器、日志处理器和指标读取器。 |
检测覆盖范围
| 语言 | 常见应用程序检测 | 通用代理和生成 AI 工具 |
|---|---|---|
| Python | OpenTelemetry 资源、处理器、读取器、日志记录、指标和跟踪。 | 语义内核、OpenAI 智能体 SDK、Agent Framework、LangChain、Microsoft Agent 365 负载和 Microsoft Agent 365 范围。 |
| Node.js | HTTP、Azure SDK、Azure Functions、MongoDB、MySQL、PostgreSQL、Redis、Bunyan 和 Winston。 | OpenAI 智能体 SDK、LangChain、Microsoft Agent 365 负载和 Microsoft Agent 365 范围。 |
| .NET | ASP.NET Core、HttpClient、SQL 客户端、Azure SDK、资源检测、指标和日志。 | 语义内核、OpenAI 和 Azure OpenAI、Agent Framework、Microsoft Agent 365 负载和 Microsoft Agent 365 范围。 |
自动化检测工具监听由受支持的库和框架发出的遥测信号。 当应用程序需要描述特定于代理的操作(例如调用、工具执行、推理或异步输出)时,将使用手动检测。
当您的应用程序发出不在内置仪器涵盖范围内的遥测数据时,请添加自定义的 OpenTelemetry 源、计量器、处理器或读取器。
Important
自动检测仅填充标准的 OpenTelemetry 属性。 它不包括 Agent 365 需要的所有属性。 必须通过 BaggageBuilder 添加特定于Microsoft的属性。 若要查看哪些属性是必需的,请参阅 应用商店验证属性。
内置检测库
自动检测监听由支持的框架发出的遥测,并通过 Distro 的 OpenTelemetry 管道转发数据。 对于智能体场景,在检测的框架创建跨度之前设置负载,如租户 ID 和智能体 ID。
| Framework | Python | Node.js | .NET |
|---|---|---|---|
| 语义内核 | 支持 | 不支持 | 支持 |
| OpenAI 和 OpenAI 代理 SDK | 支持 | 支持 | 支持 |
| 代理框架 | 支持 | 不支持 | 支持 |
| LangChain | 支持 | 支持 | 未列出 |
语义内核
from microsoft.opentelemetry import use_microsoft_opentelemetry
def token_resolver(agent_id, tenant_id):
return "your-token"
use_microsoft_opentelemetry(
enable_a365=True,
a365_token_resolver=token_resolver,
instrumentation_options={
"semantic_kernel": {"enabled": True},
},
)
OpenAI
from microsoft.opentelemetry import use_microsoft_opentelemetry
def token_resolver(agent_id, tenant_id):
return "your-token"
use_microsoft_opentelemetry(
enable_a365=True,
a365_token_resolver=token_resolver,
instrumentation_options={
"openai_agents": {"enabled": True},
},
)
代理框架
from microsoft.opentelemetry import use_microsoft_opentelemetry
def token_resolver(agent_id, tenant_id):
return "your-token"
use_microsoft_opentelemetry(
enable_a365=True,
a365_token_resolver=token_resolver,
instrumentation_options={
"agent_framework": {"enabled": True},
},
)
LangChain
from microsoft.opentelemetry import use_microsoft_opentelemetry
def token_resolver(agent_id, tenant_id):
return "your-token"
use_microsoft_opentelemetry(
enable_a365=True,
a365_token_resolver=token_resolver,
instrumentation_options={
"langchain": {"enabled": True},
},
)
手动仪器
当自动监测无法详尽描述代理操作时,请使用手动监测。 通过手动范围,应用程序可以跨语言以一致的方式描述常见代理活动。
| Scope | 用于 |
|---|---|
InvokeAgentScope |
代理调用的开始和完成。 |
ExecuteToolScope |
智能体发出的工具调用。 |
InferenceScope |
AI 模型推理操作。 |
OutputScope |
必须在原始范围完成后记录的输出。 |
在请求中跨范围重复使用相同的请求和代理标识值,以便相关遥测可以关联。
代理调用
from microsoft.opentelemetry.a365.core import (
AgentDetails,
Channel,
InvokeAgentScope,
InvokeAgentScopeDetails,
Request,
ServiceEndpoint,
)
agent_details = AgentDetails(
agent_id="agent-456",
agent_name="Email Assistant",
agent_description="An AI agent powered by Azure OpenAI",
agentic_user_id="auid-123",
agentic_user_email="[email protected]",
agent_blueprint_id="blueprint-789",
tenant_id="tenant-123",
)
request = Request(
content="Please help me organize my emails",
session_id="session-42",
conversation_id="conv-xyz",
channel=Channel(name="msteams"),
)
scope_details = InvokeAgentScopeDetails(
endpoint=ServiceEndpoint(hostname="myagent.contoso.com", port=443),
)
with InvokeAgentScope.start(
request=request,
scope_details=scope_details,
agent_details=agent_details,
) as scope:
scope.record_input_messages(["Please help me organize my emails"])
# Run the agent invocation.
invoke_scope.record_output_messages(["I found 15 urgent emails."])
工具执行
from microsoft.opentelemetry.a365.core import (
ExecuteToolScope,
ServiceEndpoint,
ToolCallDetails,
ToolType,
)
tool_details = ToolCallDetails(
tool_name="email-search",
arguments={"query": "from:[email protected]"},
tool_call_id="tool-call-456",
description="Search emails by criteria",
tool_type=ToolType.FUNCTION.value,
endpoint=ServiceEndpoint(
hostname="tools.contoso.com",
port=8080,
protocol="https",
),
)
with ExecuteToolScope.start(
request=request,
details=tool_details,
agent_details=agent_details,
) as scope:
result = search_emails(tool_details.arguments)
scope.record_response(result)
推断
from microsoft.opentelemetry.a365.core import (
InferenceCallDetails,
InferenceOperationType,
InferenceScope,
)
inference_details = InferenceCallDetails(
operationName=InferenceOperationType.CHAT,
model="gpt-4o-mini",
providerName="azure-openai",
)
with InferenceScope.start(
request=request,
details=inference_details,
agent_details=agent_details,
) as scope:
scope.record_input_messages(["Summarize the following emails for me."])
response = call_llm()
scope.record_output_messages([response.text])
scope.record_input_tokens(response.usage.input_tokens)
scope.record_output_tokens(response.usage.output_tokens)
scope.record_finish_reasons(["stop"])
输出
from microsoft.opentelemetry.a365.core import OutputScope, Response, SpanDetails
# Capture this before exiting the originating InvokeAgentScope context.
parent_context = invoke_scope.get_span_context()
response = Response(
messages=["Here is your organized inbox."],
)
with OutputScope.start(
request=request,
response=response,
agent_details=agent_details,
user_details=None,
span_details=SpanDetails(parent_context=parent_context),
) as scope:
pass
产品文档应定义这些范围内任何特定于产品的验证要求。
本地验证
本地验证确认应用程序在验证产品特定的目标之前生成遥测数据。 使用控制台输出或本地 OTLP 终结点检查是否已创建跟踪、指标和日志。
使用本地 OTLP 终结点进行验证
配置发行版以将遥测数据发送到本地收集器或其他 OTLP 兼容的终结点。
export OTEL_EXPORTER_OTLP_ENDPOINT=http://localhost:4317
from microsoft.opentelemetry import use_microsoft_opentelemetry
use_microsoft_opentelemetry()
使用本地输出进行验证
如果要在将遥测数据发送到远程目标之前确认检测,请使用本地输出。
export ENABLE_A365_OBSERVABILITY_EXPORTER=false
from microsoft.opentelemetry import use_microsoft_opentelemetry
def token_resolver(agent_id, tenant_id):
return "local-validation-token"
use_microsoft_opentelemetry(
enable_a365=True,
a365_token_resolver=token_resolver,
)
# Run instrumented application code.
查看本地输出,了解来自预期源的范围,例如 HTTP 请求、OpenAI 或 Azure OpenAI 调用、代理调用范围、工具执行范围或推理范围。 特定目的地的验证应包含在该目的地的产品文档中。
手动设置身份验证
使用代理 365 导出程序时,必须提供一种提供身份验证令牌的机制。 令牌解析器使用活动负载上下文中的智能体 ID 和租户 ID 按导出批次工作。 发行版支持两种方法。
Tip
如果你正在使用 Microsoft 365 智能体 SDK 构建代理,请参阅 Agent SDK 的可观测性身份验证设置,了解如何为智能体代理和非智能体代理配置 OBO 和 S2S 令牌获取的分步说明。
手动的令牌解析器
当您在 Agent Framework 管道之外获取令牌、构建非 Agent Framework 应用,或使用服务间(S2S)身份验证(客户端凭据流)时,请使用手动解析器。 代理可以自行生成令牌,例如,使用 Microsoft 身份验证库 (MSAL) 或任何其他令牌获取方法,但需要确保令牌具有正确的可观测性范围(api://9b975845-388f-4429-889e-eab1ef63949c/Agent365.Observability.OtelWrite)。
注释
对于服务间(S2S)身份验证,必须使用这种手动令牌解析器方法。 智能体令牌缓存仅支持代理 (OBO) 身份验证流。
以下示例展示了 OBO(代表)令牌解析器模式 — 智能体通过智能体身份验证处理程序获取用户令牌,并将其兑换为可观测性范围内的令牌。 有关 S2S(服务到服务) 示例和 OBO 与 S2S 身份验证的比较,请参阅 代理 SDK 的可观测性身份验证设置。
解析程序必须是 同步的。 获取异步活动处理程序(或通过 MSAL)中的令牌,并将其缓存给解析程序。
from microsoft.opentelemetry import use_microsoft_opentelemetry
from microsoft.opentelemetry.a365.runtime import get_observability_authentication_scope
_cached_token: str | None = None
def my_token_resolver(agent_id: str, tenant_id: str) -> str | None:
return _cached_token
use_microsoft_opentelemetry(enable_a365=True, a365_token_resolver=my_token_resolver)
@AGENT_APP.activity("message", auth_handlers=["AGENTIC"])
async def on_message(context: TurnContext, _state: TurnState):
global _cached_token
_cached_token = await AGENT_APP.auth.exchange_token(
context,
scopes=get_observability_authentication_scope(),
auth_handler_id="AGENTIC",
)
使用 Agent Framework 应用的智能体令牌缓存
对于使用代理 (OBO) 身份验证的 Agent Framework 应用,如果未设置自定义 TokenResolver,Distro 会通过 DI 自动注册 IExporterTokenCache<AgenticTokenStruct>。 代理在运行时调用 RegisterObservability() 以提供凭据,缓存处理令牌获取和刷新。
注释
此方法仅支持代理 (OBO) 身份验证流。 对于服务到服务(S2S)身份验证,请改用 手动令牌解析程序 。
from microsoft.opentelemetry import use_microsoft_opentelemetry
from microsoft.opentelemetry.a365.hosting.token_cache_helpers import AgenticTokenCache, AgenticTokenStruct
from microsoft.opentelemetry.a365.runtime import get_observability_authentication_scope
token_cache = AgenticTokenCache()
_cached_tokens: dict[tuple[str, str], str | None] = {}
# Keep the sync resolver side-effect free; refresh the cache in the async request handler.
def sync_token_resolver(agent_id: str, tenant_id: str) -> str | None:
return _cached_tokens.get((agent_id, tenant_id))
use_microsoft_opentelemetry(enable_a365=True, a365_token_resolver=sync_token_resolver)
@AGENT_APP.activity("message", auth_handlers=["AGENTIC"])
async def on_message(context: TurnContext, _state: TurnState):
agent_id = context.activity.recipient.id
tenant_id = context.activity.recipient.tenant_id
token_cache.register_observability(
agent_id=agent_id,
tenant_id=tenant_id,
token_generator=AgenticTokenStruct(
authorization=AGENT_APP.auth,
turn_context=context,
),
observability_scopes=get_observability_authentication_scope(),
)
_cached_tokens[(agent_id, tenant_id)] = await token_cache.get_observability_token(
agent_id, tenant_id,
)
存储验证属性
若要成功进行存储验证,代理必须实现 InvokeAgentScope, InferenceScope并且 ExecuteToolScope。 每个范围对应于规范架构中的跨度操作:
| SDK 范围 | 数据段操作 | 通用参考代码 |
|---|---|---|
InvokeAgentScope |
invoke_agent |
IA |
ExecuteToolScope |
execute_tool |
ET |
InferenceScope |
chat |
CH |
OutputScope |
output_messages |
OM |
有关完整的按范围划分的必需及可选属性列表(包括各属性的语义、取值指导,以及哪些属性可通过 Microsoft Defender 高级搜寻进行查询),请参阅 Agent 365 可观测性属性参考。
“适用于”列标识每个属性所属的范围,“必需”列将必需()与可选属性M区分开来O。
使用可观测性测试智能体
实现可观测性后,请验证是否正在捕获遥测信息:
- 转到
https://admin.cloud.microsoft/#/agents/all。 - 选择代理人,然后选择活动。
- 验证是否显示会话和工具调用。
示例应用程序和高级配置
有关工作示例和高级配置选项,请参阅每种语言的GitHub存储库:
故障排除
本部分介绍在将 Microsoft OpenTelemetry Distro 与 Agent 365 一起使用时遇到的常见问题。
| 问题 | 说明 |
|---|---|
| 不显示可观测性数据 | 由于未启用代理 365 导出、设置不完整或令牌解析失败,因此不显示任何遥测数据。 |
| 缺少租户 ID 或智能体 ID - 跨域被跳过 | 当缺少所需的租户或代理标识属性时,这些跨度会在导出前被过滤掉。 |
| 令牌解析失败 - 导出被跳过或未授权 | 当令牌解析程序在获取令牌期间不返回令牌或错误时,将跳过或拒绝导出。 |
| HTTP 401 未授权 | 请求到达服务,但身份验证失败,因为令牌无效、已过期或访问群体错误。 |
| HTTP 403 禁止访问 | 由于缺少租户许可或可观测性写入权限,授权失败。 |
| HTTP 403 禁止访问 - 代理 ID 不匹配 | 当请求中的代理 ID 与令牌授权的代理标识不匹配时,服务将拒绝导出。 |
| HTTP 429 或 5xx 错误 - 暂时性错误 | 临时限流或后端不稳定可能导致导出中断,并且可能需要重试或进行批次调整。 |
| 导出超时 | 由于网络延迟或终结点响应延迟,导出操作超出了超时限制。 |
| 导出成功,但遥测不会显示在 Defender 或 Purview 中 | 数据引入成功,但下游先决条件和架构要求延迟或阻止可见性。 |
Tip
Agent 365 故障排除指南 包含高层次的故障排除建议、最佳实践以及针对 Agent 365 开发生命周期各阶段的故障排除内容链接。
可观测性数据不出现
症状:
- 代理程序正在运行
- 管理中心没有遥测
- 看不到智能体活动
根本原因:
- 未启用 Agent 365 导出
- 配置错误
- 令牌解析器问题
解决方案: 请尝试以下步骤来解决问题:
验证代理 365 导出是否已启用
必须显式启用 Agent 365 导出工具。 如果您未设置,Distro 可能会回退到控制台导出程序或完全不导出内容。 在代码中启用它:
from microsoft.opentelemetry import use_microsoft_opentelemetry use_microsoft_opentelemetry( enable_a365=True, a365_enable_observability_exporter=True, a365_token_resolver=my_token_resolver, )或设置环境变量:
export ENABLE_A365_OBSERVABILITY_EXPORTER=true注释
ENABLE_A365_OBSERVABILITY_EXPORTER是一个次要开关,仅在enable_a365=True在代码中设置时才生效。 还可以通过a365_enable_observability_exporterkwarg 控制它。
检查令牌解析器配置
导出程序需要一个有效的令牌解析程序,该解析程序为每个导出请求返回持有者令牌。 如果令牌解析程序缺失或返回
null,则以无提示方式跳过导出。在本地启用控制台导出并检查遥测数据
添加控制台导出程序以验证遥测是否在到达 Agent 365 终结点之前生成。
启用详细日志记录
检查日志中是否存在导出错误
使用
az webapp log tail命令 搜索日志中可观测性相关错误。az webapp log tail --name <your-app-name> --resource-group <your-resource-group> | Select-String "observability"
缺少租户 ID 或智能体 ID — 跳过跨度
症状: 系统以无提示方式删除范围,从不导出它们。 某些平台会记录跳过的范围数量或类似 No spans with tenant/agent identity found 的消息。 其他应用会将其删除,不会记录。
解决方法:
- 在导出之前,Distro 会根据租户和智能体身份对跨度进行分区。 缺少租户 ID 或智能体 ID 的跨度会被删除,永远不会发送到服务。
- 在创建跨度之前,请确保
BaggageBuilder已配置租户 ID 和智能体 ID。 这些值会通过 OpenTelemetry 上下文传播,并附加到行李作用域内创建的所有跨度上。 有关特定于平台的 API,请参阅 Baggage 属性。 - 如果您使用负载中间件,或启用托管集成包中的上下文助手,确认
TurnContext活动有具有智能体身份的有效接收者。
令牌解析失败 — 导出被跳过或未授权
症状: 令牌解析程序返回 null 或引发错误。 根据平台的不同,导出要么完全跳过,要么伴随 HTTP 401 错误而失败。
解决方法:
- 需要令牌解析器。 如果缺少,导出程序会在启动时引发错误。 验证是否提供了令牌解析程序并返回有效的持有者令牌。
- 请确保将正确的租户 ID 和代理 ID 传递给
BaggageBuilder,因为这些值将转发到令牌解析程序。 - 对于 Azure 托管的智能体,请验证托管身份是否具有可观测性作用域所需的 API 权限。
- 对于使用 Agent Framework 托管包的.NET应用,令牌交换将通过 DI 自动处理。 如果缺少令牌,请确认
Microsoft.Agents.A365.Observability.Hosting是否已安装并注册。
HTTP 401 未授权
症状: 导出失败并出现 HTTP 401。 导出程序不会重试此错误。
解决方法:
- 请验证令牌受众与可观测性端点范围是否匹配。
- 检查令牌解析程序是否未返回委派的用户令牌、目标受众不正确的令牌或过期的令牌。
HTTP 403 禁止访问
症状: 导出失败并出现 HTTP 403。 导出程序不会重试此错误。
根源: HTTP 403 错误可能有不同的原因。 按顺序检查以下解决方法。
解决方法:
许可证丢失 — 验证租户是否在 Microsoft 365 管理中心 中分配了以下许可证之一:
- 测试 - Microsoft 365 E7
- Microsoft 365 E7
- Microsoft Agent 365 Frontier
缺少
Agent365.Observability.OtelWrite权限 — 授予您的身份(托管身份或应用注册)权限。 如果没有它,遥测导出会失败,并返回 HTTP 403。
授予权限
使用以下任一选项:
Agent 365 CLI
需要全局管理员帐户;在包含
a365.config.json的代理项目目录中运行,或使用--agent-name。a365 setup permissions bot或者,不使用配置文件:
a365 setup permissions bot --agent-name "<agent-name>"Entra 门户
不需要配置文件;要求全局管理员访问蓝图应用注册。
- 转到 Entra 门户>应用注册>,选择蓝图应用程序。
- 转到 API 权限>添加权限>我的组织使用的 API> 搜索
9b975845-388f-4429-889e-eab1ef63949c。 - 选择 “委派权限> ”检查
Agent365.Observability.OtelWrite>“添加权限”。 - 重复步骤 2-3,这次选择 “应用程序权限> ”检查
Agent365.Observability.OtelWrite>“添加权限”。 - 单击“ 授予管理员同意 ”并确认。
Agent365.Observability.OtelWrite(委派)和Agent365.Observability.OtelWrite(应用)均显示为Granted状态。
HTTP 403 禁止访问 - 代理 ID 不匹配
症状:导出失败,返回 HTTP 403 错误及类似 403 Forbidden 的服务器消息,且在调用 Agent 365 跟踪端点时出现 agent-ID-mismatch 失败。
根本原因: 设置代理详细信息时,使用 蓝图客户端 ID 而不是 代理实例客户端 ID 时,会出现此错误。 导出 URL 中的代理 ID 与令牌授权的标识不匹配,因此跟踪终结点将拒绝请求。
解决方法:
- 验证是否已将租户 ID 添加到代理 365 允许的租户列表。
- 使用 代理实例客户端 ID (而不是蓝图客户端 ID)设置代理详细信息。
- 验证生成的导出 URL - 如果启用记录器,则会记录该 URL。 确认 URL 中的代理 ID 与代理实例客户端 ID 匹配。
- 若要为每个 SDK 启用诊断日志记录,请参阅 本地验证。
HTTP 429 或 5xx 错误 - 暂时性错误
症状: 导出失败,出现暂时性 HTTP 状态代码,例如 429 或 5xx。
解决方法:
- 这些错误通常是暂时性的,可以自行解决。 Python和 JavaScript 发行版会自动重试 HTTP 408、429 和 5xx 状态代码。 .NET发行版不会自动重试。
- 如果错误仍然存在,请检查服务运行状况仪表板。
- 请考虑通过增加批之间的计划延迟或最大导出批大小来降低导出频率。 对于 Python 和 JavaScript,请使用
GitHub 存储库2 中记录的相关 或 参数。 对于.NET,请使用 o.Agent365.Exporter.ScheduledDelayMilliseconds和o.Agent365.Exporter.MaxExportBatchSize。
导出超时
症状: 导出尝试超时。
解决方法:
检查与可观测性终结点的网络连接。
所有平台的默认 HTTP 请求超时为 30 秒。 如果超时频繁发生,请在导出程序选项中增加超时值:
导出成功,但遥测不会显示在 Defender 或 Purview 中
Symptoms: 日志显示成功导出(HTTP 200),但遥测在Microsoft Defender或Microsoft Purview中不可见。
解决方法:
- 验证是否满足查看导出日志的先决条件:
- Microsoft Purview:必须为组织开启审核。 请参阅 打开或关闭审核。
-
Microsoft Defender:必须配置高级搜寻功能才能访问
CloudAppEvents表。 请参阅 高级搜寻架构中的 CloudAppEvents 表。
- 成功导出后,遥测数据可能需要几分钟才能显示。 请稍候,然后进行进一步调查。
- 验证 span 是否包含有效的
microsoft.tenant.id和gen_ai.agent.id属性。 缺少身份属性会导致服务器端忽略跨度,即使 HTTP 导出返回 200。
相关内容
- 代理 365 可观测性概念 - 数据流、标识模型、身份验证、范围和适用于每个集成路径的限制。
- Agent 365 可观测性属性参考 - 所有由 Agent 365 摄入的数据段必须遵循的标准数据段属性模式。