Написать журнал в Приложении идеи из местной сервисной фабрики

Я пытаюсь интегрировать службу аналитики приложения Azure в приложение сервисной структуры для ведения журналов и инструментария. Я использую фабричный код на моей локальной виртуальной машине. Я точно следовал документу здесь [сценарий 2]. Другие ресурсы на docs.microsoft.com также указывают на те же действия. [ex: https://docs.microsoft.com/en-us/azure/service-fabric/service-fabric-diagnostics-event-aggregation-eventflow По какой-то причине я не вижу записей о событиях в обзорах приложений. Нет ошибок в коде, когда я делаю это:

ServiceEventSource.Current.ProcessedCountMetric("synced",sw.ElapsedMilliseconds, crc.DataTable.Rows.Count);

Содержимое eventflowconfig.json

    {
      "input": [
        {
          "type": "EventSource",
          "sources": [
            { "providerName": "Microsoft-ServiceFabric-Services" },
            { "providerName": "Microsoft-ServiceFabric-Actors" },        
            { "providerName": "mystatefulservice" }
          ]
        }
      ],
      "filters": [
        {
          "type": "drop",
          "include": "Level == Verbose"
        }
      ],
      "output ": [
        {
          "type": "ApplicationInsights",
          // (замените следующее значение на инструментальный ключ ресурса AI)
          "instrumentationKey": " XXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
          "filters": [
            {
              "type": "metadata",
              "metadata": "metric",
              "include": "ProviderName == mystatefulservice && EventName == ProcessedCountMetric",
              "operationProperty": "операция",
              "elapsedMilliSecondsProperty": "elapsedMilliSeconds",
              "recordCountProperty": "recordCountProperty": "recordCount" }-08} ", schemaVersion: "}

В ServiceEventSource.cs

[Event(ProcessedCountMetricEventId, Level = EventLevel.Informational)]
    public void ProcessedCountMetric(string operation, long     elapsedMilliSeconds, int recordCount)
    {
        if (IsEnabled())
            WriteEvent(ProcessedCountMetricEventId, operation, elapsedMilliSeconds, recordCount);
    }

РЕДАКТИРОВАТЬДобавление диагностического конвейерного кода из "Program.cs в сервисе Stateful Stateful

using (var diagnosticsPipeline =
                ServiceFabricDiagnosticPipelineFactory.CreatePipeline($"{ServiceFabricGlobalConstants.AppName}-mystatefulservice-DiagnosticsPipeline")
            )
            {
                ServiceRuntime.RegisterServiceAsync("mystatefulserviceType",
                    context => new mystatefulservice(context)).GetAwaiter().GetResult();

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

                // Prevents this host process from terminating so services keep running.
                Thread.Sleep(Timeout.Infinite);
            }

1 ответ

Event Source - сложная технология, я давно с ней работаю и у меня всегда есть проблемы. Конфигурация выглядит хорошо, очень трудно исследовать без доступа к средам, поэтому я сделаю свои предложения.

Есть несколько уловов, о которых вы должны знать:

  • Если вы слушаете события etw из другого процесса, ваш процесс должен выполняться с пользователем с разрешениями "Пользователи журнала производительности". Проверьте, на каком удостоверении работает ваша служба и входит ли она в пользователей журнала производительности, у которых есть разрешения на создание сеансов событий для прослушивания этих событий.

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

  • В целях тестирования закомментируйте строку if (IsEnabled()), это внутренняя проверка, чтобы подтвердить, что ваши события должны быть отправлены. У меня были ситуации, когда он всегда ложный и пропускает события, возможно, он некоторое время кеширует результаты, документы не ясно, как это должно работать.

  • Когда это возможно, используйте EventSource из пакета nuget вместо фреймворка, версия фреймворка полна ошибок и недостатков, найденных в версии nuget.

  • Application Insights не RealTime, иногда обработка ваших событий может занять несколько минут. Я бы порекомендовал вывести события в консоль или файл и проверить, правильно ли он прослушивает, после чего включите AppInsights.

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

Взгляните на пакеты nuget Microsoft App Insights Service Fabric. Он отлично подходит для:

  • Отправка информации об ошибках и исключениях
  • Заполнение карты приложения всеми вашими сервисами и их зависимостями (включая базу данных)
  • Отчетность по показателям производительности приложений,
  • Сквозное отслеживание зависимостей сервисных вызовов,
  • Интеграция как с родными, так и с чужими приложениями SF
Другие вопросы по тегам