可觀察性 SDK

重要

若要在 Agent 365 中啟用可觀察性,請使用 Microsoft OpenTelemetry Distro。 這個發行版在 Microsoft 各產品中提供單一可觀察性 SDK,為 Agent 365、Microsoft Foundry、Azure 監視器等提供支援。 本文所述的現有做法會持續運作,不會有重大變更。 如需依語言劃分的移轉指引,請參閱下列指南:

注意

可觀察性是開始使用 Agent 365 開發中漸進式功能層級之一,適用於所有 Agent 類型。

若要參與 Agent 365 生態系統,請為您的 Agent 新增 Agent 365 可觀察性功能。 Agent 365 可觀察性以 OpenTelemetry (OTel) 為基礎,提供統一的架構,可在所有 Agent 平台上一致且安全地擷取遙測資料。 實作這個必要元件後,IT 管理員即可在 Microsoft 系統管理中心監控您 Agent 的活動,安全性團隊也能使用 Defender 和 Purview 進行合規性與威脅偵測。

重點優勢

  • 端對端可見性:擷取每次 Agent 叫用的完整遙測資料,包括工作階段、工具呼叫和例外狀況,讓您在各平台間都有完整的追蹤能力。
  • 安全性與合規性強化:將統一的稽核記錄饋入 Defender 和 Purview,為您的 Agent 啟用進階安全性案例與合規性報告。
  • 跨平台彈性:以 OTel 標準為基礎,支援 Copilot Studio、Foundry 等多元執行階段與平台,以及未來的 Agent 架構。
  • 提升管理員作業效率:在 Microsoft 365 系統管理中心提供集中式可觀察性,縮短疑難排解時間,並透過角色型存取控制,為管理您 Agent 的 IT 團隊改善治理。

支援的 Agent

下列 Agent 類型支援 Agent 365 可觀察性:

安裝

使用下列命令,為 Agent 365 支援的語言安裝可觀察性模組。

安裝核心可觀察性和執行階段套件。 所有使用 Agent 365 可觀察性的 Agent 都需要這些套件。

pip install microsoft-agents-a365-observability-core
pip install microsoft-agents-a365-runtime

如果您的 Agent 使用 Microsoft Agents Hosting 套件,請安裝適用於裝載的整合套件。 這項元件提供中介軟體,可自動從 TurnContext 填入 Baggage 與範圍,並內建可觀察性匯出工具所需的權杖快取功能。

pip install microsoft-agents-a365-observability-hosting

如果您的 Agent 使用其中一個支援的 AI 架構,請安裝對應的自動檢測擴充功能,即可自動擷取遙測資料,而不需要手動撰寫檢測程式碼。 如需設定詳細資料,請參閱自動檢測

# For Semantic Kernel
pip install microsoft-agents-a365-observability-extensions-semantic-kernel

# For OpenAI Agents SDK
pip install microsoft-agents-a365-observability-extensions-openai

# For Microsoft Agent Framework
pip install microsoft-agents-a365-observability-extensions-agent-framework

# For LangChain
pip install microsoft-agents-a365-observability-extensions-langchain

組態

使用下列設定,為您的 Agent 啟用並自訂 Agent 365 可觀察性。

若要啟用可觀察性,請將 ENABLE_A365_OBSERVABILITY_EXPORTER 環境變數設為 true。 這項設定會將記錄匯出至服務,且需要提供 token_resolver。 否則會使用主控台匯出工具。

from microsoft_agents_a365.observability.core import configure

def token_resolver(agent_id: str, tenant_id: str) -> str | None:
    # Implement secure token retrieval here
    return "Bearer <token>"

configure(
    service_name="my-agent-service",
    service_namespace="my.namespace",
    token_resolver=token_resolver,
)

權杖解析器不會記錄到主控台。

您可以將 Agent365ExporterOptions 執行個體傳遞至 exporter_options,藉此自訂匯出工具的行為。 提供 exporter_options 時,其優先順序高於 token_resolvercluster_category 參數。

from microsoft_agents_a365.observability.core import configure, Agent365ExporterOptions

configure(
    service_name="my-agent-service",
    service_namespace="my.namespace",
    exporter_options=Agent365ExporterOptions(
        cluster_category="prod",
        token_resolver=token_resolver,
    ),
    suppress_invoke_agent_input=True,
)

下表說明 configure() 的選擇性參數。

