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

如何为ASP.NET Core应用单独配置OpenTelemetry Prometheus采集端口

解决方案:为OpenTelemetry Prometheus端点单独配置端口

在ASP.NET Core中,要实现主应用(5002端口)和OpenTelemetry指标端点(4000端口)分离,有两种可靠的实现方式:

方式一:单进程多端口+请求筛选

这种方式无需额外进程,通过让主应用监听多个端口,再用端口筛选隔离不同功能:

  1. 先配置Kestrel监听主应用端口和指标端口:

    var builder = WebApplication.CreateBuilder(args);
    builder.WebHost.ConfigureKestrel(options =>
    {
        options.ListenAnyIP(5002); // 主应用端口
        options.ListenAnyIP(4000); // 指标专用端口
    });
    
  2. 用MapWhen分离指标端点和主应用中间件:

    var app = builder.Build();
    
    // 仅对4000端口提供指标端点服务
    app.MapWhen(context => context.Connection.LocalPort == 4000, metricsApp =>
    {
        metricsApp.UseOpenTelemetryPrometheusScrapingEndpoint();
        // 此处无需添加主应用的其他中间件,避免干扰
    });
    
    // 仅对5002端口提供主应用服务
    app.MapWhen(context => context.Connection.LocalPort != 4000, mainApp =>
    {
        mainApp.UseRouting();
        mainApp.UseAuthorization();
        mainApp.MapControllers();
        // 其他主应用中间件配置
    });
    
    app.Run();
    

方式二:独立Host承载指标端点

如果希望指标服务完全独立于主应用(和你之前使用AddMetricServer的模式更接近),可以启动第二个独立的Host:

  1. 配置并启动主应用Host:

    var mainBuilder = WebApplication.CreateBuilder(args);
    mainBuilder.WebHost.ConfigureKestrel(options => options.ListenAnyIP(5002));
    
    // 添加主应用服务
    mainBuilder.Services.AddControllers();
    // ...其他主应用服务配置
    
    var mainApp = mainBuilder.Build();
    // 主应用中间件配置
    mainApp.UseRouting();
    mainApp.UseAuthorization();
    mainApp.MapControllers();
    
  2. 配置独立的指标Host:

    var metricsBuilder = WebApplication.CreateBuilder(args);
    metricsBuilder.WebHost.ConfigureKestrel(options => options.ListenAnyIP(4000));
    
    // 配置OpenTelemetry,确保和主应用共享指标源
    metricsBuilder.Services.AddOpenTelemetry()
        .WithMetrics(builder =>
        {
            builder.AddPrometheusExporter();
            builder.AddAspNetCoreInstrumentation(); // 采集ASP.NET Core指标
            // 添加其他需要的指标采集器
        });
    
    var metricsApp = metricsBuilder.Build();
    metricsApp.UseOpenTelemetryPrometheusScrapingEndpoint();
    
  3. 同时启动两个Host:

    await Task.WhenAll(
        mainApp.RunAsync(),
        metricsApp.RunAsync()
    );
    

这种方式的优势是指标服务和主应用完全隔离,即使主应用出现异常,指标端点仍可能正常对外提供监控数据。

关于你原有配置的说明

你之前尝试的UseOpenTelemetryPrometheusScrapingEndpoint(context => context.Connection.LocalPort == 4000)不生效,核心原因是主应用的Kestrel未监听4000端口,导致该筛选条件永远无法匹配。必须先配置Kestrel监听目标端口,再配合端口筛选才能生效。

内容的提问来源于stack exchange,提问作者Lucas Dalmarco

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 14:47:18