我目前正在将 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 导出器并在同一项目中使用它们?或者还有其他方法可以实现这一目标吗?任何帮助或指导将不胜感激。预先感谢。
我已经尝试过:
我尝试添加第二个具有不同抓取端点的普罗米修斯导出器,但始终使用最后一个导出器。
正如您所观察到的,最后配置的导出器将获胜。 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);
当应用程序终止时,这应该正确处理两个实例。