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


Агрегирование и сбор событий с помощью EventFlow

Microsoft Diagnostics EventFlow может направлять события из узла в одно или несколько направлений мониторинга. Поскольку он включен в проект службы в виде пакета NuGet, код и конфигурация EventFlow перемещаются вместе со службой, устраняя проблему конфигурации каждого узла, упомянутую ранее в связи с диагностикой Azure. EventFlow выполняется в процессе службы и подключается непосредственно к настроенным выходным данным. Из-за прямого подключения EventFlow работает для развертываний Azure, контейнеров и локальных служб. Будьте осторожны при запуске EventFlow в сценариях высокой плотности, например, в контейнере, так как каждый конвейер EventFlow делает внешнее соединение. Таким образом, при запуске нескольких процессов вы получаете несколько исходящих подключений! Это не вызывает столько проблем для приложений Service Fabric, так как все реплики ServiceType выполняются в одном и том же процессе, что ограничивает количество исходящих подключений. EventFlow также предлагает фильтрацию событий, чтобы отправлять только события, соответствующие указанному фильтру.

Предупреждение

Application Insights для пакета SDK Service Fabric больше не поддерживается.

Настройка EventFlow

Бинарные файлы EventFlow представлены как набор пакетов NuGet. Чтобы добавить EventFlow в проект службы Service Fabric, щелкните правой кнопкой мыши проект в обозревателе решений и выберите пункт "Управление пакетами NuGet". Перейдите на вкладку "Обзор" и найдите "Diagnostics.EventFlow":

Пакеты NuGet EventFlow в пользовательском интерфейсе диспетчера пакетов NuGet Visual Studio

Вы увидите список различных пакетов, помеченных как "Входные данные" и "Выходные данные". EventFlow поддерживает различные поставщики и анализаторы ведения журнала. Служба размещения EventFlow должна включать соответствующие пакеты в зависимости от источника и места назначения журналов приложений. Помимо основного пакета ServiceFabric, также требуется, чтобы по крайней мере одни входные и выходные параметры были настроены. Например, можно добавить следующие пакеты для отправки событий EventSource в Application Insights:

  • Microsoft.Diagnostics.EventFlow.Inputs.EventSource для сбора данных из класса EventSource службы и стандартных Источников событий, таких как Microsoft-ServiceFabric-Services и Microsoft-ServiceFabric-Actors)
  • Microsoft.Diagnostics.EventFlow.Outputs.ApplicationInsights (мы отправим журналы в ресурс Azure Application Insights)
  • Microsoft.Diagnostics.EventFlow.ServiceFabric(включает инициализацию конвейера EventFlow из конфигурации службы Service Fabric и сообщает о любых проблемах при отправке диагностических данных в виде отчетов о работоспособности Service Fabric)

Примечание.

Microsoft.Diagnostics.EventFlow.Inputs.EventSource Пакету требуется, чтобы проект службы поддерживал .NET Framework 4.6 или более позднюю версию. Перед установкой этого пакета необходимо задать соответствующую целевую платформу в свойствах проекта.

После установки всех пакетов необходимо настроить и включить EventFlow в службе.

Настройка и включение сбора журналов

Конвейер EventFlow, ответственный за отправку журналов, создается из спецификации, хранящейся в файле конфигурации. Пакет Microsoft.Diagnostics.EventFlow.ServiceFabric устанавливает начальный файл конфигурации EventFlow в PackageRoot\Config папке решения с именем eventFlowConfig.json. Этот файл конфигурации необходимо изменить для сбора данных из класса службы EventSource по умолчанию и любых других входных данных, которые необходимо настроить, и отправлять данные в соответствующее место.

Примечание.

Если файл проекта имеет формат VisualStudio 2017, eventFlowConfig.json файл не будет добавлен автоматически. Чтобы устранить эту проблему, создайте файл в папке Config и задайте для действия сборки значение Copy if newer.

Ниже приведен пример eventFlowConfig.json на основе пакетов NuGet, упомянутых выше:

