Не видеть никаких следов или исключений в Insights - PullRequest
0 голосов
/ 21 февраля 2020

TL; DR: Это сообщение может быть озаглавлено "Почему все мои звонки в Insights записываются как ' Задача была отменена. '?"

I я пытаюсь использовать Application Insights для регистрации ошибок из нашего приложения ASP.NET web API 2, но они явно не регистрируются. У меня есть ключ Insights, и он явно используется, потому что я вижу записи REQUEST и DEPENDENCY, однако нет записей EXCEPTION или TRACE, созданных моим пользовательским кодом.

Я интересно, не вижу ли я глобально выданных исключений, потому что у меня нет какой-либо обработки исключений на уровне контроллера - хотя приведенного ниже кода, как я полагаю, должно быть достаточно для перехвата всех исключений и их регистрации (когда они не являются более локально захваченными и обработанными ) ...

Global.asax.cs:

public class WebApiApplication : System.Web.HttpApplication
{
    protected void Application_Start()
    {
        Microsoft.ApplicationInsights.Extensibility.TelemetryConfiguration.Active.InstrumentationKey = EnvironmentHelper.InsightsKey;
        GlobalConfiguration.Configure(WebApiConfig.Register);
    }

    protected void Application_Error(Object sender, EventArgs e)
    {
        Exception appException = Server.GetLastError();
        var ai = new TelemetryClient();
        ai.TrackException(appException);
    }
}

WebApiConfig.cs:

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        config.MapHttpAttributeRoutes();

        config.Services.Replace(typeof(IExceptionLogger), new InsightsExceptionLogger());

        GlobalConfiguration.Configuration.Filters.Add(new InsightsExceptionFilter());
    }
}

InsightsExceptionLogger.cs:

public class InsightsExceptionLogger : ExceptionLogger
{
    public override void Log(ExceptionLoggerContext context)
    {
        if (context != null && context.Exception != null)
        {
            var ai = new TelemetryClient();
            ai.TrackException(context.Exception);
        }

        base.Log(context);
    }
}

public class InsightsExceptionFilter : ExceptionFilterAttribute
{
    public override void OnException(HttpActionExecutedContext context)
    {
        if (context != null && context.Exception != null)
        {
            var ai = new TelemetryClient();
            ai.TrackException(context.Exception);
        }
    }

    public override Task OnExceptionAsync(HttpActionExecutedContext context, CancellationToken cancellationToken)
    {
        if (context != null && context.Exception != null)
        {
            var ai = new TelemetryClient();
            ai.TrackException(context.Exception);
        }

        return Task.FromResult(0);
    }
}

Пример Controller.cs:

[CookieAuthentication, CookieSlidingExpiration, InsightsExceptionFilter]
public class SomeController : ApiController
{
    private TelemetryClient ai = null;

    public SomeController()
    {
        TelemetryClient ai = new TelemetryClient();
    }

    [Route("api/v1/SomeEndpoint"), HttpGet]
    public IHttpActionResult GetSomeEndpoint([FromUri]string aParameter)
    {
        ai.TrackTrace("test trace");
        throw new Exception("test exception");
    }
}

Первый ответ на этот пост похож на мою проблему, но я не вижу ни следа оператора, ни преднамеренного исключения вошли в Insights.

Что я вижу, так это запись в журнале:

A task was canceled.

С этим исключением:

System.Threading.Tasks.TaskCanceledException:
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess

Хотя я не понимаю как / почему мои намеренно брошенные исключения будут переведены на это (если это то, что происходит) или почему мои TrackTrace() вызовы не отображаются в журнале Insights.

За этим исключением я вижу эту трассировку стека:

System.Threading.Tasks.TaskCanceledException:
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089)
   at System.Web.Http.Controllers.ActionFilterResult+<ExecuteAsync>d__5.MoveNext (System.Web.Http, Version=5.2.7.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35)
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw (mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089)
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089)
   at System.Web.Http.Controllers.AuthenticationFilterResult+<ExecuteAsync>d__5.MoveNext (System.Web.Http, Version=5.2.7.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35)
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw (mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089)
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089)
   at System.Web.Http.Controllers.ExceptionFilterResult+<ExecuteAsync>d__6.MoveNext (System.Web.Http, Version=5.2.7.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35)

1 Ответ

0 голосов
/ 25 февраля 2020

Похоже, что весь этот беспорядок был результатом одной неправильно назначенной переменной. Очень неприятно, но легко исправить. Это было обнаружено, когда я удалил преднамеренное исключение из методов контроллера и все еще регистрировал проблему вместо сообщений трассировки - те, которые должны были быть простыми, чтобы получить. Неисправный код является конструктором:

Пример Controller.cs:

[CookieAuthentication, CookieSlidingExpiration, InsightsExceptionFilter]
public class SomeController : ApiController
{
    private TelemetryClient ai = null;

    public SomeController()
    {
        TelemetryClient ai = new TelemetryClient(); // WHY LOCAL???
    }

    [Route("api/v1/SomeEndpoint"), HttpGet]
    public IHttpActionResult GetSomeEndpoint([FromUri]string aParameter)
    {
        ai.TrackTrace("test trace");
        throw new Exception("test exception");
    }
}

Конечно, изменив его на ...

Пример Controller.cs:

[CookieAuthentication, CookieSlidingExpiration, InsightsExceptionFilter]
public class SomeController : ApiController
{
    private TelemetryClient ai = null;

    public SomeController()
    {
        ai = new TelemetryClient();
    }

    [Route("api/v1/SomeEndpoint"), HttpGet]
    public IHttpActionResult GetSomeEndpoint([FromUri]string aParameter)
    {
        ai.TrackTrace("test trace");
        throw new Exception("test exception");
    }
}

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

...