參數 描述 預設
logger_name 用於偵錯與主控台記錄輸出的 Python 記錄器名稱。 microsoft_agents_a365.observability.core
exporter_options 一併設定權杖解析器與叢集類別的 Agent365ExporterOptions 執行個體。 None
suppress_invoke_agent_input 設為 True 時,會隱藏 InvokeAgent Span 上的輸入訊息。 False

下表說明 Agent365ExporterOptions 的選擇性屬性。

屬性 說明 預設
use_s2s_endpoint True 時,請使用服務到服務端點路徑。 False
max_queue_size 批次處理器的最大佇列大小。 2048
scheduled_delay_ms 匯出批次之間的延遲 (以毫秒為單位)。 5000
exporter_timeout_ms 匯出作業的逾時時間 (以毫秒為單位)。 30000
max_export_batch_size 匯出作業的最大批次大小。 512

Baggage 屬性

使用 BaggageBuilder 來設定可要求中所有跨度間流程的上下文資訊。 SDK 實現一個 SpanProcessor,能將所有非空的 Baggage 屬性複製到新啟動的跨度,且不會覆寫現有屬性。

from microsoft_agents_a365.observability.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-agents-a365-observability-hosting 套件中的 populate 協助程式。 此協助工具會自動從活動中擷取呼叫者、Agent、租用戶、管道和交談詳細資料。

from microsoft_agents.hosting.core.turn_context import TurnContext
from microsoft_agents_a365.observability.core import BaggageBuilder
from microsoft_agents_a365.observability.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

Baggage 中介軟體

如果您的 Agent 使用整合套件,請註冊 Baggage 中介軟體,讓每個傳入的要求自動填入 Baggage 。 此步驟能免除在每個活動處理常式中手動呼叫 BaggageBuilder 的需求。

在配接器中介軟體集上註冊 BaggageMiddleware。 它會自動從每個傳入的 TurnContext 中擷取呼叫者、Agent、租用戶、管道和交談詳細資料,並將要求裝合在 Baggage 範圍內。

from microsoft_agents_a365.observability.hosting import BaggageMiddleware

adapter.use(BaggageMiddleware())

或者,您也可以使用 ObservabilityHostingManager 設定 Baggage 中介軟體及其他裝載功能:

from microsoft_agents_a365.observability.hosting import ObservabilityHostingManager, ObservabilityHostingOptions

options = ObservabilityHostingOptions(enable_baggage=True)
ObservabilityHostingManager.configure(adapter.middleware_set, options)

中介軟體會跳過非同步回覆 (ContinueConversation 事件) 的 Baggage 設定,以避免覆寫原始要求已設定的 Baggage。

權杖解析器

使用 Agent 365 匯出工具時,您必須提供會傳回驗證權杖的權杖解析器函式。 搭配 Agent Hosting 架構使用 Agent 365 可觀察性 SDK 時,您可以透過 Agent 活動中的 TurnContext 產生權杖。

下列程式碼片段示範如何使用 microsoft_agents.hosting.core SDK 產生權杖。 這裡產生的驗證權杖,會用於將 Span 匯出至 A365 擷取服務。 Agent 可以自行產生權杖,例如使用 Microsoft 驗證資源庫 (MSAL),但必須確保權杖具有可觀察性範圍。

from microsoft_agents.activity import load_configuration_from_env
from microsoft_agents.authentication.msal import MsalConnectionManager
from microsoft_agents.hosting.aiohttp import CloudAdapter
from microsoft_agents.hosting.core import (
    AgentApplication,
    Authorization,
    MemoryStorage,
    TurnContext,
    TurnState,
)
from microsoft_agents_a365.runtime import (
    get_observability_authentication_scope,
)

agents_sdk_config = load_configuration_from_env(environ)

STORAGE = MemoryStorage()
CONNECTION_MANAGER = MsalConnectionManager(**agents_sdk_config)
ADAPTER = CloudAdapter(connection_manager=CONNECTION_MANAGER)
ADAPTER.use(TranscriptLoggerMiddleware(ConsoleTranscriptLogger()))
AUTHORIZATION = Authorization(STORAGE, CONNECTION_MANAGER, **agents_sdk_config)

AGENT_APP = AgentApplication[TurnState](
    storage=STORAGE, adapter=ADAPTER, authorization=AUTHORIZATION, **agents_sdk_config
)

@AGENT_APP.activity("message", auth_handlers=["AGENTIC"])
async def on_message(context: TurnContext, _state: TurnState):
    aau_auth_token = await AGENT_APP.auth.exchange_token(
                        context,
                        scopes=get_observability_authentication_scope(),
                        auth_handler_id="AGENTIC",
                    )
    # cache this auth token and return via token resolver

