Руководство по мониторингу мультиагентного приложения в службе приложений с помощью OpenTelemetry и Application Insights (.NET)

В этом руководстве вы развернете многоагентное приложение для планирования путешествий в Служба приложений Azure, настроите его инструментирование с помощью OpenTelemetry и семантических соглашений OpenTelemetry для генеративного ИИ, а затем будете использовать панель AI (предварительная версия) в App Service, а также представление Agents (предварительная версия) в Application Insights для мониторинга метрик по каждому агенту.

Пример построен с помощью Microsoft Agent Framework и использует Azure OpenAI в качестве серверной части модели. Агент-координатор делегирует пять специалистов (погода, валюта, бюджет, местные знания и маршрут). После развертывания и запуска приложения данные телеметрии по каждому агенту автоматически агрегируются в портале:

Снимок экрана: вкладка агентов ИИ службы приложений (предварительная версия) с именами агентов, вызовами, маркерами и скоростью ошибок для каждого агента.

В этом руководстве вы узнаете, как:

  • Разверните многоагентное приложение ASP.NET Core вместе с ресурсом Application Insights и развертыванием Azure OpenAI.
  • Настройте дистрибутив OpenTelemetry для Azure Monitor в своем приложении.
  • Включите семантические соглашения OpenTelemetry GenAI в Microsoft Agent Framework, чтобы передавались атрибуты каждого агента.
  • Просматривайте метрики для каждого агента на вкладке AI службы приложений (предварительная версия)Агенты.
  • Перейдите к представлению Agents (preview) в Application Insights, чтобы просматривать вызовы инструментов, потребление токенов и трассировки.
  • Устранение распространенных причин, по которым вкладка "Агенты" пуста.

Необходимые условия

1. Получение примера

git clone https://github.com/Azure-Samples/multi-agent-travel-planner-dotnet.git
cd multi-agent-travel-planner-dotnet

Репозиторий организован так, что интеграцию OpenTelemetry и определения агентов легко найти:

.
├── azure.yaml                        # azd config (App Service host)
├── infra/                            # Bicep: App Service plan, Web App, App Insights, Azure OpenAI
└── src/MultiAgentTravelPlanner/
    ├── Program.cs                    # OpenTelemetry distro + agent registration
    ├── Agents/AgentCatalog.cs        # Coordinator + 5 specialist agents
    ├── Tools/TravelTools.cs          # Function tools the agents call
    └── wwwroot/index.html            # Minimal chat UI

2. Развертывание с помощью azd

azd auth login
azd up

azd up запрашивает имя среды, подписку Azure и регион. Затем он подготавливает:

  • План службы приложений Linux (P0v3) и веб-приложение .NET 9 с управляемой идентификацией, назначаемой системой.
  • Рабочая область Log Analytics и ресурс Application Insights на основе рабочей области. Строка подключения задается в веб-приложении как APPLICATIONINSIGHTS_CONNECTION_STRING.
  • Учетная запись Azure OpenAI с развертыванием gpt-4o. Управляемое удостоверение веб-приложения предоставляется пользователю OpenAI Cognitive Services в учетной записи, чтобы приложение может вызывать модель без ключей.

После завершения azd развертывания выводит URL-адрес веб-приложения. Откройте его и отправьте 3–5 сообщений, чтобы просмотреть данные телеметрии. Рассмотрим пример.

Запланируйте 4-дневную поездку в Лиссабон в июле для двух человек в среднем бюджете. Включите сведения о погоде и курсах валют.

3. Посмотрите на проводку OpenTelemetry

В этом примере связываются три компонента, чтобы вкладка «Агенты» работала:

a. Оберните каждый агент с UseOpenTelemetry.

Microsoft Agent Framework создаёт интервалы gen_ai.* только когда вы оборачиваете агент в оболочку делегирования OpenTelemetryAgent. Самый простой способ — через AsBuilder().UseOpenTelemetry(sourceName). См. Agents/AgentCatalog.cs:

private static AIAgent WithTelemetry(AIAgent agent) =>
    agent.AsBuilder()
        .UseOpenTelemetry(TelemetrySourceName, otel => otel.EnableSensitiveData = true)
        .Build();

AIAgent weather = WithTelemetry(chat.AsAIAgent(
    instructions: "...",
    name: "WeatherAdvisor",
    description: "...",
    tools: [AIFunctionFactory.Create(tools.GetWeatherForecast)]));

Значение агента name попадает в атрибут gen_ai.agent.name , и именно по нему выполняется группировка на вкладке Agents. EnableSensitiveData = true включает добавление содержимого сообщений в спаны (по умолчанию отключено — установите false в рабочей среде или управляйте этим с помощью переменной среды OTEL_INSTRUMENTATION_GENAI_CAPTURE_MESSAGE_CONTENT).

б. Отправьте все в Application Insights с помощью дистрибутива Azure Monitor и подпишитесь на источник событий активности агента.

builder.Services.AddOpenTelemetry()
    .UseAzureMonitor()
    .ConfigureResource(r => r.AddService(serviceName: "multi-agent-travel-planner"))
    .WithTracing(t => t
        .AddSource(AgentCatalog.TelemetrySourceName)
        .AddSource("Microsoft.Extensions.AI*")
        .AddSource("OpenAI*")
        .AddSource("Experimental.OpenAI*")
        .AddSource("Azure.AI.OpenAI*"))
    .WithMetrics(m => m
        .AddMeter(AgentCatalog.TelemetrySourceName)
        .AddMeter("Microsoft.Extensions.AI*")
        .AddMeter("OpenAI*"));

