.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
相关产品推荐
相关产品推荐

