UNPKG

@loglayer/transport-new-relic

Version:

New Relic transport for the LogLayer logging library.

115 lines (113 loc) 4.09 kB
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); let _loglayer_transport_http = require("@loglayer/transport-http"); //#region src/NewRelicTransport.ts const MAX_ATTRIBUTES = 255; const MAX_ATTRIBUTE_NAME_LENGTH = 255; const MAX_ATTRIBUTE_VALUE_LENGTH = 4094; /** * Error thrown when log entry validation fails. * This includes attribute count, attribute name length, and other New Relic API validations. */ var ValidationError = class extends Error { constructor(message) { super(message); this.name = "ValidationError"; } }; /** * Validates attributes against New Relic's constraints. * - Checks number of attributes (max 255) * - Validates attribute name length (max 255 characters) * - Truncates attribute values longer than 4094 characters * * @param attributes - The attributes to validate * @returns The validated (and potentially modified) attributes * @throws {ValidationError} If validation fails */ function validateAttributes(attributes) { const validated = {}; const attributeCount = Object.keys(attributes).length; if (attributeCount > MAX_ATTRIBUTES) throw new ValidationError(`Log entry exceeds maximum number of attributes (${MAX_ATTRIBUTES}). Found: ${attributeCount}`); for (const [key, value] of Object.entries(attributes)) { if (key.length > MAX_ATTRIBUTE_NAME_LENGTH) throw new ValidationError(`Attribute name exceeds maximum length (${MAX_ATTRIBUTE_NAME_LENGTH}). Found: ${key.length}`); if (typeof value === "string" && value.length > MAX_ATTRIBUTE_VALUE_LENGTH) validated[key] = value.slice(0, MAX_ATTRIBUTE_VALUE_LENGTH); else validated[key] = value; } return validated; } /** * Default payload template that formats log data for New Relic's Log API. * Each entry includes timestamp, level, the log message, and optional attributes. */ function defaultNewRelicPayload(params) { const logEntry = { timestamp: Date.now(), level: params.logLevel, log: params.message }; if (params.data) logEntry.attributes = validateAttributes(params.data); return JSON.stringify(logEntry); } /** * NewRelicTransport is responsible for sending logs to New Relic's Log API. * It extends HttpTransport with New Relic-specific configuration, validation, * and formatting. * * Features: * - Validates attribute count (max 255) * - Validates attribute name length (max 255 characters) * - Truncates attribute values longer than 4094 characters * - Gzip compression by default (via HttpTransport) * - Retry logic with exponential backoff (via HttpTransport) * - Rate limiting support (via HttpTransport) * - Batch sending support (via HttpTransport) * - Error and debug callbacks */ var NewRelicTransport = class extends _loglayer_transport_http.HttpTransport { /** * Creates a new instance of NewRelicTransport. * * @param config - Configuration options for the transport */ constructor(config) { const { apiKey, endpoint, payloadTemplate, ...httpConfig } = config; super({ ...httpConfig, url: endpoint ?? "https://log-api.newrelic.com/log/v1", method: "POST", headers: { "Content-Type": "application/json", "Api-Key": apiKey }, payloadTemplate: payloadTemplate ?? defaultNewRelicPayload, compression: httpConfig.compression ?? true, maxRetries: httpConfig.maxRetries ?? 3, retryDelay: httpConfig.retryDelay ?? 1e3, respectRateLimit: httpConfig.respectRateLimit ?? true, maxLogSize: httpConfig.maxLogSize ?? 1048576, maxPayloadSize: httpConfig.maxPayloadSize ?? 1048576 }); } }; //#endregion Object.defineProperty(exports, 'HttpTransportError', { enumerable: true, get: function () { return _loglayer_transport_http.HttpTransportError; } }); Object.defineProperty(exports, 'LogSizeError', { enumerable: true, get: function () { return _loglayer_transport_http.LogSizeError; } }); exports.NewRelicTransport = NewRelicTransport; Object.defineProperty(exports, 'RateLimitError', { enumerable: true, get: function () { return _loglayer_transport_http.RateLimitError; } }); exports.ValidationError = ValidationError; //# sourceMappingURL=index.cjs.map