Поделиться через


Руководство. Выполнение экспериментов с флагами функций variant (предварительная версия)

Выполнение экспериментов в приложении может помочь вам принять обоснованные решения по улучшению производительности приложения и взаимодействия с пользователем. В этом руководстве вы узнаете, как настроить и выполнить эксперименты в хранилище Конфигурация приложений. Вы узнаете, как собирать и измерять данные, используя возможности Конфигурация приложений, Application Insights (предварительная версия) и рабочую область разделения экспериментов (предварительная версия).

Таким образом, вы можете принимать решения на основе данных для улучшения приложения.

Примечание.

Быстрый способ начать экспериментирование — запустить пример Day AZD. Этот репозиторий содержит полный пример подготовки ресурсов Azure и первого эксперимента по интеграции Конфигурация приложений Azure с приложениями .NET для выполнения экспериментов.

Изучив это руководство, вы:

  • Создание флага функции variant
  • Добавление ресурса Application Insights в магазин
  • Добавление рабочей области разделения экспериментов в магазин
  • Настройка приложения для запуска эксперимента
  • Включение телеметрии и создание эксперимента в флаге функции variant
  • Создание метрик для эксперимента
  • Получение результатов эксперимента

Необходимые компоненты

Создание флага функции variant (предварительная версия)

Создайте флаг функции variant с именем Greeting с двумя вариантами, отключенными и вкл., как описано в кратком руководстве по флагу компонентов.

Подключение ресурса Application Insights (предварительная версия) к хранилищу конфигураций

Чтобы запустить эксперимент, сначала необходимо подключить ресурс Application Insights на основе рабочей области к хранилищу Конфигурация приложений. Подключение этого ресурса к хранилищу Конфигурация приложений задает хранилище конфигурации с источником телеметрии для эксперимента.

  1. В хранилище Конфигурация приложений выберите Telemetry > Application Insights (предварительная версия).

    Снимок экрана: портал Azure, добавление Application Insights в хранилище.

  2. Выберите ресурс Application Insights, который вы хотите использовать в качестве поставщика данных телеметрии для флагов и приложений вариантов, и нажмите кнопку "Сохранить". Если у вас нет ресурса Application Insights, создайте его, нажав кнопку "Создать". Дополнительные сведения о том, как продолжить, перейдите к разделу "Создание ресурса на основе worskpace". Затем снова в Application Insights (предварительная версия) перезагрузите список доступных ресурсов Application Insights и выберите новый ресурс Application Insights.

  3. Уведомление указывает, что ресурс Application Insights был успешно обновлен для хранилища Конфигурация приложений.

Подключение рабочей области split Experimentation (предварительная версия) к хранилищу

Для выполнения экспериментов в Конфигурация приложений Azure вы будете использовать рабочую область разделения экспериментов. Выполните приведенные ниже действия, чтобы подключить рабочую область split Experimentation к хранилищу.

  1. В хранилище Конфигурация приложений выберите рабочую область "Экспериментирование>с разделением экспериментов" (предварительная версия) в меню слева.

    Снимок экрана: портал Azure, добавление рабочей области разделения экспериментов в хранилище Конфигурация приложений.

  2. Выберите рабочую область разделения экспериментов, а затем сохраните. Если у вас нет рабочей области разделения экспериментов, следуйте краткому руководству по созданию рабочей области split Experimentation.

    Примечание.

    Источник данных, выбранный в рабочей области разделения экспериментов, должен совпадать с ресурсом Application Insights, выбранным на предыдущем шаге.

  3. Уведомление указывает, что операция выполнена успешно.

Настройка приложения для запуска эксперимента

Теперь, когда вы подключили ресурс Application Insights (предварительная версия) к хранилищу Конфигурация приложений, настройте приложение для запуска эксперимента (предварительная версия).

