如何在.NET Azure Monitor OpenTelemetry分发版中设置自定义指标命名空间?
问题描述
我正在为.NET Core Windows服务添加自定义指标以实现可观测性。根据Azure Monitor官方文档,其支持为自定义指标附加相关属性,我的目标是创建Meter实例,并将该Meter的名称作为Azure Monitor中的metric namespace。
但使用Azure.Monitor.OpenTelemetry.Exporter包导出自定义指标遥测数据到Azure Monitor时,默认的指标命名空间是无意义的"azure.applicationinsights"。更奇怪的是,在Azure Monitor中查看原始Meter数据时,似乎Meter名称根本没有被发送或保存。
初始化配置代码:
builder.Services.AddOpenTelemetry() .WithMetrics(metrics => metrics.AddMeter(MyTelemetryConstants.SomeMeterName)) .UseAzureMonitor(o => { o.ConnectionString = builder.Configuration.GetConnectionString("AzureMonitor"); });
创建指标的代码:
public class MyAppMeter { // metric sources can use this instrument directly: `appMeter.SomeCounter.Add(1);` public Counter<int> SomeCounter { get; } public MyAppMeter(IMeterFactory meterFactory) { // 希望`MyTelemetryConstants.SomeMeterName`的值成为Azure Monitor中的Metric Namespace var meter = meterFactory.Create(MyTelemetryConstants.SomeMeterName); SomeCounter = meter.CreateCounter<int>("some_counter"); } }
请问我遗漏了什么配置?
解决方案
场景1:所有指标使用同一个命名空间
如果服务内所有自定义指标共用同一个命名空间,直接在Azure Monitor Exporter配置中指定MetricNamespace即可:
builder.Services.AddOpenTelemetry() .WithMetrics(metrics => metrics.AddMeter(MyTelemetryConstants.SomeMeterName)) .UseAzureMonitor(o => { o.ConnectionString = builder.Configuration.GetConnectionString("AzureMonitor"); // 全局设置Metric Namespace o.MetricNamespace = MyTelemetryConstants.SomeMeterName; });
场景2:每个Meter对应独立的命名空间
如果需要不同Meter使用不同的命名空间,需添加自定义MetricProcessor,将Meter名称映射为对应指标的命名空间:
- 定义自定义处理器:
public class MeterNameAsNamespaceProcessor : BaseExportingMetricProcessor { protected override void OnExport(in Batch<Metric> batch) { foreach (var metric in batch) { // 将Meter名称赋值给指标的Namespace属性 metric.SetNamespace(metric.Meter.Name); } base.OnExport(in batch); } }
- 在OpenTelemetry配置中注册该处理器:
builder.Services.AddOpenTelemetry() .WithMetrics(metrics => metrics .AddMeter(MyTelemetryConstants.SomeMeterName) // 添加自定义处理器 .AddProcessor(new MeterNameAsNamespaceProcessor())) .UseAzureMonitor(o => { o.ConnectionString = builder.Configuration.GetConnectionString("AzureMonitor"); });
补充说明
- 确保使用最新版本的
Azure.Monitor.OpenTelemetry.Exporter包,旧版本可能不支持动态设置Metric Namespace。 - 配置完成后,在Azure Monitor指标资源管理器中就能看到对应Meter名称的命名空间,原始遥测数据也会包含Meter名称信息。
内容的提问来源于stack exchange,提问作者Ronnie Overby
相关产品推荐
相关产品推荐

