67 lines
2.4 KiB
TypeScript
67 lines
2.4 KiB
TypeScript
// API Route: GET /api/shim/health
|
|
// Returns connection pool stats, database health, and system metrics (RAM/CPU/locks)
|
|
|
|
import type { APIRoute } from 'astro';
|
|
import { getPoolStats, getDatabaseStats, getVacuumCandidates } from '@/lib/shim/pool';
|
|
import { getSystemHealth } from '@/lib/shim/health';
|
|
|
|
export const GET: APIRoute = async ({ request }) => {
|
|
try {
|
|
// Token validation
|
|
const authHeader = request.headers.get('Authorization');
|
|
const token = authHeader?.replace('Bearer ', '');
|
|
|
|
const godToken = import.meta.env.GOD_MODE_TOKEN;
|
|
if (godToken && token !== godToken) {
|
|
return new Response(JSON.stringify({ error: 'Unauthorized' }), {
|
|
status: 401,
|
|
headers: { 'Content-Type': 'application/json' }
|
|
});
|
|
}
|
|
|
|
// Get all health stats
|
|
const poolStats = getPoolStats();
|
|
const dbStats = await getDatabaseStats();
|
|
const vacuumCandidates = await getVacuumCandidates();
|
|
const systemHealth = await getSystemHealth();
|
|
const needsVacuum = vacuumCandidates.length > 0 && vacuumCandidates[0].deadPercent > 20;
|
|
|
|
// Overall status (most critical wins)
|
|
const overallStatus =
|
|
systemHealth.status === 'critical' || poolStats.status === 'critical'
|
|
? 'critical'
|
|
: systemHealth.status === 'warning' || poolStats.status === 'warning'
|
|
? 'warning'
|
|
: 'healthy';
|
|
|
|
return new Response(JSON.stringify({
|
|
timestamp: new Date().toISOString(),
|
|
status: overallStatus,
|
|
system: systemHealth,
|
|
pool: poolStats,
|
|
database: dbStats,
|
|
vacuum: {
|
|
recommended: needsVacuum,
|
|
candidates: vacuumCandidates
|
|
},
|
|
alerts: [
|
|
...systemHealth.alerts,
|
|
...(poolStats.status !== 'healthy' ? [poolStats.message] : [])
|
|
]
|
|
}), {
|
|
status: 200,
|
|
headers: { 'Content-Type': 'application/json' }
|
|
});
|
|
|
|
} catch (error: any) {
|
|
console.error('Health check error:', error);
|
|
return new Response(JSON.stringify({
|
|
error: 'Health check failed',
|
|
message: error.message
|
|
}), {
|
|
status: 500,
|
|
headers: { 'Content-Type': 'application/json' }
|
|
});
|
|
}
|
|
};
|