В этом примере вы создадите веб-приложение ASP.NET с именем Quote of The Day. При загрузке приложения отображается цитата. Пользователи могут нажать кнопку сердца, чтобы она понравилась. Чтобы улучшить взаимодействие пользователей, необходимо изучить, увеличится ли персонализированное приветствие пользователей, которые любят цитату. Вы создаете флаг функции приветствия в Конфигурация приложений Azure с двумя вариантами, отключенными и вкл. Пользователи, получающие вариант Off , увидят стандартное название. Пользователи, получающие вариант On , получат приветственное сообщение. Вы собираете и сохраняете данные телеметрии взаимодействия пользователей в Application Insights. С помощью рабочей области split Experimentation можно проанализировать эффективность эксперимента.

Создание приложения и добавление секретов пользователей

  1. Откройте командную строку и запустите следующий код. Это создает новое приложение Razor Pages в ASP.NET Core с помощью проверки подлинности отдельных учетных записей и помещает его в выходную папку с именем QuoteOfTheDay.

    dotnet new razor --auth Individual -o QuoteOfTheDay
    
  2. В командной строке перейдите в папку QuoteOfTheDay и выполните следующую команду, чтобы создать секрет пользователя для приложения. Этот секрет содержит строка подключения для Конфигурация приложений.

    dotnet user-secrets set ConnectionStrings:AppConfiguration "<App Configuration Connection string>"
    
  3. Создайте другой секрет пользователя, содержащий строка подключения для Application Insights.

    dotnet user-secrets set ConnectionStrings:AppInsights "<Application Insights Connection string>"
    

