@loglayer/transport-victoria-logs
Version:
VictoriaLogs transport for the LogLayer logging library.
1 lines • 6.21 kB
Source Map (JSON)
{"version":3,"sources":["../src/index.ts","../src/VictoriaLogsTransport.ts"],"sourcesContent":["export type { VictoriaLogsTransportConfig } from \"./VictoriaLogsTransport.js\";\nexport { VictoriaLogsTransport } from \"./VictoriaLogsTransport.js\";\n","import type { HttpTransportConfig } from \"@loglayer/transport-http\";\nimport { HttpTransport } from \"@loglayer/transport-http\";\n\n/**\n * Configuration options for the VictoriaLogs transport.\n * This is essentially a wrapper around HttpTransport with VictoriaLogs specific defaults.\n */\nexport interface VictoriaLogsTransportConfig extends Omit<HttpTransportConfig, \"url\" | \"payloadTemplate\"> {\n /**\n * The VictoriaLogs host URL (e.g., http://localhost:9428)\n * The /insert/jsonline path will be automatically appended\n * @default \"http://localhost:9428\"\n */\n url?: string;\n /**\n * Function to transform log data into the payload format (optional, defaults to VictoriaLogs format)\n */\n payloadTemplate?: (data: { logLevel: string; message: string; data?: Record<string, any> }) => string;\n /**\n * Function to generate stream-level fields for VictoriaLogs\n * The keys of the returned object will be used as the values for the _stream_fields parameter\n * @default () => ({})\n */\n streamFields?: () => Record<string, string>;\n /**\n * Function to generate the timestamp for the _time field\n * @default () => new Date().toISOString()\n */\n timestamp?: () => string;\n /**\n * Custom HTTP query parameters for VictoriaLogs ingestion\n * @see https://docs.victoriametrics.com/victorialogs/data-ingestion/#http-parameters\n */\n httpParameters?: Record<string, string>;\n}\n\n/**\n * VictoriaLogs transport for LogLayer.\n *\n * This transport is a thin wrapper around the HttpTransport that provides\n * VictoriaLogs specific defaults and configuration. It uses the VictoriaLogs\n * JSON stream API to send logs.\n *\n * @see https://docs.victoriametrics.com/victorialogs/data-ingestion/#json-stream-api\n */\nexport class VictoriaLogsTransport extends HttpTransport {\n constructor(config: VictoriaLogsTransportConfig = {}) {\n const {\n url = \"http://localhost:9428\",\n method = \"POST\",\n headers = {\n \"Content-Type\": \"application/stream+json\",\n },\n contentType = \"application/stream+json\",\n batchContentType = \"application/stream+json\",\n streamFields = () => ({}),\n timestamp = () => new Date().toISOString(),\n httpParameters = {},\n payloadTemplate = ({ logLevel, message, data }) => {\n const streamFieldsData = streamFields();\n const timeValue = timestamp();\n\n // Determine field names based on HTTP parameters\n const msgField = httpParameters._msg_field || \"_msg\";\n const timeField = httpParameters._time_field || \"_time\";\n\n return JSON.stringify({\n [msgField]: message || \"(no message)\",\n [timeField]: timeValue,\n level: logLevel,\n ...streamFieldsData,\n ...data,\n });\n },\n compression = false,\n maxRetries = 3,\n retryDelay = 1000,\n respectRateLimit = true,\n enableBatchSend = true,\n batchSize = 100,\n batchSendTimeout = 5000,\n batchSendDelimiter = \"\\n\",\n maxLogSize = 1048576, // 1MB\n maxPayloadSize = 5242880, // 5MB\n enableNextJsEdgeCompat = false,\n onError,\n onDebug,\n ...restConfig\n } = config;\n\n // Get stream fields and use their keys as _stream_fields parameter\n const streamFieldsData = streamFields();\n const streamFieldsKeys = Object.keys(streamFieldsData);\n\n // Merge HTTP parameters, adding _stream_fields if streamFields has keys\n const finalHttpParameters = {\n ...httpParameters,\n ...(streamFieldsKeys.length > 0 && { _stream_fields: streamFieldsKeys.join(\",\") }),\n };\n\n // Construct the full URL with the VictoriaLogs JSON stream API endpoint and query parameters\n const baseUrl = `${url.replace(/\\/$/, \"\")}/insert/jsonline`;\n const queryParams = new URLSearchParams(finalHttpParameters);\n const fullUrl = queryParams.toString() ? `${baseUrl}?${queryParams.toString()}` : baseUrl;\n\n super({\n url: fullUrl,\n method,\n headers,\n contentType,\n batchContentType,\n payloadTemplate,\n compression,\n maxRetries,\n retryDelay,\n respectRateLimit,\n enableBatchSend,\n batchSize,\n batchSendTimeout,\n batchSendDelimiter,\n maxLogSize,\n maxPayloadSize,\n enableNextJsEdgeCompat,\n onError,\n onDebug,\n ...restConfig,\n });\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACCA,4BAA8B;AA4CvB,IAAM,wBAAN,cAAoC,oCAAc;AAAA,EACvD,YAAY,SAAsC,CAAC,GAAG;AACpD,UAAM;AAAA,MACJ,MAAM;AAAA,MACN,SAAS;AAAA,MACT,UAAU;AAAA,QACR,gBAAgB;AAAA,MAClB;AAAA,MACA,cAAc;AAAA,MACd,mBAAmB;AAAA,MACnB,eAAe,OAAO,CAAC;AAAA,MACvB,YAAY,OAAM,oBAAI,KAAK,GAAE,YAAY;AAAA,MACzC,iBAAiB,CAAC;AAAA,MAClB,kBAAkB,CAAC,EAAE,UAAU,SAAS,KAAK,MAAM;AACjD,cAAMA,oBAAmB,aAAa;AACtC,cAAM,YAAY,UAAU;AAG5B,cAAM,WAAW,eAAe,cAAc;AAC9C,cAAM,YAAY,eAAe,eAAe;AAEhD,eAAO,KAAK,UAAU;AAAA,UACpB,CAAC,QAAQ,GAAG,WAAW;AAAA,UACvB,CAAC,SAAS,GAAG;AAAA,UACb,OAAO;AAAA,UACP,GAAGA;AAAA,UACH,GAAG;AAAA,QACL,CAAC;AAAA,MACH;AAAA,MACA,cAAc;AAAA,MACd,aAAa;AAAA,MACb,aAAa;AAAA,MACb,mBAAmB;AAAA,MACnB,kBAAkB;AAAA,MAClB,YAAY;AAAA,MACZ,mBAAmB;AAAA,MACnB,qBAAqB;AAAA,MACrB,aAAa;AAAA;AAAA,MACb,iBAAiB;AAAA;AAAA,MACjB,yBAAyB;AAAA,MACzB;AAAA,MACA;AAAA,MACA,GAAG;AAAA,IACL,IAAI;AAGJ,UAAM,mBAAmB,aAAa;AACtC,UAAM,mBAAmB,OAAO,KAAK,gBAAgB;AAGrD,UAAM,sBAAsB;AAAA,MAC1B,GAAG;AAAA,MACH,GAAI,iBAAiB,SAAS,KAAK,EAAE,gBAAgB,iBAAiB,KAAK,GAAG,EAAE;AAAA,IAClF;AAGA,UAAM,UAAU,GAAG,IAAI,QAAQ,OAAO,EAAE,CAAC;AACzC,UAAM,cAAc,IAAI,gBAAgB,mBAAmB;AAC3D,UAAM,UAAU,YAAY,SAAS,IAAI,GAAG,OAAO,IAAI,YAAY,SAAS,CAAC,KAAK;AAElF,UAAM;AAAA,MACJ,KAAK;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,GAAG;AAAA,IACL,CAAC;AAAA,EACH;AACF;","names":["streamFieldsData"]}