@safaricom-mxl/log 0.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1040 -0
- package/dist/_http-DmaJ426Z.mjs +76 -0
- package/dist/_http-DmaJ426Z.mjs.map +1 -0
- package/dist/_severity-D_IU9-90.mjs +17 -0
- package/dist/_severity-D_IU9-90.mjs.map +1 -0
- package/dist/adapters/axiom.d.mts +64 -0
- package/dist/adapters/axiom.d.mts.map +1 -0
- package/dist/adapters/axiom.mjs +100 -0
- package/dist/adapters/axiom.mjs.map +1 -0
- package/dist/adapters/better-stack.d.mts +63 -0
- package/dist/adapters/better-stack.d.mts.map +1 -0
- package/dist/adapters/better-stack.mjs +98 -0
- package/dist/adapters/better-stack.mjs.map +1 -0
- package/dist/adapters/otlp.d.mts +85 -0
- package/dist/adapters/otlp.d.mts.map +1 -0
- package/dist/adapters/otlp.mjs +196 -0
- package/dist/adapters/otlp.mjs.map +1 -0
- package/dist/adapters/posthog.d.mts +107 -0
- package/dist/adapters/posthog.d.mts.map +1 -0
- package/dist/adapters/posthog.mjs +166 -0
- package/dist/adapters/posthog.mjs.map +1 -0
- package/dist/adapters/sentry.d.mts +80 -0
- package/dist/adapters/sentry.d.mts.map +1 -0
- package/dist/adapters/sentry.mjs +221 -0
- package/dist/adapters/sentry.mjs.map +1 -0
- package/dist/browser.d.mts +63 -0
- package/dist/browser.d.mts.map +1 -0
- package/dist/browser.mjs +95 -0
- package/dist/browser.mjs.map +1 -0
- package/dist/enrichers.d.mts +74 -0
- package/dist/enrichers.d.mts.map +1 -0
- package/dist/enrichers.mjs +172 -0
- package/dist/enrichers.mjs.map +1 -0
- package/dist/error.d.mts +65 -0
- package/dist/error.d.mts.map +1 -0
- package/dist/error.mjs +112 -0
- package/dist/error.mjs.map +1 -0
- package/dist/index.d.mts +6 -0
- package/dist/index.mjs +6 -0
- package/dist/logger.d.mts +46 -0
- package/dist/logger.d.mts.map +1 -0
- package/dist/logger.mjs +287 -0
- package/dist/logger.mjs.map +1 -0
- package/dist/next/client.d.mts +55 -0
- package/dist/next/client.d.mts.map +1 -0
- package/dist/next/client.mjs +44 -0
- package/dist/next/client.mjs.map +1 -0
- package/dist/next/index.d.mts +169 -0
- package/dist/next/index.d.mts.map +1 -0
- package/dist/next/index.mjs +280 -0
- package/dist/next/index.mjs.map +1 -0
- package/dist/nitro/errorHandler.d.mts +15 -0
- package/dist/nitro/errorHandler.d.mts.map +1 -0
- package/dist/nitro/errorHandler.mjs +41 -0
- package/dist/nitro/errorHandler.mjs.map +1 -0
- package/dist/nitro/module.d.mts +11 -0
- package/dist/nitro/module.d.mts.map +1 -0
- package/dist/nitro/module.mjs +23 -0
- package/dist/nitro/module.mjs.map +1 -0
- package/dist/nitro/plugin.d.mts +7 -0
- package/dist/nitro/plugin.d.mts.map +1 -0
- package/dist/nitro/plugin.mjs +145 -0
- package/dist/nitro/plugin.mjs.map +1 -0
- package/dist/nitro/v3/errorHandler.d.mts +24 -0
- package/dist/nitro/v3/errorHandler.d.mts.map +1 -0
- package/dist/nitro/v3/errorHandler.mjs +36 -0
- package/dist/nitro/v3/errorHandler.mjs.map +1 -0
- package/dist/nitro/v3/index.d.mts +5 -0
- package/dist/nitro/v3/index.mjs +5 -0
- package/dist/nitro/v3/middleware.d.mts +25 -0
- package/dist/nitro/v3/middleware.d.mts.map +1 -0
- package/dist/nitro/v3/middleware.mjs +45 -0
- package/dist/nitro/v3/middleware.mjs.map +1 -0
- package/dist/nitro/v3/module.d.mts +10 -0
- package/dist/nitro/v3/module.d.mts.map +1 -0
- package/dist/nitro/v3/module.mjs +22 -0
- package/dist/nitro/v3/module.mjs.map +1 -0
- package/dist/nitro/v3/plugin.d.mts +14 -0
- package/dist/nitro/v3/plugin.d.mts.map +1 -0
- package/dist/nitro/v3/plugin.mjs +162 -0
- package/dist/nitro/v3/plugin.mjs.map +1 -0
- package/dist/nitro/v3/useLogger.d.mts +24 -0
- package/dist/nitro/v3/useLogger.d.mts.map +1 -0
- package/dist/nitro/v3/useLogger.mjs +27 -0
- package/dist/nitro/v3/useLogger.mjs.map +1 -0
- package/dist/nitro-CrFBjY1Y.d.mts +42 -0
- package/dist/nitro-CrFBjY1Y.d.mts.map +1 -0
- package/dist/nitro-Dsv6dSzv.mjs +39 -0
- package/dist/nitro-Dsv6dSzv.mjs.map +1 -0
- package/dist/nuxt/module.d.mts +164 -0
- package/dist/nuxt/module.d.mts.map +1 -0
- package/dist/nuxt/module.mjs +84 -0
- package/dist/nuxt/module.mjs.map +1 -0
- package/dist/pipeline.d.mts +46 -0
- package/dist/pipeline.d.mts.map +1 -0
- package/dist/pipeline.mjs +122 -0
- package/dist/pipeline.mjs.map +1 -0
- package/dist/routes-BNbrnm14.mjs +39 -0
- package/dist/routes-BNbrnm14.mjs.map +1 -0
- package/dist/runtime/client/log.d.mts +15 -0
- package/dist/runtime/client/log.d.mts.map +1 -0
- package/dist/runtime/client/log.mjs +92 -0
- package/dist/runtime/client/log.mjs.map +1 -0
- package/dist/runtime/client/plugin.d.mts +5 -0
- package/dist/runtime/client/plugin.d.mts.map +1 -0
- package/dist/runtime/client/plugin.mjs +17 -0
- package/dist/runtime/client/plugin.mjs.map +1 -0
- package/dist/runtime/server/routes/_mxllog/ingest.post.d.mts +7 -0
- package/dist/runtime/server/routes/_mxllog/ingest.post.d.mts.map +1 -0
- package/dist/runtime/server/routes/_mxllog/ingest.post.mjs +123 -0
- package/dist/runtime/server/routes/_mxllog/ingest.post.mjs.map +1 -0
- package/dist/runtime/server/useLogger.d.mts +39 -0
- package/dist/runtime/server/useLogger.d.mts.map +1 -0
- package/dist/runtime/server/useLogger.mjs +43 -0
- package/dist/runtime/server/useLogger.mjs.map +1 -0
- package/dist/runtime/utils/parseError.d.mts +7 -0
- package/dist/runtime/utils/parseError.d.mts.map +1 -0
- package/dist/runtime/utils/parseError.mjs +29 -0
- package/dist/runtime/utils/parseError.mjs.map +1 -0
- package/dist/types.d.mts +496 -0
- package/dist/types.d.mts.map +1 -0
- package/dist/types.mjs +1 -0
- package/dist/utils.d.mts +34 -0
- package/dist/utils.d.mts.map +1 -0
- package/dist/utils.mjs +78 -0
- package/dist/utils.mjs.map +1 -0
- package/dist/workers.d.mts +46 -0
- package/dist/workers.d.mts.map +1 -0
- package/dist/workers.mjs +81 -0
- package/dist/workers.mjs.map +1 -0
- package/package.json +195 -0
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import { createRequire } from "node:module";
|
|
2
|
+
|
|
3
|
+
//#region \0rolldown/runtime.js
|
|
4
|
+
var __require = /* @__PURE__ */ createRequire(import.meta.url);
|
|
5
|
+
|
|
6
|
+
//#endregion
|
|
7
|
+
//#region src/adapters/_config.ts
|
|
8
|
+
/**
|
|
9
|
+
* Try to get runtime config from Nitro/Nuxt environment.
|
|
10
|
+
* Returns undefined if not in a Nitro context.
|
|
11
|
+
*/
|
|
12
|
+
function getRuntimeConfig() {
|
|
13
|
+
try {
|
|
14
|
+
const { useRuntimeConfig } = __require("nitropack/runtime");
|
|
15
|
+
return useRuntimeConfig();
|
|
16
|
+
} catch {
|
|
17
|
+
return;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
function resolveAdapterConfig(namespace, fields, overrides) {
|
|
21
|
+
const runtimeConfig = getRuntimeConfig();
|
|
22
|
+
const mxllogNs = runtimeConfig?.mxllog?.[namespace];
|
|
23
|
+
const rootNs = runtimeConfig?.[namespace];
|
|
24
|
+
const config = {};
|
|
25
|
+
for (const { key, env } of fields) config[key] = overrides?.[key] ?? mxllogNs?.[key] ?? rootNs?.[key] ?? resolveEnv(env);
|
|
26
|
+
return config;
|
|
27
|
+
}
|
|
28
|
+
function resolveEnv(envKeys) {
|
|
29
|
+
if (!envKeys) return void 0;
|
|
30
|
+
for (const key of envKeys) {
|
|
31
|
+
const val = process.env[key];
|
|
32
|
+
if (val) return val;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
//#endregion
|
|
37
|
+
//#region src/adapters/_drain.ts
|
|
38
|
+
function defineDrain(options) {
|
|
39
|
+
return async (ctx) => {
|
|
40
|
+
const contexts = Array.isArray(ctx) ? ctx : [ctx];
|
|
41
|
+
if (contexts.length === 0) return;
|
|
42
|
+
const config = options.resolve();
|
|
43
|
+
if (!config) return;
|
|
44
|
+
try {
|
|
45
|
+
await options.send(contexts.map((c) => c.event), config);
|
|
46
|
+
} catch (error) {
|
|
47
|
+
console.error(`[mxllog/${options.name}] Failed to send events:`, error);
|
|
48
|
+
}
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
//#endregion
|
|
53
|
+
//#region src/adapters/_http.ts
|
|
54
|
+
async function httpPost({ url, headers, body, timeout, label }) {
|
|
55
|
+
const controller = new AbortController();
|
|
56
|
+
const timeoutId = setTimeout(() => controller.abort(), timeout);
|
|
57
|
+
try {
|
|
58
|
+
const response = await fetch(url, {
|
|
59
|
+
method: "POST",
|
|
60
|
+
headers,
|
|
61
|
+
body,
|
|
62
|
+
signal: controller.signal
|
|
63
|
+
});
|
|
64
|
+
if (!response.ok) {
|
|
65
|
+
const text = await response.text().catch(() => "Unknown error");
|
|
66
|
+
const safeText = text.length > 200 ? `${text.slice(0, 200)}...[truncated]` : text;
|
|
67
|
+
throw new Error(`${label} API error: ${response.status} ${response.statusText} - ${safeText}`);
|
|
68
|
+
}
|
|
69
|
+
} finally {
|
|
70
|
+
clearTimeout(timeoutId);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
//#endregion
|
|
75
|
+
export { defineDrain as n, resolveAdapterConfig as r, httpPost as t };
|
|
76
|
+
//# sourceMappingURL=_http-DmaJ426Z.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"_http-DmaJ426Z.mjs","names":[],"sources":["../src/adapters/_config.ts","../src/adapters/_drain.ts","../src/adapters/_http.ts"],"sourcesContent":["/**\n * Try to get runtime config from Nitro/Nuxt environment.\n * Returns undefined if not in a Nitro context.\n */\nexport function getRuntimeConfig(): Record<string, any> | undefined {\n try {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const { useRuntimeConfig } = require('nitropack/runtime')\n return useRuntimeConfig()\n } catch {\n return undefined\n }\n}\n\nexport interface ConfigField<T> {\n key: keyof T & string\n env?: string[]\n}\n\nexport function resolveAdapterConfig<T>(\n namespace: string,\n fields: ConfigField<T>[],\n overrides?: Partial<T>,\n): Partial<T> {\n const runtimeConfig = getRuntimeConfig()\n const mxllogNs = runtimeConfig?.mxllog?.[namespace]\n const rootNs = runtimeConfig?.[namespace]\n\n const config: Record<string, unknown> = {}\n\n for (const { key, env } of fields) {\n config[key] =\n overrides?.[key]\n ?? mxllogNs?.[key]\n ?? rootNs?.[key]\n ?? resolveEnv(env)\n }\n\n return config as Partial<T>\n}\n\nfunction resolveEnv(envKeys?: string[]): string | undefined {\n if (!envKeys) return undefined\n for (const key of envKeys) {\n const val = process.env[key]\n if (val) return val\n }\n return undefined\n}\n","import type { DrainContext, WideEvent } from '../types'\n\nexport interface DrainOptions<TConfig> {\n name: string\n resolve: () => TConfig | null\n send: (events: WideEvent[], config: TConfig) => Promise<void>\n}\n\nexport function defineDrain<TConfig>(options: DrainOptions<TConfig>): (ctx: DrainContext | DrainContext[]) => Promise<void> {\n return async (ctx: DrainContext | DrainContext[]) => {\n const contexts = Array.isArray(ctx) ? ctx : [ctx]\n if (contexts.length === 0) return\n\n const config = options.resolve()\n if (!config) return\n\n try {\n await options.send(contexts.map(c => c.event), config)\n } catch (error) {\n console.error(`[mxllog/${options.name}] Failed to send events:`, error)\n }\n }\n}\n","export interface HttpPostOptions {\n url: string\n headers: Record<string, string>\n body: string\n timeout: number\n label: string\n}\n\nexport async function httpPost({ url, headers, body, timeout, label }: HttpPostOptions): Promise<void> {\n const controller = new AbortController()\n const timeoutId = setTimeout(() => controller.abort(), timeout)\n\n try {\n const response = await fetch(url, {\n method: 'POST',\n headers,\n body,\n signal: controller.signal,\n })\n\n if (!response.ok) {\n const text = await response.text().catch(() => 'Unknown error')\n const safeText = text.length > 200 ? `${text.slice(0, 200)}...[truncated]` : text\n throw new Error(`${label} API error: ${response.status} ${response.statusText} - ${safeText}`)\n }\n } finally {\n clearTimeout(timeoutId)\n }\n}\n"],"mappings":";;;;;;;;;;;AAIA,SAAgB,mBAAoD;AAClE,KAAI;EAEF,MAAM,EAAE,+BAA6B,oBAAoB;AACzD,SAAO,kBAAkB;SACnB;AACN;;;AASJ,SAAgB,qBACd,WACA,QACA,WACY;CACZ,MAAM,gBAAgB,kBAAkB;CACxC,MAAM,WAAW,eAAe,SAAS;CACzC,MAAM,SAAS,gBAAgB;CAE/B,MAAM,SAAkC,EAAE;AAE1C,MAAK,MAAM,EAAE,KAAK,SAAS,OACzB,QAAO,OACL,YAAY,QACT,WAAW,QACX,SAAS,QACT,WAAW,IAAI;AAGtB,QAAO;;AAGT,SAAS,WAAW,SAAwC;AAC1D,KAAI,CAAC,QAAS,QAAO;AACrB,MAAK,MAAM,OAAO,SAAS;EACzB,MAAM,MAAM,QAAQ,IAAI;AACxB,MAAI,IAAK,QAAO;;;;;;ACrCpB,SAAgB,YAAqB,SAAuF;AAC1H,QAAO,OAAO,QAAuC;EACnD,MAAM,WAAW,MAAM,QAAQ,IAAI,GAAG,MAAM,CAAC,IAAI;AACjD,MAAI,SAAS,WAAW,EAAG;EAE3B,MAAM,SAAS,QAAQ,SAAS;AAChC,MAAI,CAAC,OAAQ;AAEb,MAAI;AACF,SAAM,QAAQ,KAAK,SAAS,KAAI,MAAK,EAAE,MAAM,EAAE,OAAO;WAC/C,OAAO;AACd,WAAQ,MAAM,WAAW,QAAQ,KAAK,2BAA2B,MAAM;;;;;;;ACX7E,eAAsB,SAAS,EAAE,KAAK,SAAS,MAAM,SAAS,SAAyC;CACrG,MAAM,aAAa,IAAI,iBAAiB;CACxC,MAAM,YAAY,iBAAiB,WAAW,OAAO,EAAE,QAAQ;AAE/D,KAAI;EACF,MAAM,WAAW,MAAM,MAAM,KAAK;GAChC,QAAQ;GACR;GACA;GACA,QAAQ,WAAW;GACpB,CAAC;AAEF,MAAI,CAAC,SAAS,IAAI;GAChB,MAAM,OAAO,MAAM,SAAS,MAAM,CAAC,YAAY,gBAAgB;GAC/D,MAAM,WAAW,KAAK,SAAS,MAAM,GAAG,KAAK,MAAM,GAAG,IAAI,CAAC,kBAAkB;AAC7E,SAAM,IAAI,MAAM,GAAG,MAAM,cAAc,SAAS,OAAO,GAAG,SAAS,WAAW,KAAK,WAAW;;WAExF;AACR,eAAa,UAAU"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
//#region src/adapters/_severity.ts
|
|
2
|
+
const OTEL_SEVERITY_NUMBER = {
|
|
3
|
+
debug: 5,
|
|
4
|
+
info: 9,
|
|
5
|
+
warn: 13,
|
|
6
|
+
error: 17
|
|
7
|
+
};
|
|
8
|
+
const OTEL_SEVERITY_TEXT = {
|
|
9
|
+
debug: "DEBUG",
|
|
10
|
+
info: "INFO",
|
|
11
|
+
warn: "WARN",
|
|
12
|
+
error: "ERROR"
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
//#endregion
|
|
16
|
+
export { OTEL_SEVERITY_TEXT as n, OTEL_SEVERITY_NUMBER as t };
|
|
17
|
+
//# sourceMappingURL=_severity-D_IU9-90.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"_severity-D_IU9-90.mjs","names":[],"sources":["../src/adapters/_severity.ts"],"sourcesContent":["import type { LogLevel } from '../types'\n\nexport const OTEL_SEVERITY_NUMBER: Record<LogLevel, number> = {\n debug: 5,\n info: 9,\n warn: 13,\n error: 17,\n}\n\nexport const OTEL_SEVERITY_TEXT: Record<LogLevel, string> = {\n debug: 'DEBUG',\n info: 'INFO',\n warn: 'WARN',\n error: 'ERROR',\n}\n"],"mappings":";AAEA,MAAa,uBAAiD;CAC5D,OAAO;CACP,MAAM;CACN,MAAM;CACN,OAAO;CACR;AAED,MAAa,qBAA+C;CAC1D,OAAO;CACP,MAAM;CACN,MAAM;CACN,OAAO;CACR"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { DrainContext, WideEvent } from "../types.mjs";
|
|
2
|
+
import "../index.mjs";
|
|
3
|
+
|
|
4
|
+
//#region src/adapters/axiom.d.ts
|
|
5
|
+
interface AxiomConfig {
|
|
6
|
+
/** Axiom dataset name */
|
|
7
|
+
dataset: string;
|
|
8
|
+
/** Axiom API token */
|
|
9
|
+
token: string;
|
|
10
|
+
/** Organization ID (required for Personal Access Tokens) */
|
|
11
|
+
orgId?: string;
|
|
12
|
+
/** Base URL for Axiom API. Default: https://api.axiom.co */
|
|
13
|
+
baseUrl?: string;
|
|
14
|
+
/** Request timeout in milliseconds. Default: 5000 */
|
|
15
|
+
timeout?: number;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Create a drain function for sending logs to Axiom.
|
|
19
|
+
*
|
|
20
|
+
* Configuration priority (highest to lowest):
|
|
21
|
+
* 1. Overrides passed to createAxiomDrain()
|
|
22
|
+
* 2. runtimeConfig.mxllog.axiom
|
|
23
|
+
* 3. runtimeConfig.axiom
|
|
24
|
+
* 4. Environment variables: NUXT_AXIOM_*, AXIOM_*
|
|
25
|
+
*
|
|
26
|
+
* @example
|
|
27
|
+
* ```ts
|
|
28
|
+
* // Zero config - just set NUXT_AXIOM_TOKEN and NUXT_AXIOM_DATASET env vars
|
|
29
|
+
* nitroApp.hooks.hook('@safaricom-mxl/log:drain', createAxiomDrain())
|
|
30
|
+
*
|
|
31
|
+
* // With overrides
|
|
32
|
+
* nitroApp.hooks.hook('@safaricom-mxl/log:drain', createAxiomDrain({
|
|
33
|
+
* dataset: 'my-dataset',
|
|
34
|
+
* }))
|
|
35
|
+
* ```
|
|
36
|
+
*/
|
|
37
|
+
declare function createAxiomDrain(overrides?: Partial<AxiomConfig>): (ctx: DrainContext | DrainContext[]) => Promise<void>;
|
|
38
|
+
/**
|
|
39
|
+
* Send a single event to Axiom.
|
|
40
|
+
*
|
|
41
|
+
* @example
|
|
42
|
+
* ```ts
|
|
43
|
+
* await sendToAxiom(event, {
|
|
44
|
+
* dataset: 'my-logs',
|
|
45
|
+
* token: process.env.AXIOM_TOKEN!,
|
|
46
|
+
* })
|
|
47
|
+
* ```
|
|
48
|
+
*/
|
|
49
|
+
declare function sendToAxiom(event: WideEvent, config: AxiomConfig): Promise<void>;
|
|
50
|
+
/**
|
|
51
|
+
* Send a batch of events to Axiom.
|
|
52
|
+
*
|
|
53
|
+
* @example
|
|
54
|
+
* ```ts
|
|
55
|
+
* await sendBatchToAxiom(events, {
|
|
56
|
+
* dataset: 'my-logs',
|
|
57
|
+
* token: process.env.AXIOM_TOKEN!,
|
|
58
|
+
* })
|
|
59
|
+
* ```
|
|
60
|
+
*/
|
|
61
|
+
declare function sendBatchToAxiom(events: WideEvent[], config: AxiomConfig): Promise<void>;
|
|
62
|
+
//#endregion
|
|
63
|
+
export { AxiomConfig, createAxiomDrain, sendBatchToAxiom, sendToAxiom };
|
|
64
|
+
//# sourceMappingURL=axiom.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"axiom.d.mts","names":[],"sources":["../../src/adapters/axiom.ts"],"mappings":";;;;UAMiB,WAAA;;EAEf,OAAA;EAFe;EAIf,KAAA;;EAEA,KAAA;EAJA;EAMA,OAAA;EAFA;EAIA,OAAA;AAAA;;;AA+BF;;;;;;;;;;;;;;;;;;iBAAgB,gBAAA,CAAiB,SAAA,GAAY,OAAA,CAAQ,WAAA,KAAY,GAAA,EAAb,YAAA,GAAa,YAAA,OAAA,OAAA;AA0BjE;;;;;;;;;;;AAAA,iBAAsB,WAAA,CAAY,KAAA,EAAO,SAAA,EAAW,MAAA,EAAQ,WAAA,GAAc,OAAA;;;;AAe1E;;;;;;;;iBAAsB,gBAAA,CAAiB,MAAA,EAAQ,SAAA,IAAa,MAAA,EAAQ,WAAA,GAAc,OAAA"}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
import { n as defineDrain, r as resolveAdapterConfig, t as httpPost } from "../_http-DmaJ426Z.mjs";
|
|
2
|
+
|
|
3
|
+
//#region src/adapters/axiom.ts
|
|
4
|
+
const AXIOM_FIELDS = [
|
|
5
|
+
{
|
|
6
|
+
key: "dataset",
|
|
7
|
+
env: ["NUXT_AXIOM_DATASET", "AXIOM_DATASET"]
|
|
8
|
+
},
|
|
9
|
+
{
|
|
10
|
+
key: "token",
|
|
11
|
+
env: ["NUXT_AXIOM_TOKEN", "AXIOM_TOKEN"]
|
|
12
|
+
},
|
|
13
|
+
{
|
|
14
|
+
key: "orgId",
|
|
15
|
+
env: ["NUXT_AXIOM_ORG_ID", "AXIOM_ORG_ID"]
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
key: "baseUrl",
|
|
19
|
+
env: ["NUXT_AXIOM_URL", "AXIOM_URL"]
|
|
20
|
+
},
|
|
21
|
+
{ key: "timeout" }
|
|
22
|
+
];
|
|
23
|
+
/**
|
|
24
|
+
* Create a drain function for sending logs to Axiom.
|
|
25
|
+
*
|
|
26
|
+
* Configuration priority (highest to lowest):
|
|
27
|
+
* 1. Overrides passed to createAxiomDrain()
|
|
28
|
+
* 2. runtimeConfig.mxllog.axiom
|
|
29
|
+
* 3. runtimeConfig.axiom
|
|
30
|
+
* 4. Environment variables: NUXT_AXIOM_*, AXIOM_*
|
|
31
|
+
*
|
|
32
|
+
* @example
|
|
33
|
+
* ```ts
|
|
34
|
+
* // Zero config - just set NUXT_AXIOM_TOKEN and NUXT_AXIOM_DATASET env vars
|
|
35
|
+
* nitroApp.hooks.hook('@safaricom-mxl/log:drain', createAxiomDrain())
|
|
36
|
+
*
|
|
37
|
+
* // With overrides
|
|
38
|
+
* nitroApp.hooks.hook('@safaricom-mxl/log:drain', createAxiomDrain({
|
|
39
|
+
* dataset: 'my-dataset',
|
|
40
|
+
* }))
|
|
41
|
+
* ```
|
|
42
|
+
*/
|
|
43
|
+
function createAxiomDrain(overrides) {
|
|
44
|
+
return defineDrain({
|
|
45
|
+
name: "axiom",
|
|
46
|
+
resolve: () => {
|
|
47
|
+
const config = resolveAdapterConfig("axiom", AXIOM_FIELDS, overrides);
|
|
48
|
+
if (!config.dataset || !config.token) {
|
|
49
|
+
console.error("[mxllog/axiom] Missing dataset or token. Set NUXT_AXIOM_TOKEN/NUXT_AXIOM_DATASET env vars or pass to createAxiomDrain()");
|
|
50
|
+
return null;
|
|
51
|
+
}
|
|
52
|
+
return config;
|
|
53
|
+
},
|
|
54
|
+
send: sendBatchToAxiom
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Send a single event to Axiom.
|
|
59
|
+
*
|
|
60
|
+
* @example
|
|
61
|
+
* ```ts
|
|
62
|
+
* await sendToAxiom(event, {
|
|
63
|
+
* dataset: 'my-logs',
|
|
64
|
+
* token: process.env.AXIOM_TOKEN!,
|
|
65
|
+
* })
|
|
66
|
+
* ```
|
|
67
|
+
*/
|
|
68
|
+
async function sendToAxiom(event, config) {
|
|
69
|
+
await sendBatchToAxiom([event], config);
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Send a batch of events to Axiom.
|
|
73
|
+
*
|
|
74
|
+
* @example
|
|
75
|
+
* ```ts
|
|
76
|
+
* await sendBatchToAxiom(events, {
|
|
77
|
+
* dataset: 'my-logs',
|
|
78
|
+
* token: process.env.AXIOM_TOKEN!,
|
|
79
|
+
* })
|
|
80
|
+
* ```
|
|
81
|
+
*/
|
|
82
|
+
async function sendBatchToAxiom(events, config) {
|
|
83
|
+
const url = `${config.baseUrl ?? "https://api.axiom.co"}/v1/datasets/${encodeURIComponent(config.dataset)}/ingest`;
|
|
84
|
+
const headers = {
|
|
85
|
+
"Content-Type": "application/json",
|
|
86
|
+
"Authorization": `Bearer ${config.token}`
|
|
87
|
+
};
|
|
88
|
+
if (config.orgId) headers["X-Axiom-Org-Id"] = config.orgId;
|
|
89
|
+
await httpPost({
|
|
90
|
+
url,
|
|
91
|
+
headers,
|
|
92
|
+
body: JSON.stringify(events),
|
|
93
|
+
timeout: config.timeout ?? 5e3,
|
|
94
|
+
label: "Axiom"
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
//#endregion
|
|
99
|
+
export { createAxiomDrain, sendBatchToAxiom, sendToAxiom };
|
|
100
|
+
//# sourceMappingURL=axiom.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"axiom.mjs","names":[],"sources":["../../src/adapters/axiom.ts"],"sourcesContent":["import type { WideEvent } from '../types'\nimport type { ConfigField } from './_config'\nimport { resolveAdapterConfig } from './_config'\nimport { defineDrain } from './_drain'\nimport { httpPost } from './_http'\n\nexport interface AxiomConfig {\n /** Axiom dataset name */\n dataset: string\n /** Axiom API token */\n token: string\n /** Organization ID (required for Personal Access Tokens) */\n orgId?: string\n /** Base URL for Axiom API. Default: https://api.axiom.co */\n baseUrl?: string\n /** Request timeout in milliseconds. Default: 5000 */\n timeout?: number\n}\n\nconst AXIOM_FIELDS: ConfigField<AxiomConfig>[] = [\n { key: 'dataset', env: ['NUXT_AXIOM_DATASET', 'AXIOM_DATASET'] },\n { key: 'token', env: ['NUXT_AXIOM_TOKEN', 'AXIOM_TOKEN'] },\n { key: 'orgId', env: ['NUXT_AXIOM_ORG_ID', 'AXIOM_ORG_ID'] },\n { key: 'baseUrl', env: ['NUXT_AXIOM_URL', 'AXIOM_URL'] },\n { key: 'timeout' },\n]\n\n/**\n * Create a drain function for sending logs to Axiom.\n *\n * Configuration priority (highest to lowest):\n * 1. Overrides passed to createAxiomDrain()\n * 2. runtimeConfig.mxllog.axiom\n * 3. runtimeConfig.axiom\n * 4. Environment variables: NUXT_AXIOM_*, AXIOM_*\n *\n * @example\n * ```ts\n * // Zero config - just set NUXT_AXIOM_TOKEN and NUXT_AXIOM_DATASET env vars\n * nitroApp.hooks.hook('@safaricom-mxl/log:drain', createAxiomDrain())\n *\n * // With overrides\n * nitroApp.hooks.hook('@safaricom-mxl/log:drain', createAxiomDrain({\n * dataset: 'my-dataset',\n * }))\n * ```\n */\nexport function createAxiomDrain(overrides?: Partial<AxiomConfig>) {\n return defineDrain<AxiomConfig>({\n name: 'axiom',\n resolve: () => {\n const config = resolveAdapterConfig<AxiomConfig>('axiom', AXIOM_FIELDS, overrides)\n if (!config.dataset || !config.token) {\n console.error('[mxllog/axiom] Missing dataset or token. Set NUXT_AXIOM_TOKEN/NUXT_AXIOM_DATASET env vars or pass to createAxiomDrain()')\n return null\n }\n return config as AxiomConfig\n },\n send: sendBatchToAxiom,\n })\n}\n\n/**\n * Send a single event to Axiom.\n *\n * @example\n * ```ts\n * await sendToAxiom(event, {\n * dataset: 'my-logs',\n * token: process.env.AXIOM_TOKEN!,\n * })\n * ```\n */\nexport async function sendToAxiom(event: WideEvent, config: AxiomConfig): Promise<void> {\n await sendBatchToAxiom([event], config)\n}\n\n/**\n * Send a batch of events to Axiom.\n *\n * @example\n * ```ts\n * await sendBatchToAxiom(events, {\n * dataset: 'my-logs',\n * token: process.env.AXIOM_TOKEN!,\n * })\n * ```\n */\nexport async function sendBatchToAxiom(events: WideEvent[], config: AxiomConfig): Promise<void> {\n const baseUrl = config.baseUrl ?? 'https://api.axiom.co'\n const url = `${baseUrl}/v1/datasets/${encodeURIComponent(config.dataset)}/ingest`\n\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${config.token}`,\n }\n\n if (config.orgId) {\n headers['X-Axiom-Org-Id'] = config.orgId\n }\n\n await httpPost({\n url,\n headers,\n body: JSON.stringify(events),\n timeout: config.timeout ?? 5000,\n label: 'Axiom',\n })\n}\n"],"mappings":";;;AAmBA,MAAM,eAA2C;CAC/C;EAAE,KAAK;EAAW,KAAK,CAAC,sBAAsB,gBAAgB;EAAE;CAChE;EAAE,KAAK;EAAS,KAAK,CAAC,oBAAoB,cAAc;EAAE;CAC1D;EAAE,KAAK;EAAS,KAAK,CAAC,qBAAqB,eAAe;EAAE;CAC5D;EAAE,KAAK;EAAW,KAAK,CAAC,kBAAkB,YAAY;EAAE;CACxD,EAAE,KAAK,WAAW;CACnB;;;;;;;;;;;;;;;;;;;;;AAsBD,SAAgB,iBAAiB,WAAkC;AACjE,QAAO,YAAyB;EAC9B,MAAM;EACN,eAAe;GACb,MAAM,SAAS,qBAAkC,SAAS,cAAc,UAAU;AAClF,OAAI,CAAC,OAAO,WAAW,CAAC,OAAO,OAAO;AACpC,YAAQ,MAAM,0HAA0H;AACxI,WAAO;;AAET,UAAO;;EAET,MAAM;EACP,CAAC;;;;;;;;;;;;;AAcJ,eAAsB,YAAY,OAAkB,QAAoC;AACtF,OAAM,iBAAiB,CAAC,MAAM,EAAE,OAAO;;;;;;;;;;;;;AAczC,eAAsB,iBAAiB,QAAqB,QAAoC;CAE9F,MAAM,MAAM,GADI,OAAO,WAAW,uBACX,eAAe,mBAAmB,OAAO,QAAQ,CAAC;CAEzE,MAAM,UAAkC;EACtC,gBAAgB;EAChB,iBAAiB,UAAU,OAAO;EACnC;AAED,KAAI,OAAO,MACT,SAAQ,oBAAoB,OAAO;AAGrC,OAAM,SAAS;EACb;EACA;EACA,MAAM,KAAK,UAAU,OAAO;EAC5B,SAAS,OAAO,WAAW;EAC3B,OAAO;EACR,CAAC"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { DrainContext, WideEvent } from "../types.mjs";
|
|
2
|
+
import "../index.mjs";
|
|
3
|
+
|
|
4
|
+
//#region src/adapters/better-stack.d.ts
|
|
5
|
+
interface BetterStackConfig {
|
|
6
|
+
/** Better Stack source token */
|
|
7
|
+
sourceToken: string;
|
|
8
|
+
/** Logtail ingestion endpoint. Default: https://in.logs.betterstack.com */
|
|
9
|
+
endpoint?: string;
|
|
10
|
+
/** Request timeout in milliseconds. Default: 5000 */
|
|
11
|
+
timeout?: number;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Transform an mxllog wide event into a Better Stack event.
|
|
15
|
+
* Maps `timestamp` to `dt` (Better Stack's expected field).
|
|
16
|
+
*/
|
|
17
|
+
declare function toBetterStackEvent(event: WideEvent): Record<string, unknown>;
|
|
18
|
+
/**
|
|
19
|
+
* Create a drain function for sending logs to Better Stack.
|
|
20
|
+
*
|
|
21
|
+
* Configuration priority (highest to lowest):
|
|
22
|
+
* 1. Overrides passed to createBetterStackDrain()
|
|
23
|
+
* 2. runtimeConfig.mxllog.betterStack
|
|
24
|
+
* 3. runtimeConfig.betterStack
|
|
25
|
+
* 4. Environment variables: NUXT_BETTER_STACK_*, BETTER_STACK_*
|
|
26
|
+
*
|
|
27
|
+
* @example
|
|
28
|
+
* ```ts
|
|
29
|
+
* // Zero config - just set NUXT_BETTER_STACK_SOURCE_TOKEN env var
|
|
30
|
+
* nitroApp.hooks.hook('@safaricom-mxl/log:drain', createBetterStackDrain())
|
|
31
|
+
*
|
|
32
|
+
* // With overrides
|
|
33
|
+
* nitroApp.hooks.hook('@safaricom-mxl/log:drain', createBetterStackDrain({
|
|
34
|
+
* sourceToken: 'my-token',
|
|
35
|
+
* }))
|
|
36
|
+
* ```
|
|
37
|
+
*/
|
|
38
|
+
declare function createBetterStackDrain(overrides?: Partial<BetterStackConfig>): (ctx: DrainContext | DrainContext[]) => Promise<void>;
|
|
39
|
+
/**
|
|
40
|
+
* Send a single event to Better Stack.
|
|
41
|
+
*
|
|
42
|
+
* @example
|
|
43
|
+
* ```ts
|
|
44
|
+
* await sendToBetterStack(event, {
|
|
45
|
+
* sourceToken: process.env.BETTER_STACK_SOURCE_TOKEN!,
|
|
46
|
+
* })
|
|
47
|
+
* ```
|
|
48
|
+
*/
|
|
49
|
+
declare function sendToBetterStack(event: WideEvent, config: BetterStackConfig): Promise<void>;
|
|
50
|
+
/**
|
|
51
|
+
* Send a batch of events to Better Stack.
|
|
52
|
+
*
|
|
53
|
+
* @example
|
|
54
|
+
* ```ts
|
|
55
|
+
* await sendBatchToBetterStack(events, {
|
|
56
|
+
* sourceToken: process.env.BETTER_STACK_SOURCE_TOKEN!,
|
|
57
|
+
* })
|
|
58
|
+
* ```
|
|
59
|
+
*/
|
|
60
|
+
declare function sendBatchToBetterStack(events: WideEvent[], config: BetterStackConfig): Promise<void>;
|
|
61
|
+
//#endregion
|
|
62
|
+
export { BetterStackConfig, createBetterStackDrain, sendBatchToBetterStack, sendToBetterStack, toBetterStackEvent };
|
|
63
|
+
//# sourceMappingURL=better-stack.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"better-stack.d.mts","names":[],"sources":["../../src/adapters/better-stack.ts"],"mappings":";;;;UAMiB,iBAAA;;EAEf,WAAA;EAFe;EAIf,QAAA;;EAEA,OAAA;AAAA;;;;;iBAac,kBAAA,CAAmB,KAAA,EAAO,SAAA,GAAY,MAAA;;;;;;;;;AAyBtD;;;;;;;;;;;;iBAAgB,sBAAA,CAAuB,SAAA,GAAY,OAAA,CAAQ,iBAAA,KAAkB,GAAA,EAAnB,YAAA,GAAmB,YAAA,OAAA,OAAA;;;;;;;AAyB7E;;;;iBAAsB,iBAAA,CAAkB,KAAA,EAAO,SAAA,EAAW,MAAA,EAAQ,iBAAA,GAAoB,OAAA;;;;;;;;;;;iBAchE,sBAAA,CAAuB,MAAA,EAAQ,SAAA,IAAa,MAAA,EAAQ,iBAAA,GAAoB,OAAA"}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import { n as defineDrain, r as resolveAdapterConfig, t as httpPost } from "../_http-DmaJ426Z.mjs";
|
|
2
|
+
|
|
3
|
+
//#region src/adapters/better-stack.ts
|
|
4
|
+
const BETTER_STACK_FIELDS = [
|
|
5
|
+
{
|
|
6
|
+
key: "sourceToken",
|
|
7
|
+
env: ["NUXT_BETTER_STACK_SOURCE_TOKEN", "BETTER_STACK_SOURCE_TOKEN"]
|
|
8
|
+
},
|
|
9
|
+
{
|
|
10
|
+
key: "endpoint",
|
|
11
|
+
env: ["NUXT_BETTER_STACK_ENDPOINT", "BETTER_STACK_ENDPOINT"]
|
|
12
|
+
},
|
|
13
|
+
{ key: "timeout" }
|
|
14
|
+
];
|
|
15
|
+
/**
|
|
16
|
+
* Transform an mxllog wide event into a Better Stack event.
|
|
17
|
+
* Maps `timestamp` to `dt` (Better Stack's expected field).
|
|
18
|
+
*/
|
|
19
|
+
function toBetterStackEvent(event) {
|
|
20
|
+
const { timestamp, ...rest } = event;
|
|
21
|
+
return {
|
|
22
|
+
...rest,
|
|
23
|
+
dt: timestamp
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Create a drain function for sending logs to Better Stack.
|
|
28
|
+
*
|
|
29
|
+
* Configuration priority (highest to lowest):
|
|
30
|
+
* 1. Overrides passed to createBetterStackDrain()
|
|
31
|
+
* 2. runtimeConfig.mxllog.betterStack
|
|
32
|
+
* 3. runtimeConfig.betterStack
|
|
33
|
+
* 4. Environment variables: NUXT_BETTER_STACK_*, BETTER_STACK_*
|
|
34
|
+
*
|
|
35
|
+
* @example
|
|
36
|
+
* ```ts
|
|
37
|
+
* // Zero config - just set NUXT_BETTER_STACK_SOURCE_TOKEN env var
|
|
38
|
+
* nitroApp.hooks.hook('@safaricom-mxl/log:drain', createBetterStackDrain())
|
|
39
|
+
*
|
|
40
|
+
* // With overrides
|
|
41
|
+
* nitroApp.hooks.hook('@safaricom-mxl/log:drain', createBetterStackDrain({
|
|
42
|
+
* sourceToken: 'my-token',
|
|
43
|
+
* }))
|
|
44
|
+
* ```
|
|
45
|
+
*/
|
|
46
|
+
function createBetterStackDrain(overrides) {
|
|
47
|
+
return defineDrain({
|
|
48
|
+
name: "better-stack",
|
|
49
|
+
resolve: () => {
|
|
50
|
+
const config = resolveAdapterConfig("betterStack", BETTER_STACK_FIELDS, overrides);
|
|
51
|
+
if (!config.sourceToken) {
|
|
52
|
+
console.error("[mxllog/better-stack] Missing source token. Set NUXT_BETTER_STACK_SOURCE_TOKEN env var or pass to createBetterStackDrain()");
|
|
53
|
+
return null;
|
|
54
|
+
}
|
|
55
|
+
return config;
|
|
56
|
+
},
|
|
57
|
+
send: sendBatchToBetterStack
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Send a single event to Better Stack.
|
|
62
|
+
*
|
|
63
|
+
* @example
|
|
64
|
+
* ```ts
|
|
65
|
+
* await sendToBetterStack(event, {
|
|
66
|
+
* sourceToken: process.env.BETTER_STACK_SOURCE_TOKEN!,
|
|
67
|
+
* })
|
|
68
|
+
* ```
|
|
69
|
+
*/
|
|
70
|
+
async function sendToBetterStack(event, config) {
|
|
71
|
+
await sendBatchToBetterStack([event], config);
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Send a batch of events to Better Stack.
|
|
75
|
+
*
|
|
76
|
+
* @example
|
|
77
|
+
* ```ts
|
|
78
|
+
* await sendBatchToBetterStack(events, {
|
|
79
|
+
* sourceToken: process.env.BETTER_STACK_SOURCE_TOKEN!,
|
|
80
|
+
* })
|
|
81
|
+
* ```
|
|
82
|
+
*/
|
|
83
|
+
async function sendBatchToBetterStack(events, config) {
|
|
84
|
+
await httpPost({
|
|
85
|
+
url: (config.endpoint ?? "https://in.logs.betterstack.com").replace(/\/+$/, ""),
|
|
86
|
+
headers: {
|
|
87
|
+
"Content-Type": "application/json",
|
|
88
|
+
"Authorization": `Bearer ${config.sourceToken}`
|
|
89
|
+
},
|
|
90
|
+
body: JSON.stringify(events.map(toBetterStackEvent)),
|
|
91
|
+
timeout: config.timeout ?? 5e3,
|
|
92
|
+
label: "Better Stack"
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
//#endregion
|
|
97
|
+
export { createBetterStackDrain, sendBatchToBetterStack, sendToBetterStack, toBetterStackEvent };
|
|
98
|
+
//# sourceMappingURL=better-stack.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"better-stack.mjs","names":[],"sources":["../../src/adapters/better-stack.ts"],"sourcesContent":["import type { WideEvent } from '../types'\nimport type { ConfigField } from './_config'\nimport { resolveAdapterConfig } from './_config'\nimport { defineDrain } from './_drain'\nimport { httpPost } from './_http'\n\nexport interface BetterStackConfig {\n /** Better Stack source token */\n sourceToken: string\n /** Logtail ingestion endpoint. Default: https://in.logs.betterstack.com */\n endpoint?: string\n /** Request timeout in milliseconds. Default: 5000 */\n timeout?: number\n}\n\nconst BETTER_STACK_FIELDS: ConfigField<BetterStackConfig>[] = [\n { key: 'sourceToken', env: ['NUXT_BETTER_STACK_SOURCE_TOKEN', 'BETTER_STACK_SOURCE_TOKEN'] },\n { key: 'endpoint', env: ['NUXT_BETTER_STACK_ENDPOINT', 'BETTER_STACK_ENDPOINT'] },\n { key: 'timeout' },\n]\n\n/**\n * Transform an mxllog wide event into a Better Stack event.\n * Maps `timestamp` to `dt` (Better Stack's expected field).\n */\nexport function toBetterStackEvent(event: WideEvent): Record<string, unknown> {\n const { timestamp, ...rest } = event\n return { ...rest, dt: timestamp }\n}\n\n/**\n * Create a drain function for sending logs to Better Stack.\n *\n * Configuration priority (highest to lowest):\n * 1. Overrides passed to createBetterStackDrain()\n * 2. runtimeConfig.mxllog.betterStack\n * 3. runtimeConfig.betterStack\n * 4. Environment variables: NUXT_BETTER_STACK_*, BETTER_STACK_*\n *\n * @example\n * ```ts\n * // Zero config - just set NUXT_BETTER_STACK_SOURCE_TOKEN env var\n * nitroApp.hooks.hook('@safaricom-mxl/log:drain', createBetterStackDrain())\n *\n * // With overrides\n * nitroApp.hooks.hook('@safaricom-mxl/log:drain', createBetterStackDrain({\n * sourceToken: 'my-token',\n * }))\n * ```\n */\nexport function createBetterStackDrain(overrides?: Partial<BetterStackConfig>) {\n return defineDrain<BetterStackConfig>({\n name: 'better-stack',\n resolve: () => {\n const config = resolveAdapterConfig<BetterStackConfig>('betterStack', BETTER_STACK_FIELDS, overrides)\n if (!config.sourceToken) {\n console.error('[mxllog/better-stack] Missing source token. Set NUXT_BETTER_STACK_SOURCE_TOKEN env var or pass to createBetterStackDrain()')\n return null\n }\n return config as BetterStackConfig\n },\n send: sendBatchToBetterStack,\n })\n}\n\n/**\n * Send a single event to Better Stack.\n *\n * @example\n * ```ts\n * await sendToBetterStack(event, {\n * sourceToken: process.env.BETTER_STACK_SOURCE_TOKEN!,\n * })\n * ```\n */\nexport async function sendToBetterStack(event: WideEvent, config: BetterStackConfig): Promise<void> {\n await sendBatchToBetterStack([event], config)\n}\n\n/**\n * Send a batch of events to Better Stack.\n *\n * @example\n * ```ts\n * await sendBatchToBetterStack(events, {\n * sourceToken: process.env.BETTER_STACK_SOURCE_TOKEN!,\n * })\n * ```\n */\nexport async function sendBatchToBetterStack(events: WideEvent[], config: BetterStackConfig): Promise<void> {\n const endpoint = (config.endpoint ?? 'https://in.logs.betterstack.com').replace(/\\/+$/, '')\n\n await httpPost({\n url: endpoint,\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${config.sourceToken}`,\n },\n body: JSON.stringify(events.map(toBetterStackEvent)),\n timeout: config.timeout ?? 5000,\n label: 'Better Stack',\n })\n}\n"],"mappings":";;;AAeA,MAAM,sBAAwD;CAC5D;EAAE,KAAK;EAAe,KAAK,CAAC,kCAAkC,4BAA4B;EAAE;CAC5F;EAAE,KAAK;EAAY,KAAK,CAAC,8BAA8B,wBAAwB;EAAE;CACjF,EAAE,KAAK,WAAW;CACnB;;;;;AAMD,SAAgB,mBAAmB,OAA2C;CAC5E,MAAM,EAAE,WAAW,GAAG,SAAS;AAC/B,QAAO;EAAE,GAAG;EAAM,IAAI;EAAW;;;;;;;;;;;;;;;;;;;;;;AAuBnC,SAAgB,uBAAuB,WAAwC;AAC7E,QAAO,YAA+B;EACpC,MAAM;EACN,eAAe;GACb,MAAM,SAAS,qBAAwC,eAAe,qBAAqB,UAAU;AACrG,OAAI,CAAC,OAAO,aAAa;AACvB,YAAQ,MAAM,6HAA6H;AAC3I,WAAO;;AAET,UAAO;;EAET,MAAM;EACP,CAAC;;;;;;;;;;;;AAaJ,eAAsB,kBAAkB,OAAkB,QAA0C;AAClG,OAAM,uBAAuB,CAAC,MAAM,EAAE,OAAO;;;;;;;;;;;;AAa/C,eAAsB,uBAAuB,QAAqB,QAA0C;AAG1G,OAAM,SAAS;EACb,MAHgB,OAAO,YAAY,mCAAmC,QAAQ,QAAQ,GAAG;EAIzF,SAAS;GACP,gBAAgB;GAChB,iBAAiB,UAAU,OAAO;GACnC;EACD,MAAM,KAAK,UAAU,OAAO,IAAI,mBAAmB,CAAC;EACpD,SAAS,OAAO,WAAW;EAC3B,OAAO;EACR,CAAC"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import { DrainContext, WideEvent } from "../types.mjs";
|
|
2
|
+
import "../index.mjs";
|
|
3
|
+
|
|
4
|
+
//#region src/adapters/otlp.d.ts
|
|
5
|
+
interface OTLPConfig {
|
|
6
|
+
/** OTLP HTTP endpoint (e.g., http://localhost:4318) */
|
|
7
|
+
endpoint: string;
|
|
8
|
+
/** Override service name (defaults to event.service) */
|
|
9
|
+
serviceName?: string;
|
|
10
|
+
/** Additional resource attributes */
|
|
11
|
+
resourceAttributes?: Record<string, string | number | boolean>;
|
|
12
|
+
/** Custom headers (e.g., for authentication) */
|
|
13
|
+
headers?: Record<string, string>;
|
|
14
|
+
/** Request timeout in milliseconds. Default: 5000 */
|
|
15
|
+
timeout?: number;
|
|
16
|
+
}
|
|
17
|
+
/** OTLP Log Record structure */
|
|
18
|
+
interface OTLPLogRecord {
|
|
19
|
+
timeUnixNano: string;
|
|
20
|
+
severityNumber: number;
|
|
21
|
+
severityText: string;
|
|
22
|
+
body: {
|
|
23
|
+
stringValue: string;
|
|
24
|
+
};
|
|
25
|
+
attributes: Array<{
|
|
26
|
+
key: string;
|
|
27
|
+
value: {
|
|
28
|
+
stringValue?: string;
|
|
29
|
+
intValue?: string;
|
|
30
|
+
boolValue?: boolean;
|
|
31
|
+
};
|
|
32
|
+
}>;
|
|
33
|
+
traceId?: string;
|
|
34
|
+
spanId?: string;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Convert an mxllog WideEvent to an OTLP LogRecord.
|
|
38
|
+
*/
|
|
39
|
+
declare function toOTLPLogRecord(event: WideEvent): OTLPLogRecord;
|
|
40
|
+
/**
|
|
41
|
+
* Create a drain function for sending logs to an OTLP endpoint.
|
|
42
|
+
*
|
|
43
|
+
* Configuration priority (highest to lowest):
|
|
44
|
+
* 1. Overrides passed to createOTLPDrain()
|
|
45
|
+
* 2. runtimeConfig.mxllog.otlp (NUXT_MXLLOG_OTLP_*)
|
|
46
|
+
* 3. runtimeConfig.otlp (NUXT_OTLP_*)
|
|
47
|
+
* 4. Environment variables: OTEL_EXPORTER_OTLP_ENDPOINT, OTEL_SERVICE_NAME
|
|
48
|
+
*
|
|
49
|
+
* @example
|
|
50
|
+
* ```ts
|
|
51
|
+
* // Zero config - reads from runtimeConfig or env vars
|
|
52
|
+
* nitroApp.hooks.hook('@safaricom-mxl/log:drain', createOTLPDrain())
|
|
53
|
+
*
|
|
54
|
+
* // With overrides
|
|
55
|
+
* nitroApp.hooks.hook('@safaricom-mxl/log:drain', createOTLPDrain({
|
|
56
|
+
* endpoint: 'http://localhost:4318',
|
|
57
|
+
* }))
|
|
58
|
+
* ```
|
|
59
|
+
*/
|
|
60
|
+
declare function createOTLPDrain(overrides?: Partial<OTLPConfig>): (ctx: DrainContext | DrainContext[]) => Promise<void>;
|
|
61
|
+
/**
|
|
62
|
+
* Send a single event to an OTLP endpoint.
|
|
63
|
+
*
|
|
64
|
+
* @example
|
|
65
|
+
* ```ts
|
|
66
|
+
* await sendToOTLP(event, {
|
|
67
|
+
* endpoint: 'http://localhost:4318',
|
|
68
|
+
* })
|
|
69
|
+
* ```
|
|
70
|
+
*/
|
|
71
|
+
declare function sendToOTLP(event: WideEvent, config: OTLPConfig): Promise<void>;
|
|
72
|
+
/**
|
|
73
|
+
* Send a batch of events to an OTLP endpoint.
|
|
74
|
+
*
|
|
75
|
+
* @example
|
|
76
|
+
* ```ts
|
|
77
|
+
* await sendBatchToOTLP(events, {
|
|
78
|
+
* endpoint: 'http://localhost:4318',
|
|
79
|
+
* })
|
|
80
|
+
* ```
|
|
81
|
+
*/
|
|
82
|
+
declare function sendBatchToOTLP(events: WideEvent[], config: OTLPConfig): Promise<void>;
|
|
83
|
+
//#endregion
|
|
84
|
+
export { OTLPConfig, OTLPLogRecord, createOTLPDrain, sendBatchToOTLP, sendToOTLP, toOTLPLogRecord };
|
|
85
|
+
//# sourceMappingURL=otlp.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"otlp.d.mts","names":[],"sources":["../../src/adapters/otlp.ts"],"mappings":";;;;UAOiB,UAAA;;EAEf,QAAA;EAFe;EAIf,WAAA;;EAEA,kBAAA,GAAqB,MAAA;EAJrB;EAMA,OAAA,GAAU,MAAA;EAFV;EAIA,OAAA;AAAA;;UAIe,aAAA;EACf,YAAA;EACA,cAAA;EACA,YAAA;EACA,IAAA;IAAQ,WAAA;EAAA;EACR,UAAA,EAAY,KAAA;IACV,GAAA;IACA,KAAA;MAAS,WAAA;MAAsB,QAAA;MAAmB,SAAA;IAAA;EAAA;EAEpD,OAAA;EACA,MAAA;AAAA;;;;iBAwDc,eAAA,CAAgB,KAAA,EAAO,SAAA,GAAY,aAAA;;AAAnD;;;;;;;;;AA0JA;;;;;;;;;;iBAAgB,eAAA,CAAgB,SAAA,GAAY,OAAA,CAAQ,UAAA,KAAW,GAAA,EAAZ,YAAA,GAAY,YAAA,OAAA,OAAA;;;;;;;;;AA+B/D;;iBAAsB,UAAA,CAAW,KAAA,EAAO,SAAA,EAAW,MAAA,EAAQ,UAAA,GAAa,OAAA;;;;;;;;;;;iBAclD,eAAA,CAAgB,MAAA,EAAQ,SAAA,IAAa,MAAA,EAAQ,UAAA,GAAa,OAAA"}
|