Конфигурация ASP.NET Sentry - PullRequest
1 голос
/ 11 мая 2019

У меня есть веб-сайт ASP.NET MVC (4.6.1), на котором мы пытаемся настроить мониторинг с помощью службы Sentry.

В соответствии с документацией по настройке, в нем просто сказано инициализировать Sentry как можно раньше, но структура их примера дает мне основания сомневаться в том, что в нем больше ничего нет. В моем файле Gloabl.asax.cs я вызываю класс Custom model, который включает в себя Sentry Initialization. Вот копия класса:

public class SentryModel
    {
        public static void Configure()
        {
            var environment = ConfigurationManager.AppSettings["Environment"];

            //escape the method if we are in a development environment
            if (environment.Equals("development", StringComparison.CurrentCultureIgnoreCase))
                return;

            Assembly web = Assembly.GetExecutingAssembly();
            AssemblyName webName = web.GetName();
            string myVersion = webName.Version.ToString();
            string dsn_data = ConfigurationManager.ConnectionStrings["Sentry"].ConnectionString;

            using (SentrySdk.Init(o =>
            {
                o.Dsn = new Dsn(dsn_data);
                o.MaxBreadcrumbs = 50;
                o.Debug = true;
                o.Environment = environment;
                o.Release = myVersion;
                o.AttachStacktrace = true;
            }))
            {
                // app code here
            }
        }
    }

Меня беспокоит то, что у нас действительно должно быть что-то, где идет // код приложения здесь, но нет никаких указаний на то, что это конкретно. Очевидно, что мы хотим, чтобы часовой отслеживал все ошибки и события, происходящие в службе приложения. Я видел несколько примеров, когда исключение было явно отправлено в Sentry, но ничего о правильном способе инициализации сервиса и обработки пассивного захвата.

Спасибо

1 Ответ

1 голос
/ 13 мая 2019

Пример, который вы использовали, где комментарий код приложения здесь , не может не использоваться с ASP.NET classic, поскольку реальный запуск приложения управляется IIS.

SentrySdk.Init возвращает объект, который реализует IDisposable и используется для корректного завершения работы SDK. Это необходимо для того, чтобы гарантировать, что внутренняя очередь событий сбрасывается до закрытия приложения. Таким образом, вы не потеряете ни одного события.

В вашей текущей настройке в конце метода Configure SDK будет отключен, потому что вы завернули его в блок using. Таким образом, он будет инициализирован и немедленно закрыт.

Что вам нужно сделать, это вызвать Init во время запуска и избавиться от объекта, который он возвращает при завершении работы приложения. Кроме того, добавьте SentrySdk.CaptureException в обработчик событий global.asax * Application_Error.

Sentry имеет пример на GitHub о том, как использовать SDK с «классическим» ASP.NET и global.asax здесь , но важными частями являются следующие:


protected void Application_Start()
{
    // Set up the sentry SDK
    _sentry = SentrySdk.Init(o =>
    {
        o.Dsn = new Dsn(ConfigurationManager.AppSettings["SentryDsn"]);
    });
}

protected void Application_Error()
{
    var exception = Server.GetLastError();

    // Capture unhandled exceptions
    SentrySdk.CaptureException(exception);
}

protected void Application_End()
{
    // Close the Sentry SDK (flushes queued events to Sentry)
    _sentry?.Dispose();
}
...