Обновление кода приложения

  1. В QuoteOfTheDay.csproj добавьте последнюю предварительную версию пакетов управления функциями и Конфигурация приложений пакеты SDK по мере необходимости.

    <PackageReference Include="Microsoft.Azure.AppConfiguration.AspNetCore" Version="8.0.0-preview.2" />
    <PackageReference Include="Microsoft.FeatureManagement.Telemetry.ApplicationInsights" Version="4.0.0-preview3" />
    <PackageReference Include="Microsoft.FeatureManagement.Telemetry.ApplicationInsights.AspNetCore" Version="4.0.0-preview3" />
    <PackageReference Include="Microsoft.FeatureManagement.AspNetCore" Version="4.0.0-preview3" />
    
  2. В Program.cs в строке var builder = WebApplication.CreateBuilder(args);добавьте поставщик Конфигурация приложений, который извлекает конфигурацию из Azure при запуске приложения. По умолчанию метод UseFeatureFlags включает все флаги компонентов без меток и задает время истечения срока действия кэша в 30 секунд.

    builder.Configuration
        .AddAzureAppConfiguration(o =>
        {
            o.Connect(builder.Configuration.GetConnectionString("AppConfiguration"));
    
            o.UseFeatureFlags();
        });
    
  3. В Program.cs добавьте следующие инструкции using:

    using Microsoft.ApplicationInsights.AspNetCore.Extensions;
    using Microsoft.ApplicationInsights.Extensibility;
    using Microsoft.FeatureManagement.Telemetry.ApplicationInsights.AspNetCore;
    
  4. builder.Configuration.AddAzureAppConfiguration В разделе с именем добавьте:

    // Add Application Insights telemetry.
    builder.Services.AddApplicationInsightsTelemetry(
        new ApplicationInsightsServiceOptions
        {
            ConnectionString = builder.Configuration.GetConnectionString("AppInsights"),
            EnableAdaptiveSampling = false
        })
        .AddSingleton<ITelemetryInitializer, TargetingTelemetryInitializer>();
    

    Этот фрагмент выполняет следующие действия.

    • Добавляет клиент телеметрии Application Insights в приложение.
    • Добавляет инициализатор телеметрии, добавляющий сведения, предназначенные для исходящей телеметрии.
    • Отключает адаптивную выборку. Дополнительные сведения об отключении адаптивной выборки см. в раздел "Устранение неполадок".
  5. В корневой папке QuoteOfTheDay создайте файл с именем ExampleTargetingContextAccessor.cs. При этом создается новый класс с именем ExampleTargetingContextAccessor. Вставьте содержимое ниже в файл.

    using Microsoft.FeatureManagement.FeatureFilters;
    
    namespace QuoteOfTheDay
    {
        public class ExampleTargetingContextAccessor : ITargetingContextAccessor
        {
            private const string TargetingContextLookup = "ExampleTargetingContextAccessor.TargetingContext";
            private readonly IHttpContextAccessor _httpContextAccessor;
    
            public ExampleTargetingContextAccessor(IHttpContextAccessor httpContextAccessor)
            {
                _httpContextAccessor = httpContextAccessor ?? throw new ArgumentNullException(nameof(httpContextAccessor));
            }
    
            public ValueTask<TargetingContext> GetContextAsync()
            {
                HttpContext httpContext = _httpContextAccessor.HttpContext;
                if (httpContext.Items.TryGetValue(TargetingContextLookup, out object value))
                {
                    return new ValueTask<TargetingContext>((TargetingContext)value);
                }
                List<string> groups = new List<string>();
                if (httpContext.User.Identity.Name != null)
                {
                    groups.Add(httpContext.User.Identity.Name.Split("@", StringSplitOptions.None)[1]);
                }
                TargetingContext targetingContext = new TargetingContext
                {
                    UserId = httpContext.User.Identity.Name ?? "guest",
                    Groups = groups
                };
                httpContext.Items[TargetingContextLookup] = targetingContext;
                return new ValueTask<TargetingContext>(targetingContext);
            }
        }
    }
    

    Этот класс объявляет, как целевое назначение FeatureManagement получает контекст для пользователя. В этом случае он считывает httpContext.User.Identity.Name и UserId обрабатывает домен адреса электронной почты как a Group.

  6. Вернитесь к Program.cs и добавьте следующие инструкции using.

    using Microsoft.FeatureManagement.Telemetry;
    using Microsoft.FeatureManagement;
    using QuoteOfTheDay;
    
  7. В этом месте AddApplicationInsightsTelemetry добавьте службы для обработки Конфигурация приложений Обновления, настройки управления функциями, настройки целевого объекта управления функциями и включения управления функциями для публикации событий телеметрии.

    builder.Services.AddHttpContextAccessor();
    
    // Add Azure App Configuration and feature management services to the container.
    builder.Services.AddAzureAppConfiguration()
        .AddFeatureManagement()
        .WithTargeting<ExampleTargetingContextAccessor>()
        .AddTelemetryPublisher<ApplicationInsightsTelemetryPublisher>();
    
  8. В строке var app = builder.Build();добавьте ПО промежуточного слоя, которое запускает обновление Конфигурация приложений при необходимости.

    // Use Azure App Configuration middleware for dynamic configuration refresh.
    app.UseAzureAppConfiguration();
    
  9. В этом разделе добавьте следующий код, чтобы обеспечить TargetingTelemetryInitializer доступ к целевой информации, сохраняя его в HttpContext.

    // Add TargetingId to HttpContext for telemetry
    app.UseMiddleware<TargetingHttpContextMiddleware>();
    
  10. В файле QuoteOfTheDay>Pages>Shared>_Layout.cshtml в разделе, где QuoteOfTheDay.styles.css добавляется, добавьте следующую строку, чтобы добавить css для версии 5.15.3.font-awesome

    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.3/css/all.min.css">
    
  11. Откройте файл QuoteOfTheDay>Pages>Index.cshtml.cs и перезаписать содержимое в приложение цитаты.

    using Microsoft.ApplicationInsights;
    using Microsoft.AspNetCore.Mvc;
    using Microsoft.AspNetCore.Mvc.RazorPages;
    using Microsoft.FeatureManagement;
    
    namespace QuoteOfTheDay.Pages;
    
    public class Quote
    {
        public string Message { get; set; }
    
        public string Author { get; set; }
    }
    
    public class IndexModel(IVariantFeatureManagerSnapshot featureManager, TelemetryClient telemetryClient) : PageModel
    {
        private readonly IVariantFeatureManagerSnapshot _featureManager = featureManager;
        private readonly TelemetryClient _telemetryClient = telemetryClient;
    
        private Quote[] _quotes = [
            new Quote()
            {
                Message = "You cannot change what you are, only what you do.",
                Author = "Philip Pullman"
            }];
    
        public Quote? Quote { get; set; }
    
        public bool ShowGreeting { get; set; }
    
        public async void OnGet()
        {
            Quote = _quotes[new Random().Next(_quotes.Length)];
    
            Variant variant = await _featureManager.GetVariantAsync("Greeting", HttpContext.RequestAborted);
    
            ShowGreeting = variant.Configuration.Get<bool>();
        }
    
        public IActionResult OnPostHeartQuoteAsync()
        {
            string? userId = User.Identity?.Name;
    
            if (!string.IsNullOrEmpty(userId))
            {
                // Send telemetry to Application Insights
                _telemetryClient.TrackEvent("Like");
    
                return new JsonResult(new { success = true });
            }
            else
            {
                return new JsonResult(new { success = false, error = "User not authenticated" });
            }
        }
    }
    

    При PageModel выборе случайной кавычки используется GetVariantAsync для получения варианта для текущего пользователя и задает переменную с именем ShowGreeting значение варианта. Он PageModel также обрабатывает запросы post, вызывая _telemetryClient.TrackEvent("Like");событие, которое отправляет событие в Application Insights с именем Like. Это событие автоматически привязано к пользователю и варианту и может отслеживаться метриками.

  12. Откройте index.cshtml и перезаписать содержимое для приложения-цитаты.

    @page
    @model IndexModel
    @{
        ViewData["Title"] = "Home page";
        ViewData["Username"] = User.Identity.Name;
    }
    
    <style>
        body {
            font-family: Arial, sans-serif;
            background-color: #f4f4f4;
            color: #333;
        }
    
        .quote-container {
            background-color: #fff;
            margin: 2em auto;
            padding: 2em;
            border-radius: 8px;
            max-width: 750px;
            box-shadow: 0px 4px 8px rgba(0, 0, 0, 0.2);
            display: flex;
            justify-content: space-between;
            align-items: start;
            position: relative;
        }
    
        .vote-container {
            position: absolute;
            top: 10px;
            right: 10px;
            display: flex;
            gap: 0em;
        }
    
        .vote-container .btn {
            background-color: #ffffff; /* White background */
            border-color: #ffffff; /* Light blue border */
            color: #333
        }
    
        .vote-container .btn:focus {
            outline: none;
            box-shadow: none;
        }
    
        .vote-container .btn:hover {
            background-color: #F0F0F0; /* Light gray background */
        }
    
        .greeting-content {
            font-family: 'Georgia', serif; /* More artistic font */
        }
    
        .quote-content p.quote {
            font-size: 2em; /* Bigger font size */
            font-family: 'Georgia', serif; /* More artistic font */
            font-style: italic; /* Italic font */
            color: #4EC2F7; /* Medium-light blue color */
        }
    </style>
    
    <div class="quote-container">
        <div class="quote-content">
            @if (Model.ShowGreeting)
            {
                <h3 class="greeting-content">Hi <b>@User.Identity.Name</b>, hope this makes your day!</h3>
            }
            else
            {
                <h3 class="greeting-content">Quote of the day</h3>
            }
            <br />
            <p class="quote">“@Model.Quote.Message”</p>
            <p>- <b>@Model.Quote.Author</b></p>
        </div>
    
        <div class="vote-container">
            <button class="btn btn-primary" onclick="heartClicked(this)">
                <i class="far fa-heart"></i> <!-- Heart icon -->
            </button>
        </div>
    
        <form action="/" method="post">
            @Html.AntiForgeryToken()
        </form>
    </div>
    
    <script>
        function heartClicked(button) {
            var icon = button.querySelector('i');
            icon.classList.toggle('far');
            icon.classList.toggle('fas');
    
            // If the quote is hearted
            if (icon.classList.contains('fas')) {
                // Send a request to the server to save the vote
                fetch('/Index?handler=HeartQuote', {
                    method: 'POST',
                    headers: {
                        'Content-Type': 'application/json',
                        'RequestVerificationToken': document.querySelector('input[name="__RequestVerificationToken"]').value
                    }
                });
            }
        }
    </script>
    

    Этот код соответствует пользовательскому интерфейсу для отображения quoteOfTheDay и обработки с помощью сердечного действия в кавычках. Он использует ранее указанное Model.ShowGreeting значение для отображения различных вещей для разных пользователей в зависимости от их варианта.

