Ρύθμιση ελέγχου ταυτότητας παρατηρησιμότητας

Ο εξαγωγέας Agent 365 απαιτεί έναν αναλυτή διακριτικών για έλεγχο ταυτότητας κατά την εξαγωγή τηλεμετρίας. Αυτός ο οδηγός καλύπτει τη ρύθμιση για παράγοντες που έχουν αναπτυχθεί με το SDK παραγόντων Microsoft 365, συμπεριλαμβανομένων τόσο των παραγόντων με υποστήριξη Agent 365 όσο και των προσαρμοσμένων παραγόντων μηχανής σε .NET, Python και Node.js.

Για την εγκατάσταση διανομής, τη γενική ρύθμιση παραμέτρων και τα σενάρια SDK που δεν είναι παράγοντα, ανατρέξτε στο θέμα Microsoft OpenTelemetry Distro.

Επισκόπηση

Υπάρχουν τέσσερα σενάρια ελέγχου ταυτότητας, ανάλογα με τον τύπο του παράγοντα και τον τρόπο απόκτησης των διακριτικών. Η απόκτηση διακριτικών μπορεί να αξιοποιεί τη ροή On-Behalf-Of (OBO) ή Service-to-Service (S2S). Επιλέξτε το σενάριο που ταιριάζει με τη διαμόρφωσή σας:

Σενάριο Περιγραφή
Με δυνατότητα Agent 365 με χρήση OBO Το ενσωματωμένο AgenticTokenCache της διανομής χειρίζεται αυτόματα την απόκτηση διακριτικών. Δεν απαιτείται προσαρμοσμένος μηχανισμός επίλυσης. Αυτή είναι η συνιστώμενη προσέγγιση για παράγοντες με δυνατότητα Agent 365.
Με δυνατότητα Agent 365 με χρήση S2S Ο παράγοντας αποκτά ένα διακριτικό χρησιμοποιώντας την αλυσίδα ταυτότητας παράγοντα (getAgenticApplicationToken + Microsoft Authentication Libraries (MSAL)). Απαιτεί προσαρμοσμένο TokenResolver. Χρησιμοποιήστε αυτήν την προσέγγιση όταν το OBO δεν είναι διαθέσιμο ή χρειάζεστε διακριτικά μόνο για εφαρμογές.
Προσαρμοσμένη μηχανή που χρησιμοποιεί OBO Ο παράγοντας λαμβάνει ένα διακριτικό χρήστη μέσω Azure Bot OAuth, με πεδίο στην παρατηρησιμότητα API. Απαιτεί έναν προσαρμοσμένο TokenResolver και μια σύνδεση Azure Bot OAuth.
Προσαρμοσμένη μηχανή που χρησιμοποιεί S2S Ο παράγοντας αποκτά ένα διακριτικό μόνο για εφαρμογή χρησιμοποιώντας διαπιστευτήρια προγράμματος-πελάτη. Απαιτεί προσαρμοσμένο TokenResolver. Η εγγραφή της εφαρμογής πρέπει να είναι μια τυπική (μη παραγοντική) εφαρμογή.

Με δυνατότητα Agent 365 με χρήση OBO

Οι παράγοντες με δυνατότητα Agent 365 λαμβάνουν αιτήματα με παραγοντική ταυτότητα (agenticAppId, agenticUserId) από την πλατφόρμα Agent 365. Με το OBO, η ενσωματωμένη λειτουργία AgenticTokenCache αναλαμβάνει αυτόματα την απόκτηση διακριτικού: δεν απαιτείται προσαρμοσμένος μηχανισμός επίλυσης διακριτικού.

Προαπαιτούμενα στοιχεία

  • Εγγραφή εφαρμογής Entra : Μια οντότητα κύριας υπηρεσίας (εγγραφή εφαρμογής) με αναγνωριστικό πελάτη, μυστικό κωδικό προγράμματος-πελάτη και αναγνωριστικό μισθωτή
  • Δικαιώματα API με ανάθεση: Προσθέστε το Agent365.Observability.OtelWrite (Με ανάθεση), εκχώρηση συγκατάθεσης διαχειριστή. Για λεπτομερή βήματα, δείτε Εκχώρηση του δικαιώματος.

Πρόγραμμα εγκατάστασης

Σε κάθε κύκλο, ο παράγοντας σας καλεί τη συνάρτηση RegisterObservability με το context του κύκλου. Η ενσωματωμένη cache χρησιμοποιεί το εκχωρημένο διακριτικό του χρήστη από τον χειριστή AgenticUserAuthorization για να πραγματοποιήσει μια αλλαγή OBO αποκτώντας ένα διακριτικό με πεδίο Agent365.Observability.OtelWrite.