若 Agent 是透過 A365 CLI 建置,並使用 AI 隊友與 Microsoft Agent 365 Observability Hosting Library 套件,請使用 AgenticTokenCache 自動處理權杖快取。 在活動處理常式中,針對每個 Agent 與租用戶註冊一次權杖,並在可觀察性設定中,將 cache.get_observability_token 做為 token_resolver 傳入。

from microsoft_agents_a365.observability.core import configure
from microsoft_agents_a365.observability.hosting.token_cache_helpers import (
    AgenticTokenCache,
    AgenticTokenStruct,
)
from microsoft_agents_a365.runtime import get_observability_authentication_scope

# Create a shared cache instance
token_cache = AgenticTokenCache()

# Use the cache as your token resolver in configure()
configure(
    service_name="my-agent-service",
    service_namespace="my.namespace",
    token_resolver=token_cache.get_observability_token,
)

@AGENT_APP.activity("message", auth_handlers=["AGENTIC"])
async def on_message(context: TurnContext, _state: TurnState):
    token_cache.register_observability(
        agent_id="agent-456",
        tenant_id="tenant-123",
        token_generator=AgenticTokenStruct(
            authorization=AGENT_APP.auth,
            turn_context=context,
        ),
        observability_scopes=get_observability_authentication_scope(),
    )

自動檢測

自動檢測會自動監聽代理式架構 (SDK) 現有的追蹤遙測訊號,並將其轉送至 Agent 365 可觀察性服務。 這項功能可讓開發人員不必手動撰寫監控程式碼,簡化設定作業,並確保效能追蹤的一致性。

重要

自動檢測僅會填入標準 OTel 屬性。 您必須使用 BaggageBuilder 來新增 Microsoft 特定的屬性。 若要查看缺少哪些屬性,請對照市集記錄檢查您的主控台 Span 輸出,以取得差異集。

多個 SDK 與平台皆支援自動檢測:

平台 支援的 SDK / 架構
.NET 語意核心OpenAIAgent Framework
Python 語意核心OpenAIAgent FrameworkLangChain
Node.js OpenAILangChain

注意

自動檢測的支援程度會依平台與 SDK 實作而異。

語意核心

自動檢測需要使用 Baggage 建置器。 使用 BaggageBuilder 設定 Agent 識別碼與租用戶識別碼。

安裝 套件。

pip install microsoft-agents-a365-observability-extensions-semantic-kernel

設定可觀察性。

from microsoft_agents_a365.observability.core import configure
from microsoft_agents_a365.observability.extensions.semantickernel.trace_instrumentor import SemanticKernelInstrumentor

# Configure observability
configure(
    service_name="my-semantic-kernel-agent",
    service_namespace="ai.agents"
)

# Enable auto-instrumentation
instrumentor = SemanticKernelInstrumentor()
instrumentor.instrument()

# Your Semantic Kernel code is now automatically traced

OpenAI

自動檢測需要使用 Baggage 建置器。 使用 BaggageBuilder 設定 Agent 識別碼與租用戶識別碼。

安裝 套件。

pip install microsoft-agents-a365-observability-extensions-openai

設定可觀察性。

from microsoft_agents_a365.observability.core import configure
from microsoft_agents_a365.observability.extensions.openai import OpenAIAgentsTraceInstrumentor

# Configure observability
configure(
    service_name="my-openai-agent",
    service_namespace="ai.agents"
)

# Enable auto-instrumentation
instrumentor = OpenAIAgentsTraceInstrumentor()
instrumentor.instrument()

# Your OpenAI Agents code is now automatically traced

Agent Framework

自動檢測需要使用 Baggage 建置器。 使用 BaggageBuilder 設定 Agent 識別碼與租用戶識別碼。

安裝 套件。

pip install microsoft-agents-a365-observability-extensions-agent-framework

設定可觀察性。

from microsoft_agents_a365.observability.core import configure
from microsoft_agents_a365.observability.extensions.agentframework import (
    AgentFrameworkInstrumentor,
)

# Configure observability
configure(
    service_name="AgentFrameworkTracingWithAzureOpenAI",
    service_namespace="AgentFrameworkTesting",
)

# Enable auto-instrumentation
AgentFrameworkInstrumentor().instrument()

LangChain Framework

自動檢測需要使用 Baggage 建置器。 使用 BaggageBuilder 設定 Agent 識別碼與租用戶識別碼。

安裝 套件。

pip install microsoft-agents-a365-observability-extensions-langchain

設定可觀察性。

