@loglayer/transport-new-relic
Version:
New Relic transport for the LogLayer logging library.
115 lines (113 loc) • 4.09 kB
JavaScript
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