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.
Gözlemlenebilirlik, güvenilir ve sürdürülebilir sistemler oluşturmanın önemli bir yönüdür. Agent Framework, gözlemlenebilirlik için yerleşik destek sağlayarak aracılarınızın davranışını izlemenize olanak sağlar.
Bu kılavuz, aracılarınızın nasıl performans sergilediğini anlamanıza ve ortaya çıkabilecek sorunları tanılamanıza yardımcı olmak için Agent Framework ile gözlemlenebilirliği etkinleştirme adımlarını gösterir.
OpenTelemetry Tümleştirmesi
Agent Framework OpenTelemetry ile tümleşir ve daha belirgin olarak Agent Framework , OpenTelemetry GenAI Anlam Kuralları'na göre izlemeler, günlükler ve ölçümler yayar.
Gözlemlenebilirliği Etkinleştir (C#)
Sohbet istemcinizde gözlemlenebilirliği etkinleştirmek için sohbet istemcisini aşağıdaki gibi oluşturmanız gerekir:
// Using the Azure OpenAI client as an example
var instrumentedChatClient = new AzureOpenAIClient(new Uri(endpoint), new DefaultAzureCredential())
.GetChatClient(deploymentName)
.AsIChatClient() // Converts a native OpenAI SDK ChatClient into a Microsoft.Extensions.AI.IChatClient
.AsBuilder()
.UseOpenTelemetry(sourceName: "MyApplication", configure: (cfg) => cfg.EnableSensitiveData = true) // Enable OpenTelemetry instrumentation with sensitive data
.Build();
Uyarı
DefaultAzureCredential geliştirme için uygundur ancak üretimde dikkatli bir şekilde dikkate alınması gerekir. Üretimde gecikme sorunları, istenmeyen kimlik bilgisi yoklama ve geri dönüş mekanizmalarından kaynaklanan olası güvenlik risklerini önlemek için belirli bir kimlik bilgisi (ör ManagedIdentityCredential. ) kullanmayı göz önünde bulundurun.
Aracınızın gözlemlenebilirliğini etkinleştirmek için aracıyı aşağıdaki gibi oluşturmanız gerekir:
var agent = new ChatClientAgent(
instrumentedChatClient,
name: "OpenTelemetryDemoAgent",
instructions: "You are a helpful assistant that provides concise and informative responses.",
tools: [AIFunctionFactory.Create(GetWeatherAsync)]
).WithOpenTelemetry(sourceName: "MyApplication", enableSensitiveData: true); // Enable OpenTelemetry instrumentation with sensitive data
Önemli
Sohbet istemcileriniz ve aracılarınız için gözlemlenebilirliği etkinleştirdiğinizde, özellikle hassas veriler etkinleştirildiğinde yinelenen bilgiler görebilirsiniz. Hem sohbet istemcisi hem de aracı tarafından yakalanan sohbet bağlamı (istemler ve yanıtlar dahil) her iki yayılma alanında da yer alır. Gereksinimlerinize bağlı olarak, yinelenenleri önlemek için yalnızca sohbet istemcisinde veya yalnızca aracıda gözlemlenebilirliği etkinleştirmeyi seçebilirsiniz. LLM ve Aracılar için yakalanan öznitelikler hakkında daha fazla bilgi için bkz. GenAI Anlam Kuralları .
Uyarı
Üretim günlüklerinde ve izlemelerde kullanıcı bilgilerini kullanıma sunma ihtimalinden, yalnızca geliştirme veya test ortamlarında hassas verileri etkinleştirin. Hassas veriler istemleri, yanıtları, işlev çağrısı bağımsız değişkenlerini ve sonuçları içerir.
Konfigürasyon
Artık sohbet istemciniz ve aracınız izlendiğine göre, OpenTelemetry dışarı aktarıcılarını telemetri verilerini istediğiniz arka uçtan gönderecek şekilde yapılandırabilirsiniz.
İzler
İzlemeleri istenen arka uçtan dışarı aktarmak için, uygulama başlangıç kodunuzda OpenTelemetry SDK'sını yapılandırabilirsiniz. Örneğin, izlemeleri bir Azure İzleyici kaynağına aktarmak için:
using Azure.Monitor.OpenTelemetry.Exporter;
using OpenTelemetry;
using OpenTelemetry.Trace;
using OpenTelemetry.Resources;
using System;
var SourceName = "MyApplication";
var applicationInsightsConnectionString = Environment.GetEnvironmentVariable("APPLICATION_INSIGHTS_CONNECTION_STRING")
?? throw new InvalidOperationException("APPLICATION_INSIGHTS_CONNECTION_STRING is not set.");
var resourceBuilder = ResourceBuilder
.CreateDefault()
.AddService(ServiceName);
using var tracerProvider = Sdk.CreateTracerProviderBuilder()
.SetResourceBuilder(resourceBuilder)
.AddSource(SourceName)
.AddSource("*Microsoft.Extensions.AI") // Listen to the Experimental.Microsoft.Extensions.AI source for chat client telemetry.
.AddSource("*Microsoft.Extensions.Agents*") // Listen to the Experimental.Microsoft.Extensions.Agents source for agent telemetry.
.AddAzureMonitorTraceExporter(options => options.ConnectionString = applicationInsightsConnectionString)
.Build();
Tip
Arka ucunuza bağlı olarak, farklı ihracatçılar kullanabilirsiniz. Daha fazla bilgi için OpenTelemetry .NET belgelerine bakın. Yerel geliştirme için Aspire Panosu'nu kullanmayı göz önünde bulundurun.
Metrics
Benzer şekilde, ölçümleri istenen arka uçtan dışarı aktarmak için uygulama başlangıç kodunuzda OpenTelemetry SDK'sını yapılandırabilirsiniz. Örneğin, ölçümleri bir Azure İzleyici kaynağına aktarmak için:
using Azure.Monitor.OpenTelemetry.Exporter;
using OpenTelemetry;
using OpenTelemetry.Metrics;
using OpenTelemetry.Resources;
using System;
var applicationInsightsConnectionString = Environment.GetEnvironmentVariable("APPLICATION_INSIGHTS_CONNECTION_STRING")
?? throw new InvalidOperationException("APPLICATION_INSIGHTS_CONNECTION_STRING is not set.");
var resourceBuilder = ResourceBuilder
.CreateDefault()
.AddService(ServiceName);
using var meterProvider = Sdk.CreateMeterProviderBuilder()
.SetResourceBuilder(resourceBuilder)
.AddSource(SourceName)
.AddMeter("*Microsoft.Agents.AI") // Agent Framework metrics
.AddAzureMonitorMetricExporter(options => options.ConnectionString = applicationInsightsConnectionString)
.Build();
Kayıtlar
Günlükler, kullandığınız günlük çerçevesi aracılığıyla yakalanır, örneğin Microsoft.Extensions.Logging. Günlükleri bir Azure İzleyici kaynağına aktarmak için, günlük sağlayıcısını uygulama başlangıç kodunuzda yapılandırabilirsiniz:
using Azure.Monitor.OpenTelemetry.Exporter;
using Microsoft.Extensions.Logging;
var applicationInsightsConnectionString = Environment.GetEnvironmentVariable("APPLICATION_INSIGHTS_CONNECTION_STRING")
?? throw new InvalidOperationException("APPLICATION_INSIGHTS_CONNECTION_STRING is not set.");
using var loggerFactory = LoggerFactory.Create(builder =>
{
// Add OpenTelemetry as a logging provider
builder.AddOpenTelemetry(options =>
{
options.SetResourceBuilder(resourceBuilder);
options.AddAzureMonitorLogExporter(options => options.ConnectionString = applicationInsightsConnectionString);
// Format log messages. This is default to false.
options.IncludeFormattedMessage = true;
options.IncludeScopes = true;
})
.SetMinimumLevel(LogLevel.Debug);
});
// Create a logger instance for your application
var logger = loggerFactory.CreateLogger<Program>();
Aspire Panosu
Geliştirme sırasında izlemelerinizi ve ölçümlerinizi görselleştirmenin hızlı bir yolu olarak Aspire Panosu'nu kullanmayı göz önünde bulundurun. Daha fazla bilgi için Bkz. Aspire Dashboard belgeleri. Aspire Panosu verileri bir OpenTelemetry Toplayıcısı aracılığıyla alır ve bu verileri izleme sağlayıcınıza aşağıdaki gibi ekleyebilirsiniz:
using var tracerProvider = Sdk.CreateTracerProviderBuilder()
.SetResourceBuilder(resourceBuilder)
.AddSource(SourceName)
.AddSource("*Microsoft.Extensions.AI") // Listen to the Experimental.Microsoft.Extensions.AI source for chat client telemetry.
.AddSource("*Microsoft.Extensions.Agents*") // Listen to the Experimental.Microsoft.Extensions.Agents source for agent telemetry.
.AddOtlpExporter(options => options.Endpoint = new Uri("http://localhost:4317"))
.Build();
Başlangıç Yapmak
Agent Framework deposunda OpenTelemetry'nin etkinleştirildiği bir aracının tam örneğine bakın.
Tip
Çalıştırılabilir örneklerin tamamı için .NET örneklerine bakın.
Bağımlılıklar
Dahil edilen paketler
Python uygulamanızda gözlemlenebilirliği etkinleştirmek için aşağıdaki OpenTelemetry paketleri varsayılan olarak yüklenir:
Ihracatçı
Gereksiz bağımlılıkları ve otomatik izlemeyle ilgili olası sorunları önlemek için varsayılan olarak dışarı verenleri yüklemeyiz . Farklı arka uçlar için çok çeşitli ihracatçılar mevcuttur, böylece ihtiyaçlarınıza en uygun olanları seçebilirsiniz.
gereksinimlerinize göre yüklemek isteyebileceğiniz bazı yaygın ihracatçılar:
- gRPC protokolü desteği için: yükleme
opentelemetry-exporter-otlp-proto-grpc - HTTP protokolü desteği için: yükleme
opentelemetry-exporter-otlp-proto-http - Azure Application Insights için: yükleme
azure-monitor-opentelemetry
Daha fazla dışarı aktarıcı ve izleme paketi bulmak için OpenTelemetry Kayıt Defteri'ni kullanın.
Gözlemlenebilirliği Etkinleştirme (Python)
Gözlemlenebilirliği yapılandırmak için beş desen
Gereksinimlerinize bağlı olarak uygulamanızda gözlemlenebilirliği yapılandırmanın birden çok yolunu belirledik:
1. Standart OpenTelemetry ortam değişkenleri (Önerilen)
En basit yaklaşım: Ortam değişkenleri aracılığıyla her şeyi yapılandırın:
from agent_framework.observability import configure_otel_providers
# Reads OTEL_EXPORTER_OTLP_* environment variables automatically
configure_otel_providers()
Ya da yalnızca konsol verenleri istiyorsanız ortam değişkenini ENABLE_CONSOLE_EXPORTERS ayarlayın:
ENABLE_CONSOLE_EXPORTERS=true
from agent_framework.observability import configure_otel_providers
# Console exporters are enabled via the ENABLE_CONSOLE_EXPORTERS env var
configure_otel_providers()
2. Özel İhracatçılar
İhracatçılar üzerinde daha fazla denetim için bunları kendiniz oluşturun ve öğesine configure_otel_providers()geçirin:
from opentelemetry.exporter.otlp.proto.grpc.trace_exporter import OTLPSpanExporter
from opentelemetry.exporter.otlp.proto.grpc._log_exporter import OTLPLogExporter
from opentelemetry.exporter.otlp.proto.grpc.metric_exporter import OTLPMetricExporter
from agent_framework.observability import configure_otel_providers
# Create custom exporters with specific configuration
exporters = [
OTLPSpanExporter(endpoint="http://localhost:4317", compression=Compression.Gzip),
OTLPLogExporter(endpoint="http://localhost:4317"),
OTLPMetricExporter(endpoint="http://localhost:4317"),
]
# These will be added alongside any exporters from environment variables
configure_otel_providers(exporters=exporters, enable_sensitive_data=True)
3. Üçüncü taraf kurulumu
Birçok üçüncü taraf OpenTelemetry paketinin kendi kurulum yöntemleri vardır. Önce bu yöntemleri kullanabilir, ardından Aracı Çerçevesi izleme kod yollarını etkinleştirmek için çağırabilirsiniz enable_instrumentation() :
from azure.monitor.opentelemetry import configure_azure_monitor
from agent_framework.observability import create_resource, enable_instrumentation
# Configure Azure Monitor first
configure_azure_monitor(
connection_string="InstrumentationKey=...",
resource=create_resource(), # Uses OTEL_SERVICE_NAME, etc.
enable_live_metrics=True,
)
# Then activate Agent Framework's telemetry code paths
# This is optional if ENABLE_INSTRUMENTATION and/or ENABLE_SENSITIVE_DATA are set in env vars
enable_instrumentation(enable_sensitive_data=False)
Langfuse için:
from agent_framework.observability import enable_instrumentation
from langfuse import get_client
langfuse = get_client()
# Verify connection
if langfuse.auth_check():
print("Langfuse client is authenticated and ready!")
# Then activate Agent Framework's telemetry code paths
enable_instrumentation(enable_sensitive_data=False)
4. El ile kurulum
Tam denetim için, dışarı verenleri, sağlayıcıları ve araçları el ile ayarlayabilirsiniz. Uygun hizmet adına ve sürümüne sahip bir kaynak oluşturmak için yardımcı işlevini create_resource() kullanın. El ile izleme hakkında ayrıntılı yönergeler için OpenTelemetry Python belgelerine bakın.
5. Otomatik izleme (sıfır kod)
Uygulamanızı kod değişikliği olmadan otomatik olarak işaretlemek için OpenTelemetry CLI aracını kullanın:
opentelemetry-instrument \
--traces_exporter console,otlp \
--metrics_exporter console \
--service_name your-service-name \
--exporter_otlp_endpoint 0.0.0.0:4317 \
python agent_framework_app.py
Daha fazla bilgi için OpenTelemetry Sıfır kod Python belgelerine bakın .
İzlemeleri ve ölçümleri kullanma
Gözlemlenebilirlik yapılandırıldıktan sonra özel aralıklar veya ölçümler oluşturabilirsiniz:
from agent_framework.observability import get_tracer, get_meter
tracer = get_tracer()
meter = get_meter()
with tracer.start_as_current_span("my_custom_span"):
# do something
pass
counter = meter.create_counter("my_custom_counter")
counter.add(1, {"key": "value"})
Bunlar, varsayılan olarak izleme kitaplığı adı olarak ayarlanmış genel sağlayıcıdan agent_framework bir izleyici veya ölçüm döndüren OpenTelemetry API'sinin sarmalayıcılarıdır.
Ortam değişkenleri
Aşağıdaki ortam değişkenleri Agent Framework gözlemlenebilirliğini denetler:
-
ENABLE_INSTRUMENTATION- Varsayılan değer,falseOpenTelemetry izlemesini etkinleştirmek için olarak ayarlanırtrue. -
ENABLE_SENSITIVE_DATA- Hassas verilerin (istemler, yanıtlar, işlev çağrısı bağımsız değişkenleri ve sonuçlar) günlüğe kaydedilmesini etkinleştirmek için varsayılan olarakfalseayarlanırtrue. Hassas verileri kullanıma sunma ihtimaline karşı bu ayara dikkat edin. -
ENABLE_CONSOLE_EXPORTERS- Varsayılan olarak,falsetelemetri için konsol çıkışını etkinleştirmek üzere olarak ayarlanırtrue. -
VS_CODE_EXTENSION_PORT- AI Toolkit veya Azure AI Foundry VS Code uzantısı tümleştirmesi için bağlantı noktası.
Uyarı
Hassas bilgiler istemleri, yanıtları ve daha fazlasını içerir ve yalnızca geliştirme veya test ortamlarında etkinleştirilmelidir. Hassas verileri kullanıma sunma ihtimaline karşı bunu üretim ortamında etkinleştirmeniz önerilmez.
Standart OpenTelemetry ortam değişkenleri
İşlev, configure_otel_providers() standart OpenTelemetry ortam değişkenlerini otomatik olarak okur:
OTLP Yapılandırması (Aspire Panosu, Jaeger vb. için):
-
OTEL_EXPORTER_OTLP_ENDPOINT- Tüm sinyaller için temel uç nokta (örn.http://localhost:4317) -
OTEL_EXPORTER_OTLP_TRACES_ENDPOINT- İzlemelere özgü uç nokta (temeli geçersiz kılar) -
OTEL_EXPORTER_OTLP_METRICS_ENDPOINT- Ölçümlere özgü uç nokta (temeli geçersiz kılar) -
OTEL_EXPORTER_OTLP_LOGS_ENDPOINT- Günlüklere özgü uç nokta (temeli geçersiz kılar) -
OTEL_EXPORTER_OTLP_PROTOCOL- Kullanılacak protokol (grpcveyahttp, varsayılanı:grpc) -
OTEL_EXPORTER_OTLP_HEADERS- Tüm sinyaller için üst bilgiler (örn.key1=value1,key2=value2)
Hizmet Kimliği:
-
OTEL_SERVICE_NAME- Hizmet adı (varsayılan:agent_framework) -
OTEL_SERVICE_VERSION- Hizmet sürümü (varsayılan: paket sürümü) -
OTEL_RESOURCE_ATTRIBUTES- Ek kaynak öznitelikleri
Daha fazla ayrıntı için OpenTelemetry belirtimlerine bakın.
Microsoft Foundry kurulumu
Microsoft Foundry, yayma alanlarınıza yönelik görselleştirmelerle izleme için yerleşik desteğe sahiptir.
Foundry'nizin bir Azure İzleyici örneğiyle yapılandırıldığından emin olun, ayrıntılara bakın
azure-monitor-opentelemetry Paketi yükleyin:
pip install azure-monitor-opentelemetry
Gözlemlenebilirliği doğrudan öğesinden AzureAIClientyapılandırın:
Azure AI Foundry projeleri için gözlemlenebilirliği doğrudan içinden AzureAIClientyapılandırabilirsiniz:
from agent_framework.azure import AzureAIClient
from azure.ai.projects.aio import AIProjectClient
from azure.identity.aio import AzureCliCredential
async def main():
async with (
AzureCliCredential() as credential,
AIProjectClient(endpoint="https://<your-project>.foundry.azure.com", credential=credential) as project_client,
AzureAIClient(project_client=project_client) as client,
):
# Automatically configures Azure Monitor with connection string from project
await client.configure_azure_monitor(enable_live_metrics=True)
Tip
için client.configure_azure_monitor() bağımsız değişkenleri paketinden configure_azure_monitor() temel alınan azure-monitor-opentelemetry işleve geçirilir. Ayrıntılar için belgelere bakın; bağlantı dizesini ve kaynağı ayarlama işlemini üstleniriz.
Azure İzleyici'yi yapılandırın ve isteğe bağlı olarak izleme özelliğini etkinleştirin:
Application Insights ile Azure dışı yapay zeka projeleri için, Foundry'de özel bir aracı oluşturduğunuzdan emin olun, ayrıntılara bakın.
Ardından aracınızı Foundry'de kayıtlı openTelemetry aracı kimliğiyle çalıştırın ve azure izleyicisini aşağıdaki gibi yapılandırın:
from azure.monitor.opentelemetry import configure_azure_monitor
from agent_framework.observability import create_resource, enable_instrumentation
configure_azure_monitor(
connection_string="InstrumentationKey=...",
resource=create_resource(),
enable_live_metrics=True,
)
# optional if you do not have ENABLE_INSTRUMENTATION in env vars
enable_instrumentation()
# Create your agent with the same OpenTelemetry agent ID as registered in Foundry
agent = Agent(
chat_client=...,
name="My Agent",
instructions="You are a helpful assistant.",
id="<OpenTelemetry agent ID>"
)
# use the agent as normal
Aspire Panosu
Azure kurulumu olmadan yerel geliştirme için Docker aracılığıyla yerel olarak çalışan ve mükemmel bir telemetri görüntüleme deneyimi sağlayan Aspire Panosu'nu kullanabilirsiniz.
Docker ile Aspire Panosu'nu ayarlama
# Pull and run the Aspire Dashboard container
docker run --rm -it -d \
-p 18888:18888 \
-p 4317:18889 \
--name aspire-dashboard \
mcr.microsoft.com/dotnet/aspire-dashboard:latest
Bu komut panoyu şu komutla başlatır:
- Web Kullanıcı Arabirimi: Şu konumda kullanılabilir: http://localhost:18888
-
OTLP uç noktası: Uygulamalarınızın telemetri verilerini göndermesi için adresinde
http://localhost:4317kullanılabilir
Uygulamanızı yapılandırma
Aşağıdaki ortam değişkenlerini ayarlayın:
ENABLE_INSTRUMENTATION=true
OTEL_EXPORTER_OTLP_ENDPOINT=http://localhost:4317
Veya bunları dosyanıza .env ekleyin ve örneğinizi çalıştırın.
Örneğinizin çalışması tamamlandıktan sonra, telemetri verilerini görmek için bir web tarayıcısında adresine gidin http://localhost:18888 . Panoda kimlik doğrulaması yapmak ve izlemelerinizi, günlüklerinizi ve ölçümlerinizi keşfetmeye başlamak için Aspire Dashboard araştırma kılavuzunu izleyin.
Yayılma alanları ve ölçümler
Her şey ayarlandıktan sonra, sizin için otomatik olarak oluşturulan span'ları ve ölçümleri görmeye başlayacaksınız, yayılma alanları şunlardır:
-
invoke_agent <agent_name>: Bu, her aracı çağrısı için en üst düzey yayılma alanıdır, alt öğe olarak diğer tüm yayılma aralıklarını içerir. -
chat <model_name>: Aracı temel sohbet modelini çağırdığında bu yayılma alanı oluşturulur, istem ve yanıtı öznitelik olarak (olarak ayarlanırsaenable_sensitive_dataTrue) içerir. -
execute_tool <function_name>: Aracı bir işlev aracını çağırdığında bu yayılma alanı oluşturulur, olarak ayarlanırsaenable_sensitive_dataTrueişlev bağımsız değişkenlerini ve sonucu öznitelik olarak içerir.
Oluşturulan ölçümler şunlardır:
Sohbet istemcisi ve
chatişlemleri için:-
gen_ai.client.operation.duration(histogram): Bu ölçüm her işlemin süresini saniye cinsinden ölçer. -
gen_ai.client.token.usage(histogram): Bu ölçüm belirteç kullanımını belirteç sayısı olarak ölçer.
-
İşlemler sırasında işlev çağırma için
execute_tool:-
agent_framework.function.invocation.duration(histogram): Bu ölçüm, her işlev yürütmesinin süresini saniye cinsinden ölçer.
-
Örnek izleme çıkışı
Gözlemlenebilirlik etkinleştirilmiş bir aracı çalıştırdığınızda, aşağıdaki konsol çıkışına benzer izleme verileri görürsünüz:
{
"name": "invoke_agent Joker",
"context": {
"trace_id": "0xf2258b51421fe9cf4c0bd428c87b1ae4",
"span_id": "0x2cad6fc139dcf01d",
"trace_state": "[]"
},
"kind": "SpanKind.CLIENT",
"parent_id": null,
"start_time": "2025-09-25T11:00:48.663688Z",
"end_time": "2025-09-25T11:00:57.271389Z",
"status": {
"status_code": "UNSET"
},
"attributes": {
"gen_ai.operation.name": "invoke_agent",
"gen_ai.system": "openai",
"gen_ai.agent.id": "Joker",
"gen_ai.agent.name": "Joker",
"gen_ai.request.instructions": "You are good at telling jokes.",
"gen_ai.response.id": "chatcmpl-CH6fgKwMRGDtGNO3H88gA3AG2o7c5",
"gen_ai.usage.input_tokens": 26,
"gen_ai.usage.output_tokens": 29
}
}
Bu izleme şunları gösterir:
- İzleme ve yayılma tanımlayıcıları: İlgili işlemleri ilişkilendirmek için
- Zamanlama bilgileri: İşlem başlatıldığında ve sona erdiğinde
- Aracı meta verileri: Aracı Kimliği, adı ve yönergeleri
- Model bilgileri: Kullanılan yapay zeka sistemi (OpenAI) ve yanıt kimliği
- Belirteç kullanımı: Maliyet izleme için giriş ve çıkış belirteci sayıları
Samples
Depoda microsoft/agent-framework bu özellikleri gösteren bir dizi örnek vardır. Daha fazla bilgi için gözlemlenebilirlik örnekleri klasörüne bakın. Bu klasör, sıfır kod telemetrisini kullanmaya yönelik örnekler de içerir.
Tam örnek
# Copyright (c) Microsoft. All rights reserved.
import asyncio
from random import randint
from typing import Annotated
from agent_framework import Agent, tool
from agent_framework.observability import configure_otel_providers, get_tracer
from agent_framework.openai import OpenAIChatClient
from opentelemetry.trace import SpanKind
from opentelemetry.trace.span import format_trace_id
from pydantic import Field
"""
This sample shows how you can observe an agent in Agent Framework by using the
same observability setup function.
"""
# NOTE: approval_mode="never_require" is for sample brevity. Use "always_require" in production; see samples/02-agents/tools/function_tool_with_approval.py and samples/02-agents/tools/function_tool_with_approval_and_sessions.py.
@tool(approval_mode="never_require")
async def get_weather(
location: Annotated[str, Field(description="The location to get the weather for.")],
) -> str:
"""Get the weather for a given location."""
await asyncio.sleep(randint(0, 10) / 10.0) # Simulate a network call
conditions = ["sunny", "cloudy", "rainy", "stormy"]
return f"The weather in {location} is {conditions[randint(0, 3)]} with a high of {randint(10, 30)}°C."
async def main():
# calling `configure_otel_providers` will *enable* tracing and create the necessary tracing, logging
# and metrics providers based on environment variables.
# See the .env.example file for the available configuration options.
configure_otel_providers()
questions = ["What's the weather in Amsterdam?", "and in Paris, and which is better?", "Why is the sky blue?"]
with get_tracer().start_as_current_span("Scenario: Agent Chat", kind=SpanKind.CLIENT) as current_span:
print(f"Trace ID: {format_trace_id(current_span.get_span_context().trace_id)}")
agent = Agent(
client=OpenAIChatClient(),
tools=get_weather,
name="WeatherAgent",
instructions="You are a weather assistant.",
id="weather-agent",
)
thread = agent.create_session()
for question in questions:
print(f"\nUser: {question}")
print(f"{agent.name}: ", end="")
async for update in agent.run(
question,
session=thread,
stream=True,
):
if update.text:
print(update.text, end="")
if __name__ == "__main__":
asyncio.run(main())