diff --git a/src/lib/features/metrics/impact/define-impact-metrics.ts b/src/lib/features/metrics/impact/define-impact-metrics.ts index 68824fbf09..bd83285843 100644 --- a/src/lib/features/metrics/impact/define-impact-metrics.ts +++ b/src/lib/features/metrics/impact/define-impact-metrics.ts @@ -1,10 +1,25 @@ import type { IFlagResolver } from '../../../types/index.js'; export const FEAUTRE_LINK_COUNT = 'feature_link_count'; +export const CLIENT_ERROR_COUNT = 'client_error_count'; +export const SERVER_ERROR_COUNT = 'server_error_count'; +export const HEAP_MEMORY_TOTAL = 'heap_memory_total'; export const defineImpactMetrics = (flagResolver: IFlagResolver) => { flagResolver.impactMetrics?.defineCounter( FEAUTRE_LINK_COUNT, 'Count of feature links', ); + flagResolver.impactMetrics?.defineCounter( + CLIENT_ERROR_COUNT, + 'Count of 4xx errors', + ); + flagResolver.impactMetrics?.defineCounter( + SERVER_ERROR_COUNT, + 'Count of 5xx errors', + ); + flagResolver.impactMetrics?.defineGauge( + HEAP_MEMORY_TOTAL, + 'Total heap memory used by the application process', + ); }; diff --git a/src/lib/metrics.ts b/src/lib/metrics.ts index a483c7313c..0cb7a47ee4 100644 --- a/src/lib/metrics.ts +++ b/src/lib/metrics.ts @@ -41,6 +41,7 @@ import { import type { SchedulerService } from './services/index.js'; import type { IClientMetricsEnv } from './features/metrics/client-metrics/client-metrics-store-v2-type.js'; import { DbMetricsMonitor } from './metrics-gauge.js'; +import { HEAP_MEMORY_TOTAL } from './features/metrics/impact/define-impact-metrics.js'; export function registerPrometheusPostgresMetrics( db: Knex, @@ -1137,6 +1138,10 @@ export function registerPrometheusMetrics( collectAggDbMetrics: dbMetrics.refreshMetrics, collectStaticCounters: async () => { try { + config.flagResolver.impactMetrics?.updateGauge( + HEAP_MEMORY_TOTAL, + process.memoryUsage().heapUsed, + ); featureTogglesArchivedTotal.reset(); featureTogglesArchivedTotal.set( await instanceStatsService.getArchivedToggleCount(), diff --git a/src/lib/middleware/request-logger.ts b/src/lib/middleware/request-logger.ts index c0ec411f63..6b75e0c015 100644 --- a/src/lib/middleware/request-logger.ts +++ b/src/lib/middleware/request-logger.ts @@ -1,14 +1,25 @@ import url from 'url'; import type { RequestHandler } from 'express'; import type { IUnleashConfig } from '../types/option.js'; +import { + CLIENT_ERROR_COUNT, + SERVER_ERROR_COUNT, +} from '../features/metrics/impact/define-impact-metrics.js'; const requestLogger: (config: IUnleashConfig) => RequestHandler = (config) => { const logger = config.getLogger('HTTP'); const enable = config.server.enableRequestLogger; + const impactMetrics = config.flagResolver.impactMetrics; return (req, res, next) => { if (enable) { res.on('finish', () => { const { pathname } = url.parse(req.originalUrl); + if (res.statusCode >= 400 || res.statusCode < 500) { + impactMetrics?.incrementCounter(CLIENT_ERROR_COUNT); + } + if (res.statusCode >= 500) { + impactMetrics?.incrementCounter(SERVER_ERROR_COUNT); + } logger.info(`${res.statusCode} ${req.method} ${pathname}`); }); }