WebAPI应用程序的应用程序见解

时间:2020-04-20 07:05:29

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

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

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

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

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

4 个答案:

答案 0 :(得分:1)

如果目标是将不同的遥测项目发送到不同的仪表键,则正确的实现方法是使用TelemetryInitializer修改单个项目以使其具有正确的ikey。

类似于以下内容的初始化程序:

item.Context.InstrumentationKey = ikey。

此初始值设定项应访问HttpContext并从请求路由/其他参数动态确定ikey。

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

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

答案 1 :(得分:0)

您可以做到。如果您有记录器,请对ApplicationInsightsKey进行参数设置,并在每次调用时将其传递给客户端,或者如果您的应用程序基于租户,则在加载时将其注入。

在此处签出文档:Separating telemetry from Development, Test, and Production

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

只需在登录前更改Application Insights密钥即可完成这项工作。

答案 2 :(得分:0)

设置配置以选择InstrumentationKey非常好 根据请求中的client_name。

您可以根据请求中的client_name动态选择ikey。首先,您需要获取请求网址,然后检查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";
        }
    }

测试结果:

enter image description here

但是我想说,我们很少在一个环境中再使用1个ikey。如果您的目标是使数据不混乱,建议您只使用1个ikey,然后再使用Kusto query

答案 3 :(得分:0)

由于@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>

OR

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