@nanocollective/nanocoder
Version:
A local-first CLI coding agent that brings the power of agentic coding tools like Claude Code and Gemini CLI to local models or controlled APIs like OpenRouter
116 lines • 4.55 kB
JavaScript
/**
* Health check orchestration
*/
import { withNewCorrelationContext } from '../../correlation.js';
import { loggerProvider } from '../../logger-provider.js';
const getLogger = () => loggerProvider.getLogger();
import { checkConfigurationSystem } from '../checks/configuration-check.js';
import { checkLoggingSystem } from '../checks/logging-check.js';
import { checkMemory } from '../checks/memory-check.js';
import { checkPerformanceMonitoring } from '../checks/performance-check.js';
import { checkRequestTracking } from '../checks/request-check.js';
import { generateRecommendations } from './scoring.js';
// Get logger instance directly to avoid circular dependencies
const logger = getLogger();
/**
* Run a comprehensive health check
*/
export async function runHealthCheck(config, correlationId) {
return withNewCorrelationContext(async (_context) => {
const startTime = performance.now();
try {
logger.debug('Starting health check', {
correlationId,
source: 'health-monitor',
});
const checks = [];
// Run all health checks
checks.push(checkMemory(config));
checks.push(checkLoggingSystem(config));
checks.push(checkRequestTracking(config));
checks.push(checkPerformanceMonitoring(config));
checks.push(checkConfigurationSystem(config));
// Calculate overall health
const totalChecks = checks.length;
const passedChecks = checks.filter(c => c.status === 'pass').length;
const failedChecks = checks.filter(c => c.status === 'fail').length;
const warningChecks = checks.filter(c => c.status === 'warn').length;
const averageScore = checks.reduce((sum, c) => sum + c.score, 0) / totalChecks;
// Determine overall status
let status;
if (failedChecks > 0) {
status = 'unhealthy';
}
else if (warningChecks > 0 || averageScore < 80) {
status = 'degraded';
}
else {
status = 'healthy';
}
const duration = performance.now() - startTime;
const result = {
status,
score: Math.round(averageScore),
checks,
timestamp: new Date().toISOString(),
duration: Math.round(duration),
correlationId,
summary: {
total: totalChecks,
passed: passedChecks,
failed: failedChecks,
warnings: warningChecks,
},
recommendations: generateRecommendations(checks, status),
};
// Log health check result
logger.info('Health check completed', {
status,
score: result.score,
duration: `${duration.toFixed(2)}ms`,
summary: result.summary,
correlationId,
source: 'health-monitor',
});
return result;
}
catch (error) {
const duration = performance.now() - startTime;
logger.error('Health check failed', {
error: error instanceof Error ? error.message : error,
duration: `${duration.toFixed(2)}ms`,
correlationId,
source: 'health-monitor',
});
const result = {
status: 'unhealthy',
score: 0,
checks: [
{
name: 'health-check-system',
status: 'fail',
score: 0,
duration,
error: error instanceof Error ? error.message : String(error),
},
],
timestamp: new Date().toISOString(),
duration: Math.round(duration),
correlationId,
summary: {
total: 1,
passed: 0,
failed: 1,
warnings: 0,
},
recommendations: [
'Fix health check system errors',
'Check system resources',
'Review configuration',
],
};
return result;
}
});
}
//# sourceMappingURL=health-check-runner.js.map