UNPKG

datadog-logger-integrations

Version:
1 lines 8.24 kB
{"version":3,"file":"DataDogWritableStream-DmZdC6Mh.mjs","sources":["../../src/utils/parseStreamLine.ts","../../src/DataDogWritableStream.ts"],"sourcesContent":["const safeParseJson = (input: string | object) => {\n if (typeof input === 'object') {\n return input;\n }\n\n try {\n return JSON.parse(input);\n } catch {\n return {};\n }\n};\n\nexport const parseStreamLine = <T = Record<string, unknown>>(\n input: string | string[] | object,\n): T[] => {\n if (typeof input === 'object' && !Array.isArray(input)) {\n return [input as T];\n }\n\n const splittedString = Array.isArray(input)\n ? input.flatMap((v) => {\n return parseStreamLine(v) as T | T[];\n })\n : input.split(/\\r?\\n/);\n\n return splittedString.filter(Boolean).map((v) => {\n return safeParseJson(v as string | object) as T;\n });\n};\n","import { Writable } from 'node:stream';\nimport { client, v2 } from '@datadog/datadog-api-client';\nimport type { LogMessageBuilder } from './types/index.js';\nimport { parseStreamLine } from './utils/parseStreamLine';\n\nexport class DataDogWritableStream<\n T = Record<string, unknown>,\n> extends Writable {\n apiInstance: v2.LogsApi;\n batch: v2.HTTPLogItem[] = [];\n timer?: NodeJS.Timeout;\n\n flushJob?: Promise<void>;\n\n constructor(\n private readonly config: {\n ddClientConfig?: Parameters<typeof client.createConfiguration>[0];\n ddServerConfig?: {\n site?: string;\n subdomain?: string;\n protocol?: string;\n };\n sendIntervalMs?: number;\n batchSize?: number;\n debug?: boolean;\n logMessageBuilder: LogMessageBuilder<T>;\n },\n ) {\n super({ objectMode: true });\n\n const clientConfig = client.createConfiguration(this.config.ddClientConfig);\n if (config.ddServerConfig) {\n clientConfig.setServerVariables(config.ddServerConfig);\n }\n\n this.apiInstance = new v2.LogsApi(clientConfig);\n\n this.timer =\n this.config.sendIntervalMs !== 0\n ? setInterval(async () => {\n const batchToSend = this.batch;\n this.batch = [];\n this.flushJob = this.flush(batchToSend).finally(() => {\n this.flushJob = undefined;\n });\n }, this.config.sendIntervalMs ?? 3000)\n : undefined;\n }\n\n override async _write(\n item: string | string[] | object,\n _encoding: unknown,\n callback: (err?: Error | null) => void,\n ) {\n if (this.config.debug) {\n console.log(`[DataDogWritableStream] Log received: ${item}`);\n }\n const parsedItems = parseStreamLine<T>(item);\n if (this.config.debug) {\n console.log(\n `[DataDogWritableStream] Parsed item: ${JSON.stringify(parsedItems)}`,\n );\n }\n const transformed = parsedItems.map(this.config.logMessageBuilder);\n if (this.config.debug) {\n console.log(\n `[DataDogWritableStream] Enqueue: ${JSON.stringify(transformed)}`,\n );\n }\n this.batch.push(...transformed);\n\n if (\n this.batch.length >= (this.config?.batchSize ?? 10) ||\n this.config.sendIntervalMs === 0\n ) {\n const batchToSend = this.batch;\n this.batch = [];\n await this.flush(batchToSend);\n }\n callback();\n }\n\n override async _final(callback: (err?: Error | null) => void) {\n clearInterval(this.timer); // Clean up the interval\n try {\n if (this.config.debug) {\n console.log('[DataDogWritableStream] _final flush');\n }\n\n if (this.flushJob) {\n await this.flushJob;\n } else {\n const batchToSend = this.batch;\n this.batch = [];\n\n await this.flush(batchToSend);\n }\n\n callback();\n } catch (err) {\n callback(err instanceof Error ? err : new Error(JSON.stringify(err)));\n }\n }\n\n async flush(batch: v2.HTTPLogItem[]) {\n if (this.config.debug) {\n console.log(`[DataDogWritableStream] Flush: ${JSON.stringify(batch)}`);\n }\n\n if (batch.length === 0) return;\n\n try {\n const params: v2.LogsApiSubmitLogRequest = {\n body: batch,\n contentEncoding: 'deflate',\n };\n if (this.config.debug) {\n console.log(\n `[DataDogWritableStream] Outgoing param: ${JSON.stringify(params)}`,\n );\n }\n await this.apiInstance.submitLog(params);\n if (this.config.debug) {\n console.log('[DataDogWritableStream] Log sent');\n }\n } catch (err) {\n console.error('[DataDogWritableStream] Batch send failed:', err);\n }\n }\n}\n"],"names":[],"mappings":"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"}