Написать журнал в Приложении идеи из местной сервисной фабрики
Я пытаюсь интегрировать службу аналитики приложения 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