الملفات
ghaymah-exam-ayashosha-sre/q1-deploy-monitor/app.js
2026-07-29 05:15:26 +03:00

83 أسطر
2.0 KiB
JavaScript

const express = require('express')
const fs = require('fs')
const path = require('path')
const app = express()
const port = 5000
const logDir = '/logs'
const logFile = path.join(logDir, 'logs.txt')
if (!fs.existsSync(logDir)) {
fs.mkdirSync(logDir, { recursive: true })
}
function getStatsFromLogFile() {
if (!fs.existsSync(logFile)) {
return { requestCount: 0, averageResponseTime: 0 }
}
const content = fs.readFileSync(logFile, 'utf8')
const lines = content.split('\n').filter(Boolean)
const requestCount = lines.length
if (requestCount === 0) {
return { requestCount: 0, averageResponseTime: 0 }
}
const totalResponseTime = lines.reduce((total, line) => {
const parts = line.trim().split(' ')
const duration = parseFloat(parts[1])
return total + (Number.isNaN(duration) ? 0 : duration)
}, 0)
return {
requestCount,
averageResponseTime: totalResponseTime / requestCount
}
}
app.use('/dashboard', express.static(path.join(__dirname, 'dashboard'), { index: false }))
app.use((req, res, next) => {
const startTime = Date.now()
const requestTime = new Date(startTime).toISOString()
res.on('finish', () => {
const durationSeconds = (Date.now() - startTime) / 1000
const line = `${req.path} ${durationSeconds.toFixed(3)} ${requestTime} ${res.statusCode}\n`
fs.appendFile(logFile, line, (err) => {
if (err) console.error('Failed to write request log:', err)
})
})
next()
})
app.get('/dashboard', (req, res) => {
res.sendFile(path.join(__dirname, 'dashboard', 'index.html'))
})
app.get('/api/stats', (req, res) => {
const { requestCount, averageResponseTime } = getStatsFromLogFile()
res.json({
requestCount,
averageResponseTime,
status: 'up'
})
})
app.get('/', (req, res) => {
res.send('Hello World from GHAYMAH')
})
app.get('/health', (req, res) => {
res.send('The app up and runing')
})
app.listen(port, () => {
console.log(`Example app listening at http://localhost:${port}`)
console.log(`Dashboard available at http://localhost:${port}/dashboard`)
})