mirror of
https://github.com/p-stream/backend.git
synced 2026-05-16 12:21:51 +00:00
Update metrics.ts
This commit is contained in:
parent
993f9ff483
commit
639674a17a
1 changed files with 67 additions and 57 deletions
|
|
@ -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({
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue