записывать журнал в Application Insights из локальной Service Fabric

Я пытаюсь интегрировать службу Azure App Insights в приложение Service Fabric для ведения журналов и инструментовки. Я запускаю код фабрики на своей локальной виртуальной машине. Я точно следил за документом здесь [сценарий 2]. Другие ресурсы на docs.microsoft.com, похоже, также указывают на те же шаги. [пример: 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


    {
      "inputs": [
        {
          "type": "EventSource",
          "sources": [
            { "providerName": "Microsoft-ServiceFabric-Services" },
            { "providerName": "Microsoft-ServiceFabric-Actors" },        
            { "providerName": "mystatefulservice" }
          ]
        }
      ],
      "filters": [
        {
          "type": "drop",
          "include": "Level == Verbose"
        }
      ],
      "outputs": [
        {
          "type": "ApplicationInsights",
          // (replace the following value with your AI resource's instrumentation key)
          "instrumentationKey": "XXXXXXXXXXXXXXXXXXXXXX",
          "filters": [
            {
              "type": "metadata",
              "metadata": "metric",
              "include": "ProviderName == mystatefulservice && EventName == ProcessedCountMetric",
              "operationProperty": "operation",
              "elapsedMilliSecondsProperty": "elapsedMilliSeconds",
              "recordCountProperty": "recordCount"
            }
          ]
        }
      ],
      "schemaVersion": "2016-08-11"
    }

В 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 в службу с отслеживанием состояния структуры"

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);
            }

person teeboy    schedule 07.03.2018    source источник
comment
Есть ли какие-нибудь журналы или что-нибудь, что может помочь нам?   -  person Jeff Breadner    schedule 07.03.2018
comment
В VS в разделе «Просмотр»> «Другие окна» выберите «События диагностики». Это локальный прослушиватель ETW (EventSource). Вы можете проверить правильность отправки событий.   -  person Matt Trower - MSFT    schedule 07.03.2018
comment
Да, Мэтт. Я вижу событие в локальном средстве просмотра трассировки событий Windows. Но я хочу, чтобы события отображались в аналитике приложений Azure. Не местный. Джефф, я не вижу на локальном компьютере никаких журналов, указывающих на ошибки при передаче в лазурный.   -  person teeboy    schedule 07.03.2018
comment
Этот источник событий и конфигурация потока событий кажутся мне правильными, однако источники событий могут быть непростыми. Мне посчастливилось использовать этот пакет в модульном тестировании, чтобы помочь найти проблемы с источниками событий. После того, как вы убедились, что источник событий правильно настроен и вызывается, я бы предложил поиграть с этим фильтром в выводе аналитических данных приложения и посмотреть, возможно ли это ваша проблема. У меня был опыт, когда фильтры не всегда работают так, как можно было бы ожидать.   -  person pdylanross    schedule 07.03.2018
comment
@ pdylanross: Файл eventourceconfig выглядит неплохо. Как вы думаете, это, вероятно, проблема с брандмауэром в Azure? Нужно ли мне открывать порты или что-то еще, чтобы локальные события отображались в аналитике приложений Azure?   -  person teeboy    schedule 07.03.2018
comment
Я думаю, что мы можем исключить проблемы с EventSource, если вы видите события в диагностических событиях. Вы инициализировали EventFlow в своем процессе? Я не вижу упоминания о том, что вы добавляете этот код.   -  person Matt Trower - MSFT    schedule 07.03.2018
comment
Да, Мэтт. Пожалуйста, смотрите редактирование моего исходного сообщения   -  person teeboy    schedule 08.03.2018
comment
EventFlow использует подсистему работоспособности Service Fabric, чтобы сообщать о предупреждениях / ошибках в среде SF, поэтому проверьте панель мониторинга SF, чтобы узнать, исправны ли ваши службы и сообщают ли они о каких-либо ошибках. Кроме того, если вы запустите приложение в отладчике, SDK AppInsights выведет трассировки, которые он пытается отправить на серверную часть, в окно отладки. Отсутствие следов говорит о том, что что-то настроено неправильно - скорее всего, ключ инструментария не считывается из конфигурации или недействителен / указывает на несуществующий ресурс.   -  person Karol Z    schedule 08.03.2018
comment
Я вижу следы. Я вижу данные телеметрии Application Insights в окне вывода вместе с полной полезной нагрузкой. Я также вижу вывод трассировки в окне диагностики в Visual Studio. Событие никогда не публикуется в аналитике приложений Azure. Кстати, я запускаю это приложение SF на моем локальном компьютере разработчика в корпоративной интрасети. Дважды проверил ключ приборов. Сообщения журнала можно просмотреть в Аналитике приложений - ›Обзор -› вкладка поиска, верно?   -  person teeboy    schedule 08.03.2018
comment
Если вы ожидаете получить метрику, я бы пошел в Metric Explorer, Metrics (предварительный просмотр) или Search | Analytics и сделайте запрос по customMetrics. Последний предоставит вам доступ к необработанным данным и, вероятно, лучше всего подходит для устранения неполадок.   -  person Karol Z    schedule 08.03.2018


Ответы (2)


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

Вы должны знать несколько уловок:

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

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

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

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

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

person Diego Mendes    schedule 08.03.2018
comment
Извините, но в этом ответе есть несколько хороших советов, но также есть несколько советов, которые просто не соответствуют действительности. Членство в «Пользователи журнала производительности» необходимо только в том случае, если нужно фиксировать события ETW (трассировка событий для Windows) из разных процессов. Если вы просто используете инфраструктуру EventSource / EventListener, в этом нет необходимости. - person Karol Z; 08.03.2018
comment
Кроме того, фреймворк EventSource System.Diagnostic.Tracing.EventSource почти всегда подходит для использования. Это тот, который используют все .NET Framework, в том числе Service Fabric, поэтому, если вы хотите объединить трассировки из фреймворков и из вашего кода, фреймворк EventSource / EventListener сделает это возможным. Версия NuGet должна использоваться только в том случае, если вы знаете о конкретной функции или ошибке, которая отсутствует / присутствует в версии платформы EventSource, а версия NuGet разблокирует вас. - person Karol Z; 08.03.2018
comment
Спасибо, Кароль. Я дважды проверил все предложения. IsEnabled () в WriteEvent действительно возвращает true. Я также могу увидеть событие в окне диагностики местной студии Visaul. Просто событие никогда не попадает в App Insights в облаке. Хвататься за соломинку .. - person teeboy; 08.03.2018
comment
@KarolZ, спасибо за ваши комментарии, я обновил ответ, чтобы прояснить членство пользователя. Что касается второго пункта, у меня было много проблем со старыми версиями EventSource, и после перехода на версию пакета я больше не использовал версию фреймворка, но я доверяю вашим отзывам. - person Diego Mendes; 09.03.2018
comment
Похоже, это может быть связано с блокировкой брандмауэра изнутри корпоративной сети на docs.microsoft.com/en-us/azure/application-insights/. Попытка использовать тот же код из дома сработала !. Итак, будем работать с корпоративными и посмотреть, смогут ли они открыть порты брандмауэра. - person teeboy; 22.03.2018

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

Ознакомьтесь с пакетами nuget Microsoft App Insights Service Fabric. Он отлично подходит для:

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