是否可以告诉Application Insights根据请求URL使用不同的InstrumentationKey?
我们的应用程序可与不同的客户端一起使用,我们希望在不同的Application Insights实例中为它们分离日志。
网址格式:https://webapi.com/v1/ {client_name} / bla / bla
设置配置以从请求中的client_name选择InstrumentationKey会很棒。
答案 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";
}
}
测试结果:
但是我想说,我们很少在一个环境中再使用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