evlog 1.6.0 → 1.8.0
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 +96 -0
- package/dist/_http-DVDwNag0.mjs +76 -0
- package/dist/_http-DVDwNag0.mjs.map +1 -0
- package/dist/_severity-CXfyvxQi.mjs +17 -0
- package/dist/_severity-CXfyvxQi.mjs.map +1 -0
- package/dist/adapters/axiom.d.mts +17 -15
- package/dist/adapters/axiom.d.mts.map +1 -0
- package/dist/adapters/axiom.mjs +91 -50
- 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 +32 -30
- package/dist/adapters/otlp.d.mts.map +1 -0
- package/dist/adapters/otlp.mjs +181 -181
- package/dist/adapters/otlp.mjs.map +1 -0
- package/dist/adapters/posthog.d.mts +54 -19
- package/dist/adapters/posthog.d.mts.map +1 -0
- package/dist/adapters/posthog.mjs +156 -63
- package/dist/adapters/posthog.mjs.map +1 -0
- package/dist/adapters/sentry.d.mts +25 -23
- package/dist/adapters/sentry.d.mts.map +1 -0
- package/dist/adapters/sentry.mjs +198 -153
- 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 +24 -22
- package/dist/error.d.mts.map +1 -0
- package/dist/error.mjs +107 -76
- package/dist/error.mjs.map +1 -0
- package/dist/index.d.mts +6 -5
- package/dist/index.mjs +6 -5
- package/dist/logger.d.mts +11 -5
- package/dist/logger.d.mts.map +1 -0
- package/dist/logger.mjs +255 -186
- package/dist/logger.mjs.map +1 -0
- package/dist/nitro/errorHandler.d.mts +4 -2
- package/dist/nitro/errorHandler.d.mts.map +1 -0
- package/dist/nitro/errorHandler.mjs +38 -38
- 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 +4 -2
- package/dist/nitro/plugin.d.mts.map +1 -0
- package/dist/nitro/plugin.mjs +135 -140
- 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 +4 -0
- package/dist/nitro/v3/index.mjs +4 -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 +157 -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-D57TWGyN.mjs +73 -0
- package/dist/nitro-D57TWGyN.mjs.map +1 -0
- package/dist/nitro-D81NBVPi.d.mts +42 -0
- package/dist/nitro-D81NBVPi.d.mts.map +1 -0
- package/dist/nuxt/module.d.mts +155 -168
- package/dist/nuxt/module.d.mts.map +1 -0
- package/dist/nuxt/module.mjs +75 -65
- 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/runtime/client/log.d.mts +12 -7
- package/dist/runtime/client/log.d.mts.map +1 -0
- package/dist/runtime/client/log.mjs +72 -64
- package/dist/runtime/client/log.mjs.map +1 -0
- package/dist/runtime/client/plugin.d.mts +3 -1
- package/dist/runtime/client/plugin.d.mts.map +1 -0
- package/dist/runtime/client/plugin.mjs +14 -12
- package/dist/runtime/client/plugin.mjs.map +1 -0
- package/dist/runtime/server/routes/_evlog/ingest.post.d.mts +4 -2
- package/dist/runtime/server/routes/_evlog/ingest.post.d.mts.map +1 -0
- package/dist/runtime/server/routes/_evlog/ingest.post.mjs +113 -76
- package/dist/runtime/server/routes/_evlog/ingest.post.mjs.map +1 -0
- package/dist/runtime/server/useLogger.d.mts +14 -3
- package/dist/runtime/server/useLogger.d.mts.map +1 -0
- package/dist/runtime/server/useLogger.mjs +39 -10
- package/dist/runtime/server/useLogger.mjs.map +1 -0
- package/dist/runtime/utils/parseError.d.mts +5 -3
- package/dist/runtime/utils/parseError.d.mts.map +1 -0
- package/dist/runtime/utils/parseError.mjs +25 -26
- package/dist/runtime/utils/parseError.mjs.map +1 -0
- package/dist/types.d.mts +378 -246
- package/dist/types.d.mts.map +1 -0
- package/dist/types.mjs +1 -1
- package/dist/utils.d.mts +19 -14
- package/dist/utils.d.mts.map +1 -0
- package/dist/utils.mjs +59 -50
- package/dist/utils.mjs.map +1 -0
- package/dist/workers.d.mts +10 -9
- package/dist/workers.d.mts.map +1 -0
- package/dist/workers.mjs +68 -39
- package/dist/workers.mjs.map +1 -0
- package/package.json +55 -10
- package/dist/adapters/axiom.d.ts +0 -62
- package/dist/adapters/otlp.d.ts +0 -83
- package/dist/adapters/posthog.d.ts +0 -72
- package/dist/adapters/sentry.d.ts +0 -78
- package/dist/error.d.ts +0 -63
- package/dist/index.d.ts +0 -5
- package/dist/logger.d.ts +0 -40
- package/dist/nitro/errorHandler.d.ts +0 -13
- package/dist/nitro/plugin.d.ts +0 -5
- package/dist/nuxt/module.d.ts +0 -171
- package/dist/runtime/client/log.d.ts +0 -10
- package/dist/runtime/client/plugin.d.ts +0 -3
- package/dist/runtime/server/routes/_evlog/ingest.post.d.ts +0 -5
- package/dist/runtime/server/useLogger.d.ts +0 -28
- package/dist/runtime/utils/parseError.d.ts +0 -5
- package/dist/shared/evlog.Bc35pxiY.mjs +0 -10
- package/dist/types.d.ts +0 -364
- package/dist/utils.d.ts +0 -29
- package/dist/workers.d.ts +0 -45
package/dist/adapters/otlp.d.mts
CHANGED
|
@@ -1,35 +1,37 @@
|
|
|
1
|
-
import { DrainContext, WideEvent } from
|
|
1
|
+
import { DrainContext, WideEvent } from "../types.mjs";
|
|
2
|
+
import "../index.mjs";
|
|
2
3
|
|
|
4
|
+
//#region src/adapters/otlp.d.ts
|
|
3
5
|
interface OTLPConfig {
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
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;
|
|
14
16
|
}
|
|
15
17
|
/** OTLP Log Record structure */
|
|
16
18
|
interface OTLPLogRecord {
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
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;
|
|
22
31
|
};
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
stringValue?: string;
|
|
27
|
-
intValue?: string;
|
|
28
|
-
boolValue?: boolean;
|
|
29
|
-
};
|
|
30
|
-
}>;
|
|
31
|
-
traceId?: string;
|
|
32
|
-
spanId?: string;
|
|
32
|
+
}>;
|
|
33
|
+
traceId?: string;
|
|
34
|
+
spanId?: string;
|
|
33
35
|
}
|
|
34
36
|
/**
|
|
35
37
|
* Convert an evlog WideEvent to an OTLP LogRecord.
|
|
@@ -55,7 +57,7 @@ declare function toOTLPLogRecord(event: WideEvent): OTLPLogRecord;
|
|
|
55
57
|
* }))
|
|
56
58
|
* ```
|
|
57
59
|
*/
|
|
58
|
-
declare function createOTLPDrain(overrides?: Partial<OTLPConfig>): (ctx: DrainContext) => Promise<void>;
|
|
60
|
+
declare function createOTLPDrain(overrides?: Partial<OTLPConfig>): (ctx: DrainContext | DrainContext[]) => Promise<void>;
|
|
59
61
|
/**
|
|
60
62
|
* Send a single event to an OTLP endpoint.
|
|
61
63
|
*
|
|
@@ -78,6 +80,6 @@ declare function sendToOTLP(event: WideEvent, config: OTLPConfig): Promise<void>
|
|
|
78
80
|
* ```
|
|
79
81
|
*/
|
|
80
82
|
declare function sendBatchToOTLP(events: WideEvent[], config: OTLPConfig): Promise<void>;
|
|
81
|
-
|
|
82
|
-
export { createOTLPDrain, sendBatchToOTLP, sendToOTLP, toOTLPLogRecord };
|
|
83
|
-
|
|
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"}
|
package/dist/adapters/otlp.mjs
CHANGED
|
@@ -1,196 +1,196 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { n as defineDrain, r as resolveAdapterConfig, t as httpPost } from "../_http-DVDwNag0.mjs";
|
|
2
|
+
import { n as OTEL_SEVERITY_TEXT, t as OTEL_SEVERITY_NUMBER } from "../_severity-CXfyvxQi.mjs";
|
|
2
3
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
4
|
+
//#region src/adapters/otlp.ts
|
|
5
|
+
const OTLP_FIELDS = [
|
|
6
|
+
{
|
|
7
|
+
key: "endpoint",
|
|
8
|
+
env: ["NUXT_OTLP_ENDPOINT", "OTEL_EXPORTER_OTLP_ENDPOINT"]
|
|
9
|
+
},
|
|
10
|
+
{
|
|
11
|
+
key: "serviceName",
|
|
12
|
+
env: ["NUXT_OTLP_SERVICE_NAME", "OTEL_SERVICE_NAME"]
|
|
13
|
+
},
|
|
14
|
+
{ key: "headers" },
|
|
15
|
+
{ key: "resourceAttributes" },
|
|
16
|
+
{ key: "timeout" }
|
|
17
|
+
];
|
|
18
|
+
/**
|
|
19
|
+
* Convert a value to OTLP attribute value format.
|
|
20
|
+
*/
|
|
19
21
|
function toAttributeValue(value) {
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
return { intValue: String(value) };
|
|
25
|
-
}
|
|
26
|
-
if (typeof value === "string") {
|
|
27
|
-
return { stringValue: value };
|
|
28
|
-
}
|
|
29
|
-
return { stringValue: JSON.stringify(value) };
|
|
22
|
+
if (typeof value === "boolean") return { boolValue: value };
|
|
23
|
+
if (typeof value === "number" && Number.isInteger(value)) return { intValue: String(value) };
|
|
24
|
+
if (typeof value === "string") return { stringValue: value };
|
|
25
|
+
return { stringValue: JSON.stringify(value) };
|
|
30
26
|
}
|
|
27
|
+
/**
|
|
28
|
+
* Convert an evlog WideEvent to an OTLP LogRecord.
|
|
29
|
+
*/
|
|
31
30
|
function toOTLPLogRecord(event) {
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
};
|
|
56
|
-
if (typeof traceId === "string") {
|
|
57
|
-
record.traceId = traceId;
|
|
58
|
-
}
|
|
59
|
-
if (typeof spanId === "string") {
|
|
60
|
-
record.spanId = spanId;
|
|
61
|
-
}
|
|
62
|
-
return record;
|
|
31
|
+
const timestamp = new Date(event.timestamp).getTime() * 1e6;
|
|
32
|
+
const { level, traceId, spanId, ...rest } = event;
|
|
33
|
+
delete rest.timestamp;
|
|
34
|
+
delete rest.service;
|
|
35
|
+
delete rest.environment;
|
|
36
|
+
delete rest.version;
|
|
37
|
+
delete rest.commitHash;
|
|
38
|
+
delete rest.region;
|
|
39
|
+
const attributes = [];
|
|
40
|
+
for (const [key, value] of Object.entries(rest)) if (value !== void 0 && value !== null) attributes.push({
|
|
41
|
+
key,
|
|
42
|
+
value: toAttributeValue(value)
|
|
43
|
+
});
|
|
44
|
+
const record = {
|
|
45
|
+
timeUnixNano: String(timestamp),
|
|
46
|
+
severityNumber: OTEL_SEVERITY_NUMBER[level] ?? 9,
|
|
47
|
+
severityText: OTEL_SEVERITY_TEXT[level] ?? "INFO",
|
|
48
|
+
body: { stringValue: JSON.stringify(event) },
|
|
49
|
+
attributes
|
|
50
|
+
};
|
|
51
|
+
if (typeof traceId === "string") record.traceId = traceId;
|
|
52
|
+
if (typeof spanId === "string") record.spanId = spanId;
|
|
53
|
+
return record;
|
|
63
54
|
}
|
|
55
|
+
/**
|
|
56
|
+
* Build OTLP resource attributes from event and config.
|
|
57
|
+
*/
|
|
64
58
|
function buildResourceAttributes(event, config) {
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
value: { stringValue: event.commitHash }
|
|
92
|
-
});
|
|
93
|
-
}
|
|
94
|
-
if (config.resourceAttributes) {
|
|
95
|
-
for (const [key, value] of Object.entries(config.resourceAttributes)) {
|
|
96
|
-
attributes.push({
|
|
97
|
-
key,
|
|
98
|
-
value: toAttributeValue(value)
|
|
99
|
-
});
|
|
100
|
-
}
|
|
101
|
-
}
|
|
102
|
-
return attributes;
|
|
59
|
+
const attributes = [];
|
|
60
|
+
attributes.push({
|
|
61
|
+
key: "service.name",
|
|
62
|
+
value: { stringValue: config.serviceName ?? event.service }
|
|
63
|
+
});
|
|
64
|
+
if (event.environment) attributes.push({
|
|
65
|
+
key: "deployment.environment",
|
|
66
|
+
value: { stringValue: event.environment }
|
|
67
|
+
});
|
|
68
|
+
if (event.version) attributes.push({
|
|
69
|
+
key: "service.version",
|
|
70
|
+
value: { stringValue: event.version }
|
|
71
|
+
});
|
|
72
|
+
if (event.region) attributes.push({
|
|
73
|
+
key: "cloud.region",
|
|
74
|
+
value: { stringValue: event.region }
|
|
75
|
+
});
|
|
76
|
+
if (event.commitHash) attributes.push({
|
|
77
|
+
key: "vcs.commit.id",
|
|
78
|
+
value: { stringValue: event.commitHash }
|
|
79
|
+
});
|
|
80
|
+
if (config.resourceAttributes) for (const [key, value] of Object.entries(config.resourceAttributes)) attributes.push({
|
|
81
|
+
key,
|
|
82
|
+
value: toAttributeValue(value)
|
|
83
|
+
});
|
|
84
|
+
return attributes;
|
|
103
85
|
}
|
|
86
|
+
/**
|
|
87
|
+
* Build headers from OTEL env vars.
|
|
88
|
+
* Kept inline as OTLP-specific (parses OTEL_EXPORTER_OTLP_HEADERS=key=val,key=val).
|
|
89
|
+
*/
|
|
90
|
+
function getHeadersFromEnv() {
|
|
91
|
+
const headersEnv = process.env.OTEL_EXPORTER_OTLP_HEADERS || process.env.NUXT_OTLP_HEADERS;
|
|
92
|
+
if (headersEnv) {
|
|
93
|
+
const headers = {};
|
|
94
|
+
const decoded = decodeURIComponent(headersEnv);
|
|
95
|
+
for (const pair of decoded.split(",")) {
|
|
96
|
+
const eqIndex = pair.indexOf("=");
|
|
97
|
+
if (eqIndex > 0) {
|
|
98
|
+
const key = pair.slice(0, eqIndex).trim();
|
|
99
|
+
const value = pair.slice(eqIndex + 1).trim();
|
|
100
|
+
if (key && value) headers[key] = value;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
if (Object.keys(headers).length > 0) return headers;
|
|
104
|
+
}
|
|
105
|
+
const auth = process.env.NUXT_OTLP_AUTH;
|
|
106
|
+
if (auth) return { Authorization: auth };
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Create a drain function for sending logs to an OTLP endpoint.
|
|
110
|
+
*
|
|
111
|
+
* Configuration priority (highest to lowest):
|
|
112
|
+
* 1. Overrides passed to createOTLPDrain()
|
|
113
|
+
* 2. runtimeConfig.evlog.otlp (NUXT_EVLOG_OTLP_*)
|
|
114
|
+
* 3. runtimeConfig.otlp (NUXT_OTLP_*)
|
|
115
|
+
* 4. Environment variables: OTEL_EXPORTER_OTLP_ENDPOINT, OTEL_SERVICE_NAME
|
|
116
|
+
*
|
|
117
|
+
* @example
|
|
118
|
+
* ```ts
|
|
119
|
+
* // Zero config - reads from runtimeConfig or env vars
|
|
120
|
+
* nitroApp.hooks.hook('evlog:drain', createOTLPDrain())
|
|
121
|
+
*
|
|
122
|
+
* // With overrides
|
|
123
|
+
* nitroApp.hooks.hook('evlog:drain', createOTLPDrain({
|
|
124
|
+
* endpoint: 'http://localhost:4318',
|
|
125
|
+
* }))
|
|
126
|
+
* ```
|
|
127
|
+
*/
|
|
104
128
|
function createOTLPDrain(overrides) {
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
const value = pair.slice(eqIndex + 1).trim();
|
|
119
|
-
if (key && value) {
|
|
120
|
-
headers[key] = value;
|
|
121
|
-
}
|
|
122
|
-
}
|
|
123
|
-
}
|
|
124
|
-
if (Object.keys(headers).length > 0) return headers;
|
|
125
|
-
}
|
|
126
|
-
const auth = process.env.NUXT_OTLP_AUTH;
|
|
127
|
-
if (auth) {
|
|
128
|
-
return { Authorization: auth };
|
|
129
|
-
}
|
|
130
|
-
return void 0;
|
|
131
|
-
};
|
|
132
|
-
const config = {
|
|
133
|
-
endpoint: overrides?.endpoint ?? evlogOtlp?.endpoint ?? rootOtlp?.endpoint ?? process.env.NUXT_OTLP_ENDPOINT ?? process.env.OTEL_EXPORTER_OTLP_ENDPOINT,
|
|
134
|
-
serviceName: overrides?.serviceName ?? evlogOtlp?.serviceName ?? rootOtlp?.serviceName ?? process.env.NUXT_OTLP_SERVICE_NAME ?? process.env.OTEL_SERVICE_NAME,
|
|
135
|
-
headers: overrides?.headers ?? evlogOtlp?.headers ?? rootOtlp?.headers ?? getHeadersFromEnv(),
|
|
136
|
-
resourceAttributes: overrides?.resourceAttributes ?? evlogOtlp?.resourceAttributes ?? rootOtlp?.resourceAttributes,
|
|
137
|
-
timeout: overrides?.timeout ?? evlogOtlp?.timeout ?? rootOtlp?.timeout
|
|
138
|
-
};
|
|
139
|
-
if (!config.endpoint) {
|
|
140
|
-
console.error("[evlog/otlp] Missing endpoint. Set NUXT_OTLP_ENDPOINT or OTEL_EXPORTER_OTLP_ENDPOINT env var, or pass to createOTLPDrain()");
|
|
141
|
-
return;
|
|
142
|
-
}
|
|
143
|
-
try {
|
|
144
|
-
await sendToOTLP(ctx.event, config);
|
|
145
|
-
} catch (error) {
|
|
146
|
-
console.error("[evlog/otlp] Failed to send event:", error);
|
|
147
|
-
}
|
|
148
|
-
};
|
|
129
|
+
return defineDrain({
|
|
130
|
+
name: "otlp",
|
|
131
|
+
resolve: () => {
|
|
132
|
+
const config = resolveAdapterConfig("otlp", OTLP_FIELDS, overrides);
|
|
133
|
+
if (!config.headers) config.headers = getHeadersFromEnv();
|
|
134
|
+
if (!config.endpoint) {
|
|
135
|
+
console.error("[evlog/otlp] Missing endpoint. Set NUXT_OTLP_ENDPOINT or OTEL_EXPORTER_OTLP_ENDPOINT env var, or pass to createOTLPDrain()");
|
|
136
|
+
return null;
|
|
137
|
+
}
|
|
138
|
+
return config;
|
|
139
|
+
},
|
|
140
|
+
send: sendBatchToOTLP
|
|
141
|
+
});
|
|
149
142
|
}
|
|
143
|
+
/**
|
|
144
|
+
* Send a single event to an OTLP endpoint.
|
|
145
|
+
*
|
|
146
|
+
* @example
|
|
147
|
+
* ```ts
|
|
148
|
+
* await sendToOTLP(event, {
|
|
149
|
+
* endpoint: 'http://localhost:4318',
|
|
150
|
+
* })
|
|
151
|
+
* ```
|
|
152
|
+
*/
|
|
150
153
|
async function sendToOTLP(event, config) {
|
|
151
|
-
|
|
154
|
+
await sendBatchToOTLP([event], config);
|
|
152
155
|
}
|
|
156
|
+
/**
|
|
157
|
+
* Send a batch of events to an OTLP endpoint.
|
|
158
|
+
*
|
|
159
|
+
* @example
|
|
160
|
+
* ```ts
|
|
161
|
+
* await sendBatchToOTLP(events, {
|
|
162
|
+
* endpoint: 'http://localhost:4318',
|
|
163
|
+
* })
|
|
164
|
+
* ```
|
|
165
|
+
*/
|
|
153
166
|
async function sendBatchToOTLP(events, config) {
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
try {
|
|
180
|
-
const response = await fetch(url, {
|
|
181
|
-
method: "POST",
|
|
182
|
-
headers,
|
|
183
|
-
body: JSON.stringify(payload),
|
|
184
|
-
signal: controller.signal
|
|
185
|
-
});
|
|
186
|
-
if (!response.ok) {
|
|
187
|
-
const text = await response.text().catch(() => "Unknown error");
|
|
188
|
-
const safeText = text.length > 200 ? `${text.slice(0, 200)}...[truncated]` : text;
|
|
189
|
-
throw new Error(`OTLP API error: ${response.status} ${response.statusText} - ${safeText}`);
|
|
190
|
-
}
|
|
191
|
-
} finally {
|
|
192
|
-
clearTimeout(timeoutId);
|
|
193
|
-
}
|
|
167
|
+
if (events.length === 0) return;
|
|
168
|
+
const url = `${config.endpoint.replace(/\/$/, "")}/v1/logs`;
|
|
169
|
+
const [firstEvent] = events;
|
|
170
|
+
const resourceAttributes = buildResourceAttributes(firstEvent, config);
|
|
171
|
+
const logRecords = events.map(toOTLPLogRecord);
|
|
172
|
+
const payload = { resourceLogs: [{
|
|
173
|
+
resource: { attributes: resourceAttributes },
|
|
174
|
+
scopeLogs: [{
|
|
175
|
+
scope: {
|
|
176
|
+
name: "evlog",
|
|
177
|
+
version: "1.0.0"
|
|
178
|
+
},
|
|
179
|
+
logRecords
|
|
180
|
+
}]
|
|
181
|
+
}] };
|
|
182
|
+
await httpPost({
|
|
183
|
+
url,
|
|
184
|
+
headers: {
|
|
185
|
+
"Content-Type": "application/json",
|
|
186
|
+
...config.headers
|
|
187
|
+
},
|
|
188
|
+
body: JSON.stringify(payload),
|
|
189
|
+
timeout: config.timeout ?? 5e3,
|
|
190
|
+
label: "OTLP"
|
|
191
|
+
});
|
|
194
192
|
}
|
|
195
193
|
|
|
194
|
+
//#endregion
|
|
196
195
|
export { createOTLPDrain, sendBatchToOTLP, sendToOTLP, toOTLPLogRecord };
|
|
196
|
+
//# sourceMappingURL=otlp.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"otlp.mjs","names":[],"sources":["../../src/adapters/otlp.ts"],"sourcesContent":["import type { WideEvent } from '../types'\nimport type { ConfigField } from './_config'\nimport { resolveAdapterConfig } from './_config'\nimport { defineDrain } from './_drain'\nimport { httpPost } from './_http'\nimport { OTEL_SEVERITY_NUMBER, OTEL_SEVERITY_TEXT } from './_severity'\n\nexport interface OTLPConfig {\n /** OTLP HTTP endpoint (e.g., http://localhost:4318) */\n endpoint: string\n /** Override service name (defaults to event.service) */\n serviceName?: string\n /** Additional resource attributes */\n resourceAttributes?: Record<string, string | number | boolean>\n /** Custom headers (e.g., for authentication) */\n headers?: Record<string, string>\n /** Request timeout in milliseconds. Default: 5000 */\n timeout?: number\n}\n\n/** OTLP Log Record structure */\nexport interface OTLPLogRecord {\n timeUnixNano: string\n severityNumber: number\n severityText: string\n body: { stringValue: string }\n attributes: Array<{\n key: string\n value: { stringValue?: string, intValue?: string, boolValue?: boolean }\n }>\n traceId?: string\n spanId?: string\n}\n\n/** OTLP Resource structure */\ninterface OTLPResource {\n attributes: Array<{\n key: string\n value: { stringValue?: string, intValue?: string, boolValue?: boolean }\n }>\n}\n\n/** OTLP Scope structure */\ninterface OTLPScope {\n name: string\n version?: string\n}\n\n/** OTLP ExportLogsServiceRequest structure */\ninterface ExportLogsServiceRequest {\n resourceLogs: Array<{\n resource: OTLPResource\n scopeLogs: Array<{\n scope: OTLPScope\n logRecords: OTLPLogRecord[]\n }>\n }>\n}\n\nconst OTLP_FIELDS: ConfigField<OTLPConfig>[] = [\n { key: 'endpoint', env: ['NUXT_OTLP_ENDPOINT', 'OTEL_EXPORTER_OTLP_ENDPOINT'] },\n { key: 'serviceName', env: ['NUXT_OTLP_SERVICE_NAME', 'OTEL_SERVICE_NAME'] },\n { key: 'headers' },\n { key: 'resourceAttributes' },\n { key: 'timeout' },\n]\n\n/**\n * Convert a value to OTLP attribute value format.\n */\nfunction toAttributeValue(value: unknown): { stringValue?: string, intValue?: string, boolValue?: boolean } {\n if (typeof value === 'boolean') {\n return { boolValue: value }\n }\n if (typeof value === 'number' && Number.isInteger(value)) {\n return { intValue: String(value) }\n }\n if (typeof value === 'string') {\n return { stringValue: value }\n }\n // For complex types, serialize to JSON string\n return { stringValue: JSON.stringify(value) }\n}\n\n/**\n * Convert an evlog WideEvent to an OTLP LogRecord.\n */\nexport function toOTLPLogRecord(event: WideEvent): OTLPLogRecord {\n const timestamp = new Date(event.timestamp).getTime() * 1_000_000 // Convert to nanoseconds\n\n // Extract known fields, rest goes to attributes\n const { level, traceId, spanId, ...rest } = event\n // Remove base fields from rest (they're handled as resource attributes)\n delete (rest as Record<string, unknown>).timestamp\n delete (rest as Record<string, unknown>).service\n delete (rest as Record<string, unknown>).environment\n delete (rest as Record<string, unknown>).version\n delete (rest as Record<string, unknown>).commitHash\n delete (rest as Record<string, unknown>).region\n\n const attributes: OTLPLogRecord['attributes'] = []\n\n // Add all remaining event fields as attributes\n for (const [key, value] of Object.entries(rest)) {\n if (value !== undefined && value !== null) {\n attributes.push({\n key,\n value: toAttributeValue(value),\n })\n }\n }\n\n const record: OTLPLogRecord = {\n timeUnixNano: String(timestamp),\n severityNumber: OTEL_SEVERITY_NUMBER[level] ?? 9,\n severityText: OTEL_SEVERITY_TEXT[level] ?? 'INFO',\n body: { stringValue: JSON.stringify(event) },\n attributes,\n }\n\n // Add trace context if present\n if (typeof traceId === 'string') {\n record.traceId = traceId\n }\n if (typeof spanId === 'string') {\n record.spanId = spanId\n }\n\n return record\n}\n\n/**\n * Build OTLP resource attributes from event and config.\n */\nfunction buildResourceAttributes(\n event: WideEvent,\n config: OTLPConfig,\n): OTLPResource['attributes'] {\n const attributes: OTLPResource['attributes'] = []\n\n // Service name\n attributes.push({\n key: 'service.name',\n value: { stringValue: config.serviceName ?? event.service },\n })\n\n // Environment\n if (event.environment) {\n attributes.push({\n key: 'deployment.environment',\n value: { stringValue: event.environment },\n })\n }\n\n // Version\n if (event.version) {\n attributes.push({\n key: 'service.version',\n value: { stringValue: event.version },\n })\n }\n\n // Region\n if (event.region) {\n attributes.push({\n key: 'cloud.region',\n value: { stringValue: event.region },\n })\n }\n\n // Commit hash\n if (event.commitHash) {\n attributes.push({\n key: 'vcs.commit.id',\n value: { stringValue: event.commitHash },\n })\n }\n\n // Custom resource attributes from config\n if (config.resourceAttributes) {\n for (const [key, value] of Object.entries(config.resourceAttributes)) {\n attributes.push({\n key,\n value: toAttributeValue(value),\n })\n }\n }\n\n return attributes\n}\n\n/**\n * Build headers from OTEL env vars.\n * Kept inline as OTLP-specific (parses OTEL_EXPORTER_OTLP_HEADERS=key=val,key=val).\n */\nfunction getHeadersFromEnv(): Record<string, string> | undefined {\n const headersEnv = process.env.OTEL_EXPORTER_OTLP_HEADERS || process.env.NUXT_OTLP_HEADERS\n if (headersEnv) {\n const headers: Record<string, string> = {}\n const decoded = decodeURIComponent(headersEnv)\n for (const pair of decoded.split(',')) {\n const eqIndex = pair.indexOf('=')\n if (eqIndex > 0) {\n const key = pair.slice(0, eqIndex).trim()\n const value = pair.slice(eqIndex + 1).trim()\n if (key && value) {\n headers[key] = value\n }\n }\n }\n if (Object.keys(headers).length > 0) return headers\n }\n\n const auth = process.env.NUXT_OTLP_AUTH\n if (auth) {\n return { Authorization: auth }\n }\n\n return undefined\n}\n\n/**\n * Create a drain function for sending logs to an OTLP endpoint.\n *\n * Configuration priority (highest to lowest):\n * 1. Overrides passed to createOTLPDrain()\n * 2. runtimeConfig.evlog.otlp (NUXT_EVLOG_OTLP_*)\n * 3. runtimeConfig.otlp (NUXT_OTLP_*)\n * 4. Environment variables: OTEL_EXPORTER_OTLP_ENDPOINT, OTEL_SERVICE_NAME\n *\n * @example\n * ```ts\n * // Zero config - reads from runtimeConfig or env vars\n * nitroApp.hooks.hook('evlog:drain', createOTLPDrain())\n *\n * // With overrides\n * nitroApp.hooks.hook('evlog:drain', createOTLPDrain({\n * endpoint: 'http://localhost:4318',\n * }))\n * ```\n */\nexport function createOTLPDrain(overrides?: Partial<OTLPConfig>) {\n return defineDrain<OTLPConfig>({\n name: 'otlp',\n resolve: () => {\n const config = resolveAdapterConfig<OTLPConfig>('otlp', OTLP_FIELDS, overrides)\n\n // OTLP-specific: resolve headers from env if not provided via config\n if (!config.headers) {\n config.headers = getHeadersFromEnv()\n }\n\n if (!config.endpoint) {\n console.error('[evlog/otlp] Missing endpoint. Set NUXT_OTLP_ENDPOINT or OTEL_EXPORTER_OTLP_ENDPOINT env var, or pass to createOTLPDrain()')\n return null\n }\n return config as OTLPConfig\n },\n send: sendBatchToOTLP,\n })\n}\n\n/**\n * Send a single event to an OTLP endpoint.\n *\n * @example\n * ```ts\n * await sendToOTLP(event, {\n * endpoint: 'http://localhost:4318',\n * })\n * ```\n */\nexport async function sendToOTLP(event: WideEvent, config: OTLPConfig): Promise<void> {\n await sendBatchToOTLP([event], config)\n}\n\n/**\n * Send a batch of events to an OTLP endpoint.\n *\n * @example\n * ```ts\n * await sendBatchToOTLP(events, {\n * endpoint: 'http://localhost:4318',\n * })\n * ```\n */\nexport async function sendBatchToOTLP(events: WideEvent[], config: OTLPConfig): Promise<void> {\n if (events.length === 0) return\n\n const url = `${config.endpoint.replace(/\\/$/, '')}/v1/logs`\n\n // Group events by service for proper resource attribution\n // For simplicity, we use the first event's resource attributes\n const [firstEvent] = events\n const resourceAttributes = buildResourceAttributes(firstEvent, config)\n\n const logRecords = events.map(toOTLPLogRecord)\n\n const payload: ExportLogsServiceRequest = {\n resourceLogs: [\n {\n resource: { attributes: resourceAttributes },\n scopeLogs: [\n {\n scope: { name: 'evlog', version: '1.0.0' },\n logRecords,\n },\n ],\n },\n ],\n }\n\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n ...config.headers,\n }\n\n await httpPost({\n url,\n headers,\n body: JSON.stringify(payload),\n timeout: config.timeout ?? 5000,\n label: 'OTLP',\n })\n}\n"],"mappings":"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"}
|
|
@@ -1,23 +1,25 @@
|
|
|
1
|
-
import { DrainContext, WideEvent } from
|
|
1
|
+
import { DrainContext, WideEvent } from "../types.mjs";
|
|
2
|
+
import "../index.mjs";
|
|
2
3
|
|
|
4
|
+
//#region src/adapters/posthog.d.ts
|
|
3
5
|
interface PostHogConfig {
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
6
|
+
/** PostHog project API key */
|
|
7
|
+
apiKey: string;
|
|
8
|
+
/** PostHog host URL. Default: https://us.i.posthog.com */
|
|
9
|
+
host?: string;
|
|
10
|
+
/** PostHog event name. Default: evlog_wide_event */
|
|
11
|
+
eventName?: string;
|
|
12
|
+
/** Override distinct_id (defaults to event.service) */
|
|
13
|
+
distinctId?: string;
|
|
14
|
+
/** Request timeout in milliseconds. Default: 5000 */
|
|
15
|
+
timeout?: number;
|
|
14
16
|
}
|
|
15
17
|
/** PostHog event structure for the batch API */
|
|
16
18
|
interface PostHogEvent {
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
19
|
+
event: string;
|
|
20
|
+
distinct_id: string;
|
|
21
|
+
timestamp: string;
|
|
22
|
+
properties: Record<string, unknown>;
|
|
21
23
|
}
|
|
22
24
|
/**
|
|
23
25
|
* Convert a WideEvent to a PostHog event format.
|
|
@@ -44,7 +46,7 @@ declare function toPostHogEvent(event: WideEvent, config: PostHogConfig): PostHo
|
|
|
44
46
|
* }))
|
|
45
47
|
* ```
|
|
46
48
|
*/
|
|
47
|
-
declare function createPostHogDrain(overrides?: Partial<PostHogConfig>): (ctx: DrainContext) => Promise<void>;
|
|
49
|
+
declare function createPostHogDrain(overrides?: Partial<PostHogConfig>): (ctx: DrainContext | DrainContext[]) => Promise<void>;
|
|
48
50
|
/**
|
|
49
51
|
* Send a single event to PostHog.
|
|
50
52
|
*
|
|
@@ -67,6 +69,39 @@ declare function sendToPostHog(event: WideEvent, config: PostHogConfig): Promise
|
|
|
67
69
|
* ```
|
|
68
70
|
*/
|
|
69
71
|
declare function sendBatchToPostHog(events: WideEvent[], config: PostHogConfig): Promise<void>;
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
72
|
+
interface PostHogLogsConfig {
|
|
73
|
+
/** PostHog project API key */
|
|
74
|
+
apiKey: string;
|
|
75
|
+
/** PostHog host URL. Default: https://us.i.posthog.com */
|
|
76
|
+
host?: string;
|
|
77
|
+
/** Request timeout in milliseconds. Default: 5000 */
|
|
78
|
+
timeout?: number;
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Create a drain function for sending logs to PostHog Logs via OTLP.
|
|
82
|
+
*
|
|
83
|
+
* PostHog Logs uses the standard OTLP log format. This drain wraps
|
|
84
|
+
* `sendBatchToOTLP()` with PostHog-specific defaults (endpoint, auth).
|
|
85
|
+
*
|
|
86
|
+
* Configuration priority (highest to lowest):
|
|
87
|
+
* 1. Overrides passed to createPostHogLogsDrain()
|
|
88
|
+
* 2. runtimeConfig.evlog.posthog
|
|
89
|
+
* 3. runtimeConfig.posthog
|
|
90
|
+
* 4. Environment variables: NUXT_POSTHOG_*, POSTHOG_*
|
|
91
|
+
*
|
|
92
|
+
* @example
|
|
93
|
+
* ```ts
|
|
94
|
+
* // Zero config - just set NUXT_POSTHOG_API_KEY env var
|
|
95
|
+
* nitroApp.hooks.hook('evlog:drain', createPostHogLogsDrain())
|
|
96
|
+
*
|
|
97
|
+
* // With overrides
|
|
98
|
+
* nitroApp.hooks.hook('evlog:drain', createPostHogLogsDrain({
|
|
99
|
+
* apiKey: 'phc_...',
|
|
100
|
+
* host: 'https://eu.i.posthog.com',
|
|
101
|
+
* }))
|
|
102
|
+
* ```
|
|
103
|
+
*/
|
|
104
|
+
declare function createPostHogLogsDrain(overrides?: Partial<PostHogLogsConfig>): (ctx: DrainContext | DrainContext[]) => Promise<void>;
|
|
105
|
+
//#endregion
|
|
106
|
+
export { PostHogConfig, PostHogEvent, PostHogLogsConfig, createPostHogDrain, createPostHogLogsDrain, sendBatchToPostHog, sendToPostHog, toPostHogEvent };
|
|
107
|
+
//# sourceMappingURL=posthog.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"posthog.d.mts","names":[],"sources":["../../src/adapters/posthog.ts"],"mappings":";;;;UAQiB,aAAA;;EAEf,MAAA;EAFe;EAIf,IAAA;;EAEA,SAAA;EAJA;EAMA,UAAA;EAFA;EAIA,OAAA;AAAA;;UAIe,YAAA;EACf,KAAA;EACA,WAAA;EACA,SAAA;EACA,UAAA,EAAY,MAAA;AAAA;;;;iBAcE,cAAA,CAAe,KAAA,EAAO,SAAA,EAAW,MAAA,EAAQ,aAAA,GAAgB,YAAA;;;AAAzE;;;;;;;;;;;;;;;AAoCA;;;;iBAAgB,kBAAA,CAAmB,SAAA,GAAY,OAAA,CAAQ,aAAA,KAAc,GAAA,EAAf,YAAA,GAAe,YAAA,OAAA,OAAA;;;;;;;;;;;iBAyB/C,aAAA,CAAc,KAAA,EAAO,SAAA,EAAW,MAAA,EAAQ,aAAA,GAAgB,OAAA;;;;AAA9E;;;;;;;iBAcsB,kBAAA,CAAmB,MAAA,EAAQ,SAAA,IAAa,MAAA,EAAQ,aAAA,GAAgB,OAAA;AAAA,UAsBrE,iBAAA;EApCmB;EAsClC,MAAA;EAtCoD;EAwCpD,IAAA;EAxCmF;EA0CnF,OAAA;AAAA;;;;;;;;;;;;;;;AANF;;;;;;;;;AAuCA;iBAAgB,sBAAA,CAAuB,SAAA,GAAY,OAAA,CAAQ,iBAAA,KAAkB,GAAA,EAAnB,YAAA,GAAmB,YAAA,OAAA,OAAA"}
|