from microsoft_agents_a365.observability.core.config import configure
from microsoft_agents_a365.observability.extensions.langchain import CustomLangChainInstrumentor

# Configure observability
configure(
    service_name="my-langchain-agent",
    service_namespace="ai.agents"
)

# Enable auto-instrumentation
CustomLangChainInstrumentor()

# Your LangChain code is now automatically traced

手動檢測

使用 Agent 365 可觀察性 SDK 了解 Agent 的內部運作方式。 SDK 提供您可以啟動的範圍:InvokeAgentScopeExecuteToolScopeInferenceScopeOutputScope

Agent 叫用

在您的 Agent 處理程序開始時使用這個範圍。 使用叫用 Agent 範圍,您可以擷取目前所叫用的 Agent、Agent 使用者資料等屬性。

from microsoft_agents_a365.observability.core import (
    InvokeAgentScope,
    InvokeAgentScopeDetails,
    AgentDetails,
    CallerDetails,
    UserDetails,
    Channel,
    Request,
    ServiceEndpoint,
)

agent_details = AgentDetails(
    agent_id="agent-456",
    agent_name="My Agent",
    agent_description="An AI agent powered by Azure OpenAI",
    agentic_user_id="auid-123",
    agentic_user_email="agent@contoso.com",
    agent_blueprint_id="blueprint-789",
    tenant_id="tenant-123",
)

scope_details = InvokeAgentScopeDetails(
    endpoint=ServiceEndpoint(hostname="myagent.contoso.com", port=443),
)

request = Request(
    content="User asks a question",
    session_id="session-42",
    conversation_id="conv-xyz",
    channel=Channel(name="msteams"),
)

caller_details = CallerDetails(
    user_details=UserDetails(
        user_id="user-123",
        user_email="jane.doe@contoso.com",
        user_name="Jane Doe",
    ),
)

with InvokeAgentScope.start(request, scope_details, agent_details, caller_details):
    # Perform agent invocation logic
    response = call_agent(...)

工具執行

下列範例示範如何為您 Agent 的工具執行新增可觀察性追蹤。 這項追蹤會擷取遙測資料,以供監控與稽核之用。

from microsoft_agents_a365.observability.core import (
    ExecuteToolScope,
    ToolCallDetails,
    Request,
    ServiceEndpoint,
)

# Use the same agent_details and request instances from the InvokeAgentScope example above

tool_details = ToolCallDetails(
    tool_name="summarize",
    tool_type="function",
    tool_call_id="tc-001",
    arguments="{'text': '...'}",
    description="Summarize provided text",
    endpoint=ServiceEndpoint(hostname="tools.contoso.com", port=8080),
)

with ExecuteToolScope.start(request, tool_details, agent_details) as scope:
    result = run_tool(tool_details)
    scope.record_response(result)

推斷

下列範例示範如何為 AI 模型推斷呼叫加上可觀察性追蹤檢測,以擷取權杖使用量、模型詳細資料及回應中繼資料。

from microsoft_agents_a365.observability.core import (
    InferenceScope,
    InferenceCallDetails,
    InferenceOperationType,
)

# Use the same agent_details and request instances from the InvokeAgentScope example above

inference_details = InferenceCallDetails(
    operationName=InferenceOperationType.CHAT,
    model="gpt-4o-mini",
    providerName="azure-openai",
    inputTokens=123,
    outputTokens=456,
    finishReasons=["stop"],
)

with InferenceScope.start(request, inference_details, agent_details) as scope:
    completion = call_llm(...)
    scope.record_output_messages([completion.text])
    scope.record_input_tokens(completion.usage.input_tokens)
    scope.record_output_tokens(completion.usage.output_tokens)

輸出

InvokeAgentScopeExecuteToolScopeInferenceScope 無法同步擷取輸出資料時,請針對非同步案例使用這個範圍。 將 OutputScope 啟動為子 Span,在父範圍完成後記錄最終的輸出訊息。

from microsoft_agents_a365.observability.core import (
    OutputScope,
    Response,
    SpanDetails,
)

# Use the same agent_details and request instances from the InvokeAgentScope example above

# Get the parent context from the originating scope
parent_context = invoke_scope.get_context()

response = Response(messages=["Here is your organized inbox with 15 urgent emails."])

with OutputScope.start(
    request,
    response,
    agent_details,
    span_details=SpanDetails(parent_context=parent_context),
):
    # Output messages are recorded automatically from the response
    pass

在本機驗證