Για πλήρεις οδηγίες ρύθμισης, συμπεριλαμβανομένων των πακέτων, της διαμόρφωσης και παραδειγμάτων κώδικα, δείτε το Παραγοντική cache διακριτικού με εφαρμογές Agent Framework.

Με δυνατότητα Agent 365 με χρήση S2S

Οι παράγοντες με ενεργοποιημένο Agent 365 μπορούν επίσης να χρησιμοποιήσουν έλεγχο ταυτότητας S2S (service-to-service) αντί για OBO. Ο παράγοντας αποκτά διακριτικό χρησιμοποιώντας τη δική του ταυτότητα οντότητας κύριας υπηρεσίας μέσω μιας αλυσίδας ταυτότητας δύο βημάτων:

  1. getAgenticApplicationToken(tenantId, agentId) : διακριτικά πελάτη + Federated Managed Identity (FMI) διαδρομή
  2. MSAL acquireTokenForClient με το διακριτικό εφαρμογής ως clientAssertion και πεδίο api://9b975845-388f-4429-889e-eab1ef63949c/.default

Σημείωμα

Η Federated Managed Identity (FMI) είναι μια αρχιτεκτονική όπου μια διαχειριζόμενη ταυτότητα συμμετέχει στην ομοσπονδία ταυτότητας φόρτου εργασίας μέσω ομοσπονδιακών διαπιστευτηρίων ταυτότητας, επιτρέποντας την ανταλλαγή διακριτικών και τον έλεγχο ταυτότητας χωρίς χρήση μυστικών, με βάση τις σχέσεις εμπιστοσύνης μεταξύ ταυτοτήτων.

Πρέπει να παρέχετε ένα προσαρμοσμένο TokenResolver και να ορίσετε UseS2SEndpoint = true.

Προαπαιτούμενα στοιχεία

  • Εγγραφή εφαρμογής Entra : Μια οντότητα κύριας υπηρεσίας (εγγραφή εφαρμογής) με αναγνωριστικό πελάτη, μυστικό κωδικό προγράμματος-πελάτη και αναγνωριστικό μισθωτή

  • Δικαιώματα API εφαρμογής : Προσθήκη Agent365.Observability.OtelWrite (Εφαρμογή), εκχώρηση συγκατάθεσης διαχειριστή

  • Agent365.Observability.OtelWrite ρόλος εφαρμογής : Η οντότητα κύριας υπηρεσίας του παράγοντα πρέπει να έχει τον ρόλο OtelWrite εκχωρημένο στον πόρο Παρατηρησιμότητας Agent 365. Χρησιμοποιήστε το Agent 365 CLI:

    a365 setup permissions bot --config-dir "<path-to-config-dir>"
    

    Σημείωμα

    Η διάδοση του ρόλου μπορεί να διαρκέσει μερικά λεπτά. Κατά τη διάρκεια αυτής της περιόδου αναμένονται αρχικά σφάλματα 401 ή 403 από το σημείο εξαγωγής.

Βήμα 1: Διαμόρφωση περιβάλλοντος

Τα ακόλουθα παραδείγματα κώδικα δείχνουν πώς να ορίσετε τις απαιτούμενες παραμέτρους περιβάλλοντος σύνδεσης, μισθωτή, διαπιστευτηρίων πελάτη και εξαγωγέα παρατηρησιμότητας πριν ενεργοποιήσετε την προσαρμοσμένη ροή S2S διακριτικού.

Δεν απαιτείται χειριστής AgenticUserAuthorization. Το S2S χρησιμοποιεί τη χειροκίνητη παραγοντική αλυσίδα ταυτοτήτων (get_agentic_application_token + MSAL acquire_token_for_client) για να λάβει ένα διακριτικό με πεδίο στον πόρο παρατηρησιμότητας.

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: Διαμορφώστε τη διανομή με προσαρμοσμένο πρόγραμμα επίλυσης διακριτικών

Τα παρακάτω παραδείγματα δείχνουν πώς να ενεργοποιήσετε την εξαγωγή μέσω Agent 365 και να καταχωρίσετε έναν προσαρμοσμένο TokenResolver ώστε ο εξαγωγέας να μπορεί να ανακτήσει S2S διακριτικά για κάθε παράγοντα και μισθωτή.

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: Αποκτήστε και αποθηκεύστε προσωρινά το διακριτικό S2S

Σε κάθε εισερχόμενο μήνυμα, αποκτήστε το S2S token μέσω της αλυσίδας ταυτότητας παράγοντα και αποθηκεύστε το στην προσωρινή μνήμη για τον μηχανισμό επίλυσης.

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])

Σημαντικό

