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

调用/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.OpenTelemetry NuGet包,否则无法使用AddSteeltoe()和Steeltoe版的AddOpenTelemetryMetrics
  • 若使用Steeltoe的其他监控组件(如Health、Info等),建议统一使用Steeltoe提供的OpenTelemetry扩展,避免配置冲突

内容的提问来源于stack exchange,提问作者Marcelo Mosquera

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 22:45:53