Ошибки случаются. Но после того, как исключение было поймано, возникает серьезный вопрос – что потом делать с полученными данными? Каким образом передать их разработчику, где хранить, как просматривать? Для этого можно изобрести свой "велосипед". А можно сэкономить время и ресурсы воспользовавшись 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.

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

Шаг 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 можно найти список событий, включая исключения.
Если выбрать исключение в данном списке, то можно посмотреть детальную информацию:

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

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

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

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