若要驗證您已成功整合可觀察性 SDK,請檢查您 Agent 產生的主控台記錄,以及可觀察性 SDK 的記錄。

ENABLE_A365_OBSERVABILITY_EXPORTER 環境變數設定為 false。 這項設定會將 Span (追蹤) 匯出至主控台。

若要調查匯出失敗的問題,請將 ENABLE_A365_OBSERVABILITY_EXPORTER 設為 true,並在應用程式啟動時設定偵錯記錄,以啟用詳細記錄:

import logging

logging.basicConfig(level=logging.DEBUG)
logging.getLogger("microsoft_agents_a365.observability.core").setLevel(logging.DEBUG)

# Or target only the exporter:
logging.getLogger(
    "microsoft_agents_a365.observability.core.exporters.agent365_exporter"
).setLevel(logging.DEBUG)

主要記錄訊息:

DEBUG  Token resolved for agent {agentId} tenant {tenantId}
DEBUG  Exporting {n} spans to {url}
DEBUG  HTTP 200 - correlation ID: abc-123
ERROR  Token resolution failed: {error}
ERROR  HTTP 401 exporting spans - correlation ID: abc-123
INFO   No spans with tenant/agent identity found; nothing exported.

檢視已匯出的記錄

若要在 Microsoft Purview 或 Microsoft Defender 中檢視 Agent 遙測資料,請確保符合以下要求:

驗證是否可發佈至市集

重要

若要通過市集驗證,您的 Agent 必須實作 InvokeAgentScopeInferenceScopeExecuteToolScope 範圍。 發佈時必須具備這三個範圍。

發佈之前,請實作必要的 invoke agentexecute toolinferenceoutput 範圍,並使用主控台記錄驗證您 Agent 的可觀察性整合。 接著,將您 Agent 的記錄與下列屬性清單進行比對,確認所有必要屬性皆已具備。 在每個範圍或透過 Baggage 建置器擷取屬性,並可視需要納入選擇性屬性。

如需市集發佈需求的詳細資訊,請參閱市集驗證準則

InvokeAgentScope 屬性

下列清單彙總啟動 InvokeAgentScope 時所記錄的必要與選擇性遙測屬性。

"attributes": {
        "error.type": "Optional",
        "microsoft.a365.agent.blueprint.id": "Required",
        "gen_ai.agent.description": "Optional",
        "gen_ai.agent.id": "Required",
        "gen_ai.agent.name": "Required",
        "microsoft.a365.agent.platform.id": "Optional",
        "microsoft.agent.user.email": "Required",
        "microsoft.agent.user.id": "Required",
        "gen_ai.agent.version": "Optional",
        "microsoft.a365.caller.agent.blueprint.id": "Optional",
        "microsoft.a365.caller.agent.id": "Optional",
        "microsoft.a365.caller.agent.name": "Optional",
        "microsoft.a365.caller.agent.platform.id": "Optional",
        "microsoft.a365.caller.agent.user.email": "Optional",
        "microsoft.a365.caller.agent.user.id": "Optional",
        "microsoft.a365.caller.agent.version": "Optional",
        "client.address": "Required",
        "user.id": "Required",
        "user.name": "Optional",
        "user.email": "Required",
        "microsoft.channel.link": "Optional",
        "microsoft.channel.name": "Required",
        "gen_ai.conversation.id": "Required",
        "microsoft.conversation.item.link": "Optional",
        "gen_ai.input.messages": "Required",
        "gen_ai.operation.name": "Required",
        "gen_ai.output.messages": "Required",
        "server.address": "Required",
        "server.port": "Required",
        "microsoft.session.id": "Optional",
        "microsoft.session.description": "Optional",
        "microsoft.tenant.id": "Required"
    }

ExecuteToolScope 屬性

下列清單彙總啟動 ExecuteToolScope 時所記錄的必要與選擇性遙測屬性。

"attributes": {
        "error.type": "Optional",
        "microsoft.a365.agent.blueprint.id": "Required",
        "gen_ai.agent.description": "Optional",
        "gen_ai.agent.id": "Required",
        "gen_ai.agent.name": "Required",
        "microsoft.a365.agent.platform.id": "Optional",
        "microsoft.agent.user.email": "Required",
        "microsoft.agent.user.id": "Required",
        "gen_ai.agent.version": "Optional",
        "client.address": "Required",
        "user.id": "Required",
        "user.name": "Optional",
        "user.email": "Required",
        "microsoft.channel.link": "Optional",
        "microsoft.channel.name": "Required",
        "gen_ai.conversation.id": "Required",
        "microsoft.conversation.item.link": "Optional",
        "gen_ai.operation.name": "Required",
        "gen_ai.tool.call.arguments": "Required",
        "gen_ai.tool.call.id": "Required",
        "gen_ai.tool.call.result": "Required",
        "gen_ai.tool.description": "Optional",
        "gen_ai.tool.name": "Required",
        "gen_ai.tool.type": "Required",
        "server.address": "Optional",
        "server.port": "Optional",
        "microsoft.session.id": "Optional",
        "microsoft.session.description": "Optional",
        "microsoft.tenant.id": "Required"
    }

