health check passes even if database is down
This commit is contained in:
@@ -46,22 +46,30 @@ export async function GET(request: Request) {
|
|||||||
};
|
};
|
||||||
|
|
||||||
// Check database connectivity
|
// Check database connectivity
|
||||||
try {
|
if (process.env.SKIP_HEALTH_DB_CHECK === '1') {
|
||||||
const dbStart = Date.now();
|
|
||||||
await prisma.$queryRaw`SELECT 1`;
|
|
||||||
const dbLatency = Date.now() - dbStart;
|
|
||||||
services.database = {
|
services.database = {
|
||||||
status: 'healthy',
|
status: 'unknown',
|
||||||
latency: dbLatency,
|
message: 'Database check skipped (SKIP_HEALTH_DB_CHECK=1)',
|
||||||
message: 'Connected',
|
|
||||||
timestamp: new Date().toISOString(),
|
|
||||||
};
|
|
||||||
} catch (error) {
|
|
||||||
services.database = {
|
|
||||||
status: 'down',
|
|
||||||
message: error instanceof Error ? error.message : 'Connection failed',
|
|
||||||
timestamp: new Date().toISOString(),
|
timestamp: new Date().toISOString(),
|
||||||
};
|
};
|
||||||
|
} else {
|
||||||
|
try {
|
||||||
|
const dbStart = Date.now();
|
||||||
|
await prisma.$queryRaw`SELECT 1`;
|
||||||
|
const dbLatency = Date.now() - dbStart;
|
||||||
|
services.database = {
|
||||||
|
status: 'healthy',
|
||||||
|
latency: dbLatency,
|
||||||
|
message: 'Connected',
|
||||||
|
timestamp: new Date().toISOString(),
|
||||||
|
};
|
||||||
|
} catch (error) {
|
||||||
|
services.database = {
|
||||||
|
status: 'down',
|
||||||
|
message: error instanceof Error ? error.message : 'Connection failed',
|
||||||
|
timestamp: new Date().toISOString(),
|
||||||
|
};
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check Redis connectivity
|
// Check Redis connectivity
|
||||||
@@ -277,18 +285,19 @@ export async function GET(request: Request) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Determine overall status
|
// Determine overall status
|
||||||
// Critical services: Database, Environment (critical vars only)
|
// Critical services: Database (unless skipped), Environment (critical vars only)
|
||||||
// Optional services: Redis, Apple Music, CSRF_SECRET
|
// Optional services: Redis, Apple Music, CSRF_SECRET
|
||||||
|
|
||||||
|
const skipDbCheck = process.env.SKIP_HEALTH_DB_CHECK === '1';
|
||||||
const dbDown = services.database.status === 'down';
|
const dbDown = services.database.status === 'down';
|
||||||
const dbHealthy = services.database.status === 'healthy';
|
const dbHealthy = services.database.status === 'healthy' || services.database.status === 'unknown'; // Unknown is OK if skipped
|
||||||
const envDown = services.environment.status === 'down';
|
const envDown = services.environment.status === 'down';
|
||||||
const envHealthy = services.environment.status === 'healthy';
|
const envHealthy = services.environment.status === 'healthy';
|
||||||
const envDegraded = services.environment.status === 'degraded'; // Only optional vars missing
|
const envDegraded = services.environment.status === 'degraded'; // Only optional vars missing
|
||||||
|
|
||||||
// Critical services check
|
// Critical services check - database is critical unless explicitly skipped
|
||||||
const criticalServicesDown = dbDown || envDown;
|
const criticalServicesDown = (dbDown && !skipDbCheck) || envDown;
|
||||||
const criticalServicesHealthy = dbHealthy && (envHealthy || envDegraded); // Degraded env is OK (only optional vars missing)
|
const criticalServicesHealthy = (dbHealthy || skipDbCheck) && (envHealthy || envDegraded); // Degraded env is OK (only optional vars missing)
|
||||||
|
|
||||||
// Optional services status (for display only, don't affect overall status)
|
// Optional services status (for display only, don't affect overall status)
|
||||||
const optionalServicesUnknown =
|
const optionalServicesUnknown =
|
||||||
@@ -360,10 +369,21 @@ export async function GET(request: Request) {
|
|||||||
|
|
||||||
// Also support HEAD requests for lightweight health checks
|
// Also support HEAD requests for lightweight health checks
|
||||||
export async function HEAD() {
|
export async function HEAD() {
|
||||||
|
// Skip database check if requested
|
||||||
|
if (process.env.SKIP_HEALTH_DB_CHECK === '1') {
|
||||||
|
return new NextResponse(null, {
|
||||||
|
status: 200,
|
||||||
|
headers: {
|
||||||
|
// Cache HEAD responses for 10 seconds
|
||||||
|
'Cache-Control': 'public, max-age=10, stale-while-revalidate=30',
|
||||||
|
},
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
// Quick database check only - lightweight for load balancers
|
// Quick database check only - lightweight for load balancers
|
||||||
await prisma.$queryRaw`SELECT 1`;
|
await prisma.$queryRaw`SELECT 1`;
|
||||||
return new NextResponse(null, {
|
return new NextResponse(null, {
|
||||||
status: 200,
|
status: 200,
|
||||||
headers: {
|
headers: {
|
||||||
// Cache HEAD responses for 10 seconds
|
// Cache HEAD responses for 10 seconds
|
||||||
@@ -371,7 +391,7 @@ export async function HEAD() {
|
|||||||
},
|
},
|
||||||
});
|
});
|
||||||
} catch {
|
} catch {
|
||||||
return new NextResponse(null, {
|
return new NextResponse(null, {
|
||||||
status: 503,
|
status: 503,
|
||||||
headers: {
|
headers: {
|
||||||
'Cache-Control': 'no-cache', // Don't cache failures
|
'Cache-Control': 'no-cache', // Don't cache failures
|
||||||
|
|||||||
Reference in New Issue
Block a user