happy-server/sources/modules/metrics.ts
2025-08-19 18:03:03 -07:00

77 lines
2.4 KiB
TypeScript

import { register, Counter, Gauge, Histogram } from 'prom-client';
// Application metrics
export const websocketConnectionsGauge = new Gauge({
name: 'websocket_connections_total',
help: 'Number of active WebSocket connections',
labelNames: ['type'] as const,
registers: [register]
});
export const sessionAliveEventsCounter = new Counter({
name: 'session_alive_events_total',
help: 'Total number of session-alive events',
registers: [register]
});
export const machineAliveEventsCounter = new Counter({
name: 'machine_alive_events_total',
help: 'Total number of machine-alive events',
registers: [register]
});
export const sessionCacheCounter = new Counter({
name: 'session_cache_operations_total',
help: 'Total session cache operations',
labelNames: ['operation', 'result'] as const,
registers: [register]
});
export const databaseUpdatesSkippedCounter = new Counter({
name: 'database_updates_skipped_total',
help: 'Number of database updates skipped due to debouncing',
labelNames: ['type'] as const,
registers: [register]
});
export const websocketEventsCounter = new Counter({
name: 'websocket_events_total',
help: 'Total WebSocket events received by type',
labelNames: ['event_type'] as const,
registers: [register]
});
export const httpRequestsCounter = new Counter({
name: 'http_requests_total',
help: 'Total number of HTTP requests',
labelNames: ['method', 'route', 'status'] as const,
registers: [register]
});
export const httpRequestDurationHistogram = new Histogram({
name: 'http_request_duration_seconds',
help: 'HTTP request duration in seconds',
labelNames: ['method', 'route', 'status'] as const,
buckets: [0.001, 0.005, 0.01, 0.05, 0.1, 0.5, 1, 5, 10],
registers: [register]
});
// WebSocket connection tracking
const connectionCounts = {
'user-scoped': 0,
'session-scoped': 0,
'machine-scoped': 0
};
export function incrementWebSocketConnection(type: 'user-scoped' | 'session-scoped' | 'machine-scoped'): void {
connectionCounts[type]++;
websocketConnectionsGauge.set({ type }, connectionCounts[type]);
}
export function decrementWebSocketConnection(type: 'user-scoped' | 'session-scoped' | 'machine-scoped'): void {
connectionCounts[type] = Math.max(0, connectionCounts[type] - 1);
websocketConnectionsGauge.set({ type }, connectionCounts[type]);
}
// Export the register for combining metrics
export { register };