InferenceScope 屬性

下列清單彙總啟動 InferenceScope 時所記錄的必要與選擇性遙測屬性。

"attributes": {
        "error.type": "Optional",
        "microsoft.a365.agent.blueprint.id": "Required",
        "gen_ai.agent.description": "Optional",
        "gen_ai.agent.id": "Required",
        "gen_ai.agent.name": "Required",
        "microsoft.a365.agent.platform.id": "Optional",
        "microsoft.a365.agent.thought.process": "Optional",
        "microsoft.agent.user.email": "Required",
        "microsoft.agent.user.id": "Required",
        "gen_ai.agent.version": "Optional",
        "client.address": "Required",
        "user.id": "Required",
        "user.name": "Optional",
        "user.email": "Required",
        "microsoft.channel.link": "Optional",
        "microsoft.channel.name": "Required",
        "gen_ai.conversation.id": "Required",
        "microsoft.conversation.item.link": "Optional",
        "gen_ai.input.messages": "Required",
        "gen_ai.operation.name": "Required",
        "gen_ai.output.messages": "Required",
        "gen_ai.provider.name": "Required",
        "gen_ai.request.model": "Required",
        "gen_ai.response.finish_reasons": "Optional",
        "gen_ai.usage.input_tokens": "Optional",
        "gen_ai.usage.output_tokens": "Optional",
        "server.address": "Optional",
        "server.port": "Optional",
        "microsoft.session.description": "Optional",
        "microsoft.session.id": "Optional",
        "microsoft.tenant.id": "Required"
    }

OutputScope 屬性

下列清單彙總啟動 OutputScope 時所記錄的必要與選擇性遙測屬性。 當父範圍無法同步擷取輸出資料時,請針對非同步案例使用這個範圍。

"attributes": {
        "microsoft.a365.agent.blueprint.id": "Required",
        "gen_ai.agent.description": "Optional",
        "gen_ai.agent.id": "Required",
        "gen_ai.agent.name": "Required",
        "microsoft.a365.agent.platform.id": "Optional",
        "microsoft.agent.user.email": "Required",
        "microsoft.agent.user.id": "Required",
        "gen_ai.agent.version": "Optional",
        "client.address": "Required",
        "user.id": "Required",
        "user.name": "Optional",
        "user.email": "Required",
        "microsoft.channel.link": "Optional",
        "microsoft.channel.name": "Required",
        "gen_ai.conversation.id": "Required",
        "microsoft.conversation.item.link": "Optional",
        "gen_ai.operation.name": "Required",
        "gen_ai.output.messages": "Required",
        "microsoft.session.id": "Optional",
        "microsoft.session.description": "Optional",
        "microsoft.tenant.id": "Required"
    }

使用可檢視性測試您的 Agent

在您的 Agent 中實作可觀察性之後,請進行測試,確保能正確擷取遙測資料。 請遵循測試指南設定您的環境。 接著,請主要參閱檢視可觀察性記錄一節,驗證您的可觀察性實作是否如預期運作。

驗證:

  • 前往: https://admin.cloud.microsoft/#/agents/all
  • 選取您的 Agent >活動
  • 您會看到工作階段與工具呼叫

疑難排解​​

本節說明實作與使用可觀察性時常見的問題。

問題回報 Description
可檢視性資料未顯示 因為未啟用匯出、設定不正確,或權杖解析失敗,所以看不到任何遙測資料。
遺漏租用戶識別碼或 Agent 識別碼 - 已跳過跨度 如果缺少分割所需的身分識別屬性,Span 會在匯出前遭到捨棄。
權杖解析失敗 - 匯出跳過或未經授權 如果解析器未傳回權杖或發生例外狀況,匯出要求就會失敗或遭到略過。
HTTP 401 未授權 驗證在語法上成功,但因為範圍、類型或過期等因素,導致權杖對擷取而言無效。
HTTP 403 禁止 因為租用戶授權缺口或缺少可觀察性權限,所以存取遭拒。
HTTP 403 禁止 - Agent 識別碼不符 如果 URL 中的 Agent 身分識別與權杖所代表的身分識別不符,要求就會遭到拒絕。
HTTP 429 或 5xx 錯誤 - 暫時性錯誤 暫時的節流或服務端故障會中斷匯出,可能需要調整重試設定。
匯出逾時 因為網路延遲或端點回應速度,遙測批次超過設定的逾時範圍。
匯出成功,但 Defender 或 Purview 中未顯示遙測資料 擷取已完成,但下游的可見性因產品必要條件而延遲或遭到封鎖。