{
  "inputs": [
    {
      "type": "EventSource",
      "sources": [
        { "providerName": "Microsoft-ServiceFabric-Services" },
        { "providerName": "Microsoft-ServiceFabric-Actors" },
        // (replace the following value with your service's ServiceEventSource name)
        { "providerName": "your-service-EventSource-name" }
      ]
    }
  ],
  "filters": [
    {
      "type": "drop",
      "include": "Level == Verbose"
    }
  ],
  "outputs": [
    {
      "type": "ApplicationInsights",
      // (replace the following value with your AI resource's instrumentation key)
      "instrumentationKey": "00000000-0000-0000-0000-000000000000"
    }
  ],
  "schemaVersion": "2016-08-11"
}

Имя ServiceEventSource службы — это значение свойства Name, заданного с помощью EventSourceAttribute для класса ServiceEventSource. Все это указано в ServiceEventSource.cs файле, который является частью кода службы. Например, в следующем фрагменте кода имя ServiceEventSource — MyCompany-Application1-Stateless1:

[EventSource(Name = "MyCompany-Application1-Stateless1")]
internal sealed class ServiceEventSource : EventSource
{
    // (rest of ServiceEventSource implementation)
}

Обратите внимание, что eventFlowConfig.json файл является частью пакета конфигурации службы. Изменения в этом файле могут быть включены в полнофункциональные или только конфигурационные обновления службы, при условии успешной проверки работоспособности обновления Service Fabric и автоматического отката в случае сбоя обновления. Дополнительные сведения см. в статье об обновлении приложения Service Fabric.

Раздел фильтров конфигурации позволяет дополнительно настроить сведения, которые будут проходить через конвейер EventFlow в выходные данные, позволяя удалять или включать определенные сведения или изменять структуру данных события. Дополнительные сведения о фильтрации см. в статьях "Фильтры EventFlow".

Последним шагом является создание экземпляра конвейера EventFlow в коде запуска службы, расположенном в Program.cs файле:

using System;
using System.Diagnostics;
using System.Threading;
using Microsoft.ServiceFabric;
using Microsoft.ServiceFabric.Services.Runtime;

// **** EventFlow namespace
using Microsoft.Diagnostics.EventFlow.ServiceFabric;

namespace Stateless1
{
    internal static class Program
    {
        /// <summary>
        /// This is the entry point of the service host process.
        /// </summary>
        private static void Main()
        {
            try
            {
                // **** Instantiate log collection via EventFlow
                using (var diagnosticsPipeline = ServiceFabricDiagnosticPipelineFactory.CreatePipeline("MyApplication-MyService-DiagnosticsPipeline"))
                {

                    ServiceRuntime.RegisterServiceAsync("Stateless1Type",
                    context => new Stateless1(context)).GetAwaiter().GetResult();

                    ServiceEventSource.Current.ServiceTypeRegistered(Process.GetCurrentProcess().Id, typeof(Stateless1).Name);

                    Thread.Sleep(Timeout.Infinite);
                }
            }
            catch (Exception e)
            {
                ServiceEventSource.Current.ServiceHostInitializationFailed(e.ToString());
                throw;
            }
        }
    }
}

Имя, переданное в качестве параметра метода CreatePipeline метода ServiceFabricDiagnosticsPipelineFactory, — это имя сущности здоровья, представляющей конвейер сбора журналов EventFlow. Это имя используется, если EventFlow обнаруживает ошибку и сообщает об этом через подсистему работоспособности Service Fabric.

Использование параметров Service Fabric и параметров приложения в eventFlowConfig

EventFlow поддерживает использование параметров Service Fabric и параметров приложения для настройки параметров EventFlow. Параметры Service Fabric можно использовать с помощью этого специального синтаксиса для значений:

servicefabric:/<section-name>/<setting-name>

<section-name> — имя раздела конфигурации Service Fabric и <setting-name> является параметром конфигурации, предоставляющим значение, которое будет использоваться для настройки параметра EventFlow. Дополнительные сведения о том, как это сделать, см. в разделе "Поддержка параметров Service Fabric" и параметров приложения.

Проверка

Запустите службу и наблюдайте за окном вывода отладочных сообщений в Visual Studio. После запуска службы вы должны начать замечать свидетельства того, что ваша служба отправляет записи в настроенный выходной канал. Перейдите на платформу анализа событий и визуализации и убедитесь, что журналы начали отображаться (может занять несколько минут).

Дальнейшие действия