Update metrics.ts

This commit is contained in:
Pas 2025-09-17 10:11:30 -06:00
parent 993f9ff483
commit 639674a17a

View file

@ -116,13 +116,7 @@ async function saveMetricsToFile(interval: string = 'default') {
const registry = registries[interval]; const registry = registries[interval];
if (!registry) return; if (!registry) return;
const fileName = interval === 'default' const fileName = getMetricsFileName(interval);
? METRICS_FILE
: interval === 'daily'
? METRICS_DAILY_FILE
: interval === 'weekly'
? METRICS_WEEKLY_FILE
: METRICS_MONTHLY_FILE;
const metricsData = await registry.getMetricsAsJSON(); const metricsData = await registry.getMetricsAsJSON();
const relevantMetrics = metricsData.filter( const relevantMetrics = metricsData.filter(
@ -143,13 +137,7 @@ async function saveMetricsToFile(interval: string = 'default') {
async function loadMetricsFromFile(interval: string = 'default'): Promise<any[]> { async function loadMetricsFromFile(interval: string = 'default'): Promise<any[]> {
try { try {
const fileName = interval === 'default' const fileName = getMetricsFileName(interval);
? METRICS_FILE
: interval === 'daily'
? METRICS_DAILY_FILE
: interval === 'weekly'
? METRICS_WEEKLY_FILE
: METRICS_MONTHLY_FILE;
if (!fs.existsSync(fileName)) { if (!fs.existsSync(fileName)) {
log.info(`No saved ${interval} metrics found`, { evt: 'no_saved_metrics', interval }); log.info(`No saved ${interval} metrics found`, { evt: 'no_saved_metrics', interval });
@ -213,10 +201,26 @@ export async function setupMetrics(interval: 'default' | 'daily' | 'weekly' | 'm
const registry = registries[interval]; const registry = registries[interval];
// Only clear registry if explicitly requested (e.g., by scheduled task) // Only clear registry if explicitly requested (e.g., by scheduled task)
let skipRestore = false;
if (clear) { if (clear) {
registry.clear(); registry.clear();
metricsRegistered[interval] = false; // allow re-registration after clear metricsRegistered[interval] = false; // allow re-registration after clear
if (interval === 'default') defaultMetricsRegistered = false; if (interval === 'default') defaultMetricsRegistered = false;
// Remove persisted snapshot so we truly start fresh for this interval
try {
const fileName = getMetricsFileName(interval);
if (fs.existsSync(fileName)) {
fs.unlinkSync(fileName);
log.info(`Deleted persisted ${interval} metrics file`, { evt: 'deleted_metrics_file', interval });
}
} catch (err) {
log.warn(`Failed to delete ${interval} metrics file`, {
evt: 'delete_metrics_file_error',
interval,
error: err instanceof Error ? err.message : String(err),
});
}
skipRestore = true;
} }
// Only register metrics once per registry per process // Only register metrics once per registry per process
if (!metricsRegistered[interval]) { if (!metricsRegistered[interval]) {
@ -234,50 +238,52 @@ export async function setupMetrics(interval: 'default' | 'daily' | 'weekly' | 'm
log.info(`Created new ${interval} metrics...`, { evt: 'created', interval }); log.info(`Created new ${interval} metrics...`, { evt: 'created', interval });
} }
// Load saved metrics // Load saved metrics
const savedMetrics = await loadMetricsFromFile(interval); if (!skipRestore) {
if (savedMetrics.length > 0) { const savedMetrics = await loadMetricsFromFile(interval);
log.info(`Restoring saved ${interval} metrics...`, { evt: 'restore_metrics', interval }); if (savedMetrics.length > 0) {
savedMetrics.forEach(metric => { log.info(`Restoring saved ${interval} metrics...`, { evt: 'restore_metrics', interval });
if (metric.values) { savedMetrics.forEach(metric => {
metric.values.forEach(value => { if (metric.values) {
const metrics = metricsStore[interval]; metric.values.forEach(value => {
if (!metrics) return; const metrics = metricsStore[interval];
if (!metrics) return;
// Extract the base metric name without the interval suffix // Extract the base metric name without the interval suffix
const baseName = metric.name.replace(/_daily$|_weekly$|_monthly$/, ''); const baseName = metric.name.replace(/_daily$|_weekly$|_monthly$/, '');
switch (baseName) { switch (baseName) {
case 'mw_user_count': case 'mw_user_count':
metrics.user.inc(value.labels, value.value); metrics.user.inc(value.labels, value.value);
break; break;
case 'mw_captcha_solves': case 'mw_captcha_solves':
metrics.captchaSolves.inc(value.labels, value.value); metrics.captchaSolves.inc(value.labels, value.value);
break; break;
case 'mw_provider_hostname_count': case 'mw_provider_hostname_count':
metrics.providerHostnames.inc(value.labels, value.value); metrics.providerHostnames.inc(value.labels, value.value);
break; break;
case 'mw_provider_status_count': case 'mw_provider_status_count':
metrics.providerStatuses.inc(value.labels, value.value); metrics.providerStatuses.inc(value.labels, value.value);
break; break;
case 'mw_media_watch_count': case 'mw_media_watch_count':
metrics.watchMetrics.inc(value.labels, value.value); metrics.watchMetrics.inc(value.labels, value.value);
break; break;
case 'mw_provider_tool_count': case 'mw_provider_tool_count':
metrics.toolMetrics.inc(value.labels, value.value); metrics.toolMetrics.inc(value.labels, value.value);
break; break;
case 'http_request_duration_seconds': case 'http_request_duration_seconds':
// For histograms, special handling for sum and count // For histograms, special handling for sum and count
if ( if (
value.metricName === `http_request_duration_seconds${interval !== 'default' ? `_${interval}` : ''}sum` || value.metricName === `http_request_duration_seconds${interval !== 'default' ? `_${interval}` : ''}sum` ||
value.metricName === `http_request_duration_seconds${interval !== 'default' ? `_${interval}` : ''}count` value.metricName === `http_request_duration_seconds${interval !== 'default' ? `_${interval}` : ''}count`
) { ) {
metrics.httpRequestDuration.observe(value.labels, value.value); metrics.httpRequestDuration.observe(value.labels, value.value);
} }
break; break;
} }
}); });
} }
}); });
}
} }
// Initialize metrics with current data (best-effort; don't fail if DB is unavailable) // Initialize metrics with current data (best-effort; don't fail if DB is unavailable)
@ -308,6 +314,10 @@ export async function setupMetrics(interval: 'default' | 'daily' | 'weekly' | 'm
async function updateMetrics(interval: 'default' | 'daily' | 'weekly' | 'monthly' = 'default') { async function updateMetrics(interval: 'default' | 'daily' | 'weekly' | 'monthly' = 'default') {
try { try {
// Only the default (all-time) registry should be hydrated from the database.
if (interval !== 'default') {
return;
}
log.info(`Fetching users from database for ${interval} metrics...`, { evt: 'update_metrics_start', interval }); log.info(`Fetching users from database for ${interval} metrics...`, { evt: 'update_metrics_start', interval });
const users = await prisma.users.groupBy({ const users = await prisma.users.groupBy({