Метрики /metrics для Next.js и ws-proxy (центральный Prometheus)
proxy-ws (Rust/axum) — тот же паттерн, что api.rs в netrunner-backend: PrometheusBuilder + middleware, считающий http_requests_total/ http_request_duration_seconds по методу/пути/статусу. Next.js — app/api/metrics/route.ts на prom-client (явный runtime="nodejs", т.к. Edge Runtime не тянет perf_hooks/process.*), отдаёт default-метрики процесса (CPU/память/event loop lag). Оба порта (3000/3001) перестают быть 127.0.0.1-only — их должен скрейпить центральный Prometheus на VPS с данными, обязательно зафайрволить там на его IP (см. комментарии в docker-compose.yml). Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,28 @@
|
||||
import { NextResponse } from "next/server";
|
||||
import client from "prom-client";
|
||||
|
||||
// Явный Node.js рантайм — prom-client (perf_hooks, process.*) не работает в
|
||||
// Edge Runtime, дефолтном для route handlers в Next.js.
|
||||
export const runtime = "nodejs";
|
||||
|
||||
// register — модульный синглтон: Next.js держит один и тот же процесс между
|
||||
// запросами в проде (не пересоздаёт модуль на каждый вызов), поэтому
|
||||
// collectDefaultMetrics() должен быть вызван ровно один раз за жизнь
|
||||
// процесса — глобальный флаг предотвращает повторную регистрацию тех же
|
||||
// метрик при hot-reload в dev-режиме.
|
||||
declare global {
|
||||
var __prometheusMetricsInitialized: boolean | undefined;
|
||||
}
|
||||
|
||||
if (!global.__prometheusMetricsInitialized) {
|
||||
client.collectDefaultMetrics();
|
||||
global.__prometheusMetricsInitialized = true;
|
||||
}
|
||||
|
||||
export async function GET() {
|
||||
const metrics = await client.register.metrics();
|
||||
return new NextResponse(metrics, {
|
||||
status: 200,
|
||||
headers: { "Content-Type": client.register.contentType },
|
||||
});
|
||||
}
|
||||
Reference in New Issue
Block a user