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
是否可以告诉 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