@hemantwasthere/monitoring-sdk
Version:
Centralized monitoring SDK for Node.js applications with Prometheus, Loki, and Grafana integration
148 lines (147 loc) • 5.7 kB
JavaScript
;
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __exportStar = (this && this.__exportStar) || function(m, exports) {
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.MonitoringSDK = void 0;
const constants_1 = require("./constants");
const logging_1 = require("./logging");
const metrics_1 = require("./metrics");
class MonitoringSDK {
constructor(config) {
if (!MonitoringSDK.globalConfig) {
MonitoringSDK.globalConfig = {
lokiHost: constants_1.MONITORING_ENDPOINTS.LOKI,
environment: process.env.NODE_ENV || constants_1.DEFAULT_CONFIG.ENVIRONMENT,
customLabels: {
...(process.env.CLUSTER_NAME && {
cluster: process.env.CLUSTER_NAME,
}),
},
};
}
const mergedConfig = {
...config,
lokiHost: constants_1.MONITORING_ENDPOINTS.LOKI,
environment: config.environment || MonitoringSDK.globalConfig?.environment,
customLabels: {
...MonitoringSDK.globalConfig?.customLabels,
...config.customLabels,
},
};
this.config = mergedConfig;
this.metricsService = metrics_1.MetricsService.getInstance(mergedConfig);
this.loggingService = logging_1.LoggingService.getInstance(mergedConfig);
}
/**
* Set the global settings for all monitoring
* Call this once when your app starts up
*/
static setGlobalConfig(config) {
MonitoringSDK.globalConfig = config;
}
static getGlobalConfig() {
return MonitoringSDK.globalConfig;
}
/**
* Easy setup - just give it your app details and it works!
* No need to worry about URLs or configuration
*/
static initializeWithDefaults(config) {
if (!MonitoringSDK.globalConfig) {
MonitoringSDK.setGlobalConfig({
lokiHost: constants_1.MONITORING_ENDPOINTS.LOKI,
environment: process.env.NODE_ENV || constants_1.DEFAULT_CONFIG.ENVIRONMENT,
customLabels: {
...(process.env.CLUSTER_NAME && {
cluster: process.env.CLUSTER_NAME,
}),
},
});
}
const mergedConfig = {
...config,
lokiHost: constants_1.MONITORING_ENDPOINTS.LOKI,
environment: config.environment || MonitoringSDK.globalConfig?.environment,
customLabels: {
...MonitoringSDK.globalConfig?.customLabels,
...config.customLabels,
},
};
return MonitoringSDK.initialize(mergedConfig);
}
static reset() {
metrics_1.MetricsService.reset();
logging_1.LoggingService.reset();
MonitoringSDK.instance = undefined;
MonitoringSDK.globalConfig = null;
}
static initialize(config) {
if (!MonitoringSDK.instance) {
MonitoringSDK.instance = new MonitoringSDK(config);
}
else {
const currentProjectName = MonitoringSDK.instance.config.projectName;
const currentServiceName = MonitoringSDK.instance.config.serviceName;
if (currentProjectName !== config.projectName ||
currentServiceName !== config.serviceName) {
// Start fresh with the new app
metrics_1.MetricsService.reset();
logging_1.LoggingService.reset();
MonitoringSDK.instance = new MonitoringSDK(config);
}
}
return MonitoringSDK.instance;
}
static getInstance() {
if (!MonitoringSDK.instance) {
throw new Error("MonitoringSDK must be initialized first");
}
return MonitoringSDK.instance;
}
getMetrics() {
return this.metricsService;
}
getLogger() {
return this.loggingService;
}
getConfig() {
return this.config;
}
/**
* Dynamically get the appropriate middleware based on technology
*/
getMiddleware() {
switch (this.config.technology) {
case "express":
// Only require express middleware if needed
// eslint-disable-next-line @typescript-eslint/no-var-requires
return require("./middleware/express");
case "nestjs":
// Only require nestjs middleware if needed
// eslint-disable-next-line @typescript-eslint/no-var-requires
return require("./middleware/nestjs");
default:
throw new Error(`No middleware available for technology: ${this.config.technology}`);
}
}
}
exports.MonitoringSDK = MonitoringSDK;
MonitoringSDK.globalConfig = null;
__exportStar(require("./constants"), exports);
__exportStar(require("./controller"), exports);
__exportStar(require("./cron-monitor"), exports);
__exportStar(require("./logging"), exports);
__exportStar(require("./metrics"), exports);
__exportStar(require("./types"), exports);