383077e1e6
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>
29 lines
1.2 KiB
TypeScript
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 },
|
|
});
|
|
}
|