Liveness Probe (NodeJS)

JS
S
JavaScript

A simple liveness probe for NodeJS applications. This one runs on port 4500. Any request on any path on port 4500 will return process stats. http://localhost:4500/health http://localhost:4500/healthz http://localhost:4500/hello http://localhost:4500/ping

1const http = require('http');
2const logger = require('../logger');
3const os = require('os');
4const moment = require('moment');
5
6function getBasicStats() {
7    const data = {
8        os: {
9            uptime: moment.duration(os.uptime(), 'seconds').humanize()
10        },
11        cpu: {
12            cores: os.cpus().length,
13            loadavg: os.loadavg()
14        },
15        memory: {
16            total: os.totalmem(),
17            free: os.freemem()
18        },
19        process: {
20            uptime: moment.duration(process.uptime(), 'seconds').humanize()
21        }
22    };
23    return JSON.stringify(data);
24}
25
26function startLivenessProb() {
27    const port = 4500;
28    const requestHandler = (request, response) => {
29        response.end(getBasicStats());
30    };
31    const server = http.createServer(requestHandler);
32
33    server.listen(port, (err) => {
34        if (err) {
35            return logger.log('Liveness Probe Failed', err);
36        }
37        logger.log(`Liveness Probe is listening on ${port}`);
38    });
39}
40
41module.exports = startLivenessProb;
42
43// Usage
44const livenessProbe = require('./lib/liveness-probe');
45livenessProbe();
46
47/*******************************************************************************************************************************/
48// New Version in TS
49/*******************************************************************************************************************************/
50import { Request, Response, Router } from 'express';
51import { RouteHandler, Get, Post, Put, Delete } from '../decorators/route-handler';
52import logService from '../classes/log-service';
53import Server from '../classes/Server';
54import * as moment from 'moment';
55import * as os from 'os';
56
57@RouteHandler('/health')
58class LivenessProbeRoute {
59  public router: Router;
60
61  constructor(public app: Server) {}
62
63  @Get('*')
64  public broadcastStats(request: Request, response: Response): Response {
65    logService.log('broacasting');
66    const stats = this.getBasicStats();
67    return response.json(stats);
68  }
69
70  private humanizeBytes(amount: number) {
71    if (amount) {
72      const amountInMb = (amount / (1024 * 1024)).toFixed(2);
73      return `${amountInMb} MB`;
74    } else {
75      return;
76    }
77  }
78
79  private getBasicStats() {
80    const data = {
81      os: {
82        uptime: moment.duration(os.uptime(), 'seconds').humanize()
83      },
84      cpu: {
85        cores: os.cpus().length,
86        loadavg: os.loadavg()
87      },
88      memory: {
89        total: this.humanizeBytes(os.totalmem()),
90        free: this.humanizeBytes(os.freemem())
91      },
92      heap: {
93        total: this.humanizeBytes(process.memoryUsage().heapTotal),
94        used: this.humanizeBytes(process.memoryUsage().heapUsed)
95      },
96      process: {
97        uptime: moment.duration(process.uptime(), 'seconds').humanize()
98      }
99    };
100    return data;
101  }
102}
103
104export default LivenessProbeRoute;

Created on 5/16/2018