UNPKG

strogger

Version:

📊 A modern structured logging library with functional programming, duck-typing, and comprehensive third-party integrations

155 lines • 6.07 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.createDataDogTransport = void 0; const types_1 = require("../types"); const errors_1 = require("../utils/errors"); const base_transport_1 = require("./base-transport"); const createDataDogTransport = (options = {}) => { const transportName = "DataDog"; try { let minLevel = options.level ?? types_1.LogLevel.INFO; // Note: formatter is available for custom formatting // const formatter = options.formatter || { // format: (entry: LogEntry) => JSON.stringify(entry), // }; const apiKey = options.apiKey || process.env.DATADOG_API_KEY; const serviceName = options.serviceName || process.env.DD_SERVICE || process.env.SERVICE_NAME; const source = options.source || "nodejs"; const tags = options.tags || []; const batchSize = options.batchSize || 10; const flushInterval = options.flushInterval || 5000; const region = options.region || process.env.DD_SITE || "us"; // Validate required configuration (0, errors_1.validateEnvironmentVariable)("DATADOG_API_KEY", apiKey, true); // Validate transport configuration (0, errors_1.validateTransportConfig)(transportName, { apiKey }, ["apiKey"]); // Build tags string const defaultTags = [ `env:${process.env.NODE_ENV || "dev"}`, `service:${serviceName || "unknown"}`, `source:${source}`, ]; const allTags = [...defaultTags, ...tags].join(","); let batch = []; let flushTimer = null; const sendToDataDog = async (entries) => { try { const url = `https://http-intake.logs.${region === "eu" ? "eu." : ""}datadoghq.com/api/v2/logs`; const payload = entries.map((entry) => ({ message: entry.message, level: getDataDogLevel(entry.level), timestamp: new Date(entry.timestamp).getTime(), ddsource: source, ddtags: allTags, service: serviceName, ...entry.context, ...(entry.error && { error_name: entry.error.name, error_message: entry.error.message, error_stack: entry.error.stack, }), ...(entry.metadata && { metadata: entry.metadata }), })); const response = await fetch(url, { method: "POST", headers: { "Content-Type": "application/json", "DD-API-KEY": apiKey, }, body: JSON.stringify(payload), }); if (!response.ok) { throw (0, errors_1.createDetailedError)("DATADOG_API_ERROR", transportName, { status: response.status, statusText: response.statusText, url, responseBody: await response .text() .catch(() => "Unable to read response body"), }); } } catch (error) { (0, errors_1.handleTransportError)(error, transportName, true); } }; const getDataDogLevel = (level) => { switch (level) { case types_1.LogLevel.DEBUG: return "debug"; case types_1.LogLevel.INFO: return "info"; case types_1.LogLevel.WARN: return "warning"; case types_1.LogLevel.ERROR: return "error"; case types_1.LogLevel.FATAL: return "critical"; default: return "info"; } }; const flush = async () => { if (batch.length === 0) return; const entriesToSend = [...batch]; batch = []; await sendToDataDog(entriesToSend); }; const startFlushTimer = () => { if (flushTimer) return; flushTimer = setInterval(() => { flush().catch((error) => { (0, errors_1.handleTransportError)(error, transportName, true); }); }, flushInterval); }; // Start the flush timer startFlushTimer(); return { log: async (entry) => { if (!(0, base_transport_1.shouldLog)(entry.level, minLevel)) return; batch.push(entry); if (batch.length >= batchSize) { await flush(); } }, setLevel: (level) => { minLevel = level; }, getLevel: () => minLevel, // DataDog specific methods flush: async () => { await flush(); }, close: async () => { if (flushTimer) { clearInterval(flushTimer); flushTimer = null; } await flush(); }, // Add tags dynamically addTags: (newTags) => { tags.push(...newTags); }, // Get current configuration getConfig: () => ({ serviceName, source, tags: [...tags], region, batchSize, flushInterval, }), }; } catch (error) { (0, errors_1.handleTransportError)(error, transportName, false); throw error; // Re-throw for proper error handling } }; exports.createDataDogTransport = createDataDogTransport; //# sourceMappingURL=datadog-transport.js.map