UNPKG

@directus/api

Version:

Directus is a real-time API and App dashboard for managing SQL database content

49 lines (48 loc) 1.35 kB
import { useEnv } from '@directus/env'; import { toBoolean } from '@directus/utils'; import { CronJob } from 'cron'; import { useLogger } from '../logger/index.js'; import { useMetrics } from '../metrics/index.js'; import { validateCron } from '../utils/schedule.js'; const METRICS_LOCK_TIMEOUT = 10 * 60 * 1000; // 10 mins let lockedAt = 0; const logger = useLogger(); const metrics = useMetrics(); export async function handleMetricsJob() { const now = Date.now(); if (lockedAt !== 0 && lockedAt > now - METRICS_LOCK_TIMEOUT) { // ensure only generating metrics once per node return; } lockedAt = Date.now(); try { await metrics?.generate(); } catch (err) { logger.warn(`An error was thrown while attempting metric generation`); logger.warn(err); } finally { lockedAt = 0; } } /** * Schedule the metric generation * * @returns Whether or not metrics has been initialized */ export default async function schedule() { const env = useEnv(); if (!toBoolean(env['METRICS_ENABLED'])) { return false; } if (!validateCron(String(env['METRICS_SCHEDULE']))) { return false; } CronJob.from({ cronTime: String(env['METRICS_SCHEDULE']), onTick: handleMetricsJob, start: true, }); return true; }