提示

Agent 365 疑難排解指南包含高階疑難排解建議、最佳做法,以及每個階段的疑難排解連結,涵蓋 Agent 365 開發生命週期的所有部分。

可檢視性資料未顯示

徵狀:

  • Agent 正在執行
  • 系統管理中心中沒有遙測資料
  • 無法查看 Agent 活動

根本原因:

  • 未啟用可觀察性
  • 組態錯誤
  • 權杖解析器問題

解決方案:嘗試以下步驟來解決問題:

  • 驗證可觀察性匯出工具是否已啟用

    您必須明確啟用 Agent 365 匯出器。 停用時,SDK 會回復使用主控台匯出工具,且不會將遙測資料傳送至服務。 如需設定詳細資料,請參閱設定

  • 檢查權杖解析器設定

    匯出器需要一個有效的權杖解析器,可為每個匯出要求傳回一個持有人權杖。 如果遺漏權杖解析器或傳回 null,匯出會靜默跳過。 請確認您的程式碼已正確實作權杖解析器。 如需詳細資料,請參閱權杖解析器

  • 檢查記錄中的錯誤

    啟用詳細記錄,並使用 az webapp log tail 命令搜尋記錄中與可觀察性相關的錯誤。 如需依平台啟用記錄的詳細資料,請參閱在本機驗證

    # Look for observability-related errors
    az webapp log tail --name <your-app-name> --resource-group <your-resource-group> | Select-String "observability"
    
  • 驗證遙測資料匯出

    確認遙測資料已如預期產生並匯出。

    • 新增主控台匯出工具,並檢查是否已在本機產生遙測資料。 如需如何使用主控台匯出工具及驗證輸出的詳細資料,請參閱在本機驗證

遺漏租用戶識別碼或 Agent 識別碼 — 已跳過跨度

症狀:系統會靜默丟棄跨度,並永不將其匯出。 部分 SDK 會記錄遭略過的 Span 數量,或顯示類似「找不到具有租用戶/Agent 身分識別的 Span」的訊息;其他 SDK 則會直接捨棄,不會記錄。

解決方法:

  • 匯出之前,SDK 會依租用戶與 Agent 身分識別分割 Span。 系統會捨棄缺少租用戶識別碼或 Agent 識別碼的 Span,且絕不會將其傳送至服務。
  • 確保 BaggageBuilder 在建立跨度前,已經設定好租用戶識別碼和 Agent 識別碼。 這些值會透過 OpenTelemetry 上下文傳播,並附加於所有在 Baggage 範圍內建立的跨度上。 如需平台專屬的 API,請參閱 Baggage 屬性
  • 如果您使用裝載整合套件中的 Baggage 中介軟體或 Turn Context 協助程式來填入這些識別碼,請確認 TurnContext 活動具有含 Agent 身分識別的有效收件者。

權杖解析失敗 — 匯出跳過或未經授權

症狀:權杖解析器傳回 null 或拋出錯誤。 視 SDK 而定,匯出作業可能會完全略過,或要求在未附加授權標頭的情況下傳送,並因 HTTP 401 而失敗。

解決方法:

  • 初始化時必須提供權杖解析器。 如果遺漏,匯出器會在啟動時拋出錯誤。 驗證已提供權杖解析器,且能傳回有效的持有人權杖。
  • 請確認 BaggageBuilder 使用的租用戶識別碼與 Agent 識別碼正確無誤,因為這些值會傳遞給權杖解析器。
  • 對於在 Azure 上託管的 Agent,請驗證受管理識別具有可檢視性範圍所需的 API 權限。

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 權限 — 如果您最近升級了可觀察性套件,就需要授與這項權限。 請參閱下一節中的重要注意事項。

重要

升級至這些套件版本的現有 Agent 需要執行額外步驟

