无需使用ITelemetryInitializer添加Application Insights遥测属性
问题描述
我负责的Web API应用里,有一个TelemetryInitializer,它会在每次Web API调用时执行,从appsettings.json中添加几个固定属性。相关代码与配置如下:
自定义TelemetryInitializer类
public class AppInsightTelemetryInitializer : ITelemetryInitializer { private readonly AppInsightsMetrics _appInsightsMetrics; public AppInsightTelemetryInitializer(IOptions<AppInsightsMetrics> appInsightsMetrics) { _appInsightsMetrics = appInsightsMetrics.Value; } public void Initialize(ITelemetry telemetry) { var propTelemetry = (ISupportProperties)telemetry; propTelemetry.Properties["Application"] = _appInsightsMetrics.Application; propTelemetry.Properties["Version"] = _appInsightsMetrics.Version; propTelemetry.Properties["LatestCommit"] = _appInsightsMetrics.LatestCommit; } }
服务注册代码
appBuilder.Services.Configure<AppInsightsMetrics>(appBuilder.Configuration.GetSection(AppInsightsMetrics.InsightsMetrics)); appBuilder.Services.AddSingleton<ITelemetryInitializer, AppInsightTelemetryInitializer>(); if (env.IsDevelopment()) { services.AddApplicationInsightsTelemetry(x => { x.EnableDebugLogger = false; x.InstrumentationKey = "instrumentation key"; }); } else { services.AddApplicationInsightsTelemetry(); }
appsettings.json配置
"AppInsightsMetrics": { "Application": "xxx.Api", "Version": "", "LatestCommit": "" },
生产环境中这些配置项会由Azure CI/CD流水线替换。我想知道能不能在配置阶段直接定义这些属性,从而移除这个每次调用都执行的初始化器?
解决方案
完全可以通过配置阶段设置全局属性来替代每次调用执行的初始化器,以下是两种可行方案:
方案一:在服务注册时直接添加全局属性
在注册Application Insights服务时,利用TelemetryConfiguration的GlobalProperties添加静态属性,这些属性会自动附加到所有遥测数据中,仅在启动时配置一次:
// 先绑定配置到实体 var appInsightsMetrics = appBuilder.Configuration.GetSection(AppInsightsMetrics.InsightsMetrics).Get<AppInsightsMetrics>(); if (env.IsDevelopment()) { services.AddApplicationInsightsTelemetry(x => { x.EnableDebugLogger = false; x.InstrumentationKey = "instrumentation key"; // 添加全局属性 x.TelemetryConfiguration.GlobalProperties["Application"] = appInsightsMetrics.Application; x.TelemetryConfiguration.GlobalProperties["Version"] = appInsightsMetrics.Version; x.TelemetryConfiguration.GlobalProperties["LatestCommit"] = appInsightsMetrics.LatestCommit; }); } else { services.AddApplicationInsightsTelemetry(x => { x.TelemetryConfiguration.GlobalProperties["Application"] = appInsightsMetrics.Application; x.TelemetryConfiguration.GlobalProperties["Version"] = appInsightsMetrics.Version; x.TelemetryConfiguration.GlobalProperties["LatestCommit"] = appInsightsMetrics.LatestCommit; }); }
配置完成后,即可直接移除自定义的AppInsightTelemetryInitializer类及其注册代码。
方案二:通过配置文件直接配置全局属性
可以直接在appsettings.json中定义Application Insights的全局属性,无需编写额外代码:
"ApplicationInsights": { "InstrumentationKey": "your-instrumentation-key", "GlobalProperties": { "Application": "xxx.Api", "Version": "", "LatestCommit": "" } }
然后简化服务注册逻辑:
if (env.IsDevelopment()) { services.AddApplicationInsightsTelemetry(x => { x.EnableDebugLogger = false; // 开发环境的InstrumentationKey也可放入配置文件,此处按需保留 }); } else { services.AddApplicationInsightsTelemetry(); }
生产环境中,Azure CI/CD流水线只需替换ApplicationInsights.GlobalProperties下的对应值即可,同样能实现全局属性自动附加的效果。
注意事项
- 两种方案均为全局生效,所有遥测数据(请求、依赖项、日志等)都会自动带上这些属性,性能优于每次调用执行的初始化器,因为仅在启动时配置一次。
- 如果后续需要根据请求上下文动态修改属性,则仍需使用
TelemetryInitializer;但对于固定静态属性,全局配置是更优选择。
内容的提问来源于stack exchange,提问作者advapi
相关产品推荐
相关产品推荐

