UNPKG

logstack-zee

Version:

Complete Node.js logging solution with 6 integration methods, S3 bidirectional operations, advanced analytics, and multi-cloud storage support for enterprise-scale applications.

270 lines (223 loc) • 9.24 kB
// Job-based processing example for existing "apilogs" collection import { init, createDailyJobs, runHourlyJob, processSpecificHour, getJobStatus, getConfig } from '../index'; async function createAndProcessJobs() { console.log('šŸ”„ Creating and processing jobs with your existing "apilogs" collection'); try { // Initialize with your existing collection configuration await init({ // Your database connection dbUri: 'mongodb://localhost:27017/dynamite-lifestyle-prod-app', // Where to store generated files uploadProvider: 'local', fileFormat: 'json', // Configure to use your existing "apilogs" collection apiLogs: { existingCollection: { name: 'apilogs', timestampField: 'request_time', // Primary timestamp field requiredFields: { method: 'method', path: 'path', client_ip: 'client_ip', requestBody: 'requestBody', responseStatus: 'responseStatus', responseBody: 'responseBody' } } }, // Job scheduling configuration dailyCron: '0 0 * * *', // Create jobs at midnight hourlyCron: '0 * * * *', // Process hourly at minute 0 retryAttempts: 3, logging: { level: 'info', enableConsole: true, enableFile: true, logFilePath: './logs/job-processing.log' } }); console.log('āœ… Service initialized successfully!'); // Step 1: Create daily jobs for recent dates console.log('\nšŸ“‹ Step 1: Creating daily jobs...'); await createDailyJobs(); console.log('āœ… Daily jobs created for today'); // Step 2: Create jobs for historical dates (based on your data) const historicalDates = [ '2025-07-25', '2025-07-28', '2025-07-31', '2025-08-19' ]; console.log('\nšŸ“… Step 2: Creating jobs for historical dates...'); for (const date of historicalDates) { console.log(` Creating jobs for ${date}...`); await createDailyJobs(date); console.log(` āœ… Jobs created for ${date}`); } // Step 3: Process specific hours manually console.log('\n⚔ Step 3: Processing specific hours...'); const config = getConfig(); // Process hour 15 for July 25th (your busiest hour) console.log(' Processing 2025-07-25 hour 15 (21 logs expected)...'); await processSpecificHour('2025-07-25', 15, config); // Process hour 16 for July 28th console.log(' Processing 2025-07-28 hour 16 (7 logs expected)...'); await processSpecificHour('2025-07-28', 16, config); // Process hour 12 for August 19th console.log(' Processing 2025-08-19 hour 12 (3 logs expected)...'); await processSpecificHour('2025-08-19', 12, config); console.log('āœ… Manual processing completed'); // Step 4: Check job statuses console.log('\nšŸ“Š Step 4: Checking job statuses...'); for (const date of historicalDates) { console.log(`\nšŸ“… Status for ${date}:`); const status = await getJobStatus(date); const successful = status.filter(s => s && s.status === 'success'); const failed = status.filter(s => s && s.status === 'failed'); const pending = status.filter(s => s && s.status === 'pending'); console.log(` āœ… Successful: ${successful.length} hours`); console.log(` āŒ Failed: ${failed.length} hours`); console.log(` ā³ Pending: ${pending.length} hours`); // Show successful files if (successful.length > 0) { console.log(' šŸ“ Generated files:'); successful.forEach(hour => { if (hour && hour.file_path) { console.log(` šŸ“„ ${hour.file_path}`); } }); } } // Step 5: Process all remaining pending jobs for a specific date console.log('\n⚔ Step 5: Processing all remaining hours for July 25th...'); const july25Status = await getJobStatus('2025-07-25'); const pendingHours = july25Status .map((status, hour) => status && status.status === 'pending' ? hour : null) .filter(hour => hour !== null); if (pendingHours.length > 0) { console.log(` Found ${pendingHours.length} pending hours: [${pendingHours.join(', ')}]`); for (const hour of pendingHours) { console.log(` Processing hour ${hour}...`); await processSpecificHour('2025-07-25', hour, config); } } else { console.log(' āœ… No pending hours found'); } // Final summary console.log('\nšŸŽ‰ Job processing completed!'); console.log('\nšŸ“‹ Summary:'); console.log(' āœ… Daily jobs created for multiple dates'); console.log(' ⚔ Specific hours processed manually'); console.log(' šŸ“Š Job statuses checked and reported'); console.log(' šŸ“ Files generated in ./uploads/ directory'); console.log('\nšŸ’” Next steps:'); console.log(' - Check the ./uploads/ directory for generated files'); console.log(' - Set up automated cron jobs for real-time processing'); console.log(' - Configure cloud storage for production use'); } catch (error) { console.error('āŒ Error during job processing:', error); if (error instanceof Error && error.stack) { console.error('Stack trace:', error.stack); } } } // Function to process current hour's data async function processCurrentHour() { console.log('ā° Processing current hour...'); try { await init({ dbUri: 'mongodb://localhost:27017/dynamite-lifestyle-prod-app', uploadProvider: 'local', fileFormat: 'json', apiLogs: { existingCollection: { name: 'apilogs', timestampField: 'request_time' } } }); // Create today's jobs first await createDailyJobs(); // Get current date and hour const now = new Date(); const date = now.toISOString().split('T')[0]; const hour = now.getHours(); console.log(`šŸ“… Processing ${date} hour ${hour}...`); // Process current hour const config = getConfig(); await processSpecificHour(date, hour, config); // Check status const status = await getJobStatus(date); const currentHourStatus = status[hour]; if (currentHourStatus && currentHourStatus.status === 'success') { console.log(`āœ… Successfully processed current hour`); console.log(`šŸ“„ File: ${currentHourStatus.file_path}`); } else { console.log(`āŒ Failed to process current hour`); } } catch (error) { console.error('āŒ Error processing current hour:', error); } } // Function to create jobs for a specific date range async function createJobsForDateRange(startDate: string, endDate: string) { console.log(`šŸ“… Creating jobs for date range: ${startDate} to ${endDate}`); try { await init({ dbUri: 'mongodb://localhost:27017/dynamite-lifestyle-prod-app', uploadProvider: 'local', fileFormat: 'json', apiLogs: { existingCollection: { name: 'apilogs', timestampField: 'request_time' } } }); const start = new Date(startDate); const end = new Date(endDate); const dates = []; // Generate array of dates for (let date = new Date(start); date <= end; date.setDate(date.getDate() + 1)) { dates.push(date.toISOString().split('T')[0]); } console.log(`šŸ“‹ Creating jobs for ${dates.length} dates...`); for (const date of dates) { console.log(` Creating jobs for ${date}...`); await createDailyJobs(date); } console.log('āœ… All jobs created successfully!'); } catch (error) { console.error('āŒ Error creating jobs for date range:', error); } } // Export for use in other files export { createAndProcessJobs, processCurrentHour, createJobsForDateRange }; // CLI interface if (require.main === module) { const command = process.argv[2] || 'create-and-process'; switch (command) { case 'create-and-process': createAndProcessJobs().catch(console.error); break; case 'current-hour': processCurrentHour().catch(console.error); break; case 'date-range': const startDate = process.argv[3]; const endDate = process.argv[4]; if (!startDate || !endDate) { console.log('Usage: npm run job:date-range YYYY-MM-DD YYYY-MM-DD'); process.exit(1); } createJobsForDateRange(startDate, endDate).catch(console.error); break; default: console.log(` šŸš€ Available job commands: npm run job:create-and-process - Create and process jobs for historical data npm run job:current-hour - Process current hour only npm run job:date-range <start> <end> - Create jobs for date range `); } }