Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Agent 365 dışa aktarıcısı, telemetri verilerini dışa aktarırken kimlik doğrulaması yapmak için bir belirteç çözümleyicisine ihtiyaç duyar. Bu kılavuz, .NET, Python ve Node.js genelinde hem Agent 365 özellikli aracılar hem de özel altyapı aracıları dahil olmak üzere Microsoft 365 Aracıları SDK'sı ile oluşturulan aracılar için kurulumu kapsamaktadır.
Dağıtım kurulumu, genel yapılandırma ve Agent SDK dışındaki senaryolar için Microsoft OpenTelemetry Distro bölümüne bakın.
Genel bakış
Aracı türünüze ve jetonları nasıl elde ettiğine bağlı olarak dört farklı kimlik doğrulama senaryosu bulunmaktadır. Belirteç edinme, Adına (OBO) akışı veya Hizmetten Hizmete (S2S) akışı kullanılarak gerçekleştirilebilir. Kurulumunuza uygun senaryoyu seçin:
| Senaryo | Açıklama |
|---|---|
| OBO kullanılarak Agent 365 etkinleştirildi | Dağıtımın yerleşik AgenticTokenCache öğesi, belirteç edinimini otomatik olarak gerçekleştirir. Özel çözümleyiciye gerek yoktur. Bu, Agent 365 özelliğini kullanan aracılar için önerilen yaklaşımdır. |
| S2S kullanılarak Agent 365 etkinleştirildi | Aracı, aracı kimlik zincirini (getAgenticApplicationToken + Microsoft Kimlik Doğrulama Kitaplıkları (MSAL)) kullanarak bir belirteç edinir. Özel bir TokenResolver gerektirir. OBO kullanılamadığında veya yalnızca uygulama için geçerli belirteçlere ihtiyacınız olduğunda bu yöntemi kullanın. |
| OBO kullanan özel altyapı | Aracı, Azure Bot OAuth aracılığıyla gözlemlenebilirlik API'si kapsamına sahip bir kullanıcı belirteci alır. Özel bir TokenResolver ve bir Azure Bot OAuth bağlantısı gerektirir. |
| S2S kullanan özel motor | Aracı, istemci kimlik bilgilerini kullanarak yalnızca uygulama için geçerli bir belirteç alır. Özel bir TokenResolver gerektirir. Uygulama kayıtları, Standart (aracı temelli olmayan) bir uygulama olmalıdır. |
OBO kullanılarak Agent 365 etkinleştirildi
Agent 365 özellikli aracılar, Agent 365 platformundan aracı kimliği (agenticAppId, agenticUserId) ile istekler alır. OBO ile, dağıtımın yerleşik AgenticTokenCache öğesi belirteç alımını otomatik olarak yönetir: herhangi bir özel belirteç çözümleyicisine gerek yoktur.
Ön koşullar
- Entra uygulama kaydı : İstemci Kimliği, İstemci Gizli Anahtarı ve Kiracı Kimliği içeren bir hizmet sorumlusu (uygulama kayıtları)
-
Temsil edilen API izinleri :
Agent365.Observability.OtelWrite(Temsilci) ekleyin, yönetici onayı verin. Ayrıntılı adımlar için İzin verme bölümüne bakın.
Ayarlar
Her turda, aracınız tur bağlamı ile birlikte RegisterObservability işlevini çağırır. Yerleşik önbellek, bir OBO değişimi gerçekleştirmek ve Agent365.Observability.OtelWrite kapsamlı bir belirteç edinmek için AgenticUserAuthorization işleyicisinden gelen kullanıcının yetkili belirtecini kullanır.
Paketler, yapılandırma ve kod örnekleri de dahil olmak üzere tam kurulum yönergeleri için Agent Framework uygulamaları ile aracı temelli belirteç önbelleğe alma bölümüne bakın.
S2S kullanılarak Agent 365 etkinleştirildi
Agent 365 ile uyumlu aracılar, OBO yerine S2S (hizmetten hizmete) kimlik doğrulamasını da kullanabilir. Aracı, iki aşamalı bir aracı kimlik zinciri aracılığıyla kendi hizmet sorumlusu kimliğini kullanarak bir belirteç alır:
-
getAgenticApplicationToken(tenantId, agentId): istemci kimlik bilgileri + Birleştirilmiş Yönetilen Kimlik (FMI) yolu - Uygulama belirteci olarak
clientAssertionve kapsam olarakapi://9b975845-388f-4429-889e-eab1ef63949c/.defaultkullanan MSALacquireTokenForClient
Not
Birleştirilmiş Yönetilen Kimlik (FMI), yönetilen bir kimliğin birleştirilmiş kimlik bilgileri aracılığıyla iş yükü kimlik federasyonuna katıldığı ve kimlikler arasındaki güven ilişkilerine dayalı olarak jeton alışverişini ve gizli anahtar gerektirmeyen kimlik doğrulamayı etkinleştiren bir mimaridir.
Özel bir TokenResolver sağlamalı ve UseS2SEndpoint = true ayarını yapmalısınız.
Ön koşullar
Entra uygulama kaydı : İstemci Kimliği, İstemci Gizli Anahtarı ve Kiracı Kimliği içeren bir hizmet sorumlusu (uygulama kayıtları)
Uygulama API izinleri :
Agent365.Observability.OtelWrite(Uygulama) ekleme, yönetici onayı vermeAgent365.Observability.OtelWriteuygulama rolü : Aracının hizmet sorumlusuna, Agent365 Gözlemlenebilirlik kaynağı üzerindeOtelWriterolünün atanmış olması gerekir. Agent 365 CLI'sini kullanın:a365 setup permissions bot --config-dir "<path-to-config-dir>"Not
Rol yayma işleminin tamamlanması birkaç dakika sürebilir. Bu süre zarfında, dışa aktarma bitiş noktasından gelen ilk 401 veya 403 hataları beklenmektedir.
1. adım: Ortam yapılandırması
Aşağıdaki kod örnekleri, özel S2S belirteç akışını etkinleştirmeden önce gerekli bağlantı, kiracı, istemci kimlik bilgileri ve gözlemlenebilirlik aktarıcısı ortam ayarlarının nasıl yapılandırılacağını göstermektedir.
AgenticUserAuthorization işleyicisine gerek yok. S2S, gözlemlenebilirlik kaynağına yönelik bir belirteç almak için manuel aracı kimlik zincirini (get_agentic_application_token + MSAL acquire_token_for_client) kullanır.
CONNECTIONSMAP__0__SERVICEURL=*
CONNECTIONSMAP__0__CONNECTION=SERVICE_CONNECTION
CONNECTIONS__SERVICE_CONNECTION__SETTINGS__CLIENTID=<your-client-id>
CONNECTIONS__SERVICE_CONNECTION__SETTINGS__CLIENTSECRET=<your-client-secret>
CONNECTIONS__SERVICE_CONNECTION__SETTINGS__TENANTID=<your-tenant-id>
ENABLE_A365_OBSERVABILITY=true
ENABLE_A365_OBSERVABILITY_EXPORTER=true
2. adım: Dağıtımı özel belirteç çözümleyicisiyle yapılandırma
Aşağıdaki örnekler, Agent 365 dışa aktarma özelliğinin nasıl etkinleştirileceğini ve dışa aktarıcının her aracı ve kiracı için S2S belirteçlerini alabilmesi amacıyla özel bir TokenResolver öğesinin nasıl kaydedileceğini göstermektedir.
from microsoft.opentelemetry import use_microsoft_opentelemetry
_token_cache: dict[str, str] = {}
def token_resolver(agent_id: str, tenant_id: str) -> str | None:
return _token_cache.get(f"{agent_id}:{tenant_id}")
use_microsoft_opentelemetry(
enable_a365=True,
a365_token_resolver=token_resolver,
a365_use_s2s_endpoint=True,
a365_enable_observability_exporter=True,
)
3. adım: S2S belirteçini al ve önbelleğe alma
Gelen her ileti için, aracı kimlik zinciri aracılığıyla S2S belirteçini alın ve çözümleyici için önbelleğe alın.
import asyncio
from msal import ConfidentialClientApplication
from microsoft.opentelemetry.a365.core import BaggageBuilder, InvokeAgentScope, InvokeAgentScopeDetails, Request
OBSERVABILITY_S2S_SCOPE = "api://9b975845-388f-4429-889e-eab1ef63949c/.default"
async def get_agentic_s2s_token(connection, tenant_id: str, agent_id: str) -> str:
# Step 1: Get agentic application token (client_credentials + fmi_path)
app_token = await connection.get_agentic_application_token(tenant_id, agent_id)
if not app_token:
raise ValueError(f"Failed to get agentic app token for agent {agent_id}")
# Step 2: Exchange for observability-scoped token
cca = ConfidentialClientApplication(
client_id=agent_id,
authority=f"https://login.microsoftonline.com/{tenant_id}",
client_credential={"client_assertion": app_token},
)
result = await asyncio.to_thread(
lambda: cca.acquire_token_for_client(scopes=[OBSERVABILITY_S2S_SCOPE])
)
if not result or "access_token" not in result:
raise ValueError(f"Token acquisition failed: {result}")
return result["access_token"]
# In your message handler : use SDK helpers to get agent/tenant from the activity:
@AGENT_APP.activity("message")
async def on_message(context: TurnContext, _state: TurnState):
# get_agentic_instance_id reads from recipient (SDK convention)
agent_id = context.activity.get_agentic_instance_id()
tenant_id = context.activity.get_agentic_tenant_id()
# Acquire S2S token and cache BEFORE creating spans
connection = CONNECTION_MANAGER.get_connection("SERVICE_CONNECTION")
token = await get_agentic_s2s_token(connection, tenant_id, agent_id)
_token_cache[f"{agent_id}:{tenant_id}"] = token
# Wrap spans in BaggageBuilder so the exporter can resolve the token
request = Request(content=user_message, session_id=None)
with BaggageBuilder().tenant_id(tenant_id).agent_id(agent_id).build():
invoke_scope = InvokeAgentScope.start(request, InvokeAgentScopeDetails(), agent_details)
with invoke_scope:
invoke_scope.record_input_messages([user_message])
invoke_scope.record_output_messages([response])
Önemli
S2S için manuel iki adımlı akış (get_agentic_application_token + MSAL acquire_token_for_client) gereklidir.
AgenticUserAuthorization.get_token(), gözlemlenebilirlik kaynağı api://9b975845-.../.default yerine 5a807f24-.../.default (Bot Framework) kapsamındaki bir belirteci döndürür: S2S uç noktası bunu 401 InvalidAudience ile reddeder.
- Etkinlikten aracı ve kiracıyı okumak için
context.activity.get_agentic_instance_id()veget_agentic_tenant_id()kullanın (SDK kuralı gereğirecipientöğesinden okur). - Span oluşturmadan önce S2S belirtecini edinin ve önbelleğe alın. Dışa aktarıcının
BatchSpanProcessoröğesi, işleyici tamamlanmadan önce temizleme işlemi gerçekleştirebilir: Belirteç henüz önbelleğe alınmamışsa dışa aktarma işlemi başarısız olur. - Dışa aktarıcının belirteçleri hangi aracı ve kiracı için çözümleyeceğini bilmesi adına tüm A365 kapsamlarını
BaggageBuilderiçine alın. Herhangi bir sorun olmadığında, "Kiracı/aracı kimlikine sahip aralık bulamadık" mesajıyla aralıklar sessizce kaldırılır.
OBO kullanan özel altyapı
Özel motor aracıları, aracı kimlik zinciri yerine Azure Bot OAuth bağlantıları ile standart uygulama kayıtlarını kullanır. OBO'yu kullanarak, aracı, Bot Framework Belirteç Hizmeti tarafından A365 gözlemlenebilirlik API'si için önceden kapsamı belirlenmiş bir kullanıcı belirtecini Azure Bot OAuth aracılığıyla alır. Tek bir getToken veya GetTurnTokenAsync çağrısı, doğru şekilde kapsamlandırılmış belirteci döndürür; bu nedenle exchangeToken kullanmanıza gerek kalmaz.
Ön koşullar
Entra uygulama kaydı, Temsilci API izinleri ile.
Agent365.Observability.OtelWrite (Temsilci) ekleme ve yönetici onayı verme
Önemli
Belirteç önbelleğindeki agentId, uygulama kaydının İstemci Kimliği ile eşleşmelidir; özel motor aracıları için mevcut olmayan etkinliğin agenticAppId değeriyle değil. Dışarı aktarma URL'si agentId öğesini içerir ve bir uyumsuzluk HTTP 403 hatasına neden olur.
1. adım: Ortam ve uygulama yapılandırması
Aşağıdaki örnekler, hizmet bağlantı değerleri, kiracı ve istemci ayarları ile gerekli yetkilendirme eşlemeleri dahil olmak üzere, uygulamanızı ve çalışma zamanı ortamınızı nasıl yapılandıracağınızı göstermektedir.
# .env
CONNECTIONS__SERVICE_CONNECTION__SETTINGS__CLIENTID=<your-client-id>
CONNECTIONS__SERVICE_CONNECTION__SETTINGS__CLIENTSECRET=<your-client-secret>
CONNECTIONS__SERVICE_CONNECTION__SETTINGS__TENANTID=<your-tenant-id>
CONNECTIONSMAP__0__CONNECTION=SERVICE_CONNECTION
CONNECTIONSMAP__0__SERVICEURL=*
# Auth handler config : TYPE is required, name is uppercased by load_configuration_from_env
AGENTAPPLICATION__USERAUTHORIZATION__HANDLERS__OBOCONNECTIONPROFILE__TYPE=UserAuthorization
AGENTAPPLICATION__USERAUTHORIZATION__HANDLERS__OBOCONNECTIONPROFILE__SETTINGS__AZUREBOTOAUTHCONNECTIONNAME=oboConnectionProfile
AGENTAPPLICATION__USERAUTHORIZATION__HANDLERS__OBOCONNECTIONPROFILE__SETTINGS__SCOPES=api://9b975845-388f-4429-889e-eab1ef63949c/Agent365.Observability.OtelWrite
ENABLE_A365_OBSERVABILITY=true
ENABLE_A365_OBSERVABILITY_EXPORTER=true
Önemli
load_configuration_from_env tüm ortam değişkeni anahtarlarını büyük harfe dönüştürür. İşleyici adı OBOCONNECTIONPROFILE olur ve bu adı auth_handlers ve get_token() çağrılarında tam olarak aynı büyük/küçük harf düzeniyle referans göstermeniz gerekir.
TYPE eksikliği çalışma zamanında Auth handler ... not recognized or not configured hatasına neden olur.
2. adım: OBO için dağıtımı yapılandırma
Aşağıdaki örnekler, Agent 365 dışa aktarma işlemini nasıl etkinleştireceğinizi, dışa aktarıcıyı OBO uç noktasında nasıl tutacağınızı ve dışa aktarma sırasında yetkilendirilmiş belirteçler döndüren özel bir TokenResolver öğesini nasıl kaydedeceğinizi göstermektedir.
from microsoft.opentelemetry import use_microsoft_opentelemetry
_token_cache: dict[str, str] = {}
def token_resolver(agent_id: str, tenant_id: str) -> str | None:
return _token_cache.get(f"{agent_id}:{tenant_id}")
environ["ENABLE_A365_OBSERVABILITY_EXPORTER"] = "true"
use_microsoft_opentelemetry(
enable_a365=True,
a365_token_resolver=token_resolver,
a365_use_s2s_endpoint=False, # OBO uses /observability endpoint
a365_enable_observability_exporter=True,
)
Not
OBO modu, aiohttpApplication üzerinde jwt_authorization_middleware gerektirir (Bot Framework'ten gelen JWT'yi (JSON Web Belirteci) doğrular). S2S/öykünücü yolu bu ara yazılımı içermemelidir.
from microsoft_agents.hosting.aiohttp import jwt_authorization_middleware
app = Application(middlewares=[jwt_authorization_middleware])
3. adım: OBO belirtecini edinme
Aşağıdaki örnekler, yapılandırılmış Azure Bot OAuth bağlantısından yetki devri yoluyla alınmış bir OBO belirtecini nasıl talep edileceğini ve ardından bu belirtecin dışa aktarıcı için uygulama istemcisi ve kiracı bazında önbelleğe nasıl alınacağını göstermektedir.
from microsoft_agents.hosting.core import (
AgentApplication, Authorization, MemoryStorage, TurnContext, TurnState,
)
from microsoft_agents.activity import load_configuration_from_env
from microsoft_agents.authentication.msal import MsalConnectionManager
from microsoft_agents.hosting.aiohttp import CloudAdapter
# Auth handlers are loaded from .env via load_configuration_from_env (see Environment config above)
agents_sdk_config = load_configuration_from_env(environ)
STORAGE = MemoryStorage()
CONNECTION_MANAGER = MsalConnectionManager(**agents_sdk_config)
ADAPTER = CloudAdapter(connection_manager=CONNECTION_MANAGER)
AUTHORIZATION = Authorization(STORAGE, CONNECTION_MANAGER, **agents_sdk_config)
AGENT_APP = AgentApplication[TurnState](
storage=STORAGE, adapter=ADAPTER, authorization=AUTHORIZATION, **agents_sdk_config,
)
CLIENT_ID = environ.get("CONNECTIONS__SERVICE_CONNECTION__SETTINGS__CLIENTID", "")
TENANT_ID = environ.get("CONNECTIONS__SERVICE_CONNECTION__SETTINGS__TENANTID", "")
# Message handler : get_token returns a token already scoped to the observability API.
# The Azure Bot Token Service performs the OBO exchange internally based on the
# OAuth connection's configured scope. No manual MSAL exchange_token call is needed.
@AGENT_APP.activity("message", auth_handlers=["OBOCONNECTIONPROFILE"])
async def on_message(context: TurnContext, _state: TurnState):
token_response = await AGENT_APP.auth.get_token(context, "OBOCONNECTIONPROFILE")
# token_response.token has aud=<a365-observability-app-id>,
# scp=Agent365.Observability.OtelWrite
_token_cache[f"{CLIENT_ID}:{TENANT_ID}"] = token_response.token
Önemli
Azure portal ön koşulu:oboConnectionProfile adlı Azure Bot OAuth bağlantısının Scopes değerinin api://9b975845-388f-4429-889e-eab1ef63949c/Agent365.Observability.OtelWrite olarak ayarlanması gerekir. Bu ayar olmadan, belirtecin kapsamı botun kendi hedef kitlesiyle (api://botid-...) sınırlandırılır ve dışarı aktarma HTTP 401 InvalidAudience hatasıyla başarısız olur.
Not
AGENT_APP.auth.get_token() doğru kapsamdaki belirteci doğrudan döndürür; exchange_token() çağrısı yapılmasına gerek yoktur. OAuth bağlantı kapsamı A365 gözlemlenebilirlik kaynağını hedeflediğinde, Bot Framework Belirteç Hizmeti OBO değişimini yönetir.
S2S kullanan özel motor
Özel motor aracıları, hizmet bağlantısı kimlik bilgilerini kullanarak S2S (istemci kimlik bilgileri) yoluyla yalnızca uygulama için geçerli bir belirteç alabilir. Bu yöntem, standart MSAL istemci kimlik bilgilerini kullanır; aracı kimlik zinciri gerekmez.
Ön koşullar
-
Azure AD uygulama kaydı : Özel altyapı (standart) uygulaması olmalıdır. Agent 365 etkinleştirilmiş uygulama kayıtları, gözlemlenebilirlik kaynağı (
AADSTS82001) için düzclient_credentialskullanamaz. -
Uygulama izinleri :
Agent365.Observability.OtelWrite(Uygulama, Temsili değil) ekleyin ve yönetici onayı verin.
Önemli
önbelleği için kullanılan agentId, ServiceConnection'a ait ClientId olmalıdır. Dışarı aktarma URL'si /observabilityService/tenants/{tenantId}/otlp/agents/{agentId}/traces şeklindedir: uyuşmazlık HTTP 403 hatasına neden olur.
1. adım: Ortam ve uygulama yapılandırması
Aşağıdaki örnekler, hizmet bağlantı değerleri, kiracı ve istemci ayarları ile gerekli yetkilendirme eşlemeleri dahil olmak üzere, uygulamanızı ve çalışma zamanı ortamınızı nasıl yapılandıracağınızı göstermektedir.
# .env
CONNECTIONS__SERVICE_CONNECTION__SETTINGS__CLIENTID=<your-client-id>
CONNECTIONS__SERVICE_CONNECTION__SETTINGS__CLIENTSECRET=<your-client-secret>
CONNECTIONS__SERVICE_CONNECTION__SETTINGS__TENANTID=<your-tenant-id>
CONNECTIONSMAP__0__CONNECTION=SERVICE_CONNECTION
CONNECTIONSMAP__0__SERVICEURL=*
ENABLE_A365_OBSERVABILITY=true
ENABLE_A365_OBSERVABILITY_EXPORTER=true
2. adım: Dağıtımı S2S için yapılandırma
Aşağıdaki örnekler, Agent 365 dışa aktarma özelliğinin nasıl etkinleştirileceğini, dışa aktarıcının S2S uç noktasına nasıl ayarlanacağını ve dışa aktarma sırasında belirteç araması için özel bir TokenResolver öğesinin nasıl kaydedileceğini göstermektedir.
from microsoft.opentelemetry import use_microsoft_opentelemetry
_token_cache: dict[str, str] = {}
def token_resolver(agent_id: str, tenant_id: str) -> str | None:
return _token_cache.get(f"{agent_id}:{tenant_id}")
use_microsoft_opentelemetry(
enable_a365=True,
a365_token_resolver=token_resolver,
a365_use_s2s_endpoint=True, # S2S uses /observabilityService endpoint
a365_enable_observability_exporter=True,
)
3. adım: S2S belirtecini edinme
Aşağıdaki örnekler, hizmet bağlantısı kimlik bilgilerini kullanarak gözlemlenebilirlik kaynağı için yalnızca uygulama erişim belirtecinin nasıl talep edileceğini ve ardından bu belirtecin dışa aktarıcı için aracı ve kiracı bazında önbelleğe nasıl alınacağını göstermektedir.
# Force agentId to ServiceConnection ClientId (custom engine agents have no agenticAppId)
agent_id = os.environ.get("CONNECTIONS__SERVICE_CONNECTION__SETTINGS__CLIENTID")
tenant_id = os.environ.get("CONNECTIONS__SERVICE_CONNECTION__SETTINGS__TENANTID")
connection = CONNECTION_MANAGER.get_connection("SERVICE_CONNECTION")
token = await connection.get_access_token(
resource_url="https://login.microsoftonline.com",
scopes=["api://9b975845-388f-4429-889e-eab1ef63949c/.default"],
)
_token_cache[f"{agent_id}:{tenant_id}"] = token
4. adım: Span dışa aktarmak için bagaj ayarları
Agent365 dışa aktarıcısı, span bağlamında bagaj (kiracı kimliği ve aracı kimliği) bilgilerinin ayarlanmasını gerektirir. Bu olmadan dışa aktarıcı, No spans with tenant/agent identity found. iletisiyle aralıkları sessizce bırakır.
from microsoft.opentelemetry.a365.core import BaggageBuilder, InvokeAgentScope
# Baggage must wrap the span as a context manager
with BaggageBuilder().tenant_id(tenant_id).agent_id(agent_id).build():
invoke_scope = InvokeAgentScope.start(request, InvokeAgentScopeDetails(), agent_details)
with invoke_scope:
invoke_scope.record_input_messages([user_message])
invoke_scope.record_output_messages([response])