Сборка и запуск приложения

  1. В командной строке в папке QuoteOfTheDay выполните следующую dotnet buildкоманду:

  2. Выполните команду dotnet run --launch-profile https.

  3. Найдите сообщение в формате Now listening on: https://localhost:{port} в выходных данных приложения. Перейдите по включенной ссылке в браузере.

  4. После просмотра запущенного приложения нажмите кнопку "Зарегистрировать " в правом верхнем углу, чтобы зарегистрировать нового пользователя.

    Снимок экрана: цитата приложения дня, на котором показана регистрация.

  5. Зарегистрируйте нового пользователя с именем user@contoso.com. Пароль должен содержать не менее шести символов и содержать число и специальный символ.

  6. Щелкните ссылку, чтобы проверить электронную почту после ввода сведений о пользователе.

  7. Зарегистрируйте второго пользователя с именем userb@contoso.com, введите другой пароль и проверьте этот второй адрес электронной почты.

    Примечание.

    Важно использовать эти имена именно в этом руководстве. Пока функция настроена должным образом, два пользователя должны видеть разные варианты.

  8. Выберите "Войти " в правом верхнем углу, чтобы войти в систему в качестве пользователя (userb@contoso.com).

    Снимок экрана: цитата приложения дня, в которой показана **Login**.

  9. После входа в систему вы увидите userb@contoso.com специальное сообщение при просмотре приложения.

    Снимок экрана: цитата приложения дня, показывающая специальное сообщение для пользователя.

    userb@contoso.com — единственный пользователь, который видит специальное сообщение.

