Notatka
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Użyj pakietu integracyjnego langchain-azure-ai, aby emitować trasówki OpenTelemetry z aplikacji LangChain i LangGraph oraz wysyłać je do aplikacja systemu Azure Insights. W tym artykule skonfigurujesz AzureAIOpenTelemetryTracer, dołącz je do elementu runnable i sprawdzisz ślady w Azure Monitor.
Tracer emituje zakresy dla wykonywania agenta, wywołań modelu, wykonywania narzędzi i operacji pobierania. Można go używać w przypadku aplikacji, które uruchamiają w pełni lokalne, hybrydowe przepływy wywołujące usługę agenta foundry lub rozwiązania LangGraph z wieloma agentami.
Wymagania wstępne
- Subskrypcja Azure. Utwórz je bezpłatnie.
- Projekt Foundry.
- Wdrożony model czatu Azure OpenAI (na przykład
gpt-4.1). - Python 3.10 lub nowsza.
- Azure CLI jest zalogowane (
az login), więcDefaultAzureCredentialmoże się uwierzytelnić.
Konfigurowanie środowiska
Zainstaluj wymagane pakiety:
pip install -U "langchain-azure-ai[opentelemetry]" azure-identity
Ustaw zmienne środowiskowe używane w tym artykule:
import os
# Option 1: Project endpoint (recommended)
os.environ["FOUNDRY_PROJECT_ENDPOINT"] = (
"https://<resource>.services.ai.azure.com/api/projects/<project>"
)
# Option 2: Direct OpenAI-compatible endpoint + API key
os.environ["OPENAI_BASE_URL"] = (
"https://<resource>.services.ai.azure.com/openai/v1"
)
os.environ["OPENAI_API_KEY"] = "<your-api-key>"
os.environ["APPLICATION_INSIGHTS_CONNECTION_STRING"] = "InstrumentationKey=0ab1c2d3..."
Aby kontrolować, czy zawartość komunikatów i wywołań narzędzi jest zapisywana w śledzeniu, przekaż enable_content_recording do konstruktora AzureAIOpenTelemetryTracer.
Nagrywanie zawartości jest domyślnie włączone.
Wskazówka
Aby wyczyścić zawartość wiadomości i argumenty wywołań narzędzi z zapisów śladowych, ustaw enable_content_recording=False w konstruktorze AzureAIOpenTelemetryTracer.
Tworzenie tracera
Utwórz jedno wystąpienie narzędzia tracer i użyj go ponownie w przepływie pracy.
import os
from azure.identity import DefaultAzureCredential
from langchain_azure_ai.callbacks.tracers import AzureAIOpenTelemetryTracer
tracer = AzureAIOpenTelemetryTracer(
project_endpoint=os.environ["FOUNDRY_PROJECT_ENDPOINT"],
credential=DefaultAzureCredential(),
name="langchain-tracing-sample",
agent_id="support-bot",
trace_all_langgraph_nodes=True,
)
Co robi ten fragment kodu: Konfiguruje narzędzie śledzenia, które ustala powiązany ciąg połączenia dla usługi Application Insights z endpointu projektu Foundry i umożliwia śledzenie węzłów LangGraph. Użyj agent_id parametru, aby ustawić atrybut gen_ai.agent.id podczas wywoływania agentów. Parametr name ustawia nazwę trasera OpenTelemetry.
Program śledzący obsługuje standardowe kontrole dla przepływów pracy w produkcji.
- Przekaż
connection_stringw celu nakierowania na określony zasób usługi Application Insights albo poprzez skonfigurowanie zmiennej środowiskowejAPPLICATION_INSIGHTS_CONNECTION_STRING. - Ustaw wartość
trace_all_langgraph_nodes=True, aby domyślnie śledzić wszystkie węzły. - Użyj metadanych węzła, takich jak
otel_trace: Truelubotel_trace: False, aby uwzględnić lub pominąć określone węzły. - Użyj
message_keysimessage_paths, gdy komunikaty są zagnieżdżone pod niestandardowym kształtem stanu, na przykładchat_history.
Referencja:
Śledzenie agenta
Zacznij od minimalnego agenta LangChain, aby szybko zweryfikować śledzenie. Dla LangGraph, dołącz tracer z with_config na skompilowanym grafie.
from langchain.agents import create_agent
agent = create_agent(
model="azure_ai:gpt-5.2",
system_prompt="You're an informational agent. Answer questions cheerfully.",
).with_config(
{"callbacks": [tracer]}
)
response = agent.invoke({"messages": "what's your name?"})
response["messages"][-1].pretty_print()
================================== Ai Message ==================================
I’m ChatGPT, your AI assistant.
Co robi ten fragment kodu: Tworzy prostego agenta LangGraph, dołącza element tracer i wywołuje agenta z komunikatem.
Referencja:
Śledzenie elementu Runnable LangChain
Zacznij od minimalnego procesu LangChain, aby szybko zweryfikować śledzenie.
import os
from azure.identity import DefaultAzureCredential
from langchain_core.prompts import ChatPromptTemplate
from langchain_azure_ai.chat_models import AzureAIChatCompletionsModel
model = AzureAIChatCompletionsModel(
project_endpoint=os.environ["FOUNDRY_PROJECT_ENDPOINT"],
credential=DefaultAzureCredential(),
model="gpt-4.1",
)
prompt = ChatPromptTemplate.from_template(
"You are concise. Answer in one sentence: {question}"
)
chain = prompt | model
response = chain.invoke(
{"question": "What does OpenTelemetry help me do?"},
config={"callbacks": [tracer]},
)
print(response.content)
OpenTelemetry helps you observe requests, latency, dependencies, and failures across your AI workflow.
Co robi ten fragment kodu: Uruchamia standardowy potok LangChain i wysyła zakresy czatów do biblioteki OpenTelemetry za pośrednictwem polecenia AzureAIOpenTelemetryTracer.
Referencja:
Śledzenie grafu LangGraph
Dla LangGraph, dołącz tracer z with_config na skompilowanym grafie.
Ten fragment kodu ponownie wykorzystuje model i tracer z wcześniejszych przykładów.
from langgraph.graph import END, START, MessagesState, StateGraph
from langgraph.prebuilt import ToolNode
from langgraph.checkpoint.memory import MemorySaver
from langchain_core.tools import tool
from langchain_azure_ai.utils.agents import pretty_print
@tool
def play_song_on_spotify(song: str):
"""Play a song on Spotify"""
# Integrate with Spotify API here.
return f"Successfully played {song} on Spotify!"
@tool
def play_song_on_apple(song: str):
"""Play a song on Apple Music"""
# Integrate with Apple Music API here.
return f"Successfully played {song} on Apple Music!"
tool_node = ToolNode([play_song_on_apple, play_song_on_spotify])
model_with_tools = model.bind_tools([play_song_on_apple, play_song_on_spotify])
def should_continue(state: MessagesState):
messages = state["messages"]
last_message = messages[-1]
return "continue" if getattr(last_message, "tool_calls", None) else "end"
def call_model(state: MessagesState):
messages = state["messages"]
response = model_with_tools.invoke(messages)
return {"messages": [response]}
memory = MemorySaver()
workflow = (
StateGraph(MessagesState)
.add_node("agent", call_model)
.add_node("action", tool_node)
.add_edge(START, "agent")
.add_conditional_edges(
"agent",
should_continue,
{
"continue": "action",
"end": END,
},
)
.add_edge("action", "agent")
.compile(checkpointer=memory)
)
Następnie możesz uruchomić graf w zwykły sposób:
from langchain_core.messages import HumanMessage
config = {"configurable": {"thread_id": "1"}, "callbacks": [tracer]}
message = HumanMessage(content="Can you play Taylor Swift's most popular song?")
result = workflow.invoke({"messages": [message]}, config)
pretty_print(result)
================================ Human Message =================================
Can you play Taylor Swift's most popular song?
================================== Ai Message ==================================
Tool Calls:
play_song_on_spotify (call_xxx)
Call ID: call_xxx
Args:
song: Anti-Hero
================================= Tool Message =================================
Name: play_song_on_spotify
Successfully played Anti-Hero on Spotify!
================================== Ai Message ==================================
I played Taylor Swift's popular song "Anti-Hero" on Spotify.
Co robi ten fragment kodu: Tworzy prostą aplikację LangGraph, oznacza węzeł do śledzenia i emituje invoke_agent i model/narzędzie obejmuje ten sam ślad.
Referencja:
Omówienie struktury śledzenia
Tracer emituje zakresy, które są zgodne z konwencjami semantycznymi OpenTelemetry GenAI.
Każdy typ zakresu używa określonej gen_ai.operation.name wartości:
| Typ zakresu | gen_ai.operation.name |
Opis |
|---|---|---|
| Wywołanie agenta/łańcucha | invoke_agent |
Każdy węzeł LangGraph lub etap łańcucha. Nazwa zakresu to invoke_agent {gen_ai.agent.name}. |
| Wywołanie modelu czatu | chat |
Żądania wnioskowania LLM. Nazwa zakresu to chat {gen_ai.request.model}. |
| Uzupełnianie tekstu | text_completion |
Połączenia LLM bez czatu. |
| Uruchamianie narzędzia | execute_tool |
Wywołania narzędzi wyzwalane przez model. Nazwa zakresu to execute_tool {gen_ai.tool.name}. |
| Retriever | execute_tool |
Operacje pobierania z magazynów wektorów lub wyszukiwania. |
Zakresy mają również następujące kluczowe atrybuty:
-
gen_ai.agent.name— nazwa agenta lub węzła. -
gen_ai.agent.id— zostało ustawione z parametru konstruktoraagent_id. -
gen_ai.agent.description— opis agenta. -
gen_ai.provider.name— dostawca modelu (na przykładopenai). -
gen_ai.request.model— nazwa modelu używana do wnioskowania. -
gen_ai.conversation.id— identyfikator wątku lub sesji, jeśli jest dostępny. -
gen_ai.usage.input_tokens/gen_ai.usage.output_tokens— Liczba tokenów z odpowiedzi modelu. -
gen_ai.input.messages/gen_ai.output.messages— Zawartość wiadomości (po włączeniu rejestrowania zawartości).
Jak narzędzie tracer rozwiązuje problem gen_ai.agent.name
Tracer rozpoznaje nazwę agenta z pierwszej niepustej wartości w następującej kolejności:
-
agent_namew metadanych węzła. -
langgraph_nodew metadanych węzła (automatycznie ustawiane przez LangGraph). -
agent_typew metadanych węzła. - Argument słowa kluczowego
namez wywołania zwrotnego LangChain. -
langgraph_path(ostatni element), jeśli powyższe są uniwersalnymi symbolami zastępczymi. - Serializowany identyfikator łańcucha lub nazwa klasy.
- Parametr
namez konstruktoraAzureAIOpenTelemetryTracer(domyślna wartość rezerwowa).
Jak narzędzie tracer rozwiązuje problem gen_ai.agent.id
Narzędzie tracer rozpoznaje identyfikator agenta z:
-
agent_idw metadanych węzła (nadpisanie na poziomie poszczególnych węzłów). - Parametr konstruktora (wartość domyślna
agent_iddla wszystkich zakresów).
Dostosowywanie atrybutów za pomocą metadanych węzła
Można ustawić agent_name, agent_idi agent_description na węzeł przy użyciu metadanych LangGraph. Każdy klucz metadanych rozpoczynający się od gen_ai. jest również przekazywany jako atrybut span.
config = {
"configurable": {"thread_id": "session-abc-123"},
"callbacks": [tracer],
"metadata": {
"agent_name": "support-bot",
"agent_id": "support-bot-v2",
"agent_description": "Handles customer support requests",
},
}
result = workflow.invoke({"messages": [message]}, config)
W przypadku korzystania z języka LangGraph można również ustawić metadane na węzeł w definicji grafu:
workflow = StateGraph(MessagesState)
workflow.add_node(
"planner",
planner_fn,
metadata={
"agent_name": "PlannerAgent",
"agent_id": "planner-v1",
"otel_agent_span": True,
},
)
Referencja:
Wyświetlanie śladów w Azure Monitor
Ślady są wysyłane do usługi aplikacja systemu Azure Insights i mogą być odpytywane przy użyciu Azure Monitor:
Przejdź do portalu Azure.
Przejdź do skonfigurowanego rozwiązania aplikacja systemu Azure Insights.
Korzystając z lewego paska nawigacyjnego, wybierz pozycję Zbadaj>Agentów (wersja zapoznawcza).
Zobaczysz pulpit nawigacyjny pokazujący wykonania agentów, modeli i narzędzi. Użyj tego widoku, aby zrozumieć ogólną aktywność agentów.
Wybierz Opcję Wyświetl ślady z działaniami agenta. Na panelu bocznym są wyświetlane wszystkie ślady generowane przez przebiegi agenta.
Wybierz jeden ze śladów. Powinieneś zobaczyć szczegóły.
Wyświetlanie śladów w płaszczyźnie sterowania Foundry
Jeśli wdrożyłeś rozwiązanie LangGraph albo LangChain, możesz zarejestrować to wdrożenie w Foundry Control Plane, aby uzyskać wgląd i zarządzanie.
Zarejestruj aplikację w Foundry Control Plane, aby wyświetlić ślady w portalu Foundry.
Wykonaj następujące kroki:
Upewnij się, że spełniasz wymagania dotyczące używania niestandardowej funkcji agenta warstwy kontrolnej Foundry:
Brama sztucznej inteligencji skonfigurowana w zasobie Foundry. Usługa Foundry używa Azure API Management do rejestrowania agentów jako interfejsów API.
Agent, który wdrażasz i udostępniasz za pośrednictwem dostępnego punktu końcowego. Punkt końcowy może być publicznym punktem końcowym lub punktem końcowym dostępnym z sieci, w której wdrażasz zasób foundry.
Upewnij się, że w projekcie skonfigurowano możliwość obserwacji.
Podczas konfigurowania klasy
AzureAIOpenTelemetryTracerupewnij się, że używasz punktu końcowego projektu, na którym ma być zarejestrowany agent. Upewnij się, że skonfigurowałeśagent_id.Przejdź do portalu Foundry.
Na pasku narzędzi wybierz pozycję Obsługa.
W okienku Przegląd wybierz pozycję Zarejestruj agenta.
Zostanie wyświetlony kreator rejestracji. Najpierw wypełnij szczegółowe informacje o agencie, który chcesz zarejestrować.
- Adres URL agenta: punkt końcowy (adres URL), w którym agent jest uruchamiany i odbiera żądania.
- Protokół: protokół komunikacyjny, który obsługuje agent.
-
Identyfikator agenta OpenTelemetry:
agent_idparametr skonfigurowany wAzureAIOpenTelemetryTracerklasie. -
Projekt: projekt, który skonfigurowałeś do odbierania śladów w klasie
AzureAIOpenTelemetryTracer. -
Nazwa agenta: nazwa agenta (może być taka sama jak
agent_id).
Wywołaj agenta, aby upewnić się, że został uruchomiony.
Na pasku narzędzi wybierz pozycję Obsługa.
W okienku po lewej stronie wybierz pozycję Zasoby.
Wybierz utworzonego agenta.
Sekcja Ślady zawiera jeden wpis dla każdego wywołania HTTP wykonanego do punktu końcowego agenta.
Aby wyświetlić szczegóły, wybierz wpis.
Rozwiązywanie problemów
- Jeśli żadne ślady nie są wyświetlane, sprawdź, czy
connection_stringjest skonfigurowany lub punkt końcowy projektu uwidacznia dane telemetryczne. - Jeśli zawartość komunikatu zostanie zasłonięta, ustaw
enable_content_recording=TruewAzureAIOpenTelemetryTracerkonstruktorze. - Jeśli brakuje niektórych węzłów LangGraph, ustaw
trace_all_langgraph_nodes=Truelub dodaj metadane węzłaotel_trace: True.