Microsoft OpenTelemetry Distro は、エージェント アプリケーションと非エージェント アプリケーションからトレース、メトリック、ログを収集するための単一のオンボード エクスペリエンスを提供する、統合された可観測性ディストリビューションです。 Microsoft Agent 365、Microsoft Foundry、Azure Monitor、および OpenTelemetry Protocol (OTLP) 互換バックエンドの可観測性がサポートされています。 ディストリビューションは、.NET、Node.js、およびPythonをサポートし、複数の可観測スタック全体の断片化されたセットアップを 1 つのインポートと 1 つの構成呼び出しに置き換えます。
主な利点
Microsoft OpenTelemetry Distro には、次の利点があります。
- 1 つのパッケージ、1 つの API: 複数のエクスポーター パッケージとインストルメンテーション パッケージを 1 つの依存関係に置き換えます。
- Multi-backend support: Azure Monitor、Datadog、Grafana、New Relic などの OpenTelemetry Protocol (OTLP) と互換性のあるエンドポイント、および Microsoft Agent 365 に同時にテレメトリを送信します。
- 組み込みインストルメンテーション: 追加の構成なしで、HTTP、データベース、Azure SDK、Azure Functionsなどの自動インストルメンテーションを使用します。
- 標準ベース: 業界標準の可観測フレームワークである OpenTelemetry に基づいて構築されます。
- 最小定型文: 1 つのインポートと 1 つの関数呼び出しをアプリケーション エントリ ポイントに追加します。
インストールとコンフィギュレーション
このガイダンスでは、Microsoft OpenTelemetry Distro を使用してアプリケーションに可観測性を追加する方法について説明します。 Distro は、組み込みのインストルメンテーションを使用してトレース、メトリック、ログを自動的に収集し、テレメトリを Azure Monitor、任意の OpenTelemetry Protocol (OTLP) エンドポイント、または Microsoft Agent 365 にエクスポートします。
ライブラリをインストールする
Microsoft OpenTelemetry Distro の使用を開始するには、言語のパッケージ マネージャーを使用して、開発プラットフォームに適したライブラリをインストールします。
コンフィギュレーション
エージェント 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()に渡すことで、エクスポーターの動作をカスタマイズできます。
| Parameter | Description | デフォルト |
|---|---|---|
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 |
コンテキストの伝達
分散エージェント 365 操作全体で可観測性を維持するには、コンテキストを伝達する必要があります。 エージェントとサービスを介してコンテキストを伝達する場合は、要求ライフサイクル全体にわたってトレース、ログ、メトリックが適切に関連付けられていることを確認します。 この相関関係は、エージェント 365 の監視エクスペリエンスを完全かつ効果的にMicrosoftするために必要です。
バゲッジ属性
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
BaggageBuilderからTurnContextを自動的に設定するには、populate パッケージのmicrosoft-opentelemetry ヘルパーを使用します。 このヘルパーは、アクティビティから呼び出し元、エージェント、テナント、チャネル、会話の詳細を自動的に抽出します。
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キュレーションされたインストルメンテーションを組み合わせています。 Distro では、言語と構成に応じて、アプリケーション テレメトリ、インフラストラクチャ テレメトリ、エージェントまたは生成 AI テレメトリを収集できます。
| カテゴリ | 内容 |
|---|---|
| シグナル パイプライン | トレース、メトリック、およびログ。 |
| リソース検出 | サポートされているサービス、ホスト、クラウド、Azureランタイム コンテキスト。 |
| インフラストラクチャのインストルメンテーション | サポートされている HTTP、ASP.NET Core、Azure SDK、データベース クライアント、およびログ 記録フレームワーク。 |
| 生成 AI インストルメンテーション | OpenAI、Azure OpenAI、Semantic Kernel、LangChain、OpenAI Agents SDK、およびエージェント フレームワーク (サポートされている場合)。 |
| エージェントのスコープ(手動) | エージェントの呼び出し、ツールの実行、推論、および出力テレメトリ (サポートされている場合)。 |
| エクスポーターとプロセッサ | Azure Monitor、Microsoft Agent 365、OTLP、コンソール出力、スパン プロセッサ、ログ プロセッサ、メトリック リーダー。 |
インストルメントカバレッジ
| Language | 一般的なアプリケーション インストルメンテーション | 一般的なエージェントと生成型 AI インストルメンテーション |
|---|---|---|
| Python | OpenTelemetry リソース、プロセッサ、リーダー、ログ、メトリック、トレース。 | Semantic Kernel、OpenAI Agents SDK、Agent Framework、LangChain、Microsoft Agent 365 Baggage、Microsoft Agent 365 Scopes。 |
| Node.js | HTTP、Azure SDK、Azure Functions、MongoDB、MySQL、PostgreSQL、Redis、Bunyan、Winston。 | OpenAI Agents SDK、LangChain、Microsoft Agent 365 の手荷物、Microsoft Agent 365 のスコープ。 |
| .NET | ASP.NET Core、HttpClient、SQL クライアント、Azure SDK、リソース検出、メトリック、ログ。 | Semantic Kernel、OpenAI、Azure OpenAI、Agent Framework、Microsoft Agent 365 のバゲージ、Microsoft Agent 365 のスコープ。 |
自動インストルメンテーションは、サポートされているライブラリとフレームワークによって出力されたテレメトリ信号をリッスンします。 手動インストルメンテーションは、呼び出し、ツールの実行、推論、非同期出力などのエージェント固有の操作をアプリケーションで記述する必要がある場合に使用されます。
組み込みのインストルメンテーションでカバーされていないテレメトリをアプリケーションが出力するときに、カスタムの OpenTelemetry ソース、メーター、プロセッサ、またはリーダーを追加します。
組み込みのインストルメンテーション ライブラリ
自動インストルメンテーションは、サポートされているフレームワークによって出力されたテレメトリをリッスンし、Distro の OpenTelemetry パイプラインを介して転送します。 エージェントのシナリオでは、インストルメント化されたフレームワークがスパンを作成する前に、テナント ID やエージェント ID などの手荷物を設定します。
| フレームワーク | Python | Node.js | .NET |
|---|---|---|---|
| セマンティック カーネル | サポートされている | サポートしていません | サポートされている |
| OpenAI および OpenAI Agents 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 |
元のスコープが完了した後に必ず記録する必要がある出力。 |
関連するテレメトリを関連付けることができるように、要求内のスコープ間で同じ要求とエージェント ID 値を再利用します。
エージェント呼び出し
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="agent@contoso.com",
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:manager@contoso.com"},
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 互換エンドポイントにテレメトリを送信するように Distro を構成します。
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 を使用して、エクスポート バッチごとに機能します。 ディストリビューションでは、3 つの方法がサポートされています。
手動トークン リゾルバー
Agent Framework パイプラインの外部でトークンを取得する場合、またはエージェント フレームワーク以外のアプリをビルドする場合は、手動リゾルバーを使用します。
リゾルバーは 同期である必要があります。 非同期アクティビティ ハンドラーでトークンを取得し、リゾルバー用にキャッシュします。
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 アプリの場合、カスタム IExporterTokenCache<AgenticTokenStruct>を設定しない場合、ディストリビューションは DI 経由でTokenResolverを自動的に登録します。 エージェントは実行時に RegisterObservability() を呼び出して資格情報を提供し、キャッシュはトークンの取得と更新を処理します。
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を実装する必要があります。 次の属性は、各スコープに必須または省略可能です。
InvokeAgentScope
| 属性 | Status |
|---|---|
gen_ai.agent.id |
Required |
gen_ai.agent.name |
Required |
gen_ai.operation.name |
Required |
gen_ai.input.messages |
Required |
gen_ai.output.messages |
Required |
gen_ai.conversation.id |
Required |
microsoft.tenant.id |
Required |
microsoft.a365.agent.blueprint.id |
Required |
microsoft.agent.user.id |
Required |
microsoft.agent.user.email |
Required |
microsoft.channel.name |
Required |
user.id |
Required |
user.email |
Required |
client.address |
Required |
server.address |
Required |
server.port |
Required |
error.type |
Optional |
gen_ai.agent.description |
Optional |
gen_ai.agent.version |
Optional |
microsoft.a365.agent.platform.id |
Optional |
microsoft.channel.link |
Optional |
microsoft.conversation.item.link |
Optional |
microsoft.session.id |
Optional |
microsoft.session.description |
Optional |
user.name |
Optional |
microsoft.a365.caller.agent.id |
Optional |
microsoft.a365.caller.agent.name |
Optional |
microsoft.a365.caller.agent.blueprint.id |
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 |
ExecuteToolScope
| 属性 | Status |
|---|---|
gen_ai.agent.id |
Required |
gen_ai.agent.name |
Required |
gen_ai.operation.name |
Required |
gen_ai.tool.name |
Required |
gen_ai.tool.call.id |
Required |
gen_ai.tool.call.arguments |
Required |
gen_ai.tool.call.result |
Required |
gen_ai.tool.type |
Required |
gen_ai.conversation.id |
Required |
microsoft.tenant.id |
Required |
microsoft.a365.agent.blueprint.id |
Required |
microsoft.agent.user.id |
Required |
microsoft.agent.user.email |
Required |
microsoft.channel.name |
Required |
user.id |
Required |
user.email |
Required |
client.address |
Required |
error.type |
Optional |
gen_ai.agent.description |
Optional |
gen_ai.agent.version |
Optional |
gen_ai.tool.description |
Optional |
microsoft.a365.agent.platform.id |
Optional |
microsoft.channel.link |
Optional |
microsoft.conversation.item.link |
Optional |
microsoft.session.id |
Optional |
microsoft.session.description |
Optional |
server.address |
Optional |
server.port |
Optional |
user.name |
Optional |
InferenceScope
| 属性 | Status |
|---|---|
gen_ai.agent.id |
Required |
gen_ai.agent.name |
Required |
gen_ai.operation.name |
Required |
gen_ai.input.messages |
Required |
gen_ai.output.messages |
Required |
gen_ai.request.model |
Required |
gen_ai.provider.name |
Required |
gen_ai.conversation.id |
Required |
microsoft.tenant.id |
Required |
microsoft.a365.agent.blueprint.id |
Required |
microsoft.agent.user.id |
Required |
microsoft.agent.user.email |
Required |
microsoft.channel.name |
Required |
user.id |
Required |
user.email |
Required |
client.address |
Required |
error.type |
Optional |
gen_ai.agent.description |
Optional |
gen_ai.agent.version |
Optional |
gen_ai.response.finish_reasons |
Optional |
gen_ai.usage.input_tokens |
Optional |
gen_ai.usage.output_tokens |
Optional |
microsoft.a365.agent.platform.id |
Optional |
microsoft.a365.agent.thought.process |
Optional |
microsoft.channel.link |
Optional |
microsoft.conversation.item.link |
Optional |
microsoft.session.id |
Optional |
microsoft.session.description |
Optional |
server.address |
Optional |
server.port |
Optional |
user.name |
Optional |
OutputScope
| 属性 | Status |
|---|---|
gen_ai.agent.id |
Required |
gen_ai.agent.name |
Required |
gen_ai.operation.name |
Required |
gen_ai.output.messages |
Required |
gen_ai.conversation.id |
Required |
microsoft.tenant.id |
Required |
microsoft.a365.agent.blueprint.id |
Required |
microsoft.agent.user.id |
Required |
microsoft.agent.user.email |
Required |
microsoft.channel.name |
Required |
user.id |
Required |
user.email |
Required |
client.address |
Required |
gen_ai.agent.description |
Optional |
gen_ai.agent.version |
Optional |
microsoft.a365.agent.platform.id |
Optional |
microsoft.channel.link |
Optional |
microsoft.conversation.item.link |
Optional |
microsoft.session.id |
Optional |
microsoft.session.description |
Optional |
user.name |
Optional |
可観測性でエージェントをテストする
可観測性を実装した後、テレメトリがキャプチャされていることを確認します。
-
https://admin.cloud.microsoft/#/agents/allにアクセスします。 - エージェントを選択し、[ アクティビティ] を選択します。
- セッションとツール呼び出しが表示されることを確認します。
サンプル アプリケーションと高度な構成
作業サンプルと高度な構成オプションについては、各言語のGitHubリポジトリを参照してください。
Troubleshooting
このセクションでは、Microsoft OpenTelemetry Distro と Agent 365 を実装して使用するときの一般的な問題について説明します。
Tip
Agent 365トラブルシューティングガイドには、Agent 365 の開発ライフサイクルの各段階に対応した高レベルのトラブルシューティング推奨事項、ベストプラクティス、トラブルシューティングコンテンツへのリンクが含まれています。
観測データが表示されません
症状:
- エージェントが走っている
- 管理センターにテレメトリはありません
- エージェントの活動が見えません
根本原因:
- エージェント 365 のエクスポートが有効になっていない
- 構成エラー
- トークンリゾルバの問題
解決策: 問題解決のために以下の手順を試してみてください。
エージェント 365 エクスポートが有効になっていることを確認する
エージェント 365 エクスポーターを明示的に有効にする必要があります。 設定しない場合、ディストリビューションはコンソール エクスポーターにフォールバックしたり、何もエクスポートしない可能性があります。 コードで有効にします。
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=trueNote
ENABLE_A365_OBSERVABILITY_EXPORTERは、コードでenable_a365=Trueが設定されている場合にのみ有効なセカンダリ トグルです。a365_enable_observability_exporterkwarg を使用して制御することもできます。
トークンリゾルバの設定を確認する
エクスポーターには、エクスポート要求ごとにベアラー トークンを返す有効なトークン リゾルバーが必要です。 トークン リゾルバーが見つからないか、
nullを返した場合、エクスポートは自動的にスキップされます。コンソールのエクスポートを有効にし、テレメトリをローカルで確認する
コンソール エクスポーターを追加して、エージェント 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などのメッセージが記録されます。 他のユーザーは、ログを記録せずに削除します。
解決方法:
- エクスポートの前に、ディストリビューション パーティションはテナント ID とエージェント ID ごとにまたがっています。 テナント ID またはエージェント ID がないスパンは削除され、サービスに送信されることはありません。
- スパンを作成する前に、
BaggageBuilderがテナント ID とエージェント ID で設定されていることを確認します。 これらの値は OpenTelemetry コンテキストを通じて伝達され、手荷物スコープ内で作成されたすべてのスパンにアタッチされます。 プラットフォーム固有の API については、「 Baggage 属性」を参照してください。 - ホスティング統合パッケージの手荷物ミドルウェアまたはターン コンテキスト ヘルパーを使用している場合は、
TurnContextアクティビティにエージェント ID を持つ有効な受信者があることを確認します。
トークン解決失敗 - エクスポートがスキップされるか未承認
症状: トークン リゾルバーは null を返すか、エラーをスローします。 プラットフォームによっては、エクスポートが完全にスキップされるか、HTTP 401 で失敗します。
解決方法:
- トークン リゾルバーが必要です。 見つからない場合、エクスポーターは起動時にエラーをスローします。 トークン リゾルバーが提供され、有効なベアラー トークンが返されることを確認します。
- これらの値はトークン リゾルバーに転送されるため、正しいテナント ID とエージェント ID が
BaggageBuilderに渡されていることを確認します。 - Azureホステッド エージェントの場合は、マネージド ID に監視スコープに必要な API アクセス許可があることを確認します。
- Agent Framework ホスティング パッケージを使用する.NET アプリの場合、トークン交換は DI を介して自動的に処理されます。 トークンがない場合は、
Microsoft.Agents.A365.Observability.Hostingがインストールされ、登録されていることを確認します。
HTTP 401 認証されていません
症状: HTTP 401 でエクスポートが失敗する。 エクスポーターはこのエラーを再試行しません。
解決方法:
- トークン対象ユーザーが可観測性エンドポイントスコープと一致するかどうかを確認します。
- トークン リゾルバーが、委任されたユーザー トークン、正しくない対象ユーザーのトークン、または期限切れのトークンを返していないことを確認します。
HTTP 403 Forbidden(アクセス禁止)
症状: HTTP 403 でエクスポートが失敗する。 エクスポーターはこのエラーを再試行しません。
根本原因: HTTP 403 エラーの原因が異なる場合があります。 次の解決策を順番に確認してください。
解決方法:
Missing license — テナントに、Microsoft 365 管理センター 。- Test - Microsoft 365 E7
- Microsoft 365 E7
- Microsoft Agent 365 Frontier
Agent365.Observability.OtelWriteアクセス許可がありません - ID (マネージド ID またはアプリの登録) にこのアクセス許可を付与する必要があります。 これを指定しないと、HTTP 403 でテレメトリのエクスポートが失敗します。次のいずれかのオプションを使用して、アクセス許可を付与します。
Option A — Agent 365 CLI (構成ディレクトリに
a365.config.jsonおよびa365.generated.config.json、グローバル管理者アカウント、Agent 365 CLI v1.1.139-preview以降が必要です)a365 setup admin --config-dir "<path-to-config-dir>"オプション B — 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 429 / 5xx — 一時的なエラー
症状: エクスポートは、429 や 5xx などの一時的な HTTP 状態コードで失敗します。
解決方法:
- 通常、これらのエラーは一時的なものであり、単独で解決されます。 Pythonおよび JavaScript ディストリビューションは、HTTP 408、429、および 5xx 状態コードで自動的に再試行します。 .NET ディストリビューションは自動的に再試行されません。
- エラーが解決しない場合は、サービス正常性ダッシュボードを確認します。
- バッチ間のスケジュールされた遅延を増やすか、最大エクスポート バッチ サイズを増やすことで、エクスポートの頻度を減らすことを検討してください。 Pythonおよび JavaScript の場合は、
GitHub リポジトリ またはパラメーターを使用>。 .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 テーブルを参照してください。
- エクスポートが成功した後、テレメトリの設定には数分かかる場合があります。 さらに調査する前に待ってください。
- スパンに有効な
microsoft.tenant.id属性とgen_ai.agent.id属性が含まれていることを確認します。 ID 属性が見つからないと、HTTP エクスポートから 200 が返された場合でも、サーバー側でスパンが削除されます。