【问题标题】:Application Insights for WebAPI applicationWebAPI 应用程序的 Application Insights
【发布时间】:2020-08-02 14:56:55
【问题描述】:

是否可以根据请求 URL 告诉 Application Insights 使用不同的 InstrumentationKey?

我们的应用程序与不同的客户端一起工作,我们希望在不同的 Application Insights 实例中为它们分离日志。

网址格式:https://webapi.com/v1/{client_name}/bla/bla

最好设置配置以从请求中按 client_name 选择 InstrumentationKey。

【问题讨论】:

  • 它是一个 .NET 框架 webapi?不是 .NET 核心?
  • @IvanYang 是.NET框架
  • 如果答案有效,您能接受它作为答案吗?谢谢。这对其他人会有所帮助。
  • 我不得不切换到一项紧急任务。我将在返回 Application Insights 集成时更新问题

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


【解决方案1】:

如果目标是将不同的遥测项发送到不同的检测密钥,实现该目标的正确方法是使用 TelemetryInitializer 修改单个项以具有正确的 ikey。

一个像下面这样的初始化器:

item.Context.InstrumentationKey = ikey.

此初始化程序应访问 HttpContext 并根据请求路由/其他参数动态决定 ikey。

不建议为此修改 TC.Active,因为它是全局共享设置。

(这不是一个非常常见的用例 - 但微软内部有团队为 PROD 规模的应用程序这样做)

【讨论】:

    【解决方案2】:

    你可以这样做。如果您有记录器,请将 ApplicationInsightsKey 参数化并在每次调用时为客户端传递密钥,或者如果您的应用程序是基于租户的,则在加载时注入它。

    在此处查看文档:Separating telemetry from Development, Test, and Production

    Microsoft.ApplicationInsights.Extensibility.
    TelemetryConfiguration.Active.InstrumentationKey = <App-Insights-Key-for-the-client>
    

    只需在记录之前更改 Application Insights 密钥,它就可以完成这项工作。

    【讨论】:

    • 更改 .Active ikey 会影响其他并行请求。如果在任何时候都有一个请求,那么这很有效。但是大多数应用程序都有并行请求,这在那里不起作用。
    • 没错,正是我刚才提到的——“在每次调用时为客户端传递密钥,或者如果您的应用程序是基于租户的,则在加载时注入它。”
    【解决方案3】:

    设置配置以选择 InstrumentationKey 会很棒 通过请求中的 client_name。

    您可以根据请求中的 client_name 动态选择 ikey。首先需要获取请求的url,然后查看client_name。

    为此,您可以将以下代码添加到Global.asax 文件中:

        void Application_BeginRequest(Object source, EventArgs e)
        {
            var app = (HttpApplication)source;
            //get the request url
            var uriObject = app.Context.Request.Url.ToString();
    
            if (uriObject.Contains("/client_name_1"))
            {
                Microsoft.ApplicationInsights.Extensibility.
                          TelemetryConfiguration.Active.InstrumentationKey = "ikey_1";
            }
            else if (uriObject.Contains("/client_name_2"))
            {
                Microsoft.ApplicationInsights.Extensibility.
                          TelemetryConfiguration.Active.InstrumentationKey = "ikey_2";
            }
            else
            {
                Microsoft.ApplicationInsights.Extensibility.
                          TelemetryConfiguration.Active.InstrumentationKey = "ikey_3";
            }
        }
    

    测试结果:

    但我想说我们很少在一个环境中使用 1 个以上的 ikey。如果您的目标是让数据不杂乱无章,我建议您只能使用 1 个 ikey,然后使用 Kusto query 来达到您的目的。

    【讨论】:

      【解决方案4】:

      感谢@cijothomas 和@danpop (link) 的回答,我能够理解整个画面。

      第 1 步:创建自定义 ITelemetryInitializer (Microsoft Documentation):

      public class MyTelemetryInitializer : ITelemetryInitializer
      {
          public void Initialize(ITelemetry telemetry)
          {
              var appKey = CallContext.LogicalGetData("ApplicationKey")?.ToString();
      
              switch (appKey)
              {
                  case "App1":
                      telemetry.Context.InstrumentationKey = "d223527b-f34e-4c47-8aa8-1f21eb0fc349";
                      return;
                  default:
                      telemetry.Context.InstrumentationKey = "f8ceb6cf-4357-4776-a2b6-5bbed8d2561c";
                      return;
              }
          }
      }
      

      第 2 步:注册自定义初始化程序:

      <ApplicationInsights xmlns="http://schemas.microsoft.com/ApplicationInsights/2013/Settings">
         <TelemetryInitializers>
           <Add Type="Application.WebAPI.MyTelemetryInitializer, Application.WebAPI"/>
         </TelemetryInitializers>
         <!--<InstrumentationKey>f8ceb6cf-4357-4776-a2b6-5bbed8d2561c</InstrumentationKey>-->
      </ApplicationInsights>
      

      protected void Application_Start()
      {
          // ...
          TelemetryConfiguration.Active.TelemetryInitializers.Add(new MyTelemetryInitializer());
      }
      

      第 3 步:对记录器进行一些调整(源代码取自@danpop 答案Logger target configuration):

      var config = new LoggingConfiguration();
      ConfigurationItemFactory.Default.Targets.RegisterDefinition("ai", typeof());
      ApplicationInsightsTarget aiTarget = new ApplicationInsightsTarget();
      aiTarget.InstrumentationKey = "your_key";
      aiTarget.Name = "ai";
      config.AddTarget("ai", aiTarget);
      LogManager.Configuration = config;
      

      ILogger 配置示例:Log4Net, NLog, System.Diagnostics

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-05-14
        • 2020-02-02
        • 1970-01-01
        • 1970-01-01
        • 2023-02-09
        • 1970-01-01
        • 2019-08-02
        • 2022-01-11
        相关资源
        最近更新 更多