Включение отладчика моментальных снимков для приложений .NET в Azure Service Fabric, облачных службах и виртуальных машинах

Если приложение ASP.NET или ASP.NET Core выполняется в службе приложение Azure и требует настройки настраиваемого отладчика моментальных снимков или предварительной версии .NET Core, начните с включения отладчика моментальных снимков для приложений .NET в службе приложение Azure.

Если ваше приложение работает в Azure Service Fabric, Azure Cloud Services, Azure Virtual Machines или на локальных машинах, вы можете пропустить включение отладчика моментальных снимков в службе приложений Azure и следовать инструкциям в этой статье.

Предварительные условия

Настройка сбора моментальных снимков для приложений ASP.NET

При добавлении пакета NuGet Microsoft.ApplicationInsights.SnapshotCollector в ваше приложение, SnapshotCollectorTelemetryProcessor автоматически добавляется в раздел TelemetryProcessorsApplicationInsights.config.

Если вы не видите SnapshotCollectorTelemetryProcessor в ApplicationInsights.config, или если вы хотите настроить конфигурацию отладчика моментальных снимков, вы можете изменить её вручную.

Примечание.

Любая конфигурация вручную может перезаписаться при обновлении до более новой версии пакета NuGet Microsoft.ApplicationInsights.SnapshotCollector .

Конфигурация сборщика моментальных снимков по умолчанию выглядит примерно так:

<TelemetryProcessors>
  <Add Type="Microsoft.ApplicationInsights.SnapshotCollector.SnapshotCollectorTelemetryProcessor, Microsoft.ApplicationInsights.SnapshotCollector">
    <!-- The default is true, but you can disable Snapshot Debugging by setting it to false -->
    <IsEnabled>true</IsEnabled>
    <!-- Snapshot Debugging is usually disabled in developer mode, but you can enable it by setting this to true. -->
    <!-- DeveloperMode is a property on the active TelemetryChannel. -->
    <IsEnabledInDeveloperMode>false</IsEnabledInDeveloperMode>
    <!-- How many times we need to see an exception before we ask for snapshots. -->
    <ThresholdForSnapshotting>1</ThresholdForSnapshotting>
    <!-- The maximum number of examples we create for a single problem. -->
    <MaximumSnapshotsRequired>3</MaximumSnapshotsRequired>
    <!-- The maximum number of problems that we can be tracking at any time. -->
    <MaximumCollectionPlanSize>50</MaximumCollectionPlanSize>
    <!-- How often we reconnect to the stamp. The default value is 15 minutes.-->
    <ReconnectInterval>00:15:00</ReconnectInterval>
    <!-- How often to reset problem counters. -->
    <ProblemCounterResetInterval>1.00:00:00</ProblemCounterResetInterval>
    <!-- The maximum number of snapshots allowed in ten minutes.The default value is 1. -->
    <SnapshotsPerTenMinutesLimit>3</SnapshotsPerTenMinutesLimit>
    <!-- The maximum number of snapshots allowed per day. -->
    <SnapshotsPerDayLimit>30</SnapshotsPerDayLimit>
    <!-- Whether or not to collect snapshot in low IO priority thread. The default value is true. -->
    <SnapshotInLowPriorityThread>true</SnapshotInLowPriorityThread>
    <!-- Agree to send anonymous data to Microsoft to make this product better. -->
    <ProvideAnonymousTelemetry>true</ProvideAnonymousTelemetry>
    <!-- The limit on the number of failed requests to request snapshots before the telemetry processor is disabled. -->
    <FailedRequestLimit>3</FailedRequestLimit>
  </Add>
</TelemetryProcessors>

Моментальные снимки собираются только при исключениях, о которых сообщается в Application Insights. В некоторых случаях, как и в более старых версиях платформы .NET, может потребоваться настроить коллекцию исключений для просмотра исключений с моментальными снимками на портале.

Настройка коллекции моментальных снимков для ASP.NET основных приложений или рабочих служб

Предварительные условия

Приложение уже должно ссылаться на один из следующих пакетов NuGet Application Insights:

Добавьте пакет NuGet

Microsoft.ApplicationInsights.SnapshotCollector Добавьте пакет NuGet в приложение.

Обновите коллекцию служб

В коде запуска приложения, где настроены службы, добавьте вызов AddSnapshotCollector метода расширения. Мы рекомендуем добавить эту строку сразу после вызова AddApplicationInsightsTelemetry. Например:

var builder = WebApplication.CreateBuilder(args);

// Add services to the container.
builder.Services.AddApplicationInsightsTelemetry();
builder.Services.AddSnapshotCollector();

Настройка сборщика моментальных снимков

Для большинства сценариев параметры сборщика моментальных снимков по умолчанию достаточны. Однако можно настроить параметры, добавив следующий код перед вызовом AddSnapshotCollector():

using Microsoft.ApplicationInsights.SnapshotCollector;
...
builder.Services.Configure<SnapshotCollectorConfiguration>(builder.Configuration.GetSection("SnapshotCollector"));

Затем добавьте раздел SnapshotCollector в appsettings.json, где вы можете переопределить значения по умолчанию.

Конфигурация сборщика моментальных снимков по умолчанию appsettings.json выглядит примерно так:

{
  "SnapshotCollector": {
    "IsEnabledInDeveloperMode": false,
    "ThresholdForSnapshotting": 1,
    "MaximumSnapshotsRequired": 3,
    "MaximumCollectionPlanSize": 50,
    "ReconnectInterval": "00:15:00",
    "ProblemCounterResetInterval":"1.00:00:00",
    "SnapshotsPerTenMinutesLimit": 1,
    "SnapshotsPerDayLimit": 30,
    "SnapshotInLowPriorityThread": true,
    "ProvideAnonymousTelemetry": true,
    "FailedRequestLimit": 3
  }
}

Если необходимо вручную настроить поведение сборщика моментальных снимков без использования appsettings.json, используйте перегрузку AddSnapshotCollector , которая принимает делегат. Например:

builder.Services.AddSnapshotCollector(config => config.IsEnabledInDeveloperMode = true);

Настройка сбора моментальных снимков для других приложений .NET

Снимки состояния собираются только для исключений, которые сообщаются в Application Insights.

Для приложений ASP.NET и ASP.NET Core пакет SDK Application Insights автоматически сообщает о необработанных исключениях, которые выходят за пределы метода контроллера или обработчика маршрутов конечной точки.

Для других приложений может потребоваться изменить код, чтобы сообщить о них. Код обработки исключений зависит от структуры приложения. Например:

using Microsoft.ApplicationInsights;
using Microsoft.ApplicationInsights.DataContracts;
using Microsoft.ApplicationInsights.Extensibility;

internal class ExampleService
{
  private readonly TelemetryClient _telemetryClient;

  public ExampleService(TelemetryClient telemetryClient)
  {
    // Obtain the TelemetryClient via dependency injection.
    _telemetryClient = telemetryClient;
  }

  public void HandleExampleRequest()
  {
    using IOperationHolder<RequestTelemetry> operation = 
        _telemetryClient.StartOperation<RequestTelemetry>("Example");
    try
    {
      // TODO: Handle the request.
      operation.Telemetry.Success = true;
    }
    catch (Exception ex)
    {
      // Report the exception to Application Insights.
      operation.Telemetry.Success = false;
      _telemetryClient.TrackException(ex);
      // TODO: Rethrow the exception if desired.
    }
  }
}

В следующем примере используется ILogger вместо TelemetryClient. В этом примере предполагается, что вы используете поставщик средств журналирования Application Insights. Как показано в примере, при обработке исключения обязательно передайте исключение в качестве первого параметра LogError.

using Microsoft.Extensions.Logging;

internal class LoggerExample
{
  private readonly ILogger _logger;

  public LoggerExample(ILogger<LoggerExample> logger)
  {
    _logger = logger;
  }

  public void HandleExampleRequest()
  {
    using IDisposable scope = _logger.BeginScope("Example");
    try
    {
      // TODO: Handle the request
    }
    catch (Exception ex)
    {
      // Use the LogError overload with an Exception as the first parameter.
      _logger.LogError(ex, "An error occurred.");
    }
  }
}

По умолчанию логгер Application Insights перенаправляет исключения в отладчик моментальных снимков с помощью ApplicationInsightsLoggerProvider и TelemetryClient.TrackException. Это поведение управляется свойством TrackExceptionsAsExceptionTelemetry класса ApplicationInsightsLoggerOptions .

Если вы зададите TrackExceptionsAsExceptionTelemetry в false при конфигурации журнала Application Insights, приведённый выше пример не инициирует отладчик моментальных снимков. В этом случае измените код для вызова TrackException вручную.