@instana/shared-metrics
Version:
Internal metrics plug-in package for Node.js monitoring with Instana
92 lines (77 loc) • 2.71 kB
JavaScript
/*
* (c) Copyright IBM Corp. 2021
* (c) Copyright Instana Inc. and contributors 2017
*/
;
const { hook } = require('@instana/core').util;
/** @type {import('@instana/core/src/core').GenericLogger} */
let logger;
/**
* @param {import('@instana/core/src/config').InstanaConfig} config
*/
exports.init = function init(config) {
logger = config.logger;
};
/** @type {number} */
let timeBetweenHealthcheckCalls;
const healthy = 1;
const unhealthy = 0;
/** @type {*} */
let adminPluginHealthcheck;
/** @type {NodeJS.Timeout} */
let timeoutHandle;
exports.payloadPrefix = 'healthchecks';
// @ts-ignore
exports.currentPayload = {};
hook.onModuleLoad(
'admin-plugin-healthcheck',
function onAdminPluginHealthcheckLoaded(/** @type {*} */ _adminPluginHealthcheck) {
adminPluginHealthcheck = _adminPluginHealthcheck;
}
);
/**
* @param {import('@instana/core/src/config').InstanaConfig} config
*/
exports.activate = function activate(config) {
timeBetweenHealthcheckCalls = config.metrics.timeBetweenHealthcheckCalls;
if (adminPluginHealthcheck != null) {
gatherHealthcheckResults();
}
};
function gatherHealthcheckResults() {
adminPluginHealthcheck
.getHealthCheckResult()
.then(function onHealthcheckResults(/** @type{*} */ adminHealthcheckResults) {
/** @type {Object.<string, *>} */
const results = {};
/** @type {Object.<string, *>} */
const previousResults = exports.currentPayload;
// eslint-disable-next-line no-restricted-syntax
for (const key in adminHealthcheckResults) {
// eslint-disable-next-line no-prototype-builtins
if (adminHealthcheckResults.hasOwnProperty(key)) {
const result = adminHealthcheckResults[key];
const checkHealthy = result.healthy ? healthy : unhealthy;
const changed = previousResults[key] == null || previousResults[key].healthy !== checkHealthy;
results[key] = {
healthy: checkHealthy,
since: changed ? new Date().getTime() : previousResults[key].since
};
}
}
// @ts-ignore
exports.currentPayload = results;
timeoutHandle = setTimeout(gatherHealthcheckResults, timeBetweenHealthcheckCalls);
timeoutHandle.unref();
})
.catch(function onHealthcheckResultFailure(/** @type {*} */ err) {
// @ts-ignore
exports.currentPayload = {};
logger.warn(`Unexpected error while getting healthcheck results. ${err?.message} ${err?.stack}`);
timeoutHandle = setTimeout(gatherHealthcheckResults, timeBetweenHealthcheckCalls);
timeoutHandle.unref();
});
}
exports.deactivate = function deactivate() {
clearTimeout(timeoutHandle);
};