Η χειροκίνητη διαδικασία δύο βημάτων (get_agentic_application_token + MSAL acquire_token_for_client) απαιτείται για το S2S. Το AgenticUserAuthorization.get_token() επιστρέφει ένα διακριτικό με πεδίο στο 5a807f24-.../.default (Bot Framework), όχι στον πόρο παρατηρησιμότητας api://9b975845-.../.default: το σημείο πρόσβασης S2S το απορρίπτει με 401 InvalidAudience.

  • Χρησιμοποιήστε τα context.activity.get_agentic_instance_id() και get_agentic_tenant_id() για να διαβάσετε τον παράγοντα και τον μισθωτή από τη δραστηριότητα (όπως ορίζει το SDK από recipient).
  • Αποκτήστε και αποθηκεύστε στο cache το S2S διακριτικό πριν δημιουργήσετε spans. Ο εξαγωγέας BatchSpanProcessor μπορεί να κάνει flush πριν ολοκληρώσει ο χειριστής. Αν το διακριτικό δεν έχει αποθηκευτεί στην cache ακόμα, η εξαγωγή αποτυγχάνει.
  • Συμπεριλάβετε όλα τα πεδία A365 στο BaggageBuilder ώστε ο εξαγωγέας να γνωρίζει για ποιον παράγοντα και μισθωτή να επιλύσει τα διακριτικά. Χωρίς baggage, τα spans αγνοούνται σιωπηλά με το μήνυμα «Δεν βρέθηκαν spans με ταυτότητα μισθωτή/παράγοντα.»

Προσαρμοσμένη μηχανή που χρησιμοποιεί OBO

Οι παράγοντες προσαρμοσμένης μηχανής χρησιμοποιούν τυπικές εγγραφές εφαρμογών με συνδέσεις Azure Bot OAuth, όχι την παραγοντική αλυσίδα ταυτοτήτων. Χρησιμοποιώντας το OBO, ο παράγοντας λαμβάνει ένα διακριτικό χρήστη μέσω του Azure Bot OAuth που έχει ήδη εμβέλεια στο API παρατηρησιμότητας A365 από την υπηρεσία διακριτικών Bot Framework. Μία μόνο κλήση getToken ή GetTurnTokenAsync επιστρέφει το διακριτικό με τον σωστό σκοπό, επομένως δεν χρειάζεστε exchangeToken.

Προαπαιτούμενα στοιχεία

Εγγραφή εφαρμογής Entra με δικαιώματα API με ανάθεση. Προσθήκη Agent365.Observability.OtelWrite (Πληρεξούσιο) και εκχώρηση συγκατάθεσης διαχειριστή

Σημαντικό

Το agentId στην προσωρινή μνήμη διακριτικών πρέπει να ταιριάζει με το Αναγνωριστικό πελάτη της εγγραφής της εφαρμογής — όχι με το agenticAppId της δραστηριότητας, το οποίο δεν υπάρχει για παράγοντες προσαρμοσμένης μηχανής. Η διεύθυνση URL εξαγωγής περιλαμβάνει το agentId, και μια αναντιστοιχία προκαλεί HTTP 403.

Βήμα 1: Ρύθμιση παραμέτρων περιβάλλοντος και εφαρμογής

Τα παρακάτω παραδείγματα δείχνουν πώς να διαμορφώσετε την εφαρμογή και το περιβάλλον εκτέλεσης, συμπεριλαμβανομένων των τιμών σύνδεσης υπηρεσίας, των ρυθμίσεων μισθωτή και πελάτη, και των απαιτούμενων αντιστοιχίσεων ελέγχου ταυτότητας.

# .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

Σημαντικό

Το load_configuration_from_env μετατρέπει σε κεφαλαία όλα τα κλειδιά των μεταβλητών περιβάλλοντος. Το όνομα του χειριστή γίνεται OBOCONNECTIONPROFILE και πρέπει να το αναφέρετε με αυτό ακριβώς στις κλήσεις auth_handlers και get_token(). Η απουσία του TYPE προκαλεί Auth handler ... not recognized or not configured κατά το χρόνο εκτέλεσης.

Βήμα 2: Ρυθμίστε τις παραμέτρους της διανομής για το OBO

Τα παρακάτω παραδείγματα δείχνουν πώς να ενεργοποιήσετε την εξαγωγή του Agent 365, να διατηρήσετε τον εξαγωγέα στο τελικό σημείο OBO και να καταχωρήσετε έναν προσαρμοσμένο χειριστή TokenResolver που επιστρέφει αντιπροσωπευτικά διακριτικά κατά την εξαγωγή.

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,
)

Σημείωμα

Η λειτουργία OBO απαιτεί jwt_authorization_middleware στο aiohttpApplication (επικυρώνει το εισερχόμενο JWT (JSON Web Token) από το Bot Framework). Η διαδρομή S2S/εξομοιωτή δεν πρέπει να περιλαμβάνει αυτό το ενδιάμεσο λογισμικό.

from microsoft_agents.hosting.aiohttp import jwt_authorization_middleware
app = Application(middlewares=[jwt_authorization_middleware])

