如何为ApplicationInsights中requests记录的customDimensions添加值?
给Application Insights Requests的customDimensions添加自定义属性的方法
方法1:使用TelemetryInitializer(全局可靠方案)
这是全局生效的方式,能自动给所有RequestTelemetry的customDimensions追加属性,适合统一注入场景。
- 实现
ITelemetryInitializer接口类:
public class CustomRequestTelemetryInitializer : ITelemetryInitializer { private readonly IHttpContextAccessor _httpContextAccessor; public CustomRequestTelemetryInitializer(IHttpContextAccessor httpContextAccessor) { _httpContextAccessor = httpContextAccessor; } public void Initialize(ITelemetry telemetry) { if (telemetry is RequestTelemetry requestTelemetry) { // 直接添加固定属性 requestTelemetry.Properties["CustomGlobalKey"] = "CustomGlobalValue"; // 从当前请求上下文提取动态属性(如用户ID) var httpContext = _httpContextAccessor.HttpContext; if (httpContext?.User?.Identity?.IsAuthenticated == true) { requestTelemetry.Properties["AuthenticatedUserId"] = httpContext.User.Identity.Name; } } } }
- 在项目启动类(Program.cs/Startup.cs)中注册:
// .NET 6+ 示例 builder.Services.AddApplicationInsightsTelemetry(); builder.Services.AddSingleton<ITelemetryInitializer, CustomRequestTelemetryInitializer>(); builder.Services.AddHttpContextAccessor(); // 如需从HttpContext取数据必须注册
方法2:通过Activity传递属性(适配OpenTelemetry场景)
之前用Activity.Current.AddTag无效,大概率是操作时机或API使用错误,正确方式如下:
// 在请求处理流程内(如Controller Action、中间件中) if (Activity.Current != null) { // 直接设置标签,会被Application Insights捕获到customDimensions Activity.Current.SetTag("CustomActivityKey", "CustomActivityValue"); // 若需要属性传递到下游服务,用AddBaggage,同样会同步到customDimensions Activity.Current.AddBaggage("DownstreamBaggageKey", "DownstreamValue"); }
注意:确保项目已正确集成Application Insights与Activity追踪,.NET 6+的官方SDK默认已关联两者。
方法3:结合Logger Scope同步属性到Requests
你提到logger.BeginScope可给Traces加值,通过配置可让这些Scope属性同步到RequestTelemetry:
- 在appsettings.json中添加配置:
"ApplicationInsights": { "InstrumentationKey": "你的仪器密钥", "Logging": { "ApplicationInsights": { "Scopes": { "EnableScopes": true, "IncludeScopesInCustomDimensions": true } } } }
- 在代码中创建Scope并执行请求逻辑:
var scopeProperties = new Dictionary<string, object> { { "CustomScopeKey", "CustomScopeValue" } }; using (logger.BeginScope(scopeProperties)) { // 此处的请求处理逻辑,对应的RequestTelemetry会自动带上Scope中的属性 }
注意:该方案要求Application Insights SDK版本≥2.20.0,旧版本不支持此同步逻辑。
常见问题说明
- 旧版
TelemetryClient.Properties是全局属性池,仅适合所有请求共享的固定属性,针对单请求的自定义属性推荐用TelemetryInitializer。 - 若
Activity.Current为空,检查是否在异步流程中丢失了上下文,或是否未启用Activity追踪(.NET Core 3.1+默认启用)。
内容的提问来源于stack exchange,提问作者Richard Barraclough
相关产品推荐
相关产品推荐

