curaflow/tools/log-viewer/server.js

56 lines
1.6 KiB
JavaScript

const express = require('express');
const { spawn } = require('child_process');
const path = require('path');
const app = express();
const PORT = 9999;
app.use(express.static(path.join(__dirname, 'public')));
app.get('/api/logs', (req, res) => {
res.setHeader('Content-Type', 'text/event-stream');
res.setHeader('Cache-Control', 'no-cache');
res.setHeader('Connection', 'keep-alive');
res.flushHeaders();
const service = req.query.service || 'curio-app';
let label = 'app=curio-app';
if (service === 'curaflow-agent') {
label = 'app.kubernetes.io/name=curaflow-agent';
}
// Spawn kubectl logs
const kubectl = spawn('kubectl', ['logs', '-f', '-n', 'curio', '-l', label, '--tail=100']);
kubectl.stdout.on('data', (data) => {
const lines = data.toString().split('\n');
lines.forEach(line => {
if (line.trim()) {
res.write(`data: ${JSON.stringify({ text: line, isError: false })}\n\n`);
}
});
});
kubectl.stderr.on('data', (data) => {
const lines = data.toString().split('\n');
lines.forEach(line => {
if (line.trim()) {
res.write(`data: ${JSON.stringify({ text: line, isError: true })}\n\n`);
}
});
});
kubectl.on('close', (code) => {
res.write(`data: ${JSON.stringify({ text: `[Process exited with code ${code}]`, isError: true })}\n\n`);
res.end();
});
req.on('close', () => {
kubectl.kill();
});
});
app.listen(PORT, () => {
console.log(`Curio Log Viewer running at http://localhost:${PORT}`);
});