为什么 Prometheus 在抓取我的 .NET Core 微服务`/health_metrics`端点时返回“HTTP status 503 Service Unavailable”?

问题描述 投票:0回答:1

我在尝试从 .NET Core 微服务中抓取指标时遇到 Prometheus 问题。我的服务在 Docker 中运行,我可以通过浏览器

/health_metrics
很好地访问
http://192.168.161.74:2011/health_metrics
端点。它显示指标没有任何问题。

Prometheus is returning a 503 Service Unavailable 但是,Prometheus 在尝试抓取此端点时返回

503 Service Unavailable
错误。这是我的
prometheus.yml
配置片段:

global:
  scrape_interval: 15s

scrape_configs:

  - job_name: 'health-metrics'
    metrics_path: /health_metrics
    static_configs:
      - targets: ['192.168.161.74:2011']

附加信息:

  • 我的微服务设置包括各种工具和仪表板,例如:
    • GraphQL 客户端工具:Portal Banana、Portal Voyager、Adapter Banana、Adapter Voyager
    • REST 客户端工具:Swagger
    • Hangfire 仪表板
    • 健康检查:健康UI、健康API
  • /health_metrics
    端点可通过浏览器访问,并显示 GC 收集计数、进程启动时间、内存使用情况等指标。

 GraphQL Client Tools: Portal Banana, Portal Voyager, Adaptor Banana, Adaptor Voyager REST Client Tools: Swagger Hangfire Dashboard Health Check

这是

/health_metrics
公开的指标示例:

# HELP dotnet_collection_count_total GC collection count
# TYPE dotnet_collection_count_total counter
dotnet_collection_count_total{generation="1"} 0
dotnet_collection_count_total{generation="0"} 1
dotnet_collection_count_total{generation="2"} 0

# HELP process_start_time_seconds Start time of the process since unix epoch in seconds.
# TYPE process_start_time_seconds gauge
process_start_time_seconds 1721278066.591546
...

到目前为止我尝试过的故障排除步骤:

  1. 验证端点可从 Prometheus 服务器访问。(从内部和外部)
  2. 确保没有防火墙规则阻止 Prometheus 和微服务之间的流量。
  3. 检查了 Docker 日志是否有任何错误,但没有发现与
    /health_metrics
    端点相关的错误。

health metrics

社区问题:

  1. 当可通过浏览器访问端点时,什么可能导致 Prometheus 返回
    503 Service Unavailable
    错误?
  2. Prometheus 或 Docker 中是否有可能需要调整才能解决此问题的特定配置?
  3. 是否有任何资源限制或超时设置导致此行为?
  4. 有没有办法从 Prometheus 获取更详细的日志记录来诊断此问题的根本原因?

我在 Windows 上针对我的 .NET Core 微服务测试了此问题,并且也出现了此错误。我使用 Golang 创建了一个代码,从 Prometheus 的 /health_metrics 获取此内容,并在另一个端口中显示 /metric,它起作用了,这让我认为延迟可能是问题所在。

任何见解或建议将不胜感激!

.net-core prometheus grafana metrics
1个回答
0
投票

由于跨源资源共享 (CORS) 策略配置错误,可能会在抓取您的

.NET Core
/health_metrics
端点时返回“HTTP 503 服务不可用”。将
/health_metrics
端点添加到 CORS 配置中解决了该问题。

以下是如何在您的

.NET Core
应用程序中修复此问题:

services.AddCors(options =>
{
    options.AddPolicy("AllowPrometheus", builder =>
    {
        builder.WithOrigins("http://localhost:9090")
               .AllowAnyMethod()
               .AllowAnyHeader();
    });
});
app.UseCors("AllowPrometheus");

使用更新的 CORS 配置重新启动服务后,Prometheus 成功抓取了指标。

AI 建议的其他故障排除技巧:

  • 确保
    /health_metrics
    端点具有
    Content-Type: text/plain; charset=utf-8
  • 检查响应时间以确保它们在 Prometheus 的超时限制内。
  • 使用 Prometheus 日志诊断抓取问题。

这个简洁的答案重点关注 CORS 修复,并强调了类似问题的其他潜在原因。

© www.soinside.com 2019 - 2024. All rights reserved.