调用/actuator/prometheus端点时遇OpenTelemetry配置错误求助
解决Steeltoe Prometheus端点的OpenTelemetry配置错误
每次调用/actuator/prometheus端点时,都会收到错误提示:Please ensure OpenTelemetry is configured via Steeltoe extension methods,不清楚问题根源。以下是初始化代码(已确认openTelemetryEndpoint变量有有效值):
builder.Services.AddAllActuators(); builder.Services.AddPrometheusActuator(); // OpenTelemetry configuration var openTelemetryServiceName = Environment.GetEnvironmentVariable("OTEL_SERVICE_NAME"); var openTelemetryEndpoint = Environment.GetEnvironmentVariable("OTEL_EXPORTER_OTLP_TRACES_ENDPOINT"); if (!string.IsNullOrWhiteSpace(openTelemetryEndpoint)) { // Configure metrics builder.Services.AddOpenTelemetryMetrics(b => { b.AddHttpClientInstrumentation(); b.AddAspNetCoreInstrumentation(); b.AddMeter(openTelemetryServiceName + "-metrics"); b.AddOtlpExporter(options => { options.Endpoint = new Uri(openTelemetryEndpoint); options.Protocol = OpenTelemetry.Exporter.OtlpExportProtocol.Grpc; }); }); // Configure tracing builder.Services.AddOpenTelemetryTracing(b => { b.SetResourceBuilder(ResourceBuilder.CreateDefault().AddService(openTelemetryServiceName)); b.AddHttpClientInstrumentation(); b.AddAspNetCoreInstrumentation(); b.AddSource(openTelemetryServiceName + "-activity-source"); b.AddOtlpExporter(options => { options.Endpoint = new Uri(openTelemetryEndpoint); options.Protocol = OpenTelemetry.Exporter.OtlpExportProtocol.Grpc; }); }); // Configure logging builder.Logging.AddOpenTelemetry(b => { b.IncludeFormattedMessage = true; b.IncludeScopes = true; b.ParseStateValues = true; b.AddOtlpExporter(options => { options.Endpoint = new Uri(openTelemetryEndpoint); options.Protocol = OpenTelemetry.Exporter.OtlpExportProtocol.Grpc; }); b.AddConsoleExporter(); }); }
问题根源
你直接使用原生OpenTelemetry扩展方法配置指标,但Steeltoe的Prometheus Actuator依赖Steeltoe封装的OpenTelemetry扩展来整合指标数据,原生配置无法被Steeltoe识别,因此触发该错误。
修复方案
1. 调整配置顺序
将OpenTelemetry配置代码移到Actuator注册之前,确保Steeltoe能识别到OpenTelemetry的配置。
2. 使用Steeltoe的OpenTelemetry扩展配置指标
在指标配置中添加AddSteeltoe()扩展方法,整合Steeltoe的监控指标,并确保使用Steeltoe提供的AddOpenTelemetryMetrics(需安装Steeltoe.Management.OpenTelemetry NuGet包)。
修改后的完整代码
// OpenTelemetry configuration(移至Actuator配置前) var openTelemetryServiceName = Environment.GetEnvironmentVariable("OTEL_SERVICE_NAME"); var openTelemetryEndpoint = Environment.GetEnvironmentVariable("OTEL_EXPORTER_OTLP_TRACES_ENDPOINT"); if (!string.IsNullOrWhiteSpace(openTelemetryEndpoint)) { // 使用Steeltoe封装的OpenTelemetry扩展配置指标 builder.Services.AddOpenTelemetryMetrics(b => { b.AddSteeltoe(); // 关键:添加Steeltoe指标整合逻辑 b.AddHttpClientInstrumentation(); b.AddAspNetCoreInstrumentation(); b.AddMeter(openTelemetryServiceName + "-metrics"); b.AddOtlpExporter(options => { options.Endpoint = new Uri(openTelemetryEndpoint); options.Protocol = OpenTelemetry.Exporter.OtlpExportProtocol.Grpc; }); }); // 追踪和日志配置可保留原生实现,不影响Prometheus端点 builder.Services.AddOpenTelemetryTracing(b => { b.SetResourceBuilder(ResourceBuilder.CreateDefault().AddService(openTelemetryServiceName)); b.AddHttpClientInstrumentation(); b.AddAspNetCoreInstrumentation(); b.AddSource(openTelemetryServiceName + "-activity-source"); b.AddOtlpExporter(options => { options.Endpoint = new Uri(openTelemetryEndpoint); options.Protocol = OpenTelemetry.Exporter.OtlpExportProtocol.Grpc; }); }); builder.Logging.AddOpenTelemetry(b => { b.IncludeFormattedMessage = true; b.IncludeScopes = true; b.ParseStateValues = true; b.AddOtlpExporter(options => { options.Endpoint = new Uri(openTelemetryEndpoint); options.Protocol = OpenTelemetry.Exporter.OtlpExportProtocol.Grpc; }); b.AddConsoleExporter(); }); } // 先完成OpenTelemetry配置,再注册Actuators builder.Services.AddAllActuators(); builder.Services.AddPrometheusActuator();
额外注意事项
- 必须安装
Steeltoe.Management.OpenTelemetryNuGet包,否则无法使用AddSteeltoe()和Steeltoe版的AddOpenTelemetryMetrics - 若使用Steeltoe的其他监控组件(如Health、Info等),建议统一使用Steeltoe提供的OpenTelemetry扩展,避免配置冲突
内容的提问来源于stack exchange,提问作者Marcelo Mosquera
相关产品推荐
相关产品推荐

