【问题标题】:Web API + Azure App Insights pass the data from ActionFilter to ITelemetryProcessorWeb API + Azure App Insights 将数据从 ActionFilter 传递到 ITelemetryProcessor
【发布时间】:2018-07-03 08:12:26
【问题描述】:

我想自定义我的 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 ?我想避免像设置临时标题等那样的黑客行为。提前致谢。

【问题讨论】:

    标签: c# azure asp.net-web-api azure-application-insights actionfilterattribute


    【解决方案1】:

    我不确定这是否有用。但我希望会。

    使用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

    【讨论】:

    • 是的,这可能是一个解决方案,谢谢。我想知道 Azure AI 中是否有内置的东西,但 HttpContext.Current 可以解决这个问题
    【解决方案2】:

    编写一个 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

    【讨论】:

    • 谢谢,它看起来像我正在寻找的东西。问题是我没有使用 .NET Core 并且当前安装的 NuGet 包 (version="2.4.0" targetFramework="net452") 无法识别 IHttpContextAccessor 是特定于 .NET Core 的吗?
    • 对于常规(非 .net 核心),您可以从 TelemetryInitializer 访问 HttpContext.Current,因为它们与请求在同一线程中运行。您可以从初始化程序检查上下文并在 Telemetry 上设置一些属性。稍后使用 TelemetryProcessor 根据 Initializer 设置的属性采取行动。
    猜你喜欢
    • 2013-06-23
    • 1970-01-01
    • 2019-09-09
    • 1970-01-01
    • 2022-08-02
    • 2020-09-07
    • 2022-01-21
    • 1970-01-01
    • 2021-06-13
    相关资源
    最近更新 更多