You've already forked healthcheck
Добавлен обработчик /health/:service/:node
All checks were successful
Build and push Docker image / build (push) Successful in 4m1s
All checks were successful
Build and push Docker image / build (push) Successful in 4m1s
This commit is contained in:
43
server.js
43
server.js
@@ -5,11 +5,17 @@ const app = express()
|
|||||||
const PORT = 8080
|
const PORT = 8080
|
||||||
const docker = new Docker({ socketPath: '/var/run/docker.sock' })
|
const docker = new Docker({ socketPath: '/var/run/docker.sock' })
|
||||||
|
|
||||||
async function getServiceStatusCode(service_name) {
|
async function getServiceStatusCode(service, node_id_or_name = null) {
|
||||||
try {
|
try {
|
||||||
const service = docker.getService(service_name)
|
await docker.getService(service).inspect()
|
||||||
await service.inspect()
|
|
||||||
const tasks = await docker.listTasks({ filters: { service: [service_name] } })
|
const filters = { service: [service] }
|
||||||
|
|
||||||
|
if (node_id_or_name) {
|
||||||
|
filters.node = [node_id_or_name]
|
||||||
|
}
|
||||||
|
|
||||||
|
const tasks = await docker.listTasks({ filters: filters })
|
||||||
|
|
||||||
if (tasks.length === 0) {
|
if (tasks.length === 0) {
|
||||||
return 503
|
return 503
|
||||||
@@ -19,16 +25,20 @@ async function getServiceStatusCode(service_name) {
|
|||||||
const state = task.Status.State
|
const state = task.Status.State
|
||||||
const healthStatus = task.Status.ContainerStatus?.Health?.Status
|
const healthStatus = task.Status.ContainerStatus?.Health?.Status
|
||||||
|
|
||||||
if (healthStatus === 'healthy' || (state === 'running' && !healthStatus)) {
|
if (healthStatus === 'healthy') {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (state === 'running' && !healthStatus) {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
return false
|
return false
|
||||||
})
|
})
|
||||||
|
|
||||||
return isHealthy ? 200 : 503
|
return isHealthy ? 200 : 503
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error(error.message)
|
console.error(`Error checking service ${service} (Node: ${node_id_or_name || 'All'}): ${error.message}`)
|
||||||
|
|
||||||
if (error.statusCode === 404) {
|
if (error.statusCode === 404) {
|
||||||
return 404
|
return 404
|
||||||
@@ -38,6 +48,22 @@ async function getServiceStatusCode(service_name) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
app.get('/health/:service/:node', async (req, res) => {
|
||||||
|
const service = req.params.service
|
||||||
|
const node = req.params.node
|
||||||
|
|
||||||
|
if (!service || !/^[a-zA-Z0-9_-]+$/.test(service)) {
|
||||||
|
return res.sendStatus(400)
|
||||||
|
}
|
||||||
|
if (!node || !/^[a-zA-Z0-9_-]+$/.test(node)) {
|
||||||
|
return res.sendStatus(400)
|
||||||
|
}
|
||||||
|
|
||||||
|
const statusCode = await getServiceStatusCode(service, node)
|
||||||
|
res.sendStatus(statusCode)
|
||||||
|
})
|
||||||
|
|
||||||
app.get('/health/:service', async (req, res) => {
|
app.get('/health/:service', async (req, res) => {
|
||||||
const service = req.params.service
|
const service = req.params.service
|
||||||
|
|
||||||
@@ -45,10 +71,11 @@ app.get('/health/:service', async (req, res) => {
|
|||||||
return res.sendStatus(400)
|
return res.sendStatus(400)
|
||||||
}
|
}
|
||||||
|
|
||||||
const statusCode = await getServiceStatusCode(service)
|
const statusCode = await getServiceStatusCode(service, null)
|
||||||
res.sendStatus(statusCode)
|
res.sendStatus(statusCode)
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
||||||
app.use((_, response) => response.sendStatus(404))
|
app.use((_, response) => response.sendStatus(404))
|
||||||
|
|
||||||
const server = app.listen(PORT, () => {
|
const server = app.listen(PORT, () => {
|
||||||
@@ -70,4 +97,4 @@ const shutdown_handler = (signal) => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
process.on('SIGTERM', () => shutdown_handler('SIGTERM'))
|
process.on('SIGTERM', () => shutdown_handler('SIGTERM'))
|
||||||
process.on('SIGINT', () => shutdown_handler('SIGINT'))
|
process.on('SIGINT', () => shutdown_handler('SIGINT'))
|
||||||
|
|||||||
Reference in New Issue
Block a user