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

.NET应用OpenTelemetry Metrics无法在Prometheus中显示求助

问题:.NET应用指标采集OTLP导出到Prometheus失败

我在.NET应用的指标采集工作中遇到了问题,遵循微软文档教程操作,但教程已过时,部分方法无法正常使用。

Console导出器工作正常,能在控制台看到指标数据,但代码中把OTLP端点设为localhost:9090后,无法在localhost:9090/metrics或Prometheus图形页面看到自定义指标,只能看到Prometheus自身指标,确认不是我的应用指标。


我的Program.cs代码

using SignalR.Hubs;
using System.Diagnostics;
using System.Diagnostics.Metrics;
using OpenTelemetry.Metrics;

var builder = WebApplication.CreateBuilder(args);
builder.Services.AddSignalR(
                     options =>
                     {
                         options.EnableDetailedErrors = true;
                     });
builder.Services.AddControllers();
builder.WebHost.UseIISIntegration();

var meter = new Meter("My_Meter");
var gauge_memory = meter.CreateObservableGauge<long>("memory_application", () => Process.GetCurrentProcess().WorkingSet64);
var test_metric = meter.CreateCounter<long>("metric_counter");

builder.Services.AddSingleton(test_metric); //custom metrics
builder.Services.AddOpenTelemetry().WithMetrics(metrics => metrics
        .AddMeter("Microsoft.AspNetCore.Hosting")
        .AddMeter("Microsoft.AspNetCore.Server.Kestrel")
        .AddMeter("Microsoft.AspNetCore.Http.Connections")
        .AddMeter("Microsoft.AspNetCore.Routing")
        .AddMeter("Microsoft.AspNetCore.Diagnostics")
        .AddMeter("Microsoft.AspNetCore.RateLimiting")
        .AddMeter("My_Meter")
        .AddAspNetCoreInstrumentation()
        .AddHttpClientInstrumentation()
        .AddOtlpExporter(opts =>
        {
            opts.Endpoint = new Uri("http://localhost:9090");
        })
        .AddConsoleExporter()
        .AddPrometheusExporter()
); ;

var app = builder.Build();
app.UseDefaultFiles();
app.UseStaticFiles();
app.UseRouting();
app.UseEndpoints(endpoints =>
{
    endpoints.MapControllers();
    app.MapHub<ActivityHub>("/activity");
    app.MapHub<ActivityHub>("/activity/NewMessage/username/message");
});
app.Run();

重点关注创建Meter及添加OTLP指标导出器的部分。


我的.csproj文件内容

<Project Sdk="Microsoft.NET.Sdk.Web">

  <PropertyGroup>
    <TargetFramework>net6.0</TargetFramework>
    <Nullable>enable</Nullable>
    <ImplicitUsings>enable</ImplicitUsings>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="OpenTelemetry" Version="1.7.0" />
    <PackageReference Include="OpenTelemetry.Api" Version="1.7.0" />
    <PackageReference Include="OpenTelemetry.Api.ProviderBuilderExtensions" Version="1.7.0" />
    <PackageReference Include="OpenTelemetry.Exporter.Console" Version="1.7.0" />
    <PackageReference Include="OpenTelemetry.Exporter.OpenTelemetryProtocol" Version="1.7.0" />
    <PackageReference Include="OpenTelemetry.Exporter.Prometheus.AspNetCore" Version="1.5.0-rc.1" />
    <PackageReference Include="OpenTelemetry.Extensions.Hosting" Version="1.7.0" />
     <PackageReference Include="OpenTelemetry.Instrumentation.AspNetCore" Version="1.5.0-beta.1" />
     <PackageReference Include="OpenTelemetry.Instrumentation.Http" Version="1.5.0-beta.1" />
  </ItemGroup>

</Project>

Console导出器输出(正常显示指标)

Metric Name: memory_application, Meter: My_Meter
(2023-12-13T20:43:17.5694497Z, 2023-12-13T22:45:47.4143609Z] LongGauge
Value: 40169472

Metric Name: metric_counter, Meter: My_Meter
(2023-12-13T20:43:17.5728915Z, 2023-12-13T22:45:47.4143615Z] LongSum
Value: 13200

Metric Name: http.server.duration, Measures the duration of inbound HTTP requests., Unit: ms, Meter: OpenTelemetry.Instrumentation.AspNetCore/1.0.0.0
(2023-12-13T20:43:17.5729684Z, 2023-12-13T22:45:47.4143627Z] http.flavor: 1.1 http.method: POST http.route: /activity/negotiate http.scheme: http http.status_code: 200 net.host.name: localhost net.host.port: 56325 Histogram
Value: Sum: 1496,0958999999987 Count: 550 Min: 0,0292 Max: 832,8732
(-Infinity,0]:0
(0,5]:544
(5,10]:2
(10,25]:2
(25,50]:0
(50,75]:0
(75,100]:0
(100,250]:0
(250,500]:1
(500,750]:0
(750,1000]:1
(1000,2500]:0
(2500,5000]:0
(5000,7500]:0
(7500,10000]:0
(10000,+Infinity]:0

我的Prometheus配置文件

# my global config
global:
  scrape_interval: 15s # Set the scrape interval to every 15 seconds. Default is every 1 minute.
  evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute.
  # scrape_timeout is set to the global default (10s).

# Alertmanager configuration
alerting:
  alertmanagers:
    - static_configs:
        - targets:
          # - alertmanager:9093

# Load rules once and periodically evaluate them according to the global 'evaluation_interval'.
rule_files:
  # - "first_rules.yml"
  # - "second_rules.yml"

# A scrape configuration containing exactly one endpoint to scrape:
# Here it's Prometheus itself.
scrape_configs:
  # The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
  - job_name: "otel-collector"
    # metrics_path defaults to '/metrics'
    # scheme defaults to 'http'.

    static_configs:
      - targets: ["localhost:9090"]

内容的提问来源于stack exchange,提问作者The Trainer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 23:14:50