這個步驟僅適用於升級現有 Agent 的情況。 新安裝的 Agent 不需要這個步驟。 如果您要升級至下列套件版本或更新版本,必須將新的 Agent365.Observability.OtelWrite 權限授與您的身分識別 (受控識別或應用程式註冊)。 若無此權限,遙測資料匯出將因 HTTP 403 而失敗。

平台 需要執行這個步驟的最低版本
.NET 0.3-beta
Node.js 0.2.0-preview.1
Python 0.3.0

請使用下列其中一個選項授與權限。

選項 A — Agent 365 CLI (需要全域管理員帳戶;請從包含 a365.config.json 的 Agent 專案目錄執行,或使用 --agent-name)

a365 setup permissions bot

或者,無需組態檔:

a365 setup permissions bot --agent-name "<agent-name>"

這個命令會授與藍圖上所有缺少的權限,包括可觀察性範圍。

選項 B — Entra 入口網站 (不需要設定檔;需要對藍圖應用程式註冊擁有全域管理員存取權)

  1. 移至 Entra 入口網站>應用程式註冊>,選取您的 Blueprint 應用程式。
  2. 移至 API 權限>新增權限>我的組織使用的 API> 尋找 9b975845-388f-4429-889e-eab1ef63949c
  3. 選取委派權限>,勾選Agent365.Observability.OtelWrite>新增權限
  4. 重複執行步驟 2–3,這次改選取應用程式權限>,勾選 Agent365.Observability.OtelWrite>新增權限
  5. 按一下授與管理員同意並確認。

Agent365.Observability.OtelWrite (委派) 與 Agent365.Observability.OtelWrite (應用程式) 都應顯示 Granted 狀態。

HTTP 403 禁止 — Agent 識別碼不符

症狀:匯出時因 HTTP 403 而失敗,並收到類似 403 Forbiddenagent-ID-mismatch 的伺服器訊息,且在呼叫 Agent 365 追蹤端點時發生失敗。

根本原因:在您設定 Agent 詳細資料時,您使用藍圖用戶端識別碼而非 Agen t執行個體用戶端識別碼,就會導致此錯誤。 匯出 URL 中的 Agent 識別碼與權杖授權的身分識別不相符,因此追蹤端點拒絕要求。

解決方法:

  • 驗證租用戶識別碼是否已新增至 Agent 365 允許租用戶清單。
  • 將 Agent 詳細資料設定為 Agent 執行個體用戶端識別碼 (而非藍圖用戶端識別碼)。
  • 驗證產生的匯出 URL - 如果您啟用記錄器,會將它記錄下來。 確認 URL 中的Agent 識別碼與 Agent 執行個體用戶端識別碼相符。
  • 如需依 SDK 啟用診斷記錄的詳細資料,請參閱在本機驗證

HTTP 429 或 5xx 錯誤 - 暫時性錯誤

症狀:匯出因暫時性 HTTP 狀態碼 (例如 429 或 5xx) 而失敗。

解決方法:

  • 這些錯誤通常是暫時性的,會自行解決。 Python 與 JavaScript SDK 會針對 HTTP 408、429 及 5xx 狀態碼,以指數輪詢間隔自動重試最多三次。 .NET SDK 不會自動重試。
  • 如果錯誤持續,請檢查服務健康狀態儀表板。
  • 請考慮增加批次之間的排程延遲,或增加匯出批次的大小上限,藉此降低匯出頻率。 如需依平台劃分的設定選項,請參閱設定中的 Agent365ExporterOptions 資料表。

匯出逾時

症狀:匯出嘗試逾時。

解決方法:

  • 檢查與可檢視性端點的網路連線。
  • 逾時的預設值會依平台而異。 預設的 HTTP 要求逾時為 30 秒。 部分 SDK 也另外提供整體匯出工具逾時設定,涵蓋包括重試在內的整個匯出週期。 如需依平台劃分的確切屬性與預設值,請參閱設定中的 Agent365ExporterOptions 資料表。
  • 如果經常發生逾時,請增加匯出工具選項中的相關逾時值。

匯出成功,但 Defender 或 Purview 中未顯示遙測資料

徵狀:記錄顯示匯出成功,但在 Microsoft Defender 或 Microsoft Purview 中看不到遙測資料。

解決方法:

  • 請確認您符合檢視已匯出記錄的必要條件。 若為 Purview,必須開啟稽核功能。 若為 Defender,您必須設定進階搜捕。 如需詳細資訊,請參閱檢視已匯出的記錄
  • 遙測資料在成功匯出後可能需要數分鐘才能填入。 請先等待資料出現,再進一步調查。

如需深入了解如何測試可觀察性,請參閱: