WebAPI 应用程序的 Application Insights

Application Insights for WebAPI application

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

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

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

根据请求 client_name 将配置设置为 select InstrumentationKey 会很棒。

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

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

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

只需在记录之前更改 Application Insights 键即可。

It would be great to setup configuration to select InstrumentationKey by client_name from request.

您可以根据请求中的 client_name 动态 select 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个ikeys。如果你的目标是让数据不乱,我建议你可以只使用1个ikey,然后使用Kusto query来达到你的目的。

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

像下面这样的初始化程序:

item.Context.InstrumentationKey = ikey.

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

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

(这不是一个很常见的用例 - 但 Microsoft 内部有团队为 PROD 规模的应用程序执行此操作)

感谢@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