ASP.NET Core中OpenTelemetry自动采集指标发送至AzureMonitor问题
问题解答
1. 图中数据是否为StatsBeat数据?
你提到的HeartBeatState、http.client.*、http.server.*不全是StatsBeat数据:
HeartBeatState属于App Insights的基础心跳遥测,用于监控应用存活状态,不属于StatsBeat;http.client.*、http.server.*是OpenTelemetry针对HTTP请求自动采集的标准指标,来自ASP.NET Core内置的仪器(Instrumentation),也不属于StatsBeat;- StatsBeat是Azure Monitor SDK自身产生的遥测,用于追踪SDK的运行状态、版本信息等,指标名称通常带有
StatsBeat前缀。
2. 若为StatsBeat数据,是否无使用成本?
StatsBeat数据确实是免费的,不会计入App Insights的用量配额,也不会产生额外费用。但你当前看到的http.client.*、http.server.*这类自动采集的HTTP指标属于常规遥测数据,会占用App Insights的用量额度,产生对应成本。
3. 设置APPLICATIONINSIGHTS_STATSBEAT_DISABLED=true能否关闭该数据采集?
这个环境变量仅对StatsBeat数据生效,无法关闭你提到的HeartBeatState、HTTP自动指标。所以你设置后仍能看到这些数据是正常的,因为它们不在该变量的控制范围内。
4. 能否在代码注册阶段关闭该自动采集?
可以通过修改OpenTelemetry的Metrics配置来实现,具体有两种常用方式:
方式一:仅保留自定义Meter,移除默认自动采集仪器
在WithMetrics配置中,明确移除ASP.NET Core自带的HTTP仪器,只保留你自定义的Meter:
public static IServiceCollection RegisterMetrics(this IServiceCollection services, string appInsightsConnectionString, string serviceName) { var meterName = $"{serviceName}.Meters"; services.AddOpenTelemetry() .WithMetrics(options => { options.SetResourceBuilder(ResourceBuilder.CreateEmpty().AddService(serviceName)); // 仅添加自定义Meter options.AddMeter(meterName); // 移除默认的HTTP客户端/服务端自动采集仪器 options.RemoveInstrumentation<HttpClientInstrumentation>(); options.RemoveInstrumentation<AspNetCoreInstrumentation>(); }) .UseAzureMonitor((options) => { options.ConnectionString = appInsightsConnectionString; // 关闭HeartBeatState心跳数据 options.DisableHeartbeat = true; }); services.TryAddSingleton<IMetricsFactory>(x => new MetricsFactory(meterName, x.GetRequiredService<IMeterFactory>())); return services; }
方式二:通过AddView精细过滤不需要的指标
如果需要针对特定指标做排除,可使用AddView配置:
public static IServiceCollection RegisterMetrics(this IServiceCollection services, string appInsightsConnectionString, string serviceName) { var meterName = $"{serviceName}.Meters"; services.AddOpenTelemetry() .WithMetrics(options => { options.SetResourceBuilder(ResourceBuilder.CreateEmpty().AddService(serviceName)); options.AddMeter(meterName); // 隐藏指定前缀的HTTP指标 options.AddView("http.client.*", viewOpts => viewOpts.IsVisible = false); options.AddView("http.server.*", viewOpts => viewOpts.IsVisible = false); }) .UseAzureMonitor((options) => { options.ConnectionString = appInsightsConnectionString; options.DisableHeartbeat = true; }); services.TryAddSingleton<IMetricsFactory>(x => new MetricsFactory(meterName, x.GetRequiredService<IMeterFactory>())); return services; }
内容的提问来源于stack exchange,提问作者KennetRunner
相关产品推荐
相关产品推荐