Βήμα 3: Αποκτήστε το διακριτικό OBO

Τα παρακάτω παραδείγματα δείχνουν πώς μπορείτε να ζητήσετε ένα ανατεθειμένο διακριτικό OBO από τη ρυθμισμένη σύνδεση Azure Bot OAuth και, στη συνέχεια, να το αποθηκεύσετε στην cache ανά πελάτη εφαρμογής και μισθωτή για τον εξαγωγέα.

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

Σημαντικό

Προαπαιτούμενο πύλης Azure: Η σύνδεση Azure Bot OAuth με όνομα oboConnectionProfile πρέπει να έχει τα πεδία της ρυθμισμένα σε api://9b975845-388f-4429-889e-eab1ef63949c/Agent365.Observability.OtelWrite. Χωρίς αυτήν τη ρύθμιση, το διακριτικό έχει πεδίο στο κοινό του bot (api://botid-...) και η εξαγωγή αποτυγχάνει με HTTP 401 InvalidAudience.

Σημείωμα

Το AGENT_APP.auth.get_token() επιστρέφει απευθείας το διακριτικό με το σωστό πεδίο – δεν χρειάζεται να γίνει κλήση exchange_token(). Η υπηρεσία διακριτικών Bot Framework διαχειρίζεται την ανταλλαγή OBO όταν το πεδίο της σύνδεσης OAuth στοχεύει τον πόρο παρατηρησιμότητας A365.

Προσαρμοσμένη μηχανή που χρησιμοποιεί S2S

Οι παράγοντες προσαρμοσμένου μηχανισμού μπορούν να χρησιμοποιήσουν S2S (διακριτικά πελάτη) για να αποκτήσουν ένα διακριτικό εφαρμογής χρησιμοποιώντας τα διαπιστευτήρια σύνδεσης υπηρεσίας. Αυτή η μέθοδος χρησιμοποιεί τυπικά διαπιστευτήρια προγράμματος-πελάτη MSAL – δεν απαιτείται αλυσίδα ταυτότητας παραγόντων.

Προαπαιτούμενα στοιχεία

  • Καταχώρηση εφαρμογής Azure AD : Πρέπει να είναι μια προσαρμοσμένη μηχανή (standard) εφαρμογή. Οι καταχωρήσεις εφαρμογών με δυνατότητα Agent 365 δεν μπορούν να χρησιμοποιήσουν απλό client_credentials για τον πόρο παρατηρησιμότητας (AADSTS82001).
  • Δικαιώματα εφαρμογής : Προσθέστε Agent365.Observability.OtelWrite (Εφαρμογή, όχι Ανάθεση), και δώστε συγκατάθεση διαχειριστή.

Σημαντικό

Το agentId που χρησιμοποιείται για την προσωρινή αποθήκευση πρέπει να είναι ClientId του ServiceConnection. Η διεύθυνση URL εξαγωγής είναι /observabilityService/tenants/{tenantId}/otlp/agents/{agentId}/traces : μια αναντιστοιχία προκαλεί HTTP 403.

Βήμα 1: Ρύθμιση παραμέτρων περιβάλλοντος και εφαρμογής

Τα παρακάτω παραδείγματα δείχνουν πώς να διαμορφώσετε την εφαρμογή και το περιβάλλον εκτέλεσης, συμπεριλαμβανομένων των τιμών σύνδεσης υπηρεσίας, των ρυθμίσεων μισθωτή και πελάτη, και των απαιτούμενων αντιστοιχίσεων ελέγχου ταυτότητας.

# .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: Ρυθμίστε τις παραμέτρους της διανομής για το S2S

Τα παρακάτω παραδείγματα δείχνουν πώς να ενεργοποιήσετε την εξαγωγή του Agent 365, να ορίσετε τον εξαγωγέα στο τελικό σημείο S2S και να εγγράψετε μια προσαρμοσμένη TokenResolver για αναζήτηση διακριτικού κατά την εξαγωγή.

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: Αποκτήστε το διακριτικό S2S

Τα παρακάτω παραδείγματα δείχνουν πώς να αιτηθείτε ένα διακριτικό πρόσβασης μόνο για εφαρμογές για τον πόρο παρατηρησιμότητας χρησιμοποιώντας τα διαπιστευτήρια σύνδεσης υπηρεσίας και στη συνέχεια να το αποθηκεύσετε στη μνήμη cache ανά παράγοντα και μισθωτή για τον εξαγωγέα.

# 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: Ορίστε το baggage για εξαγωγή span

Ο εξαγωγέας Agent365 απαιτεί να οριστεί το baggage (αναγνωριστικό μισθωτή και αναγνωριστικό παράγοντα) στο πλαίσιο span. Χωρίς αυτό, ο εξαγωγέας απορρίπτει αθόρυβα spans με το μήνυμα No spans with tenant/agent identity found..

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])