revel应用暴露/metrics端点需手动注册get路由,调用prometheus_client的generate_latest()并设置content-type为text/plain; version=0.0.4;优先监控http_request_total、http_request_duration_seconds_bucket、process_cpu_seconds_total及业务gauge/counter指标。

Revel 应用怎么暴露 /metrics 端点
Revel 本身不内置 Prometheus 指标暴露能力,必须手动注册一个 /metrics 路由并返回符合 Prometheus 文本格式的指标数据。不能依赖中间件或框架钩子自动注入,否则容易被请求生命周期干扰(比如 session、filter 链路提前终止响应)。
推荐做法是:在 app/init.go 的 init() 函数里,用 revel.InterceptFunc 或直接在 app.Routes 中添加 GET 路由,调用 prometheus_client 的 generate_latest() 并设置正确 Content-Type:
-
Content-Type必须为text/plain; version=0.0.4,不是application/json或默认text/html - 不要用
revel.RenderText(),它会加额外换行或 HTML 包裹;改用revel.Result返回原始字节 - 若用
prometheus/client_golang,需确保 registry 是全局单例,且在所有 goroutine 中安全访问
哪些指标对 Revel 服务最有价值
Revel 是同步阻塞式框架(非 ASGI/async),所以重点监控 HTTP 层和进程级信号,而非协程调度类指标。优先暴露四类:
-
http_request_total{method, status_code, path}:用Counter,按c.Request.URL.Path和c.Response.Status打点,别只记总数 -
http_request_duration_seconds_bucket{le, method, path}:用Histogram,le分桶建议设为0.01, 0.05, 0.1, 0.25, 0.5, 1.0, 2.0 -
process_cpu_seconds_total和process_resident_memory_bytes:开箱即用,但 Revel 多 worker 场景下需在启动时调用disable_process_metrics(),再由主进程统一注册一次 - 业务态指标如
revel_session_count(Gauge)、db_query_errors_total(Counter),避免用用户 ID、订单号等高基数 label
Nginx 反向代理后 /metrics 抓不到数据怎么办
90% 的情况是 Nginx 把 /metrics 请求转发错了,或者根本没透传。Prometheus 抓取的是你对外暴露的域名地址(如 https://api.example.com/metrics),不是 Revel 本地监听的 127.0.0.1:8089。
- 检查 Nginx 配置中
location /metrics { ... }是否单独存在,且proxy_pass指向 Revel 后端(与/规则一致) - 确认 Nginx 没有重写或过滤
Accept头——Prometheus 发起抓取时带Accept: application/vnd.prometheus.text.plain;version=0.0.4;q=0.9,*/*;q=0.8,部分 Nginx 配置会因不识别而拒绝 - 临时在 Nginx 上加日志:
log_format metrics '$remote_addr - $request $status $body_bytes_sent'; access_log /var/log/nginx/metrics.log metrics;,看是否真有请求打进来 - 直接 curl Nginx 域名下的
/metrics,验证返回内容是否以# HELP开头、无 HTML 标签、HTTP 状态码为 200
Grafana 查不到 Revel 指标时最该先查什么
别急着调 Grafana 数据源或面板,先确认 Prometheus 自己有没有拿到数据。这是整个链路最脆弱的一环。
- 进 Prometheus Web UI →
Status → Targets,看你的 Revel 实例 target 是否显示UP,Last Scrape时间是否在 30 秒内 - 如果状态是
DOWN,点进去看Last Error,常见报错:server returned HTTP status 404 Not Found(路由没配)、net/http: request canceled(Nginx 超时或 TLS 握手失败)、invalid content type(Content-Type 错了) - 在 Revel Pod 或服务器上执行:
curl -v http://localhost:8089/metrics,确认本地能通、响应格式正确;再从 Prometheus 容器里执行同样命令,确认网络可达 - Revel 启动日志里搜
metrics或8080,确认没绑定到localhost而不是0.0.0.0(尤其 Docker 部署时)
Revel 的监控暴露本质是“让一个纯文本 HTTP 接口稳定存活”,其余都是围绕这个前提的连通性校验。任何中间层(Nginx、ServiceMesh、Ingress)都可能静默吞掉这个请求,必须逐段验证。











