Создаем журнал исключений с помощью Application Insights

AzureОшибки случаются. Но после того, как исключение было поймано, возникает серьезный вопрос – что потом делать с полученными данными? Каким образом передать их разработчику, где хранить, как просматривать? Для этого можно изобрести свой "велосипед".
А можно сэкономить время и ресурсы воспользовавшись Application Insights. Это облачная служба аналитики входящая в состав  Microsoft Azure. Она позволяет легко собирать и анализировать различную отладочную (и не только) информацию о работе приложения. Давайте посмотрим, как при наличии учетной записи в Azure буквально за несколько минут можно добавить в существующее приложение поддержку записи исключений в журнал.

Прежде всего необходимо отметить несколько моментов про службу Application Insights:

  • Она нацелена в первую очередь на работу с отладочной информацией и данными о работе самого приложения. 
  • Можно использовать как с веб- так и с обычными приложениями.
  • Есть бесплатная и платная версия. Первый вариант ограничен по функциональности и максимальный объемом передаваемых данных 32MB в сутки (1GB в месяц). Но он вполне подойдет для целей мониторинга исключений. Дополнительные возможности и трафик оплачиваются отдельно. С ценами можно ознакомиться на Azure Portal.

Исходное приложение

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

namespace ApplicationInsightsWinConsoleDemo
{
    using System;

    class Program
    {
        static void Main(string[] args)
        {
            try {
                object someObject = null;
                Type objType = someObject.GetType();

                Console.WriteLine("Success. Press any key...");
                Console.ReadKey(intercept: true);
            }
            catch (Exception ex) {
                Console.WriteLine("Invalid program termination.");
                Console.ReadKey(intercept: true);
            }
        }
    }
}

Добавляем Application Insights для исключений

Шаг 1:  Создаем экземпляр Application Insights в Azure

  • Откройте портал Azure: https://portal.azure.com
  • Добавьте новый экземпляр Application Insights с помощью меню New > Developer Services > Application Insights.

Create new Application Insights instance

Обратите внимание на пункт Application Type. Для всех не-веб приложений надо выбрать вариант Other.
  • Чтобы связать приложение и созданный экземпляр Application Insights потребуется Instrumentation Key. Его можно получить в блоке Essentials.

Application Insights instrumentation key

Шаг 2: Добавляем Application Insights в приложение

  • Установите с помощью NuGet библиотеку Microsoft.ApplicationInsights:
PM> Install-Package Microsoft.ApplicationInsights
  • Добавьте отправку данных об исключительных ситуации в Application Insights. Теперь метод Main будет выглядеть так:
namespace ApplicationInsightsWinConsoleDemo
{
    using System;
    using Microsoft.ApplicationInsights;

    class Program
    {
        static void Main(string[] args)
        {
            try {
                object someObject = null;
                Type objType = someObject.GetType();
                Console.WriteLine("Success. Press any key...");
                Console.ReadKey(intercept: true);
            }
            catch (Exception ex) {
                var tc = new TelemetryClient { InstrumentationKey = "ec22d334-22ea-46e0-bc6e-6ecbdb5b130b" };
                tc.Context.User.Id = Environment.UserName;
                tc.Context.Session.Id = Guid.NewGuid().ToString();
                tc.Context.Device.OperatingSystem = Environment.OSVersion.ToString();
                tc.TrackException(ex);
                tc.Flush();

                Console.WriteLine("Invalid program termination.");
                Console.ReadKey(intercept: true);
            }
        }
    }
}

Экземпляру класса TelemetryClient обязательно необходимо указать InstrumentationKey соответствующего экземпляра Application Insights.

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

Так же в TelemetryClient присутствует свойство Context, позволяющее указать дополнительную информацию о текущем устройстве и пользователе. Его заполнение опционально.

Далее с помощью вызова TrackException() передаем информацию о произошедшем исключении. Поскольку передача информации на сервер идет блоками , то гарантировано очистим буферы командой Flush().

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

Шаг 3: Изучаем результат

Снова перейдем на портал Azure https://portal.azure.com и откроем созданный ранее экземпляр Application Insights.  Выбрав в панели пункт Search можно найти список событий, включая исключения.Application Insights exceptions list

Если выбрать исключение в данном списке, то можно посмотреть детальную информацию:

Application Insights exception details

Шаг 4: Настраиваем оповещения

Разумеется постоянно отслеживать появление новых исключений открывая список на Azure Portal очень не удобно. Поэтому создадим оповещение, которое по почте или с помощью WebHook оповещать определенных лиц об новых ошибках. Для этого необходимо выбрать пункт Alerts:

Application Insights alerts

В окне для создания Alert в качестве контролируемого параметра необходимо выбрать "Server Exceptions" .

Application Insights alerts

Теперь достаточно периодически проверять почту или поглядывать в выбранный messenger (если он поддерживает WebHooks). Кроме того, оповещения отмечаются и на портале:

Application Insights alerts

TelemetryClient умеет передавать и другие типы данных, такие как сообщения, события, обращения к внешних ресурсам (dependency) и т.д. Полный список методов класса можно посмотреть тут.

Комментарии (2) -

Андрей 06.02.2017 11:48:26

Да, но смотреть логи в Application Insights очень неудобно Frown
Лучше подключить Sentry или создать виртуалку с ELK (Elasticsearch, Logstash, Kibana)

Смотря как использовать и чего хочется.
Application Insight можно смотреть сразу из Visual Studio. Есть Lens для с отображением залоганных Exceptions у методов. Кроме того, можно создать WorkItem в VSTS или GitHub.

А для серьезного анализа можно использовать Analytics (встроенный в Application Insight) или вообще экспорт данных.

Добавить комментарий