evlog 1.6.0 → 1.7.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 +95 -0
- package/dist/_utils-DZA9nou3.mjs +23 -0
- package/dist/_utils-DZA9nou3.mjs.map +1 -0
- package/dist/adapters/axiom.d.mts +16 -15
- package/dist/adapters/axiom.d.mts.map +1 -0
- package/dist/adapters/axiom.mjs +95 -50
- package/dist/adapters/axiom.mjs.map +1 -0
- package/dist/adapters/better-stack.d.mts +62 -0
- package/dist/adapters/better-stack.d.mts.map +1 -0
- package/dist/adapters/better-stack.mjs +109 -0
- package/dist/adapters/better-stack.mjs.map +1 -0
- package/dist/adapters/otlp.d.mts +31 -30
- package/dist/adapters/otlp.d.mts.map +1 -0
- package/dist/adapters/otlp.mjs +197 -177
- package/dist/adapters/otlp.mjs.map +1 -0
- package/dist/adapters/posthog.d.mts +20 -19
- package/dist/adapters/posthog.d.mts.map +1 -0
- package/dist/adapters/posthog.mjs +109 -62
- package/dist/adapters/posthog.mjs.map +1 -0
- package/dist/adapters/sentry.d.mts +24 -23
- package/dist/adapters/sentry.d.mts.map +1 -0
- package/dist/adapters/sentry.mjs +208 -151
- package/dist/adapters/sentry.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 +5 -3
- package/dist/logger.d.mts.map +1 -0
- package/dist/logger.mjs +200 -184
- 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 +49 -38
- package/dist/nitro/errorHandler.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 +155 -136
- package/dist/nitro/plugin.mjs.map +1 -0
- package/dist/nuxt/module.d.mts +149 -168
- package/dist/nuxt/module.d.mts.map +1 -0
- package/dist/nuxt/module.mjs +66 -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 +7 -5
- package/dist/runtime/client/log.d.mts.map +1 -0
- package/dist/runtime/client/log.mjs +57 -62
- 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 +13 -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 +348 -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 +26 -5
- 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/nuxt/module.d.mts
CHANGED
|
@@ -1,171 +1,152 @@
|
|
|
1
|
-
import
|
|
2
|
-
import
|
|
1
|
+
import { EnvironmentContext, RouteConfig, SamplingConfig, TransportConfig } from "../types.mjs";
|
|
2
|
+
import * as _nuxt_schema0 from "@nuxt/schema";
|
|
3
3
|
|
|
4
|
+
//#region src/nuxt/module.d.ts
|
|
4
5
|
interface ModuleOptions {
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
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
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
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
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
/**
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
*
|
|
148
|
-
* @example
|
|
149
|
-
* ```ts
|
|
150
|
-
* sentry: {
|
|
151
|
-
* dsn: process.env.SENTRY_DSN,
|
|
152
|
-
* }
|
|
153
|
-
* ```
|
|
154
|
-
*/
|
|
155
|
-
sentry?: {
|
|
156
|
-
/** Sentry DSN */
|
|
157
|
-
dsn: string;
|
|
158
|
-
/** Environment override (defaults to event.environment) */
|
|
159
|
-
environment?: string;
|
|
160
|
-
/** Release version override (defaults to event.version) */
|
|
161
|
-
release?: string;
|
|
162
|
-
/** Additional tags to attach as attributes */
|
|
163
|
-
tags?: Record<string, string>;
|
|
164
|
-
/** Request timeout in milliseconds. Default: 5000 */
|
|
165
|
-
timeout?: number;
|
|
166
|
-
};
|
|
6
|
+
/**
|
|
7
|
+
* Environment context overrides.
|
|
8
|
+
*/
|
|
9
|
+
env?: Partial<EnvironmentContext>;
|
|
10
|
+
/**
|
|
11
|
+
* Enable pretty printing.
|
|
12
|
+
* @default true in development, false in production
|
|
13
|
+
*/
|
|
14
|
+
pretty?: boolean;
|
|
15
|
+
/**
|
|
16
|
+
* Route patterns to include in logging.
|
|
17
|
+
* Supports glob patterns like '/api/**'.
|
|
18
|
+
* If not set, all routes are logged.
|
|
19
|
+
* @example ['/api/**', '/auth/**']
|
|
20
|
+
*/
|
|
21
|
+
include?: string[];
|
|
22
|
+
/**
|
|
23
|
+
* Route patterns to exclude from logging.
|
|
24
|
+
* Supports glob patterns like '/api/_nuxt_icon/**'.
|
|
25
|
+
* Exclusions take precedence over inclusions.
|
|
26
|
+
* @example ['/api/_nuxt_icon/**', '/health']
|
|
27
|
+
*/
|
|
28
|
+
exclude?: string[];
|
|
29
|
+
/**
|
|
30
|
+
* Route-specific service configuration.
|
|
31
|
+
* Allows setting different service names for different routes.
|
|
32
|
+
* Patterns are matched using glob syntax.
|
|
33
|
+
*
|
|
34
|
+
* @example
|
|
35
|
+
* ```ts
|
|
36
|
+
* routes: {
|
|
37
|
+
* '/api/foo/**': { service: 'service1' },
|
|
38
|
+
* '/api/bar/**': { service: 'service2' }
|
|
39
|
+
* }
|
|
40
|
+
* ```
|
|
41
|
+
*/
|
|
42
|
+
routes?: Record<string, RouteConfig>;
|
|
43
|
+
/**
|
|
44
|
+
* Sampling configuration for filtering logs.
|
|
45
|
+
* Allows configuring what percentage of logs to keep per level.
|
|
46
|
+
*
|
|
47
|
+
* @example
|
|
48
|
+
* ```ts
|
|
49
|
+
* sampling: {
|
|
50
|
+
* rates: {
|
|
51
|
+
* info: 10, // Keep 10% of info logs
|
|
52
|
+
* warn: 50, // Keep 50% of warning logs
|
|
53
|
+
* debug: 5, // Keep 5% of debug logs
|
|
54
|
+
* error: 100, // Always keep errors (default)
|
|
55
|
+
* }
|
|
56
|
+
* }
|
|
57
|
+
* ```
|
|
58
|
+
*/
|
|
59
|
+
sampling?: SamplingConfig;
|
|
60
|
+
/**
|
|
61
|
+
* Transport configuration for sending client logs to the server.
|
|
62
|
+
*
|
|
63
|
+
* @example
|
|
64
|
+
* ```ts
|
|
65
|
+
* transport: {
|
|
66
|
+
* enabled: true, // Send logs to server API
|
|
67
|
+
* endpoint: '/api/_evlog/ingest' // Custom endpoint
|
|
68
|
+
* }
|
|
69
|
+
* ```
|
|
70
|
+
*/
|
|
71
|
+
transport?: TransportConfig;
|
|
72
|
+
/**
|
|
73
|
+
* Axiom adapter configuration.
|
|
74
|
+
* When configured, use `createAxiomDrain()` from `evlog/axiom` to send logs.
|
|
75
|
+
*
|
|
76
|
+
* @example
|
|
77
|
+
* ```ts
|
|
78
|
+
* axiom: {
|
|
79
|
+
* dataset: 'my-app-logs',
|
|
80
|
+
* token: process.env.AXIOM_TOKEN,
|
|
81
|
+
* }
|
|
82
|
+
* ```
|
|
83
|
+
*/
|
|
84
|
+
axiom?: {
|
|
85
|
+
/** Axiom dataset name */dataset: string; /** Axiom API token */
|
|
86
|
+
token: string; /** Organization ID (required for Personal Access Tokens) */
|
|
87
|
+
orgId?: string; /** Base URL for Axiom API. Default: https://api.axiom.co */
|
|
88
|
+
baseUrl?: string; /** Request timeout in milliseconds. Default: 5000 */
|
|
89
|
+
timeout?: number;
|
|
90
|
+
};
|
|
91
|
+
/**
|
|
92
|
+
* OTLP adapter configuration.
|
|
93
|
+
* When configured, use `createOTLPDrain()` from `evlog/otlp` to send logs.
|
|
94
|
+
*
|
|
95
|
+
* @example
|
|
96
|
+
* ```ts
|
|
97
|
+
* otlp: {
|
|
98
|
+
* endpoint: 'http://localhost:4318',
|
|
99
|
+
* headers: {
|
|
100
|
+
* 'Authorization': `Basic ${process.env.GRAFANA_TOKEN}`,
|
|
101
|
+
* },
|
|
102
|
+
* }
|
|
103
|
+
* ```
|
|
104
|
+
*/
|
|
105
|
+
otlp?: {
|
|
106
|
+
/** OTLP HTTP endpoint (e.g., http://localhost:4318) */endpoint: string; /** Override service name (defaults to event.service) */
|
|
107
|
+
serviceName?: string; /** Additional resource attributes */
|
|
108
|
+
resourceAttributes?: Record<string, string | number | boolean>; /** Custom headers (e.g., for authentication) */
|
|
109
|
+
headers?: Record<string, string>; /** Request timeout in milliseconds. Default: 5000 */
|
|
110
|
+
timeout?: number;
|
|
111
|
+
};
|
|
112
|
+
/**
|
|
113
|
+
* PostHog adapter configuration.
|
|
114
|
+
* When configured, use `createPostHogDrain()` from `evlog/posthog` to send logs.
|
|
115
|
+
*
|
|
116
|
+
* @example
|
|
117
|
+
* ```ts
|
|
118
|
+
* posthog: {
|
|
119
|
+
* apiKey: process.env.POSTHOG_API_KEY,
|
|
120
|
+
* }
|
|
121
|
+
* ```
|
|
122
|
+
*/
|
|
123
|
+
posthog?: {
|
|
124
|
+
/** PostHog project API key */apiKey: string; /** PostHog host URL. Default: https://us.i.posthog.com */
|
|
125
|
+
host?: string; /** PostHog event name. Default: evlog_wide_event */
|
|
126
|
+
eventName?: string; /** Override distinct_id (defaults to event.service) */
|
|
127
|
+
distinctId?: string; /** Request timeout in milliseconds. Default: 5000 */
|
|
128
|
+
timeout?: number;
|
|
129
|
+
};
|
|
130
|
+
/**
|
|
131
|
+
* Sentry adapter configuration.
|
|
132
|
+
* When configured, use `createSentryDrain()` from `evlog/sentry` to send logs.
|
|
133
|
+
*
|
|
134
|
+
* @example
|
|
135
|
+
* ```ts
|
|
136
|
+
* sentry: {
|
|
137
|
+
* dsn: process.env.SENTRY_DSN,
|
|
138
|
+
* }
|
|
139
|
+
* ```
|
|
140
|
+
*/
|
|
141
|
+
sentry?: {
|
|
142
|
+
/** Sentry DSN */dsn: string; /** Environment override (defaults to event.environment) */
|
|
143
|
+
environment?: string; /** Release version override (defaults to event.version) */
|
|
144
|
+
release?: string; /** Additional tags to attach as attributes */
|
|
145
|
+
tags?: Record<string, string>; /** Request timeout in milliseconds. Default: 5000 */
|
|
146
|
+
timeout?: number;
|
|
147
|
+
};
|
|
167
148
|
}
|
|
168
|
-
declare const _default:
|
|
169
|
-
|
|
170
|
-
export { _default as default };
|
|
171
|
-
|
|
149
|
+
declare const _default: _nuxt_schema0.NuxtModule<ModuleOptions, ModuleOptions, false>;
|
|
150
|
+
//#endregion
|
|
151
|
+
export { ModuleOptions, _default as default };
|
|
152
|
+
//# sourceMappingURL=module.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"module.d.mts","names":[],"sources":["../../src/nuxt/module.ts"],"mappings":";;;;UAYiB,aAAA;;;AAAjB;EAIE,GAAA,GAAM,OAAA,CAAQ,kBAAA;;;;;EAMd,MAAA;EAiDW;;;;;;EAzCX,OAAA;EAdA;;;;;;EAsBA,OAAA;EAeS;;;;;;;;;;;;;EAAT,MAAA,GAAS,MAAA,SAAe,WAAA;EA4EtB;;;;;;;;;;;;;;;;EA1DF,QAAA,GAAW,cAAA;EA8GF;;;;AAIV;;;;;;;EArGC,SAAA,GAAY,eAAA;;;;;;;;;;;;;EAcZ,KAAA;6BAEE,OAAA;IAEA,KAAA;IAEA,KAAA;IAEA,OAAA;IAEA,OAAA;EAAA;;;;;;;;;;;;;;;EAiBF,IAAA;2DAEE,QAAA;IAEA,WAAA;IAEA,kBAAA,GAAqB,MAAA;IAErB,OAAA,GAAU,MAAA;IAEV,OAAA;EAAA;;;;;;;;;;;;EAcF,OAAA;kCAEE,MAAA;IAEA,IAAA;IAEA,SAAA;IAEA,UAAA;IAEA,OAAA;EAAA;;;;;;;;;;;;EAcF,MAAA;qBAEE,GAAA;IAEA,WAAA;IAEA,OAAA;IAEA,IAAA,GAAO,MAAA;IAEP,OAAA;EAAA;AAAA;AAAA,cAEH,QAAA"}
|
package/dist/nuxt/module.mjs
CHANGED
|
@@ -1,68 +1,69 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { addImports, addPlugin, addServerHandler, addServerImports, addServerPlugin, createResolver, defineNuxtModule } from "@nuxt/kit";
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
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
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
}
|
|
3
|
+
//#region src/nuxt/module.ts
|
|
4
|
+
var module_default = defineNuxtModule({
|
|
5
|
+
meta: {
|
|
6
|
+
name: "evlog",
|
|
7
|
+
configKey: "evlog",
|
|
8
|
+
docs: "https://evlog.dev"
|
|
9
|
+
},
|
|
10
|
+
defaults: {},
|
|
11
|
+
setup(options, nuxt) {
|
|
12
|
+
const resolver = createResolver(import.meta.url);
|
|
13
|
+
const transportEnabled = options.transport?.enabled ?? false;
|
|
14
|
+
const transportEndpoint = options.transport?.endpoint ?? "/api/_evlog/ingest";
|
|
15
|
+
nuxt.hook("nitro:config", (nitroConfig) => {
|
|
16
|
+
nitroConfig.errorHandler = nitroConfig.errorHandler || resolver.resolve("../nitro/errorHandler");
|
|
17
|
+
});
|
|
18
|
+
nuxt.options.runtimeConfig.evlog = options;
|
|
19
|
+
nuxt.options.runtimeConfig.public.evlog = {
|
|
20
|
+
pretty: options.pretty,
|
|
21
|
+
transport: {
|
|
22
|
+
enabled: transportEnabled,
|
|
23
|
+
endpoint: transportEndpoint
|
|
24
|
+
}
|
|
25
|
+
};
|
|
26
|
+
if (transportEnabled) addServerHandler({
|
|
27
|
+
route: transportEndpoint,
|
|
28
|
+
method: "post",
|
|
29
|
+
handler: resolver.resolve("../runtime/server/routes/_evlog/ingest.post")
|
|
30
|
+
});
|
|
31
|
+
addServerPlugin(resolver.resolve("../nitro/plugin"));
|
|
32
|
+
addPlugin({
|
|
33
|
+
src: resolver.resolve("../runtime/client/plugin"),
|
|
34
|
+
mode: "client"
|
|
35
|
+
});
|
|
36
|
+
addImports([
|
|
37
|
+
{
|
|
38
|
+
name: "log",
|
|
39
|
+
from: resolver.resolve("../runtime/client/log")
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
name: "createEvlogError",
|
|
43
|
+
from: resolver.resolve("../error")
|
|
44
|
+
},
|
|
45
|
+
{
|
|
46
|
+
name: "parseError",
|
|
47
|
+
from: resolver.resolve("../runtime/utils/parseError")
|
|
48
|
+
}
|
|
49
|
+
]);
|
|
50
|
+
addServerImports([
|
|
51
|
+
{
|
|
52
|
+
name: "useLogger",
|
|
53
|
+
from: resolver.resolve("../runtime/server/useLogger")
|
|
54
|
+
},
|
|
55
|
+
{
|
|
56
|
+
name: "log",
|
|
57
|
+
from: resolver.resolve("../logger")
|
|
58
|
+
},
|
|
59
|
+
{
|
|
60
|
+
name: "createEvlogError",
|
|
61
|
+
from: resolver.resolve("../error")
|
|
62
|
+
}
|
|
63
|
+
]);
|
|
64
|
+
}
|
|
66
65
|
});
|
|
67
66
|
|
|
68
|
-
|
|
67
|
+
//#endregion
|
|
68
|
+
export { module_default as default };
|
|
69
|
+
//# sourceMappingURL=module.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"module.mjs","names":[],"sources":["../../src/nuxt/module.ts"],"sourcesContent":["import {\n addImports,\n addPlugin,\n addServerHandler,\n addServerImports,\n addServerPlugin,\n createResolver,\n defineNuxtModule,\n} from '@nuxt/kit'\nimport type { NitroConfig } from 'nitropack'\nimport type { EnvironmentContext, RouteConfig, SamplingConfig, TransportConfig } from '../types'\n\nexport interface ModuleOptions {\n /**\n * Environment context overrides.\n */\n env?: Partial<EnvironmentContext>\n\n /**\n * Enable pretty printing.\n * @default true in development, false in production\n */\n pretty?: boolean\n\n /**\n * Route patterns to include in logging.\n * Supports glob patterns like '/api/**'.\n * If not set, all routes are logged.\n * @example ['/api/**', '/auth/**']\n */\n include?: string[]\n\n /**\n * Route patterns to exclude from logging.\n * Supports glob patterns like '/api/_nuxt_icon/**'.\n * Exclusions take precedence over inclusions.\n * @example ['/api/_nuxt_icon/**', '/health']\n */\n exclude?: string[]\n\n /**\n * Route-specific service configuration.\n * Allows setting different service names for different routes.\n * Patterns are matched using glob syntax.\n *\n * @example\n * ```ts\n * routes: {\n * '/api/foo/**': { service: 'service1' },\n * '/api/bar/**': { service: 'service2' }\n * }\n * ```\n */\n routes?: Record<string, RouteConfig>\n\n /**\n * Sampling configuration for filtering logs.\n * Allows configuring what percentage of logs to keep per level.\n *\n * @example\n * ```ts\n * sampling: {\n * rates: {\n * info: 10, // Keep 10% of info logs\n * warn: 50, // Keep 50% of warning logs\n * debug: 5, // Keep 5% of debug logs\n * error: 100, // Always keep errors (default)\n * }\n * }\n * ```\n */\n sampling?: SamplingConfig\n\n /**\n * Transport configuration for sending client logs to the server.\n *\n * @example\n * ```ts\n * transport: {\n * enabled: true, // Send logs to server API\n * endpoint: '/api/_evlog/ingest' // Custom endpoint\n * }\n * ```\n */\n transport?: TransportConfig\n\n /**\n * Axiom adapter configuration.\n * When configured, use `createAxiomDrain()` from `evlog/axiom` to send logs.\n *\n * @example\n * ```ts\n * axiom: {\n * dataset: 'my-app-logs',\n * token: process.env.AXIOM_TOKEN,\n * }\n * ```\n */\n axiom?: {\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\n /**\n * OTLP adapter configuration.\n * When configured, use `createOTLPDrain()` from `evlog/otlp` to send logs.\n *\n * @example\n * ```ts\n * otlp: {\n * endpoint: 'http://localhost:4318',\n * headers: {\n * 'Authorization': `Basic ${process.env.GRAFANA_TOKEN}`,\n * },\n * }\n * ```\n */\n otlp?: {\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 /**\n * PostHog adapter configuration.\n * When configured, use `createPostHogDrain()` from `evlog/posthog` to send logs.\n *\n * @example\n * ```ts\n * posthog: {\n * apiKey: process.env.POSTHOG_API_KEY,\n * }\n * ```\n */\n posthog?: {\n /** PostHog project API key */\n apiKey: string\n /** PostHog host URL. Default: https://us.i.posthog.com */\n host?: string\n /** PostHog event name. Default: evlog_wide_event */\n eventName?: string\n /** Override distinct_id (defaults to event.service) */\n distinctId?: string\n /** Request timeout in milliseconds. Default: 5000 */\n timeout?: number\n }\n\n /**\n * Sentry adapter configuration.\n * When configured, use `createSentryDrain()` from `evlog/sentry` to send logs.\n *\n * @example\n * ```ts\n * sentry: {\n * dsn: process.env.SENTRY_DSN,\n * }\n * ```\n */\n sentry?: {\n /** Sentry DSN */\n dsn: string\n /** Environment override (defaults to event.environment) */\n environment?: string\n /** Release version override (defaults to event.version) */\n release?: string\n /** Additional tags to attach as attributes */\n tags?: Record<string, string>\n /** Request timeout in milliseconds. Default: 5000 */\n timeout?: number\n }\n}\n\nexport default defineNuxtModule<ModuleOptions>({\n meta: {\n name: 'evlog',\n configKey: 'evlog',\n docs: 'https://evlog.dev',\n },\n defaults: {},\n setup(options, nuxt) {\n const resolver = createResolver(import.meta.url)\n\n const transportEnabled = options.transport?.enabled ?? false\n const transportEndpoint = options.transport?.endpoint ?? '/api/_evlog/ingest'\n\n // Register custom error handler for proper EvlogError serialization\n // Only set if not already configured to avoid overwriting user's custom handler\n // @ts-expect-error nitro:config hook exists but is not in NuxtHooks type\n nuxt.hook('nitro:config', (nitroConfig: NitroConfig) => {\n nitroConfig.errorHandler = nitroConfig.errorHandler || resolver.resolve('../nitro/errorHandler')\n })\n\n nuxt.options.runtimeConfig.evlog = options\n nuxt.options.runtimeConfig.public.evlog = {\n pretty: options.pretty,\n transport: {\n enabled: transportEnabled,\n endpoint: transportEndpoint,\n },\n }\n\n if (transportEnabled) {\n addServerHandler({\n route: transportEndpoint,\n method: 'post',\n handler: resolver.resolve('../runtime/server/routes/_evlog/ingest.post'),\n })\n }\n\n addServerPlugin(resolver.resolve('../nitro/plugin'))\n\n addPlugin({\n src: resolver.resolve('../runtime/client/plugin'),\n mode: 'client',\n })\n\n addImports([\n {\n name: 'log',\n from: resolver.resolve('../runtime/client/log'),\n },\n {\n name: 'createEvlogError',\n from: resolver.resolve('../error'),\n },\n {\n name: 'parseError',\n from: resolver.resolve('../runtime/utils/parseError'),\n },\n ])\n\n addServerImports([\n {\n name: 'useLogger',\n from: resolver.resolve('../runtime/server/useLogger'),\n },\n {\n name: 'log',\n from: resolver.resolve('../logger'),\n },\n {\n name: 'createEvlogError',\n from: resolver.resolve('../error'),\n },\n ])\n },\n})\n"],"mappings":";;;AA2LA,qBAAe,iBAAgC;CAC7C,MAAM;EACJ,MAAM;EACN,WAAW;EACX,MAAM;EACP;CACD,UAAU,EAAE;CACZ,MAAM,SAAS,MAAM;EACnB,MAAM,WAAW,eAAe,OAAO,KAAK,IAAI;EAEhD,MAAM,mBAAmB,QAAQ,WAAW,WAAW;EACvD,MAAM,oBAAoB,QAAQ,WAAW,YAAY;AAKzD,OAAK,KAAK,iBAAiB,gBAA6B;AACtD,eAAY,eAAe,YAAY,gBAAgB,SAAS,QAAQ,wBAAwB;IAChG;AAEF,OAAK,QAAQ,cAAc,QAAQ;AACnC,OAAK,QAAQ,cAAc,OAAO,QAAQ;GACxC,QAAQ,QAAQ;GAChB,WAAW;IACT,SAAS;IACT,UAAU;IACX;GACF;AAED,MAAI,iBACF,kBAAiB;GACf,OAAO;GACP,QAAQ;GACR,SAAS,SAAS,QAAQ,8CAA8C;GACzE,CAAC;AAGJ,kBAAgB,SAAS,QAAQ,kBAAkB,CAAC;AAEpD,YAAU;GACR,KAAK,SAAS,QAAQ,2BAA2B;GACjD,MAAM;GACP,CAAC;AAEF,aAAW;GACT;IACE,MAAM;IACN,MAAM,SAAS,QAAQ,wBAAwB;IAChD;GACD;IACE,MAAM;IACN,MAAM,SAAS,QAAQ,WAAW;IACnC;GACD;IACE,MAAM;IACN,MAAM,SAAS,QAAQ,8BAA8B;IACtD;GACF,CAAC;AAEF,mBAAiB;GACf;IACE,MAAM;IACN,MAAM,SAAS,QAAQ,8BAA8B;IACtD;GACD;IACE,MAAM;IACN,MAAM,SAAS,QAAQ,YAAY;IACpC;GACD;IACE,MAAM;IACN,MAAM,SAAS,QAAQ,WAAW;IACnC;GACF,CAAC;;CAEL,CAAC"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
//#region src/pipeline.d.ts
|
|
2
|
+
interface DrainPipelineOptions<T = unknown> {
|
|
3
|
+
batch?: {
|
|
4
|
+
/** Maximum number of events per batch sent to the drain function. @default 50 */size?: number; /** Maximum time (ms) an event can stay buffered before a flush is triggered, even if the batch is not full. @default 5000 */
|
|
5
|
+
intervalMs?: number;
|
|
6
|
+
};
|
|
7
|
+
retry?: {
|
|
8
|
+
/** Total number of attempts (including the initial one) before dropping the batch. @default 3 */maxAttempts?: number; /** Delay strategy between retry attempts. @default 'exponential' */
|
|
9
|
+
backoff?: 'exponential' | 'linear' | 'fixed'; /** Base delay (ms) for the first retry. Scaled by the backoff strategy on subsequent retries. @default 1000 */
|
|
10
|
+
initialDelayMs?: number; /** Upper bound (ms) for any single retry delay. @default 30000 */
|
|
11
|
+
maxDelayMs?: number;
|
|
12
|
+
};
|
|
13
|
+
/** Maximum number of events held in the buffer. When exceeded, the oldest event is dropped. @default 1000 */
|
|
14
|
+
maxBufferSize?: number;
|
|
15
|
+
/** Called when a batch is dropped after all retry attempts are exhausted, or when the buffer overflows. */
|
|
16
|
+
onDropped?: (events: T[], error?: Error) => void;
|
|
17
|
+
}
|
|
18
|
+
interface PipelineDrainFn<T> {
|
|
19
|
+
(ctx: T): void;
|
|
20
|
+
/** Flush all buffered events. Call on server shutdown. */
|
|
21
|
+
flush: () => Promise<void>;
|
|
22
|
+
readonly pending: number;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Create a drain pipeline that batches events, retries on failure, and manages buffer overflow.
|
|
26
|
+
*
|
|
27
|
+
* Returns a higher-order function: pass your drain adapter to get a hook-compatible function.
|
|
28
|
+
*
|
|
29
|
+
* @example
|
|
30
|
+
* ```ts
|
|
31
|
+
* const pipeline = createDrainPipeline({ batch: { size: 50 } })
|
|
32
|
+
* const drain = pipeline(async (batch) => {
|
|
33
|
+
* await sendToBackend(batch)
|
|
34
|
+
* })
|
|
35
|
+
*
|
|
36
|
+
* // Use as a hook
|
|
37
|
+
* nitroApp.hooks.hook('evlog:drain', drain)
|
|
38
|
+
*
|
|
39
|
+
* // Flush on shutdown
|
|
40
|
+
* nitroApp.hooks.hook('close', () => drain.flush())
|
|
41
|
+
* ```
|
|
42
|
+
*/
|
|
43
|
+
declare function createDrainPipeline<T = unknown>(options?: DrainPipelineOptions<T>): (drain: (batch: T[]) => void | Promise<void>) => PipelineDrainFn<T>;
|
|
44
|
+
//#endregion
|
|
45
|
+
export { DrainPipelineOptions, PipelineDrainFn, createDrainPipeline };
|
|
46
|
+
//# sourceMappingURL=pipeline.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pipeline.d.mts","names":[],"sources":["../src/pipeline.ts"],"mappings":";UAAiB,oBAAA;EACf,KAAA;IADmC,iFAGjC,IAAA,WAiBqC;IAfrC,UAAA;EAAA;EAEF,KAAA;IAFE,iGAIA,WAAA,WAAA;IAEA,OAAA,uCAEA;IAAA,cAAA,WAKF;IAHE,UAAA;EAAA;EAKW;EAFb,aAAA;EAE0B;EAA1B,SAAA,IAAa,MAAA,EAAQ,CAAA,IAAK,KAAA,GAAQ,KAAA;AAAA;AAAA,UAGnB,eAAA;EAAA,CACd,GAAA,EAAK,CAAA;EADwB;EAG9B,KAAA,QAAa,OAAA;EAAA,SACJ,OAAA;AAAA;;;;;;;AAsBX;;;;;;;;;;;;;iBAAgB,mBAAA,aAAA,CAAiC,OAAA,GAAU,oBAAA,CAAqB,CAAA,KAAM,KAAA,GAAQ,KAAA,EAAO,CAAA,cAAe,OAAA,WAAkB,eAAA,CAAgB,CAAA"}
|