Files
netrunner-landing/app/api/metrics/route.ts
T
nineap 383077e1e6 Метрики /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>
2026-07-09 23:21:43 +07:00

29 lines
1.2 KiB
TypeScript

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 },
});
}