You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在.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名称映射为对应指标的命名空间:

  1. 定义自定义处理器:
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);
    }
}
  1. 在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 05:06:09