Включение телеметрии и создание эксперимента в флаге функции variant

Включите данные телеметрии и создайте эксперимент в флаге функции варианта, выполнив следующие действия:

  1. В хранилище Конфигурация приложений перейдите в Operations>Feature Manager.

  2. Выберите контекстное меню ... справа от флага функции "Приветствие" и нажмите кнопку "Изменить".

    Снимок экрана: портал Azure, изменение флага функции варианта.

  3. Перейдите на вкладку "Телеметрия" и установите флажок Включить телеметрию.

  4. Перейдите на вкладку "Эксперимент" , установите флажок "Создать эксперимент" и присвойте эксперименту имя.

  5. Выберите "Просмотр и обновление", а затем "Обновить".

  6. Уведомление указывает, что операция выполнена успешно. В диспетчере функций флаг функции варианта должен иметь слово "Активный " в разделе "Эксперимент".

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

Метрика в рабочей области split Experimentation — это количественное измерение события, отправленного в Application Insights. Эта метрика помогает оценить влияние флага функции на поведение пользователя и результаты.

При обновлении приложения ранее вы добавили _telemetryClient.TrackEvent("Like") в код приложения. Like — это событие телеметрии, представляющее действие пользователя, в данном случае выбор кнопки "Сердце". Это событие отправляется в ресурс Application Insights, который будет подключаться к метрику, которую вы хотите создать. Созданное приложение указывает только одно событие, но может иметь несколько событий и последующих нескольких метрик. Несколько метрик также могут быть основаны на одном событии Application Insights.

  1. Перейдите к ресурсу рабочей области split Experimentation. В разделе "Метрики экспериментирования конфигурации>" нажмите кнопку "Создать".

  2. Выберите или введите следующие сведения в разделе "Создание метрики экспериментирования" и сохраните его с помощью create.

    Снимок экрана: портал Azure, создание новой метрики экспериментирования.

    Параметр Пример значения Description
    Имя Голосование сердца Имя метрики эксперимента.
    Description Количество людей, которые выбирают кнопку сердца, когда они видят специальное сообщение, и когда они этого не делают. Необязательное описание для метрики.
    Имя события Application Insights Like Имя события Application Insights. Это имя учитывает регистр, и это имя, указанное в коде._telemetryClient.TrackEvent("<Event-Name>")
    Мера как Численность Доступны следующие параметры:
    • Счетчик: подсчитывает количество срабатываний события пользователями.
    • Среднее: среднее значение события для пользователей.
    • Сумма: добавляет значения события для пользователей. Отображает среднее суммированное значение.
    • Процент: вычисляет процент пользователей, которые активировали событие.
    Требуемое влияние Увеличивать Этот параметр представляет собой конечную цель или цель измерения созданной метрики.

    В этом руководстве наша гипотеза заключается в том, что больше пользователей нажимают кнопку с фигурой сердца, когда рядом с цитатой дня есть специальное сообщение. Код приложения отслеживает это событие с именем Like. Приложение отправляет событие Like как телеметрию в Application Insights и требуемое влияние для этого эксперимента, чтобы увидеть увеличение количества щелчков пользователей (измеряется как число) для голосования сердца, чтобы иметь возможность проверить данную гипотезу. Если количество нажатий кнопки уменьшается, несмотря на специальное сообщение, отображаемое выделенной аудитории, то гипотеза является недопустимой для этого эксперимента.

  3. После создания на портале отображается новая метрика. Его можно изменить или удалить, выбрав контекстное меню (...) в правой части экрана.

    Снимок экрана: портал Azure с метрикой эксперимента.

