如何在 dotnet 中使用 OpenTelemetry Prometheus 导出器导出多个版本的指标?

问题描述 投票:0回答:1

我目前正在将 OpenTelemetry 集成到 dotnet 项目中,并使用 Prometheus 导出器在 /v1/metrics 路径上公开我的指标。鉴于该项目目前正在开发中,我们预计该系统提供的指标将发生重大变化。我们正在寻找一种方法来同时导出不同端点路径上不同版本的指标,例如 /v2/metrics、/v3/metrics 等。

这是有问题的代码部分:

    services.AddOpenTelemetry()
        .WithMetrics(opts => opts
            .SetResourceBuilder(ResourceBuilder.CreateDefault().AddService("rrfc"))
            .AddMeter(TelemetryUnit.CALL_TELEMETRY_METER)
            .AddPrometheusExporter(opt =>
            {
                opt.ScrapeEndpointPath = "/v1/metrics";
            }));
    
    app.UseOpenTelemetryPrometheusScrapingEndpoint();

有没有办法使用不同的 ScrapeEndpointPath 选项配置多个 Prometheus 导出器并在同一项目中使用它们?或者还有其他方法可以实现这一目标吗?任何帮助或指导将不胜感激。预先感谢。

我已经尝试过:

我尝试添加第二个具有不同抓取端点的普罗米修斯导出器,但始终使用最后一个导出器。

.net prometheus versioning metrics open-telemetry
1个回答
0
投票

正如您所观察到的,最后配置的导出器将获胜。 WithMetrics 上的

文档评论
内容如下:

注意:库作者多次调用此方法是安全的。 每个注册的配置操作都将按顺序应用。

您需要手动实例化两个单独的

MetricProvider
,而不是使用扩展方法,并像这样抓取端点:

var meterProvider1 = Sdk.CreateMeterProviderBuilder()
    .SetResourceBuilder(ResourceBuilder.CreateDefault().AddService("rrfc"))
    .AddMeter(TelemetryUnit.CALL_TELEMETRY_METER)
    .AddPrometheusExporter(opt =>
    {
        opt.ScrapeEndpointPath = "/v1/metrics";
    });

var meterProvider2 = Sdk.CreateMeterProviderBuilder()
    .SetResourceBuilder(ResourceBuilder.CreateDefault().AddService("rrfc"))
    .AddMeter(TelemetryUnit.CALL_TELEMETRY_METER)
    .AddPrometheusExporter(opt =>
    {
        opt.ScrapeEndpointPath = "/v2/metrics";
    });

app.UseOpenTelemetryPrometheusScrapingEndpoint(meterProvider1);
app.UseOpenTelemetryPrometheusScrapingEndpoint(meterProvider2);

手动创建

MeterProvider
的多个实例意味着弄清楚如何管理它们的生命周期。
WithMetrics
扩展方法通过挂钩到 .NET 依赖注入框架来实现此目的。

根据CreateMeterProviderBuilder状态下的

文档评论

创建一个

MeterProviderBuilder
用于构建 一个
MeterProvider
。在典型的应用中,单个
MeterProvider
在应用程序启动时创建并释放 在应用程序关闭时。重要的是要确保提供商不 处置得太早了。

一个快速的解决方案是将两个

MeterProvider
实例注册为单例,如下所示:

services.AddSingleton(meterProvider1);
services.AddSingleton(meterProvider2);

当应用程序终止时,这应该正确处理两个实例。

© www.soinside.com 2019 - 2024. All rights reserved.