192 lines
4.7 KiB
JavaScript
192 lines
4.7 KiB
JavaScript
const express = require('express');
|
|
const router = express.Router();
|
|
const http = require('http');
|
|
|
|
/**
|
|
* Data Retention Metrics Proxy
|
|
* Proxies requests to the data retention microservice
|
|
*/
|
|
|
|
const DATA_RETENTION_HOST = process.env.DATA_RETENTION_HOST || 'data-retention';
|
|
const DATA_RETENTION_PORT = process.env.DATA_RETENTION_PORT || 3001;
|
|
|
|
/**
|
|
* Make HTTP request to data retention service
|
|
*/
|
|
function makeRequest(path) {
|
|
return new Promise((resolve, reject) => {
|
|
const options = {
|
|
hostname: DATA_RETENTION_HOST,
|
|
port: DATA_RETENTION_PORT,
|
|
path: path,
|
|
method: 'GET',
|
|
timeout: 5000
|
|
};
|
|
|
|
const req = http.request(options, (res) => {
|
|
let data = '';
|
|
|
|
res.on('data', (chunk) => {
|
|
data += chunk;
|
|
});
|
|
|
|
res.on('end', () => {
|
|
try {
|
|
const result = JSON.parse(data);
|
|
resolve({ status: res.statusCode, data: result });
|
|
} catch (error) {
|
|
reject(new Error(`Failed to parse response: ${error.message}`));
|
|
}
|
|
});
|
|
});
|
|
|
|
req.on('error', (error) => {
|
|
reject(new Error(`Request failed: ${error.message}`));
|
|
});
|
|
|
|
req.on('timeout', () => {
|
|
req.destroy();
|
|
reject(new Error('Request timeout'));
|
|
});
|
|
|
|
req.end();
|
|
});
|
|
}
|
|
|
|
/**
|
|
* GET /api/data-retention/metrics
|
|
* Get detailed metrics from data retention service
|
|
*/
|
|
router.get('/metrics', async (req, res) => {
|
|
try {
|
|
const response = await makeRequest('/metrics');
|
|
|
|
if (response.status === 200) {
|
|
res.json({
|
|
success: true,
|
|
data: response.data,
|
|
timestamp: new Date().toISOString()
|
|
});
|
|
} else {
|
|
res.status(response.status).json({
|
|
success: false,
|
|
error: 'Failed to fetch metrics from data retention service'
|
|
});
|
|
}
|
|
} catch (error) {
|
|
console.error('Data retention metrics error:', error);
|
|
res.status(503).json({
|
|
success: false,
|
|
error: 'Data retention service unavailable',
|
|
details: error.message
|
|
});
|
|
}
|
|
});
|
|
|
|
/**
|
|
* GET /api/data-retention/health
|
|
* Get health status from data retention service
|
|
*/
|
|
router.get('/health', async (req, res) => {
|
|
try {
|
|
const response = await makeRequest('/health');
|
|
|
|
if (response.status === 200) {
|
|
res.json({
|
|
success: true,
|
|
data: response.data,
|
|
timestamp: new Date().toISOString()
|
|
});
|
|
} else {
|
|
res.status(response.status).json({
|
|
success: false,
|
|
error: 'Failed to fetch health from data retention service'
|
|
});
|
|
}
|
|
} catch (error) {
|
|
console.error('Data retention health error:', error);
|
|
res.status(503).json({
|
|
success: false,
|
|
error: 'Data retention service unavailable',
|
|
details: error.message
|
|
});
|
|
}
|
|
});
|
|
|
|
/**
|
|
* GET /api/data-retention/stats
|
|
* Get basic statistics from data retention service
|
|
*/
|
|
router.get('/stats', async (req, res) => {
|
|
try {
|
|
const response = await makeRequest('/stats');
|
|
|
|
if (response.status === 200) {
|
|
res.json({
|
|
success: true,
|
|
data: response.data,
|
|
timestamp: new Date().toISOString()
|
|
});
|
|
} else {
|
|
res.status(response.status).json({
|
|
success: false,
|
|
error: 'Failed to fetch stats from data retention service'
|
|
});
|
|
}
|
|
} catch (error) {
|
|
console.error('Data retention stats error:', error);
|
|
res.status(503).json({
|
|
success: false,
|
|
error: 'Data retention service unavailable',
|
|
details: error.message
|
|
});
|
|
}
|
|
});
|
|
|
|
/**
|
|
* GET /api/data-retention/status
|
|
* Get combined status including service connectivity
|
|
*/
|
|
router.get('/status', async (req, res) => {
|
|
try {
|
|
const [healthResponse, metricsResponse] = await Promise.allSettled([
|
|
makeRequest('/health'),
|
|
makeRequest('/metrics')
|
|
]);
|
|
|
|
const result = {
|
|
success: true,
|
|
service: {
|
|
name: 'data-retention-service',
|
|
connected: false,
|
|
error: null
|
|
},
|
|
health: null,
|
|
metrics: null,
|
|
timestamp: new Date().toISOString()
|
|
};
|
|
|
|
if (healthResponse.status === 'fulfilled' && healthResponse.value.status === 200) {
|
|
result.service.connected = true;
|
|
result.health = healthResponse.value.data;
|
|
} else {
|
|
result.service.error = healthResponse.reason?.message || 'Health check failed';
|
|
}
|
|
|
|
if (metricsResponse.status === 'fulfilled' && metricsResponse.value.status === 200) {
|
|
result.metrics = metricsResponse.value.data;
|
|
}
|
|
|
|
res.json(result);
|
|
|
|
} catch (error) {
|
|
console.error('Data retention status error:', error);
|
|
res.status(503).json({
|
|
success: false,
|
|
error: 'Failed to get data retention service status',
|
|
details: error.message
|
|
});
|
|
}
|
|
});
|
|
|
|
module.exports = router; |