UNPKG

pm2-prom-module

Version:

PM2 module to help collect applications statistic and send it to Prometheus server

107 lines (106 loc) 4.75 kB
"use strict"; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); // @ts-ignore const pmx_1 = __importDefault(require("pmx")); const http_1 = require("http"); const net_1 = __importDefault(require("net")); const fs_1 = __importDefault(require("fs")); const pm2_1 = require("./core/pm2"); const logger_1 = require("./utils/logger"); const metrics_1 = require("./metrics"); const DEFAULT_PREFIX = 'pm2'; const startPromServer = (prefix, moduleConfig) => { (0, metrics_1.initMetrics)(prefix); const serviceName = moduleConfig.service_name; const port = Number(moduleConfig.port); const hostname = moduleConfig.hostname; const unixSocketPath = moduleConfig.unix_socket_path; const promServer = (0, http_1.createServer)((_req, res) => __awaiter(void 0, void 0, void 0, function* () { const mergedRegistry = (0, metrics_1.combineAllRegistries)(Boolean(moduleConfig.aggregate_app_metrics)); mergedRegistry.setDefaultLabels({ serviceName }); res.setHeader('Content-Type', mergedRegistry.contentType); res.end(yield mergedRegistry.metrics()); return; })); const listenCallback = () => { const listenValue = promServer.address(); let listenString = ''; if (typeof listenValue === 'string') { listenString = listenValue; } else { listenString = `${listenValue === null || listenValue === void 0 ? void 0 : listenValue.address}:${listenValue === null || listenValue === void 0 ? void 0 : listenValue.port}`; } console.log(`Metrics server is available on ${listenString}`); }; if (unixSocketPath) { promServer.on('error', function (promServerError) { if (promServerError.code == 'EADDRINUSE') { console.log(`Listen error: "${promServerError.message}". Try to remove socket...`); const clientSocket = new net_1.default.Socket(); clientSocket.on('error', function (clientSocketError) { if (clientSocketError.code == 'ECONNREFUSED') { console.log(`Remove old socket ${unixSocketPath}`); fs_1.default.unlinkSync(unixSocketPath); promServer.listen(unixSocketPath); } }); clientSocket.connect({ path: unixSocketPath }, function () { console.log('Server running, giving up...'); process.exit(); }); } }); promServer.listen(unixSocketPath, listenCallback); } else { promServer.listen(port, hostname, listenCallback); } }; pmx_1.default.initModule({ widget: { el: { probes: true, actions: true, }, block: { actions: false, issues: true, meta: true, }, }, }, function (err, conf) { var _a, _b; if (err) return console.error(err.stack || err); const moduleConfig = conf.module_conf; (0, logger_1.initLogger)({ isDebug: moduleConfig.debug }); (0, pm2_1.startPm2Connect)(moduleConfig); startPromServer((_a = moduleConfig.prefix) !== null && _a !== void 0 ? _a : DEFAULT_PREFIX, moduleConfig); pmx_1.default.configureModule({ human_info: [ ['Status', 'Module enabled'], ['Debug', moduleConfig.debug ? 'Enabled' : 'Disabled'], [ 'Aggregate apps metrics', moduleConfig.aggregate_app_metrics ? 'Enabled' : 'Disabled', ], ['Port', moduleConfig.port], ['Service name', moduleConfig.service_name ? moduleConfig.service_name : `N/A`], ['Check interval', `${moduleConfig.app_check_interval} ms`], ['Prefix', (_b = moduleConfig.prefix) !== null && _b !== void 0 ? _b : DEFAULT_PREFIX], ], }); });