Фреймворк Fresh предоставляет встроенные возможности для работы с метриками и мониторингом, но часто возникает необходимость создания кастомных метрик, чтобы отслеживать специфические показатели приложения. Custom metrics позволяют получать более детальную информацию о работе системы, производительности и поведении пользователей.
Метрики в Fresh строятся на концепции наблюдаемых данных, которые можно собирать и агрегировать. Каждая метрика состоит из имени, типа и значений, которые обновляются при определённых событиях приложения.
Типы метрик:
Для создания кастомной метрики необходимо использовать модуль
fresh/metrics. Пример определения счётчика:
import { Counter } from "fresh/metrics";
const requestCounter = new Counter({
name: "http_requests_total",
description: "Общее количество HTTP-запросов",
labels: ["method", "status"]
});
function trackRequest(method, status) {
requestCounter.inc({ method, status });
}
Ключевые моменты:
Метрика Counter обновляется вызовом метода
inc(), который принимает объект с метками.
Gauge полезна для отслеживания состояния, которое меняется во времени:
import { Gauge } from "fresh/metrics";
const activeUsers = new Gauge({
name: "active_users",
description: "Текущее количество активных пользователей"
});
function userLoggedIn() {
activeUsers.inc();
}
function userLoggedOut() {
activeUsers.dec();
}
Методы inc() и dec() позволяют изменять
текущее значение метрики. Можно также использовать
set(value) для явного задания значения.
Для анализа времени выполнения операций используют Histogram или Summary:
import { Histogram } from "fresh/metrics";
const responseTime = new Histogram({
name: "response_time_seconds",
description: "Время ответа сервера в секундах",
buckets: [0.1, 0.3, 0.5, 1, 2, 5]
});
function trackResponseTime(duration) {
responseTime.observe(duration);
}
observe(value) добавляет новое значение в
распределение.Summary позволяет получать процентильные показатели:
import { Summary } from "fresh/metrics";
const apiLatency = new Summary({
name: "api_latency_seconds",
description: "Латентность API в секундах",
percentiles: [0.5, 0.95, 0.99]
});
function recordLatency(ms) {
apiLatency.observe(ms / 1000);
}
Custom metrics можно интегрировать в middleware или в хендлеры маршрутов. Пример middleware, отслеживающего все HTTP-запросы:
export async function handler(req, ctx) {
const start = performance.now();
const resp = await ctx.next();
const duration = (performance.now() - start) / 1000;
requestCounter.inc({ method: req.method, status: resp.status });
responseTime.observe(duration);
return resp;
}
Такой подход позволяет собирать полную статистику по каждому запросу, включая метод, статус и время обработки.
Использование labels позволяет группировать метрики по различным измерениям. Например, можно отслеживать ошибки по типу или региону:
errorCounter.inc({ type: "database", region: "eu" });
С помощью агрегаторов и панелей мониторинга эти метки используются для построения дашбордов и отчетов.
Custom metrics в Fresh предоставляют мощный инструмент для мониторинга и анализа приложения, позволяя создавать точные и детализированные отчёты о работе системы, оптимизировать производительность и выявлять узкие места.