Получение результатов эксперимента

Чтобы поместить новый эксперимент установки в тест и создать результаты для анализа, имитируйте некоторый трафик в приложение и подождите 10–15 минут.

Чтобы просмотреть результаты эксперимента, перейдите к диспетчеру функций и в списке флагов вариантов, щелкните ...> Поэкспериментируйте или выберите активную ссылку в столбце "Эксперимент". Этот столбец по умолчанию не отображается. Чтобы отобразить его, в диспетчере функций выберите "Управление представлением>"Изменить столбцы>>" и "Применить".

На странице результатов по умолчанию выбирается версия эксперимента, базовый план для сравнения результатов и вариант сравнения . При необходимости измените значения по умолчанию на ваш вкус, а затем выберите "Применить ", чтобы просмотреть результат эксперимента.

Снимок экрана: портал Azure с результатом эксперимента.

На снимке экрана выше показано, что эксперимент имел нужный результат, с вариантом On для голосования сердца, что привело к 560,62% больше голосов сердца, чем вариант Off.

Любой измененный флаг функции создает новую версию эксперимента, которую можно выбрать для просмотра результатов.

Примечание.

Чтобы получить результаты экспериментирования, требуется по крайней мере 30 событий на вариант, но мы рекомендуем больше, чем минимальный размер выборки, чтобы убедиться, что экспериментирование создает надежные результаты.

Примечание.

Выборка Application Insights включена по умолчанию и может повлиять на результаты эксперимента. В этом руководстве рекомендуется отключить выборку в Application Insights. Дополнительные сведения о выборке в Application Insights.

Следующий шаг

Дополнительные сведения о концепциях экспериментирования см. в следующем документе.

Для полного запуска функции библиотеки управления функциями .NET перейдите к следующему документу.