UNPKG

@hemantwasthere/monitoring-sdk

Version:

Centralized monitoring SDK for Node.js applications with Prometheus, Loki, and Grafana integration

148 lines (147 loc) 5.7 kB
"use strict"; 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);