You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
423 lines
13 KiB
423 lines
13 KiB
/**
|
|
* Phase 3.2 Advanced Error Handling Usage Example
|
|
*
|
|
* Demonstrates comprehensive error handling with categorization, retry logic, and telemetry
|
|
* Shows error classification, exponential backoff, and debugging information
|
|
*
|
|
* @author Matthew Raymer
|
|
* @version 1.0.0
|
|
*/
|
|
|
|
import { DailyNotification } from '@timesafari/daily-notification-plugin';
|
|
|
|
/**
|
|
* Example: Configure advanced error handling
|
|
*/
|
|
async function configureAdvancedErrorHandling() {
|
|
try {
|
|
console.log('Configuring advanced error handling...');
|
|
|
|
// Configure with error handling
|
|
await DailyNotification.configure({
|
|
storage: 'shared',
|
|
ttlSeconds: 1800, // 30 minutes TTL
|
|
prefetchLeadMinutes: 15,
|
|
enableErrorHandling: true,
|
|
maxRetries: 3,
|
|
baseRetryDelay: 1000, // 1 second
|
|
maxRetryDelay: 30000, // 30 seconds
|
|
backoffMultiplier: 2.0
|
|
});
|
|
|
|
console.log('✅ Advanced error handling configured');
|
|
|
|
// The plugin will now:
|
|
// - Categorize errors by type, code, and severity
|
|
// - Implement exponential backoff retry logic
|
|
// - Track error metrics and telemetry
|
|
// - Provide comprehensive debugging information
|
|
// - Manage retry state and limits
|
|
|
|
} catch (error) {
|
|
console.error('❌ Advanced error handling configuration failed:', error);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Example: Demonstrate error categorization
|
|
*/
|
|
async function demonstrateErrorCategorization() {
|
|
try {
|
|
console.log('Demonstrating error categorization...');
|
|
|
|
// Configure error handling
|
|
await configureAdvancedErrorHandling();
|
|
|
|
// Simulate different types of errors
|
|
const errorScenarios = [
|
|
{
|
|
name: 'Network Error',
|
|
url: 'https://unreachable-api.example.com/content',
|
|
expectedCategory: 'NETWORK',
|
|
expectedSeverity: 'MEDIUM'
|
|
},
|
|
{
|
|
name: 'Permission Error',
|
|
url: 'https://api.example.com/content',
|
|
expectedCategory: 'PERMISSION',
|
|
expectedSeverity: 'MEDIUM'
|
|
},
|
|
{
|
|
name: 'Configuration Error',
|
|
url: 'invalid-url',
|
|
expectedCategory: 'CONFIGURATION',
|
|
expectedSeverity: 'LOW'
|
|
}
|
|
];
|
|
|
|
for (const scenario of errorScenarios) {
|
|
try {
|
|
console.log(`📡 Testing ${scenario.name}...`);
|
|
|
|
await DailyNotification.scheduleDailyNotification({
|
|
url: scenario.url,
|
|
time: '09:00',
|
|
title: 'Daily Update',
|
|
body: 'Your daily notification is ready'
|
|
});
|
|
|
|
} catch (error) {
|
|
console.log(`✅ ${scenario.name} handled:`, error.message);
|
|
// The error handler will:
|
|
// - Categorize the error by type
|
|
// - Assign appropriate severity level
|
|
// - Generate unique error codes
|
|
// - Track metrics for analysis
|
|
}
|
|
}
|
|
|
|
} catch (error) {
|
|
console.error('❌ Error categorization demonstration failed:', error);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Example: Demonstrate retry logic with exponential backoff
|
|
*/
|
|
async function demonstrateRetryLogic() {
|
|
try {
|
|
console.log('Demonstrating retry logic with exponential backoff...');
|
|
|
|
// Configure error handling
|
|
await configureAdvancedErrorHandling();
|
|
|
|
// Schedule notification with unreliable endpoint
|
|
console.log('📡 Scheduling notification with unreliable endpoint...');
|
|
|
|
await DailyNotification.scheduleDailyNotification({
|
|
url: 'https://unreliable-api.example.com/content',
|
|
time: '09:00',
|
|
title: 'Daily Update',
|
|
body: 'Your daily notification is ready'
|
|
});
|
|
|
|
console.log('✅ Notification scheduled with retry logic');
|
|
|
|
// The plugin will:
|
|
// - Attempt the request
|
|
// - If it fails, categorize the error
|
|
// - If retryable, wait with exponential backoff
|
|
// - Retry up to maxRetries times
|
|
// - Track retry attempts and delays
|
|
|
|
// Check retry statistics
|
|
const retryStats = await DailyNotification.getRetryStatistics();
|
|
console.log('📊 Retry Statistics:', retryStats);
|
|
|
|
} catch (error) {
|
|
console.error('❌ Retry logic demonstration failed:', error);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Example: Check error metrics and telemetry
|
|
*/
|
|
async function checkErrorMetricsAndTelemetry() {
|
|
try {
|
|
console.log('Checking error metrics and telemetry...');
|
|
|
|
// Configure error handling
|
|
await configureAdvancedErrorHandling();
|
|
|
|
// Generate some errors to create metrics
|
|
await demonstrateErrorCategorization();
|
|
|
|
// Get error metrics
|
|
const errorMetrics = await DailyNotification.getErrorMetrics();
|
|
|
|
console.log('📊 Error Metrics:');
|
|
console.log(` Total Errors: ${errorMetrics.totalErrors}`);
|
|
console.log(` Network Errors: ${errorMetrics.networkErrors}`);
|
|
console.log(` Storage Errors: ${errorMetrics.storageErrors}`);
|
|
console.log(` Scheduling Errors: ${errorMetrics.schedulingErrors}`);
|
|
console.log(` Permission Errors: ${errorMetrics.permissionErrors}`);
|
|
console.log(` Configuration Errors: ${errorMetrics.configurationErrors}`);
|
|
console.log(` System Errors: ${errorMetrics.systemErrors}`);
|
|
console.log(` Unknown Errors: ${errorMetrics.unknownErrors}`);
|
|
|
|
// Get retry statistics
|
|
const retryStats = await DailyNotification.getRetryStatistics();
|
|
console.log('🔄 Retry Statistics:');
|
|
console.log(` Total Operations: ${retryStats.totalOperations}`);
|
|
console.log(` Active Retries: ${retryStats.activeRetries}`);
|
|
console.log(` Total Retries: ${retryStats.totalRetries}`);
|
|
|
|
// Analyze error patterns
|
|
if (errorMetrics.networkErrors > 0) {
|
|
console.log('⚠️ Network errors detected - check connectivity');
|
|
}
|
|
|
|
if (errorMetrics.permissionErrors > 0) {
|
|
console.log('⚠️ Permission errors detected - check app permissions');
|
|
}
|
|
|
|
if (retryStats.totalRetries > retryStats.totalOperations * 2) {
|
|
console.log('⚠️ High retry rate - system may be unstable');
|
|
}
|
|
|
|
} catch (error) {
|
|
console.error('❌ Error metrics check failed:', error);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Example: Handle custom retry configurations
|
|
*/
|
|
async function handleCustomRetryConfigurations() {
|
|
try {
|
|
console.log('Handling custom retry configurations...');
|
|
|
|
// Configure error handling
|
|
await configureAdvancedErrorHandling();
|
|
|
|
// Schedule notification with custom retry config
|
|
console.log('📡 Scheduling with custom retry configuration...');
|
|
|
|
await DailyNotification.scheduleDailyNotification({
|
|
url: 'https://api.example.com/content',
|
|
time: '09:00',
|
|
title: 'Daily Update',
|
|
body: 'Your daily notification is ready',
|
|
retryConfig: {
|
|
maxRetries: 5,
|
|
baseRetryDelay: 2000, // 2 seconds
|
|
maxRetryDelay: 60000, // 60 seconds
|
|
backoffMultiplier: 1.5
|
|
}
|
|
});
|
|
|
|
console.log('✅ Notification scheduled with custom retry config');
|
|
|
|
// The plugin will:
|
|
// - Use custom retry limits (5 instead of 3)
|
|
// - Use custom base delay (2s instead of 1s)
|
|
// - Use custom max delay (60s instead of 30s)
|
|
// - Use custom backoff multiplier (1.5 instead of 2.0)
|
|
|
|
} catch (error) {
|
|
console.error('❌ Custom retry configuration failed:', error);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Example: Monitor error patterns over time
|
|
*/
|
|
async function monitorErrorPatternsOverTime() {
|
|
try {
|
|
console.log('Monitoring error patterns over time...');
|
|
|
|
// Configure error handling
|
|
await configureAdvancedErrorHandling();
|
|
|
|
// Monitor errors over multiple operations
|
|
const monitoringInterval = setInterval(async () => {
|
|
try {
|
|
const errorMetrics = await DailyNotification.getErrorMetrics();
|
|
const retryStats = await DailyNotification.getRetryStatistics();
|
|
|
|
console.log('📊 Error Pattern Snapshot:');
|
|
console.log(` Total Errors: ${errorMetrics.totalErrors}`);
|
|
console.log(` Network Errors: ${errorMetrics.networkErrors}`);
|
|
console.log(` Active Retries: ${retryStats.activeRetries}`);
|
|
console.log(` Total Retries: ${retryStats.totalRetries}`);
|
|
|
|
// Stop monitoring if we have enough data
|
|
if (errorMetrics.totalErrors >= 10) {
|
|
clearInterval(monitoringInterval);
|
|
console.log('✅ Error pattern monitoring completed');
|
|
}
|
|
|
|
} catch (error) {
|
|
console.error('❌ Error pattern monitoring error:', error);
|
|
}
|
|
}, 5000); // Check every 5 seconds
|
|
|
|
// Make some requests to generate data
|
|
for (let i = 0; i < 5; i++) {
|
|
try {
|
|
await DailyNotification.scheduleDailyNotification({
|
|
url: 'https://api.example.com/content',
|
|
time: `09:${i.toString().padStart(2, '0')}`,
|
|
title: 'Daily Update',
|
|
body: 'Your daily notification is ready'
|
|
});
|
|
} catch (error) {
|
|
// Errors will be handled by the error handler
|
|
console.log(`Request ${i + 1} failed:`, error.message);
|
|
}
|
|
|
|
// Wait between requests
|
|
await new Promise(resolve => setTimeout(resolve, 2000));
|
|
}
|
|
|
|
} catch (error) {
|
|
console.error('❌ Error pattern monitoring failed:', error);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Example: Reset error metrics and retry states
|
|
*/
|
|
async function resetErrorMetricsAndRetryStates() {
|
|
try {
|
|
console.log('Resetting error metrics and retry states...');
|
|
|
|
// Configure error handling
|
|
await configureAdvancedErrorHandling();
|
|
|
|
// Get current metrics
|
|
const beforeMetrics = await DailyNotification.getErrorMetrics();
|
|
const beforeRetryStats = await DailyNotification.getRetryStatistics();
|
|
|
|
console.log('📊 Before Reset:');
|
|
console.log(` Total Errors: ${beforeMetrics.totalErrors}`);
|
|
console.log(` Active Retries: ${beforeRetryStats.activeRetries}`);
|
|
|
|
// Reset metrics
|
|
await DailyNotification.resetErrorMetrics();
|
|
console.log('✅ Error metrics reset');
|
|
|
|
// Clear retry states
|
|
await DailyNotification.clearRetryStates();
|
|
console.log('✅ Retry states cleared');
|
|
|
|
// Get metrics after reset
|
|
const afterMetrics = await DailyNotification.getErrorMetrics();
|
|
const afterRetryStats = await DailyNotification.getRetryStatistics();
|
|
|
|
console.log('📊 After Reset:');
|
|
console.log(` Total Errors: ${afterMetrics.totalErrors}`);
|
|
console.log(` Active Retries: ${afterRetryStats.activeRetries}`);
|
|
|
|
} catch (error) {
|
|
console.error('❌ Error metrics reset failed:', error);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Example: Debug error handling information
|
|
*/
|
|
async function debugErrorHandlingInformation() {
|
|
try {
|
|
console.log('Debugging error handling information...');
|
|
|
|
// Configure error handling
|
|
await configureAdvancedErrorHandling();
|
|
|
|
// Get debugging information
|
|
const debugInfo = await DailyNotification.getErrorDebugInfo();
|
|
|
|
console.log('🐛 Error Debug Information:');
|
|
console.log(` Error Handler Status: ${debugInfo.handlerStatus}`);
|
|
console.log(` Configuration: ${JSON.stringify(debugInfo.configuration)}`);
|
|
console.log(` Recent Errors: ${debugInfo.recentErrors.length}`);
|
|
console.log(` Retry States: ${debugInfo.retryStates.length}`);
|
|
|
|
// Display recent errors
|
|
if (debugInfo.recentErrors.length > 0) {
|
|
console.log('📋 Recent Errors:');
|
|
debugInfo.recentErrors.forEach((error, index) => {
|
|
console.log(` ${index + 1}. ${error.category} - ${error.severity} - ${error.errorCode}`);
|
|
});
|
|
}
|
|
|
|
// Display retry states
|
|
if (debugInfo.retryStates.length > 0) {
|
|
console.log('🔄 Retry States:');
|
|
debugInfo.retryStates.forEach((state, index) => {
|
|
console.log(` ${index + 1}. Operation: ${state.operationId} - Attempts: ${state.attemptCount}`);
|
|
});
|
|
}
|
|
|
|
} catch (error) {
|
|
console.error('❌ Error debugging failed:', error);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Example: Optimize error handling for production
|
|
*/
|
|
async function optimizeErrorHandlingForProduction() {
|
|
try {
|
|
console.log('Optimizing error handling for production...');
|
|
|
|
// Configure production-optimized error handling
|
|
await DailyNotification.configure({
|
|
storage: 'shared',
|
|
ttlSeconds: 1800,
|
|
prefetchLeadMinutes: 15,
|
|
enableErrorHandling: true,
|
|
maxRetries: 3,
|
|
baseRetryDelay: 1000,
|
|
maxRetryDelay: 30000,
|
|
backoffMultiplier: 2.0,
|
|
enableErrorTelemetry: true,
|
|
errorReportingEndpoint: 'https://api.example.com/errors'
|
|
});
|
|
|
|
console.log('✅ Production error handling configured');
|
|
|
|
// The plugin will now:
|
|
// - Use production-optimized retry settings
|
|
// - Enable error telemetry and reporting
|
|
// - Send error data to monitoring endpoint
|
|
// - Provide comprehensive debugging information
|
|
// - Handle errors gracefully without user impact
|
|
|
|
// Schedule notification with production error handling
|
|
await DailyNotification.scheduleDailyNotification({
|
|
url: 'https://api.example.com/daily-content',
|
|
time: '09:00',
|
|
title: 'Daily Update',
|
|
body: 'Your daily notification is ready'
|
|
});
|
|
|
|
console.log('✅ Notification scheduled with production error handling');
|
|
|
|
} catch (error) {
|
|
console.error('❌ Production error handling optimization failed:', error);
|
|
}
|
|
}
|
|
|
|
// Export examples for use
|
|
export {
|
|
configureAdvancedErrorHandling,
|
|
demonstrateErrorCategorization,
|
|
demonstrateRetryLogic,
|
|
checkErrorMetricsAndTelemetry,
|
|
handleCustomRetryConfigurations,
|
|
monitorErrorPatternsOverTime,
|
|
resetErrorMetricsAndRetryStates,
|
|
debugErrorHandlingInformation,
|
|
optimizeErrorHandlingForProduction
|
|
};
|
|
|