Web API + Azure App Insights передают данные из ActionFilter в ITelemetryProcessor.

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

public class MyCustomFilterAttribute: ActionFilterAttribute
{
    public override void OnActionExecuting(HttpActionContext filterContext)
    {
        //perform some logic and set the flag here
    }
}

а потом

public class TelemetryFilter : ITelemetryProcessor
{
    public void Process(ITelemetry item)
    {
        var request = item as RequestTelemetry;
        //read the flag here and terminate processing
    }
}

Это возможно ? Есть ли какие-то TempData, которые используются этими двумя типами? Я хотел бы избежать таких хаков, как установка временного заголовка и т.д. Заранее спасибо.


person mickl    schedule 03.07.2018    source источник


Ответы (2)


Я не уверен, что это будет полезно. Но надеюсь будет.

Использование Activity.Current

    public void Initialize(ITelemetry telemetry)
    {
        Activity current = Activity.Current;

        if (current == null)
        {
            current = (Activity)HttpContext.Current?.Items["__AspnetActivity__"];
//put your code here
        }
}

Обратитесь к этому SO

person Jayendran    schedule 09.07.2018
comment
да, это может быть решением, спасибо. Мне интересно, есть ли что-то встроенное в Azure AI, но HttpContext.Current может решить эту проблему. - person mickl; 09.07.2018

Напишите TelemetryInitializer, где у вас есть доступ к HttpContext.

//Инициализатор телеметрии

public void Initialize(ITelemetry telemetry)
    {
     var ctx = HttpContext.Current; // Telemetry Initialzer runs in same thread as the request.
     var request = item as RequestTelemetry;
     req.Properties.Add("MyActionFilter", "MyActionFilterValue")
     ...
    }

//Обработчик телеметрии

public void Process(ITelemetry item)
    {
        var request = item as RequestTelemetry;
        //read the flag here and terminate processing
        if(req.Properties["MyActionFilter"] == "somthing")
        {
        ...
        }
    }

https://docs.microsoft.com/en-us/azure/application-insights/app-insights-api-filtering-sampling#itelemetryprocessor-and-itelemetryinitializer

Для Asp.Net Core внедрение IHttpContextAccessor в конструктор TelemetryInitializer может получить контекст, как это сделано здесь: https://github.com/Microsoft/ApplicationInsights-aspnetcore/blob/develop/src/Microsoft.ApplicationInsights.AspNetCore/TelemetryInitializers/TelemetryInitializerBase.cs

person cijothomas    schedule 06.07.2018
comment
Спасибо, это похоже на то, что я ищу. Дело в том, что я не использую .NET Core, и в настоящее время установленный пакет NuGet (version="2.4.0" targetFramework="net452") не может распознать IHttpContextAccessor это что-то специфичное для .NET Core? - person mickl; 09.07.2018
comment
Для обычного (не .net core) вы можете получить доступ к HttpContext.Current из TelemetryInitializer, поскольку они выполняются в том же потоке, что и запрос. Вы можете проверить контекст и установить некоторые свойства телеметрии из инициализатора. А позже используйте TelemetryProcessor для выполнения действия на основе свойства, установленного Initializer. - person cijothomas; 10.07.2018