61 lines
1.3 KiB
TypeScript
61 lines
1.3 KiB
TypeScript
import { query } from '../../../utils/db'
|
|
|
|
export default defineEventHandler(async (event) => {
|
|
const queryParams = getQuery(event)
|
|
const targetId = queryParams.target_id as string
|
|
const period = (queryParams.period as string) || '1h'
|
|
|
|
if (!targetId) {
|
|
throw createError({
|
|
statusCode: 400,
|
|
message: 'target_id is required'
|
|
})
|
|
}
|
|
|
|
const periodMap: Record<string, string> = {
|
|
'1h': '1 hour',
|
|
'2h': '2 hours',
|
|
'3h': '3 hours',
|
|
'4h': '4 hours',
|
|
'5h': '5 hours',
|
|
'6h': '6 hours',
|
|
'12h': '12 hours',
|
|
'18h': '18 hours',
|
|
'24h': '24 hours',
|
|
'7d': '7 days',
|
|
'30d': '30 days'
|
|
}
|
|
|
|
const interval = periodMap[period] || '1 hour'
|
|
|
|
let containers: any[] = []
|
|
try {
|
|
containers = await query(`
|
|
SELECT
|
|
container_id,
|
|
container_name,
|
|
container_status,
|
|
cpu_percent,
|
|
memory_usage,
|
|
memory_limit,
|
|
memory_percent,
|
|
uptime,
|
|
network_rx,
|
|
network_tx,
|
|
collected_at
|
|
FROM server_containers
|
|
WHERE target_id = $1
|
|
AND collected_at::timestamp >= NOW() - INTERVAL '${interval}'
|
|
ORDER BY collected_at ASC, container_name ASC
|
|
`, [targetId])
|
|
} catch (e) {
|
|
containers = []
|
|
}
|
|
|
|
return {
|
|
target_id: targetId,
|
|
period,
|
|
data: containers
|
|
}
|
|
})
|