vestig 0.11.4 → 0.13.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 -2
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +4 -0
- package/dist/config.js.map +1 -1
- package/dist/index.d.ts +9 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -1
- package/dist/index.js.map +1 -1
- package/dist/logger.d.ts +85 -0
- package/dist/logger.d.ts.map +1 -1
- package/dist/logger.js +209 -2
- package/dist/logger.js.map +1 -1
- package/dist/metrics/index.d.ts +2 -0
- package/dist/metrics/index.d.ts.map +1 -0
- package/dist/metrics/index.js +2 -0
- package/dist/metrics/index.js.map +1 -0
- package/dist/metrics/prometheus.d.ts +109 -0
- package/dist/metrics/prometheus.d.ts.map +1 -0
- package/dist/metrics/prometheus.js +162 -0
- package/dist/metrics/prometheus.js.map +1 -0
- package/dist/sampling/index.d.ts +2 -0
- package/dist/sampling/index.d.ts.map +1 -1
- package/dist/sampling/index.js +2 -0
- package/dist/sampling/index.js.map +1 -1
- package/dist/sampling/tail.d.ts +76 -0
- package/dist/sampling/tail.d.ts.map +1 -0
- package/dist/sampling/tail.js +138 -0
- package/dist/sampling/tail.js.map +1 -0
- package/dist/transports/batch.d.ts +2 -0
- package/dist/transports/batch.d.ts.map +1 -1
- package/dist/transports/batch.js +13 -3
- package/dist/transports/batch.js.map +1 -1
- package/dist/transports/file.d.ts +14 -1
- package/dist/transports/file.d.ts.map +1 -1
- package/dist/transports/file.js +59 -4
- package/dist/transports/file.js.map +1 -1
- package/dist/transports/http.d.ts +29 -1
- package/dist/transports/http.d.ts.map +1 -1
- package/dist/transports/http.js +63 -6
- package/dist/transports/http.js.map +1 -1
- package/dist/transports/sentry.d.ts +83 -0
- package/dist/transports/sentry.d.ts.map +1 -0
- package/dist/transports/sentry.js +283 -0
- package/dist/transports/sentry.js.map +1 -0
- package/dist/types.d.ts +149 -2
- package/dist/types.d.ts.map +1 -1
- package/dist/utils/buffer.d.ts +33 -1
- package/dist/utils/buffer.d.ts.map +1 -1
- package/dist/utils/buffer.js +40 -2
- package/dist/utils/buffer.js.map +1 -1
- package/dist/utils/dedupe.d.ts +80 -0
- package/dist/utils/dedupe.d.ts.map +1 -0
- package/dist/utils/dedupe.js +173 -0
- package/dist/utils/dedupe.js.map +1 -0
- package/dist/utils/sanitize.d.ts +23 -1
- package/dist/utils/sanitize.d.ts.map +1 -1
- package/dist/utils/sanitize.js +113 -8
- package/dist/utils/sanitize.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/dist/wide-events/builder.d.ts +51 -0
- package/dist/wide-events/builder.d.ts.map +1 -0
- package/dist/wide-events/builder.js +177 -0
- package/dist/wide-events/builder.js.map +1 -0
- package/dist/wide-events/context.d.ts +57 -0
- package/dist/wide-events/context.d.ts.map +1 -0
- package/dist/wide-events/context.js +148 -0
- package/dist/wide-events/context.js.map +1 -0
- package/dist/wide-events/index.d.ts +6 -0
- package/dist/wide-events/index.d.ts.map +1 -0
- package/dist/wide-events/index.js +7 -0
- package/dist/wide-events/index.js.map +1 -0
- package/dist/wide-events/schemas/http.d.ts +179 -0
- package/dist/wide-events/schemas/http.d.ts.map +1 -0
- package/dist/wide-events/schemas/http.js +25 -0
- package/dist/wide-events/schemas/http.js.map +1 -0
- package/dist/wide-events/schemas/index.d.ts +5 -0
- package/dist/wide-events/schemas/index.d.ts.map +1 -0
- package/dist/wide-events/schemas/index.js +5 -0
- package/dist/wide-events/schemas/index.js.map +1 -0
- package/dist/wide-events/schemas/job.d.ts +130 -0
- package/dist/wide-events/schemas/job.d.ts.map +1 -0
- package/dist/wide-events/schemas/job.js +27 -0
- package/dist/wide-events/schemas/job.js.map +1 -0
- package/dist/wide-events/types.d.ts +216 -0
- package/dist/wide-events/types.d.ts.map +1 -0
- package/dist/wide-events/types.js +2 -0
- package/dist/wide-events/types.js.map +1 -0
- package/package.json +1 -1
package/dist/transports/batch.js
CHANGED
|
@@ -24,6 +24,7 @@ export class BatchTransport {
|
|
|
24
24
|
flushTimer = null;
|
|
25
25
|
isFlushing = false;
|
|
26
26
|
isDestroyed = false;
|
|
27
|
+
failedBatch = null;
|
|
27
28
|
constructor(config) {
|
|
28
29
|
this.config = {
|
|
29
30
|
name: config.name,
|
|
@@ -74,12 +75,16 @@ export class BatchTransport {
|
|
|
74
75
|
* Flush all buffered entries
|
|
75
76
|
*/
|
|
76
77
|
async flush() {
|
|
77
|
-
if (this.isFlushing || this.buffer.size === 0)
|
|
78
|
+
if (this.isFlushing || (this.buffer.size === 0 && !this.failedBatch))
|
|
78
79
|
return;
|
|
79
80
|
this.isFlushing = true;
|
|
80
81
|
try {
|
|
81
|
-
|
|
82
|
+
// Include any previously failed batch entries
|
|
83
|
+
const failedEntries = this.failedBatch;
|
|
84
|
+
this.failedBatch = null;
|
|
85
|
+
const newEntries = this.buffer.toArray();
|
|
82
86
|
this.buffer.clear();
|
|
87
|
+
const entries = failedEntries ? [...failedEntries, ...newEntries] : newEntries;
|
|
83
88
|
await this.sendWithRetry(entries);
|
|
84
89
|
}
|
|
85
90
|
finally {
|
|
@@ -119,7 +124,11 @@ export class BatchTransport {
|
|
|
119
124
|
}
|
|
120
125
|
}
|
|
121
126
|
}
|
|
122
|
-
// All retries failed
|
|
127
|
+
// All retries failed - store for retry on next flush
|
|
128
|
+
// This ensures entries aren't lost due to transient failures
|
|
129
|
+
// Note: Only ONE failed batch is retained to prevent unbounded growth
|
|
130
|
+
this.failedBatch = entries;
|
|
131
|
+
// Call error handler for logging/monitoring
|
|
123
132
|
this.onSendError(lastError, entries);
|
|
124
133
|
}
|
|
125
134
|
/**
|
|
@@ -151,6 +160,7 @@ export class BatchTransport {
|
|
|
151
160
|
buffered: stats.size,
|
|
152
161
|
dropped: stats.dropped,
|
|
153
162
|
isFlushing: this.isFlushing,
|
|
163
|
+
pendingRetry: this.failedBatch?.length ?? 0,
|
|
154
164
|
};
|
|
155
165
|
}
|
|
156
166
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"batch.js","sourceRoot":"","sources":["../../src/transports/batch.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAA;AAEhD;;GAEG;AACH,MAAM,QAAQ,GAAG;IAChB,SAAS,EAAE,GAAG;IACd,aAAa,EAAE,IAAI;IACnB,UAAU,EAAE,CAAC;IACb,UAAU,EAAE,IAAI;CACP,CAAA;AAEV;;;;;GAKG;AACH,MAAM,OAAgB,cAAc;IAE1B,MAAM,CAAiB;IAEb,MAAM,CAA0B;IAChC,SAAS,CAAQ;IACjB,aAAa,CAAQ;IACrB,UAAU,CAAQ;IAClB,UAAU,CAAQ;IAE7B,UAAU,GAA0C,IAAI,CAAA;IACxD,UAAU,GAAG,KAAK,CAAA;IAClB,WAAW,GAAG,KAAK,CAAA;
|
|
1
|
+
{"version":3,"file":"batch.js","sourceRoot":"","sources":["../../src/transports/batch.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { FileTransportConfig, LogEntry } from '../types';
|
|
1
|
+
import type { FileTransportConfig, LogEntry, RotationInterval } from '../types';
|
|
2
2
|
import { BatchTransport } from './batch';
|
|
3
3
|
/**
|
|
4
4
|
* File transport for writing logs to disk
|
|
@@ -22,7 +22,9 @@ export declare class FileTransport extends BatchTransport {
|
|
|
22
22
|
private readonly maxSize;
|
|
23
23
|
private readonly maxFiles;
|
|
24
24
|
private readonly compress;
|
|
25
|
+
private readonly rotateInterval;
|
|
25
26
|
private currentSize;
|
|
27
|
+
private currentPeriod;
|
|
26
28
|
private fd;
|
|
27
29
|
private fs;
|
|
28
30
|
private zlib;
|
|
@@ -41,6 +43,10 @@ export declare class FileTransport extends BatchTransport {
|
|
|
41
43
|
protected send(entries: LogEntry[]): Promise<void>;
|
|
42
44
|
/**
|
|
43
45
|
* Rotate log files
|
|
46
|
+
*
|
|
47
|
+
* For size-based rotation: app.log -> app.log.1 -> app.log.2 -> ...
|
|
48
|
+
* For time-based rotation: app.log -> app.log.2026-01-04 -> app.log.2026-01-03 -> ...
|
|
49
|
+
* Combined: uses period suffix when available, then numeric index
|
|
44
50
|
*/
|
|
45
51
|
private rotate;
|
|
46
52
|
/**
|
|
@@ -55,5 +61,12 @@ export declare class FileTransport extends BatchTransport {
|
|
|
55
61
|
* Get current file size
|
|
56
62
|
*/
|
|
57
63
|
getCurrentSize(): number;
|
|
64
|
+
/**
|
|
65
|
+
* Get rotation configuration
|
|
66
|
+
*/
|
|
67
|
+
getRotationConfig(): {
|
|
68
|
+
interval: RotationInterval;
|
|
69
|
+
currentPeriod: string;
|
|
70
|
+
};
|
|
58
71
|
}
|
|
59
72
|
//# sourceMappingURL=file.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"file.d.ts","sourceRoot":"","sources":["../../src/transports/file.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,mBAAmB,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAA;
|
|
1
|
+
{"version":3,"file":"file.d.ts","sourceRoot":"","sources":["../../src/transports/file.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,mBAAmB,EAAE,QAAQ,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAA;AAC/E,OAAO,EAAE,cAAc,EAAE,MAAM,SAAS,CAAA;AAqCxC;;;;;;;;;;;;;;;GAeG;AACH,qBAAa,aAAc,SAAQ,cAAc;IAChD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IAErB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAQ;IAC7B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAQ;IAChC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAQ;IACjC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAkB;IAEjD,OAAO,CAAC,WAAW,CAAI;IACvB,OAAO,CAAC,aAAa,CAAK;IAC1B,OAAO,CAAC,EAAE,CAA0B;IACpC,OAAO,CAAC,EAAE,CAAiD;IAC3D,OAAO,CAAC,IAAI,CAA0C;gBAE1C,MAAM,EAAE,mBAAmB;IAkBvC;;OAEG;IACY,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAoBpC;;OAEG;YACW,QAAQ;IAetB;;OAEG;cACa,IAAI,CAAC,OAAO,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IA4BxD;;;;;;OAMG;YACW,MAAM;IA2CpB;;OAEG;YACW,YAAY;IAW1B;;OAEG;IACY,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IASvC;;OAEG;IACH,cAAc,IAAI,MAAM;IAIxB;;OAEG;IACH,iBAAiB,IAAI;QAAE,QAAQ,EAAE,gBAAgB,CAAC;QAAC,aAAa,EAAE,MAAM,CAAA;KAAE;CAM1E"}
|
package/dist/transports/file.js
CHANGED
|
@@ -7,7 +7,31 @@ const DEFAULTS = {
|
|
|
7
7
|
maxSize: 10 * 1024 * 1024, // 10MB
|
|
8
8
|
maxFiles: 5,
|
|
9
9
|
compress: false,
|
|
10
|
+
rotateInterval: 'none',
|
|
10
11
|
};
|
|
12
|
+
/**
|
|
13
|
+
* Get the current period identifier for time-based rotation
|
|
14
|
+
*/
|
|
15
|
+
function getCurrentPeriod(interval) {
|
|
16
|
+
const now = new Date();
|
|
17
|
+
switch (interval) {
|
|
18
|
+
case 'hourly':
|
|
19
|
+
return `${now.getFullYear()}-${String(now.getMonth() + 1).padStart(2, '0')}-${String(now.getDate()).padStart(2, '0')}-${String(now.getHours()).padStart(2, '0')}`;
|
|
20
|
+
case 'daily':
|
|
21
|
+
return `${now.getFullYear()}-${String(now.getMonth() + 1).padStart(2, '0')}-${String(now.getDate()).padStart(2, '0')}`;
|
|
22
|
+
case 'weekly': {
|
|
23
|
+
// Get ISO week number
|
|
24
|
+
const d = new Date(Date.UTC(now.getFullYear(), now.getMonth(), now.getDate()));
|
|
25
|
+
const dayNum = d.getUTCDay() || 7;
|
|
26
|
+
d.setUTCDate(d.getUTCDate() + 4 - dayNum);
|
|
27
|
+
const yearStart = new Date(Date.UTC(d.getUTCFullYear(), 0, 1));
|
|
28
|
+
const weekNum = Math.ceil(((d.getTime() - yearStart.getTime()) / 86400000 + 1) / 7);
|
|
29
|
+
return `${d.getUTCFullYear()}-W${String(weekNum).padStart(2, '0')}`;
|
|
30
|
+
}
|
|
31
|
+
default:
|
|
32
|
+
return '';
|
|
33
|
+
}
|
|
34
|
+
}
|
|
11
35
|
/**
|
|
12
36
|
* File transport for writing logs to disk
|
|
13
37
|
*
|
|
@@ -30,7 +54,9 @@ export class FileTransport extends BatchTransport {
|
|
|
30
54
|
maxSize;
|
|
31
55
|
maxFiles;
|
|
32
56
|
compress;
|
|
57
|
+
rotateInterval;
|
|
33
58
|
currentSize = 0;
|
|
59
|
+
currentPeriod = '';
|
|
34
60
|
fd = null;
|
|
35
61
|
fs = null;
|
|
36
62
|
zlib = null;
|
|
@@ -47,6 +73,7 @@ export class FileTransport extends BatchTransport {
|
|
|
47
73
|
this.maxSize = config.maxSize ?? DEFAULTS.maxSize;
|
|
48
74
|
this.maxFiles = config.maxFiles ?? DEFAULTS.maxFiles;
|
|
49
75
|
this.compress = config.compress ?? DEFAULTS.compress;
|
|
76
|
+
this.rotateInterval = config.rotateInterval ?? DEFAULTS.rotateInterval;
|
|
50
77
|
}
|
|
51
78
|
/**
|
|
52
79
|
* Initialize the file transport
|
|
@@ -77,6 +104,10 @@ export class FileTransport extends BatchTransport {
|
|
|
77
104
|
// Get current file size
|
|
78
105
|
const stats = await this.fd.stat();
|
|
79
106
|
this.currentSize = stats.size;
|
|
107
|
+
// Initialize current period for time-based rotation
|
|
108
|
+
if (this.rotateInterval !== 'none') {
|
|
109
|
+
this.currentPeriod = getCurrentPeriod(this.rotateInterval);
|
|
110
|
+
}
|
|
80
111
|
}
|
|
81
112
|
/**
|
|
82
113
|
* Send entries to the file
|
|
@@ -88,7 +119,15 @@ export class FileTransport extends BatchTransport {
|
|
|
88
119
|
// Format entries as newline-delimited JSON
|
|
89
120
|
const data = `${entries.map((e) => JSON.stringify(e)).join('\n')}\n`;
|
|
90
121
|
const bytes = Buffer.byteLength(data, 'utf8');
|
|
91
|
-
// Check if rotation needed
|
|
122
|
+
// Check if time-based rotation needed
|
|
123
|
+
if (this.rotateInterval !== 'none') {
|
|
124
|
+
const newPeriod = getCurrentPeriod(this.rotateInterval);
|
|
125
|
+
if (newPeriod !== this.currentPeriod) {
|
|
126
|
+
await this.rotate();
|
|
127
|
+
this.currentPeriod = newPeriod;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
// Check if size-based rotation needed
|
|
92
131
|
if (this.currentSize + bytes > this.maxSize) {
|
|
93
132
|
await this.rotate();
|
|
94
133
|
}
|
|
@@ -98,6 +137,10 @@ export class FileTransport extends BatchTransport {
|
|
|
98
137
|
}
|
|
99
138
|
/**
|
|
100
139
|
* Rotate log files
|
|
140
|
+
*
|
|
141
|
+
* For size-based rotation: app.log -> app.log.1 -> app.log.2 -> ...
|
|
142
|
+
* For time-based rotation: app.log -> app.log.2026-01-04 -> app.log.2026-01-03 -> ...
|
|
143
|
+
* Combined: uses period suffix when available, then numeric index
|
|
101
144
|
*/
|
|
102
145
|
async rotate() {
|
|
103
146
|
if (!this.fd || !this.fs)
|
|
@@ -105,10 +148,13 @@ export class FileTransport extends BatchTransport {
|
|
|
105
148
|
// Close current file
|
|
106
149
|
await this.fd.close();
|
|
107
150
|
this.fd = null;
|
|
151
|
+
// Determine the suffix for the rotated file
|
|
152
|
+
const periodSuffix = this.rotateInterval !== 'none' && this.currentPeriod ? `.${this.currentPeriod}` : '';
|
|
153
|
+
const compressSuffix = this.compress ? '.gz' : '';
|
|
108
154
|
// Rotate existing files
|
|
109
155
|
for (let i = this.maxFiles - 1; i >= 1; i--) {
|
|
110
|
-
const oldPath = i === 1 ? this.path : `${this.path}.${i - 1}${
|
|
111
|
-
const newPath = `${this.path}.${i}${
|
|
156
|
+
const oldPath = i === 1 ? this.path : `${this.path}${periodSuffix}.${i - 1}${compressSuffix}`;
|
|
157
|
+
const newPath = `${this.path}${periodSuffix}.${i}${compressSuffix}`;
|
|
112
158
|
try {
|
|
113
159
|
await this.fs.access(oldPath);
|
|
114
160
|
if (i === 1 && this.compress) {
|
|
@@ -125,7 +171,7 @@ export class FileTransport extends BatchTransport {
|
|
|
125
171
|
}
|
|
126
172
|
}
|
|
127
173
|
// Delete oldest file if it exists
|
|
128
|
-
const oldestPath = `${this.path}.${this.maxFiles}${
|
|
174
|
+
const oldestPath = `${this.path}${periodSuffix}.${this.maxFiles}${compressSuffix}`;
|
|
129
175
|
try {
|
|
130
176
|
await this.fs.unlink(oldestPath);
|
|
131
177
|
}
|
|
@@ -163,5 +209,14 @@ export class FileTransport extends BatchTransport {
|
|
|
163
209
|
getCurrentSize() {
|
|
164
210
|
return this.currentSize;
|
|
165
211
|
}
|
|
212
|
+
/**
|
|
213
|
+
* Get rotation configuration
|
|
214
|
+
*/
|
|
215
|
+
getRotationConfig() {
|
|
216
|
+
return {
|
|
217
|
+
interval: this.rotateInterval,
|
|
218
|
+
currentPeriod: this.currentPeriod,
|
|
219
|
+
};
|
|
220
|
+
}
|
|
166
221
|
}
|
|
167
222
|
//# sourceMappingURL=file.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"file.js","sourceRoot":"","sources":["../../src/transports/file.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AAEtC,OAAO,EAAE,cAAc,EAAE,MAAM,SAAS,CAAA;AAExC;;GAEG;AACH,MAAM,QAAQ,GAAG;IAChB,OAAO,EAAE,EAAE,GAAG,IAAI,GAAG,IAAI,EAAE,OAAO;IAClC,QAAQ,EAAE,CAAC;IACX,QAAQ,EAAE,KAAK;
|
|
1
|
+
{"version":3,"file":"file.js","sourceRoot":"","sources":["../../src/transports/file.ts"],"names":[],"mappings":"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"}
|
|
@@ -28,6 +28,7 @@ export declare class HTTPTransport extends BatchTransport {
|
|
|
28
28
|
private readonly headers;
|
|
29
29
|
private readonly timeout;
|
|
30
30
|
private readonly transform?;
|
|
31
|
+
private readonly keepAlive;
|
|
31
32
|
constructor(config: HTTPTransportConfig);
|
|
32
33
|
/**
|
|
33
34
|
* Send entries to the configured URL
|
|
@@ -40,10 +41,37 @@ export declare class HTTPTransport extends BatchTransport {
|
|
|
40
41
|
}
|
|
41
42
|
/**
|
|
42
43
|
* Custom error for HTTP transport failures
|
|
44
|
+
*
|
|
45
|
+
* Wraps all HTTP-related errors for consistent error handling.
|
|
46
|
+
* Status codes:
|
|
47
|
+
* - 0: Network error (no response received)
|
|
48
|
+
* - 408: Request timeout
|
|
49
|
+
* - 4xx/5xx: HTTP response errors
|
|
43
50
|
*/
|
|
44
51
|
export declare class HTTPTransportError extends Error {
|
|
45
52
|
readonly statusCode: number;
|
|
46
53
|
readonly responseBody?: string | undefined;
|
|
47
|
-
|
|
54
|
+
readonly cause?: Error | undefined;
|
|
55
|
+
constructor(message: string, statusCode: number, responseBody?: string | undefined, cause?: Error | undefined);
|
|
56
|
+
/**
|
|
57
|
+
* Whether this error represents a network failure (no response received)
|
|
58
|
+
*/
|
|
59
|
+
get isNetworkError(): boolean;
|
|
60
|
+
/**
|
|
61
|
+
* Whether this error represents a timeout
|
|
62
|
+
*/
|
|
63
|
+
get isTimeout(): boolean;
|
|
64
|
+
/**
|
|
65
|
+
* Whether this error represents a client error (4xx)
|
|
66
|
+
*/
|
|
67
|
+
get isClientError(): boolean;
|
|
68
|
+
/**
|
|
69
|
+
* Whether this error represents a server error (5xx)
|
|
70
|
+
*/
|
|
71
|
+
get isServerError(): boolean;
|
|
72
|
+
/**
|
|
73
|
+
* Whether the request should be retried (network errors, timeouts, 5xx)
|
|
74
|
+
*/
|
|
75
|
+
get isRetryable(): boolean;
|
|
48
76
|
}
|
|
49
77
|
//# sourceMappingURL=http.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../src/transports/http.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAA;AAC7D,OAAO,EAAE,cAAc,EAAE,MAAM,SAAS,CAAA;
|
|
1
|
+
{"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../src/transports/http.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAA;AAC7D,OAAO,EAAE,cAAc,EAAE,MAAM,SAAS,CAAA;AAcxC;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,qBAAa,aAAc,SAAQ,cAAc;IAChD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IAErB,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAQ;IAC5B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAgB;IACvC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAwB;IAChD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAQ;IAChC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAkC;IAC7D,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;gBAEvB,MAAM,EAAE,mBAAmB;IAqBvC;;OAEG;cACa,IAAI,CAAC,OAAO,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IA2CxD;;OAEG;YACW,YAAY;CAO1B;AAED;;;;;;;;GAQG;AACH,qBAAa,kBAAmB,SAAQ,KAAK;aAG3B,UAAU,EAAE,MAAM;aAClB,YAAY,CAAC,EAAE,MAAM;aACnB,KAAK,CAAC,EAAE,KAAK;gBAH/B,OAAO,EAAE,MAAM,EACC,UAAU,EAAE,MAAM,EAClB,YAAY,CAAC,EAAE,MAAM,YAAA,EACnB,KAAK,CAAC,EAAE,KAAK,YAAA;IAMhC;;OAEG;IACH,IAAI,cAAc,IAAI,OAAO,CAE5B;IAED;;OAEG;IACH,IAAI,SAAS,IAAI,OAAO,CAEvB;IAED;;OAEG;IACH,IAAI,aAAa,IAAI,OAAO,CAE3B;IAED;;OAEG;IACH,IAAI,aAAa,IAAI,OAAO,CAE3B;IAED;;OAEG;IACH,IAAI,WAAW,IAAI,OAAO,CAEzB;CACD"}
|
package/dist/transports/http.js
CHANGED
|
@@ -5,6 +5,7 @@ import { BatchTransport } from './batch';
|
|
|
5
5
|
const DEFAULTS = {
|
|
6
6
|
method: 'POST',
|
|
7
7
|
timeout: 30000,
|
|
8
|
+
keepAlive: true,
|
|
8
9
|
headers: {
|
|
9
10
|
'Content-Type': 'application/json',
|
|
10
11
|
},
|
|
@@ -37,6 +38,7 @@ export class HTTPTransport extends BatchTransport {
|
|
|
37
38
|
headers;
|
|
38
39
|
timeout;
|
|
39
40
|
transform;
|
|
41
|
+
keepAlive;
|
|
40
42
|
constructor(config) {
|
|
41
43
|
super({
|
|
42
44
|
...config,
|
|
@@ -45,9 +47,15 @@ export class HTTPTransport extends BatchTransport {
|
|
|
45
47
|
this.name = config.name ?? 'http';
|
|
46
48
|
this.url = config.url;
|
|
47
49
|
this.method = config.method ?? DEFAULTS.method;
|
|
48
|
-
this.headers = { ...DEFAULTS.headers, ...config.headers };
|
|
49
50
|
this.timeout = config.timeout ?? DEFAULTS.timeout;
|
|
50
51
|
this.transform = config.transform;
|
|
52
|
+
this.keepAlive = config.keepAlive ?? DEFAULTS.keepAlive;
|
|
53
|
+
// Build headers with optional keep-alive
|
|
54
|
+
this.headers = {
|
|
55
|
+
...DEFAULTS.headers,
|
|
56
|
+
...(this.keepAlive ? { Connection: 'keep-alive' } : {}),
|
|
57
|
+
...config.headers,
|
|
58
|
+
};
|
|
51
59
|
}
|
|
52
60
|
/**
|
|
53
61
|
* Send entries to the configured URL
|
|
@@ -63,16 +71,27 @@ export class HTTPTransport extends BatchTransport {
|
|
|
63
71
|
headers: this.headers,
|
|
64
72
|
body,
|
|
65
73
|
signal: controller.signal,
|
|
74
|
+
// Enable keepalive for browser page-unload scenarios
|
|
75
|
+
// This ensures the request completes even during navigation
|
|
76
|
+
keepalive: this.keepAlive,
|
|
66
77
|
});
|
|
67
78
|
if (!response.ok) {
|
|
68
79
|
throw new HTTPTransportError(`HTTP ${response.status}: ${response.statusText}`, response.status, await this.safeReadBody(response));
|
|
69
80
|
}
|
|
70
81
|
}
|
|
71
82
|
catch (err) {
|
|
72
|
-
|
|
73
|
-
|
|
83
|
+
// Wrap all errors in HTTPTransportError for consistency
|
|
84
|
+
if (err instanceof HTTPTransportError) {
|
|
85
|
+
throw err;
|
|
74
86
|
}
|
|
75
|
-
|
|
87
|
+
if (err instanceof Error) {
|
|
88
|
+
if (err.name === 'AbortError') {
|
|
89
|
+
throw new HTTPTransportError(`Request timeout after ${this.timeout}ms`, 408);
|
|
90
|
+
}
|
|
91
|
+
// Network errors (ECONNREFUSED, DNS failures, etc.)
|
|
92
|
+
throw new HTTPTransportError(err.message, 0, undefined, err);
|
|
93
|
+
}
|
|
94
|
+
throw new HTTPTransportError(String(err), 0);
|
|
76
95
|
}
|
|
77
96
|
finally {
|
|
78
97
|
clearTimeout(timeoutId);
|
|
@@ -92,15 +111,53 @@ export class HTTPTransport extends BatchTransport {
|
|
|
92
111
|
}
|
|
93
112
|
/**
|
|
94
113
|
* Custom error for HTTP transport failures
|
|
114
|
+
*
|
|
115
|
+
* Wraps all HTTP-related errors for consistent error handling.
|
|
116
|
+
* Status codes:
|
|
117
|
+
* - 0: Network error (no response received)
|
|
118
|
+
* - 408: Request timeout
|
|
119
|
+
* - 4xx/5xx: HTTP response errors
|
|
95
120
|
*/
|
|
96
121
|
export class HTTPTransportError extends Error {
|
|
97
122
|
statusCode;
|
|
98
123
|
responseBody;
|
|
99
|
-
|
|
100
|
-
|
|
124
|
+
cause;
|
|
125
|
+
constructor(message, statusCode, responseBody, cause) {
|
|
126
|
+
super(message, cause ? { cause } : undefined);
|
|
101
127
|
this.statusCode = statusCode;
|
|
102
128
|
this.responseBody = responseBody;
|
|
129
|
+
this.cause = cause;
|
|
103
130
|
this.name = 'HTTPTransportError';
|
|
104
131
|
}
|
|
132
|
+
/**
|
|
133
|
+
* Whether this error represents a network failure (no response received)
|
|
134
|
+
*/
|
|
135
|
+
get isNetworkError() {
|
|
136
|
+
return this.statusCode === 0;
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Whether this error represents a timeout
|
|
140
|
+
*/
|
|
141
|
+
get isTimeout() {
|
|
142
|
+
return this.statusCode === 408;
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Whether this error represents a client error (4xx)
|
|
146
|
+
*/
|
|
147
|
+
get isClientError() {
|
|
148
|
+
return this.statusCode >= 400 && this.statusCode < 500;
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Whether this error represents a server error (5xx)
|
|
152
|
+
*/
|
|
153
|
+
get isServerError() {
|
|
154
|
+
return this.statusCode >= 500 && this.statusCode < 600;
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* Whether the request should be retried (network errors, timeouts, 5xx)
|
|
158
|
+
*/
|
|
159
|
+
get isRetryable() {
|
|
160
|
+
return this.isNetworkError || this.isTimeout || this.isServerError;
|
|
161
|
+
}
|
|
105
162
|
}
|
|
106
163
|
//# sourceMappingURL=http.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"http.js","sourceRoot":"","sources":["../../src/transports/http.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,SAAS,CAAA;AAExC;;GAEG;AACH,MAAM,QAAQ,GAAG;IAChB,MAAM,EAAE,MAAe;IACvB,OAAO,EAAE,KAAK;IACd,OAAO,EAAE;QACR,cAAc,EAAE,kBAAkB;KAClC;CACQ,CAAA;AAEV;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,OAAO,aAAc,SAAQ,cAAc;IACvC,IAAI,CAAQ;IAEJ,GAAG,CAAQ;IACX,MAAM,CAAgB;IACtB,OAAO,CAAwB;IAC/B,OAAO,CAAQ;IACf,SAAS,CAAmC;
|
|
1
|
+
{"version":3,"file":"http.js","sourceRoot":"","sources":["../../src/transports/http.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import type { LogEntry, SentryTransportConfig } from '../types';
|
|
2
|
+
import { BatchTransport } from './batch';
|
|
3
|
+
/**
|
|
4
|
+
* Sentry transport for sending logs to Sentry
|
|
5
|
+
*
|
|
6
|
+
* Maps vestig log entries to Sentry events and sends them via
|
|
7
|
+
* Sentry's Store API. Supports environments, releases, tags,
|
|
8
|
+
* and automatic error extraction.
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* ```typescript
|
|
12
|
+
* const transport = new SentryTransport({
|
|
13
|
+
* name: 'sentry',
|
|
14
|
+
* dsn: process.env.SENTRY_DSN,
|
|
15
|
+
* environment: 'production',
|
|
16
|
+
* release: 'my-app@1.2.3',
|
|
17
|
+
* tags: { team: 'backend' },
|
|
18
|
+
* })
|
|
19
|
+
*
|
|
20
|
+
* logger.addTransport(transport)
|
|
21
|
+
* logger.error('Database connection failed', { host: 'db-1' })
|
|
22
|
+
* ```
|
|
23
|
+
*/
|
|
24
|
+
export declare class SentryTransport extends BatchTransport {
|
|
25
|
+
readonly name: string;
|
|
26
|
+
private readonly parsedDSN;
|
|
27
|
+
private readonly environment?;
|
|
28
|
+
private readonly release?;
|
|
29
|
+
private readonly service?;
|
|
30
|
+
private readonly serverName?;
|
|
31
|
+
private readonly tags?;
|
|
32
|
+
private readonly minLevel;
|
|
33
|
+
constructor(config: SentryTransportConfig);
|
|
34
|
+
/**
|
|
35
|
+
* Parse Sentry DSN into components
|
|
36
|
+
*/
|
|
37
|
+
private parseDSN;
|
|
38
|
+
/**
|
|
39
|
+
* Build the Sentry store API URL
|
|
40
|
+
*/
|
|
41
|
+
private getStoreUrl;
|
|
42
|
+
/**
|
|
43
|
+
* Check if a log entry should be sent based on minimum level
|
|
44
|
+
*/
|
|
45
|
+
private shouldSend;
|
|
46
|
+
/**
|
|
47
|
+
* Send entries to Sentry
|
|
48
|
+
*/
|
|
49
|
+
protected send(entries: LogEntry[]): Promise<void>;
|
|
50
|
+
/**
|
|
51
|
+
* Send a single event to Sentry
|
|
52
|
+
*/
|
|
53
|
+
private sendEvent;
|
|
54
|
+
/**
|
|
55
|
+
* Build Sentry authentication header
|
|
56
|
+
*/
|
|
57
|
+
private buildAuthHeader;
|
|
58
|
+
/**
|
|
59
|
+
* Transform a log entry to Sentry event format
|
|
60
|
+
*/
|
|
61
|
+
private transformEntry;
|
|
62
|
+
/**
|
|
63
|
+
* Generate a random event ID (32 hex chars)
|
|
64
|
+
*/
|
|
65
|
+
private generateEventId;
|
|
66
|
+
/**
|
|
67
|
+
* Parse stack trace into Sentry frame format
|
|
68
|
+
*/
|
|
69
|
+
private parseStackTrace;
|
|
70
|
+
/**
|
|
71
|
+
* Safely read response body for error messages
|
|
72
|
+
*/
|
|
73
|
+
private safeReadBody;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Custom error for Sentry transport failures
|
|
77
|
+
*/
|
|
78
|
+
export declare class SentryTransportError extends Error {
|
|
79
|
+
readonly statusCode: number;
|
|
80
|
+
readonly responseBody?: string | undefined;
|
|
81
|
+
constructor(message: string, statusCode: number, responseBody?: string | undefined);
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=sentry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sentry.d.ts","sourceRoot":"","sources":["../../src/transports/sentry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAY,qBAAqB,EAAE,MAAM,UAAU,CAAA;AACzE,OAAO,EAAE,cAAc,EAAE,MAAM,SAAS,CAAA;AAiCxC;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,qBAAa,eAAgB,SAAQ,cAAc;IAClD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IAErB,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAW;IACrC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAQ;IACrC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAQ;IACjC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAQ;IACjC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAQ;IACpC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAwB;IAC9C,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAU;gBAEvB,MAAM,EAAE,qBAAqB;IAmBzC;;OAEG;IACH,OAAO,CAAC,QAAQ;IAiBhB;;OAEG;IACH,OAAO,CAAC,WAAW;IAKnB;;OAEG;IACH,OAAO,CAAC,UAAU;IAIlB;;OAEG;cACa,IAAI,CAAC,OAAO,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAoBxD;;OAEG;YACW,SAAS;IAsBvB;;OAEG;IACH,OAAO,CAAC,eAAe;IAYvB;;OAEG;IACH,OAAO,CAAC,cAAc;IA+EtB;;OAEG;IACH,OAAO,CAAC,eAAe;IAevB;;OAEG;IACH,OAAO,CAAC,eAAe;IAoBvB;;OAEG;YACW,YAAY;CAO1B;AAED;;GAEG;AACH,qBAAa,oBAAqB,SAAQ,KAAK;aAG7B,UAAU,EAAE,MAAM;aAClB,YAAY,CAAC,EAAE,MAAM;gBAFrC,OAAO,EAAE,MAAM,EACC,UAAU,EAAE,MAAM,EAClB,YAAY,CAAC,EAAE,MAAM,YAAA;CAKtC"}
|