UseAzureMonitor() автоматически считывается APPLICATIONINSIGHTS_CONNECTION_STRING из конфигурации и проводных трассировок, журналов и метрик в Application Insights. Вызовы AddSource и AddMeter регистрируют источники активности и измерители, через которые Microsoft Agent Framework и базовый SDK OpenAI публикуют телеметрию.

Вот и все. Имя и идентификатор каждого агента передаются в каждом спане как gen_ai.agent.name / gen_ai.agent.id, данные об использовании токенов проходят через gen_ai.usage.input_tokens и gen_ai.usage.output_tokens, а вызовы инструментов и модели отображаются как execute_tool и дочерние спаны завершения чата.

Important

Шаблон Bicep в этом примере задаёт ApplicationInsightsAgent_EXTENSION_VERSION=disabled для веб-приложения. Это отключает бескодовое подключение к App Service для .NET, чтобы внутрипроцессный дистрибутив OpenTelemetry для Azure Monitor не конкурировал за одни и те же источники Activity. При инструментировании приложения в коде всегда отключайте агент без кода.

4. Просмотр метрик для каждого агента в Службе приложений

  1. На портале Azure откройте веб-приложение.
  2. В области навигации слева выберите ИИ (предварительная версия).
  3. Перейдите на вкладку "Агенты ".

Вы должны увидеть по одной строке для каждого зарегистрированного агента (Coordinator, WeatherAdvisor, CurrencyConverter, BudgetOptimizer, LocalKnowledge, ItineraryPlanner) с количеством вызовов, токенов и уровнем ошибок за выбранный диапазон дат. Используйте поле поиска, имя агента и фильтры идентификатора агента, чтобы сузить список. Выберите Просмотреть журналы в любой строке, чтобы открыть Application Insights с запросом, ограниченным этим агентом.

Снимок экрана: вкладка

5. Подробнее о Application Insights

Выберите "Вид" в Application Insights в верхней части вкладки "Агенты ". Откроется представление агентов (предварительная версия) в ресурсе Application Insights, подключенном к веб-приложению:

Снимок экрана представления

Здесь вы сможете:

  • Сравните запуски агентов за период времени и посмотрите, у какого агента самый высокий уровень ошибок.
  • Просмотр количества вызовов для каждого инструмента и средних продолжительности вызовов.
  • Разбивка потребления токенов по моделям и по входным и выходным данным.
  • Используйте Просмотреть трассировки с запусками агента или Просмотреть трассировки с ошибками генеративного ИИ, чтобы перейти к соответствующим распределённым трассировкам.

Дополнительные сведения об этом представлении см. в разделе "Агенты" (предварительная версия) в Application Insights.

6. Устранение неполадок

Если вкладка "Агенты " пуста или не завершена, проверьте следующее.

Агенты вообще не указаны.

  • Убедитесь, что ресурс Application Insights веб-приложения подключен. Откройте колонку Application Insights веб-приложения (в разделе "Параметры") и проверьте подключение.
  • Убедитесь, что APPLICATIONINSIGHTS_CONNECTION_STRING присутствует в качестве параметра приложения App Service. Шаблон azd задаёт его автоматически; если вы адаптировали шаблон Bicep, ещё раз проверьте.
  • В приложении убедитесь, что вы вызываете .UseAzureMonitor() и .AddSource("Microsoft.Agents.AI") (а также источники Microsoft.Extensions.AI). Если одно из этих вариантов отсутствует, диапазоны агентов не будут экспортированы.

Агенты отображаются, но токены или вызовы равны нулю.

  • Убедитесь, что каждый агент обёрнут в UseOpenTelemetry в его конструкторе:

    AIAgent agent = chat.AsAIAgent(...)
        .AsBuilder()
        .UseOpenTelemetry("MyAgentSource", o => o.EnableSensitiveData = true)
        .Build();
    

    И что то же имя источника зарегистрировано в конвейере OpenTelemetry с помощью .WithTracing(t => t.AddSource("MyAgentSource")).

  • Вкладка "Агенты" использует атрибуты gen_ai.usage.input_tokens и gen_ai.usage.output_tokens. Проверьте это, выполнив этот запрос в Logs:

    dependencies
    | where timestamp > ago(1h)
    | where customDimensions has "gen_ai.agent.name"
    | project timestamp, name, customDimensions
    | take 20
    

    Вы должны увидеть ключи gen_ai.agent.name, gen_ai.agent.id и gen_ai.usage.* в customDimensions.

Ошибки указывают AuthenticationFailed на Azure OpenAI.

  • Управляемое удостоверение веб-приложения, назначаемое системой, требует роли Cognitive Services OpenAI User в учетной записи Azure OpenAI. Bicep в infra/modules/roles.bicep назначает его. Если вы развернули в другом месте, назначьте роль вручную.

Дискретизация приводит к потере данных.

  • Дистрибутив OpenTelemetry для Azure Monitor по умолчанию применяет адаптивную выборку. Если вы тестируете при низком объёме данных и строки отсутствуют, установите o.SamplingRatio = 1.0f в UseAzureMonitor на время теста.

7. Очистка ресурсов

azd down --purge

Это удаляет группу ресурсов, ресурс App Service, ресурс Application Insights и учётную запись Azure OpenAI, включая ресурсы Azure OpenAI, помеченные как удалённые, поэтому рекомендуется --purge.