@syncular/observability-sentry 0.0.1-100
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/dist/browser.d.ts +35 -0
- package/dist/browser.d.ts.map +1 -0
- package/dist/browser.js +155 -0
- package/dist/browser.js.map +1 -0
- package/dist/cloudflare.d.ts +47 -0
- package/dist/cloudflare.d.ts.map +1 -0
- package/dist/cloudflare.js +163 -0
- package/dist/cloudflare.js.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -0
- package/dist/shared.d.ts +31 -0
- package/dist/shared.d.ts.map +1 -0
- package/dist/shared.js +147 -0
- package/dist/shared.js.map +1 -0
- package/package.json +55 -0
- package/src/browser.ts +215 -0
- package/src/cloudflare.test.ts +49 -0
- package/src/cloudflare.ts +230 -0
- package/src/index.ts +3 -0
- package/src/shared.test.ts +145 -0
- package/src/shared.ts +200 -0
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import * as Sentry from '@sentry/react';
|
|
2
|
+
import { type SyncTelemetry, type SyncTelemetryAttributeValue } from '@syncular/core';
|
|
3
|
+
export type BrowserSentryInitOptions = Parameters<typeof Sentry.init>[0];
|
|
4
|
+
export type BrowserSentryCaptureMessageLevel = Parameters<typeof Sentry.captureMessage>[1];
|
|
5
|
+
interface BrowserSentryCaptureMessageOptions {
|
|
6
|
+
level?: BrowserSentryCaptureMessageLevel;
|
|
7
|
+
tags?: Record<string, string>;
|
|
8
|
+
}
|
|
9
|
+
type BrowserSentryLogLevel = 'trace' | 'debug' | 'info' | 'warn' | 'error' | 'fatal';
|
|
10
|
+
interface BrowserSentryLogOptions {
|
|
11
|
+
level?: BrowserSentryLogLevel;
|
|
12
|
+
attributes?: Record<string, SyncTelemetryAttributeValue>;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Create a Syncular telemetry backend wired to `@sentry/react`.
|
|
16
|
+
*/
|
|
17
|
+
export declare function createBrowserSentryTelemetry(): SyncTelemetry;
|
|
18
|
+
/**
|
|
19
|
+
* Configure Syncular core telemetry to use the browser Sentry adapter.
|
|
20
|
+
*/
|
|
21
|
+
export declare function configureBrowserSentryTelemetry(): SyncTelemetry;
|
|
22
|
+
/**
|
|
23
|
+
* Initialize browser Sentry and configure Syncular telemetry.
|
|
24
|
+
*/
|
|
25
|
+
export declare function initAndConfigureBrowserSentry(options: BrowserSentryInitOptions): SyncTelemetry;
|
|
26
|
+
/**
|
|
27
|
+
* Capture a browser message in Sentry with optional tags.
|
|
28
|
+
*/
|
|
29
|
+
export declare function captureBrowserSentryMessage(message: string, options?: BrowserSentryCaptureMessageOptions): void;
|
|
30
|
+
/**
|
|
31
|
+
* Emit a browser Sentry log entry.
|
|
32
|
+
*/
|
|
33
|
+
export declare function logBrowserSentryMessage(message: string, options?: BrowserSentryLogOptions): void;
|
|
34
|
+
export {};
|
|
35
|
+
//# sourceMappingURL=browser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"browser.d.ts","sourceRoot":"","sources":["../src/browser.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AACxC,OAAO,EAGL,KAAK,aAAa,EAClB,KAAK,2BAA2B,EACjC,MAAM,gBAAgB,CAAC;AAGxB,MAAM,MAAM,wBAAwB,GAAG,UAAU,CAAC,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;AACzE,MAAM,MAAM,gCAAgC,GAAG,UAAU,CACvD,OAAO,MAAM,CAAC,cAAc,CAC7B,CAAC,CAAC,CAAC,CAAC;AAEL,UAAU,kCAAkC;IAC1C,KAAK,CAAC,EAAE,gCAAgC,CAAC;IACzC,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC/B;AAED,KAAK,qBAAqB,GACtB,OAAO,GACP,OAAO,GACP,MAAM,GACN,MAAM,GACN,OAAO,GACP,OAAO,CAAC;AAEZ,UAAU,uBAAuB;IAC/B,KAAK,CAAC,EAAE,qBAAqB,CAAC;IAC9B,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,2BAA2B,CAAC,CAAC;CAC1D;AAqDD;;GAEG;AACH,wBAAgB,4BAA4B,IAAI,aAAa,CAkD5D;AAED;;GAEG;AACH,wBAAgB,+BAA+B,IAAI,aAAa,CAI/D;AAED;;GAEG;AACH,wBAAgB,6BAA6B,CAC3C,OAAO,EAAE,wBAAwB,GAChC,aAAa,CAIf;AAuBD;;GAEG;AACH,wBAAgB,2BAA2B,CACzC,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE,kCAAkC,GAC3C,IAAI,CAYN;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CACrC,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE,uBAAuB,GAChC,IAAI,CASN"}
|
package/dist/browser.js
ADDED
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
import * as Sentry from '@sentry/react';
|
|
2
|
+
import { configureSyncTelemetry, } from '@syncular/core';
|
|
3
|
+
import { createSentrySyncTelemetry } from './shared.js';
|
|
4
|
+
function resolveBrowserLogMethod(level) {
|
|
5
|
+
switch (level) {
|
|
6
|
+
case 'trace':
|
|
7
|
+
return Sentry.logger.trace ?? Sentry.logger.debug ?? Sentry.logger.info;
|
|
8
|
+
case 'debug':
|
|
9
|
+
return Sentry.logger.debug ?? Sentry.logger.info;
|
|
10
|
+
case 'info':
|
|
11
|
+
return Sentry.logger.info;
|
|
12
|
+
case 'warn':
|
|
13
|
+
return Sentry.logger.warn ?? Sentry.logger.info;
|
|
14
|
+
case 'error':
|
|
15
|
+
return Sentry.logger.error ?? Sentry.logger.warn ?? Sentry.logger.info;
|
|
16
|
+
case 'fatal':
|
|
17
|
+
return (Sentry.logger.fatal ??
|
|
18
|
+
Sentry.logger.error ??
|
|
19
|
+
Sentry.logger.warn ??
|
|
20
|
+
Sentry.logger.info);
|
|
21
|
+
default:
|
|
22
|
+
return Sentry.logger.info;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
function toCountMetricOptions(options) {
|
|
26
|
+
if (!options?.attributes)
|
|
27
|
+
return undefined;
|
|
28
|
+
return { attributes: options.attributes };
|
|
29
|
+
}
|
|
30
|
+
function toValueMetricOptions(options) {
|
|
31
|
+
if (!options)
|
|
32
|
+
return undefined;
|
|
33
|
+
const hasAttributes = Boolean(options.attributes);
|
|
34
|
+
const hasUnit = Boolean(options.unit);
|
|
35
|
+
if (!hasAttributes && !hasUnit)
|
|
36
|
+
return undefined;
|
|
37
|
+
return {
|
|
38
|
+
attributes: options.attributes,
|
|
39
|
+
unit: options.unit,
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Create a Syncular telemetry backend wired to `@sentry/react`.
|
|
44
|
+
*/
|
|
45
|
+
export function createBrowserSentryTelemetry() {
|
|
46
|
+
return createSentrySyncTelemetry({
|
|
47
|
+
logger: Sentry.logger,
|
|
48
|
+
startSpan(options, callback) {
|
|
49
|
+
return Sentry.startSpan(options, (span) => callback({
|
|
50
|
+
setAttribute(name, value) {
|
|
51
|
+
span.setAttribute(name, value);
|
|
52
|
+
},
|
|
53
|
+
setAttributes(attributes) {
|
|
54
|
+
span.setAttributes(attributes);
|
|
55
|
+
},
|
|
56
|
+
setStatus(status) {
|
|
57
|
+
span.setStatus({
|
|
58
|
+
code: status === 'ok' ? 1 : 2,
|
|
59
|
+
});
|
|
60
|
+
},
|
|
61
|
+
}));
|
|
62
|
+
},
|
|
63
|
+
metrics: {
|
|
64
|
+
count(name, value, options) {
|
|
65
|
+
const metricOptions = toCountMetricOptions(options);
|
|
66
|
+
if (metricOptions) {
|
|
67
|
+
Sentry.metrics.count(name, value, metricOptions);
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
Sentry.metrics.count(name, value);
|
|
71
|
+
},
|
|
72
|
+
gauge(name, value, options) {
|
|
73
|
+
const metricOptions = toValueMetricOptions(options);
|
|
74
|
+
if (metricOptions) {
|
|
75
|
+
Sentry.metrics.gauge(name, value, metricOptions);
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
Sentry.metrics.gauge(name, value);
|
|
79
|
+
},
|
|
80
|
+
distribution(name, value, options) {
|
|
81
|
+
const metricOptions = toValueMetricOptions(options);
|
|
82
|
+
if (metricOptions) {
|
|
83
|
+
Sentry.metrics.distribution(name, value, metricOptions);
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
Sentry.metrics.distribution(name, value);
|
|
87
|
+
},
|
|
88
|
+
},
|
|
89
|
+
captureException(error) {
|
|
90
|
+
Sentry.captureException(error);
|
|
91
|
+
},
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Configure Syncular core telemetry to use the browser Sentry adapter.
|
|
96
|
+
*/
|
|
97
|
+
export function configureBrowserSentryTelemetry() {
|
|
98
|
+
const telemetry = createBrowserSentryTelemetry();
|
|
99
|
+
configureSyncTelemetry(telemetry);
|
|
100
|
+
return telemetry;
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Initialize browser Sentry and configure Syncular telemetry.
|
|
104
|
+
*/
|
|
105
|
+
export function initAndConfigureBrowserSentry(options) {
|
|
106
|
+
const configuredOptions = ensureBrowserTracingIntegration(options);
|
|
107
|
+
Sentry.init(configuredOptions);
|
|
108
|
+
return configureBrowserSentryTelemetry();
|
|
109
|
+
}
|
|
110
|
+
function ensureBrowserTracingIntegration(options) {
|
|
111
|
+
const integrations = options.integrations;
|
|
112
|
+
if (typeof integrations === 'function')
|
|
113
|
+
return options;
|
|
114
|
+
const configuredIntegrations = integrations ?? [];
|
|
115
|
+
const hasBrowserTracing = configuredIntegrations.some((integration) => integration.name === 'BrowserTracing');
|
|
116
|
+
if (hasBrowserTracing)
|
|
117
|
+
return options;
|
|
118
|
+
return {
|
|
119
|
+
...options,
|
|
120
|
+
integrations: [
|
|
121
|
+
Sentry.browserTracingIntegration(),
|
|
122
|
+
...configuredIntegrations,
|
|
123
|
+
],
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Capture a browser message in Sentry with optional tags.
|
|
128
|
+
*/
|
|
129
|
+
export function captureBrowserSentryMessage(message, options) {
|
|
130
|
+
if (!options?.tags || Object.keys(options.tags).length === 0) {
|
|
131
|
+
Sentry.captureMessage(message, options?.level);
|
|
132
|
+
return;
|
|
133
|
+
}
|
|
134
|
+
Sentry.withScope((scope) => {
|
|
135
|
+
for (const [name, value] of Object.entries(options.tags ?? {})) {
|
|
136
|
+
scope.setTag(name, value);
|
|
137
|
+
}
|
|
138
|
+
Sentry.captureMessage(message, options?.level);
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Emit a browser Sentry log entry.
|
|
143
|
+
*/
|
|
144
|
+
export function logBrowserSentryMessage(message, options) {
|
|
145
|
+
const level = options?.level ?? 'info';
|
|
146
|
+
const logMethod = resolveBrowserLogMethod(level);
|
|
147
|
+
if (!logMethod)
|
|
148
|
+
return;
|
|
149
|
+
if (!options?.attributes || Object.keys(options.attributes).length === 0) {
|
|
150
|
+
logMethod(message);
|
|
151
|
+
return;
|
|
152
|
+
}
|
|
153
|
+
logMethod(message, options.attributes);
|
|
154
|
+
}
|
|
155
|
+
//# sourceMappingURL=browser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"browser.js","sourceRoot":"","sources":["../src/browser.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import * as Sentry from '@sentry/cloudflare';
|
|
2
|
+
import { type SyncTelemetry, type SyncTelemetryAttributeValue } from '@syncular/core';
|
|
3
|
+
export type CloudflareSentryCaptureMessageLevel = Parameters<typeof Sentry.captureMessage>[1];
|
|
4
|
+
interface CloudflareSentryCaptureMessageOptions {
|
|
5
|
+
level?: CloudflareSentryCaptureMessageLevel;
|
|
6
|
+
tags?: Record<string, string>;
|
|
7
|
+
}
|
|
8
|
+
type CloudflareSentryLogLevel = 'trace' | 'debug' | 'info' | 'warn' | 'error' | 'fatal';
|
|
9
|
+
interface CloudflareSentryLogOptions {
|
|
10
|
+
level?: CloudflareSentryLogLevel;
|
|
11
|
+
attributes?: Record<string, SyncTelemetryAttributeValue>;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Re-export Cloudflare Sentry worker wrapper.
|
|
15
|
+
*/
|
|
16
|
+
export declare const withCloudflareSentry: typeof Sentry.withSentry;
|
|
17
|
+
export declare const instrumentCloudflareDurableObjectWithSentry: typeof Sentry.instrumentDurableObjectWithSentry;
|
|
18
|
+
export interface CloudflareSentryTraceHeaders {
|
|
19
|
+
sentryTrace?: string;
|
|
20
|
+
baggage?: string;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Read current trace headers from the active Cloudflare Sentry scope.
|
|
24
|
+
*/
|
|
25
|
+
export declare function getCloudflareSentryTraceHeaders(traceData?: ReturnType<typeof Sentry.getTraceData>): CloudflareSentryTraceHeaders;
|
|
26
|
+
/**
|
|
27
|
+
* Clone a request and attach active Cloudflare trace headers when available.
|
|
28
|
+
*/
|
|
29
|
+
export declare function attachCloudflareSentryTraceHeaders(request: Request, traceHeaders?: CloudflareSentryTraceHeaders): Request;
|
|
30
|
+
/**
|
|
31
|
+
* Create a Syncular telemetry backend wired to `@sentry/cloudflare`.
|
|
32
|
+
*/
|
|
33
|
+
export declare function createCloudflareSentryTelemetry(): SyncTelemetry;
|
|
34
|
+
/**
|
|
35
|
+
* Configure Syncular core telemetry to use the Cloudflare Sentry adapter.
|
|
36
|
+
*/
|
|
37
|
+
export declare function configureCloudflareSentryTelemetry(): SyncTelemetry;
|
|
38
|
+
/**
|
|
39
|
+
* Capture a worker message in Sentry with optional tags.
|
|
40
|
+
*/
|
|
41
|
+
export declare function captureCloudflareSentryMessage(message: string, options?: CloudflareSentryCaptureMessageOptions): void;
|
|
42
|
+
/**
|
|
43
|
+
* Emit a Cloudflare Sentry log entry.
|
|
44
|
+
*/
|
|
45
|
+
export declare function logCloudflareSentryMessage(message: string, options?: CloudflareSentryLogOptions): void;
|
|
46
|
+
export {};
|
|
47
|
+
//# sourceMappingURL=cloudflare.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cloudflare.d.ts","sourceRoot":"","sources":["../src/cloudflare.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,oBAAoB,CAAC;AAC7C,OAAO,EAGL,KAAK,aAAa,EAClB,KAAK,2BAA2B,EACjC,MAAM,gBAAgB,CAAC;AAuBxB,MAAM,MAAM,mCAAmC,GAAG,UAAU,CAC1D,OAAO,MAAM,CAAC,cAAc,CAC7B,CAAC,CAAC,CAAC,CAAC;AAEL,UAAU,qCAAqC;IAC7C,KAAK,CAAC,EAAE,mCAAmC,CAAC;IAC5C,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC/B;AAED,KAAK,wBAAwB,GACzB,OAAO,GACP,OAAO,GACP,MAAM,GACN,MAAM,GACN,OAAO,GACP,OAAO,CAAC;AAEZ,UAAU,0BAA0B;IAClC,KAAK,CAAC,EAAE,wBAAwB,CAAC;IACjC,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,2BAA2B,CAAC,CAAC;CAC1D;AAiCD;;GAEG;AACH,eAAO,MAAM,oBAAoB,0BAAoB,CAAC;AACtD,eAAO,MAAM,2CAA2C,iDACd,CAAC;AAE3C,MAAM,WAAW,4BAA4B;IAC3C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,wBAAgB,+BAA+B,CAC7C,SAAS,GAAE,UAAU,CAAC,OAAO,MAAM,CAAC,YAAY,CAAyB,GACxE,4BAA4B,CAO9B;AAED;;GAEG;AACH,wBAAgB,kCAAkC,CAChD,OAAO,EAAE,OAAO,EAChB,YAAY,GAAE,4BAAgE,GAC7E,OAAO,CAcT;AAED;;GAEG;AACH,wBAAgB,+BAA+B,IAAI,aAAa,CAkD/D;AAED;;GAEG;AACH,wBAAgB,kCAAkC,IAAI,aAAa,CAIlE;AAED;;GAEG;AACH,wBAAgB,8BAA8B,CAC5C,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE,qCAAqC,GAC9C,IAAI,CAYN;AAED;;GAEG;AACH,wBAAgB,0BAA0B,CACxC,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE,0BAA0B,GACnC,IAAI,CASN"}
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
import * as Sentry from '@sentry/cloudflare';
|
|
2
|
+
import { configureSyncTelemetry, } from '@syncular/core';
|
|
3
|
+
import { createSentrySyncTelemetry } from './shared.js';
|
|
4
|
+
function toCountMetricOptions(options) {
|
|
5
|
+
if (!options?.attributes)
|
|
6
|
+
return undefined;
|
|
7
|
+
return { attributes: options.attributes };
|
|
8
|
+
}
|
|
9
|
+
function toValueMetricOptions(options) {
|
|
10
|
+
if (!options)
|
|
11
|
+
return undefined;
|
|
12
|
+
const hasAttributes = Boolean(options.attributes);
|
|
13
|
+
const hasUnit = Boolean(options.unit);
|
|
14
|
+
if (!hasAttributes && !hasUnit)
|
|
15
|
+
return undefined;
|
|
16
|
+
return {
|
|
17
|
+
attributes: options.attributes,
|
|
18
|
+
unit: options.unit,
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
function resolveCloudflareLogMethod(level) {
|
|
22
|
+
switch (level) {
|
|
23
|
+
case 'trace':
|
|
24
|
+
return Sentry.logger.trace ?? Sentry.logger.debug ?? Sentry.logger.info;
|
|
25
|
+
case 'debug':
|
|
26
|
+
return Sentry.logger.debug ?? Sentry.logger.info;
|
|
27
|
+
case 'info':
|
|
28
|
+
return Sentry.logger.info;
|
|
29
|
+
case 'warn':
|
|
30
|
+
return Sentry.logger.warn ?? Sentry.logger.info;
|
|
31
|
+
case 'error':
|
|
32
|
+
return Sentry.logger.error ?? Sentry.logger.warn ?? Sentry.logger.info;
|
|
33
|
+
case 'fatal':
|
|
34
|
+
return (Sentry.logger.fatal ??
|
|
35
|
+
Sentry.logger.error ??
|
|
36
|
+
Sentry.logger.warn ??
|
|
37
|
+
Sentry.logger.info);
|
|
38
|
+
default:
|
|
39
|
+
return Sentry.logger.info;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Re-export Cloudflare Sentry worker wrapper.
|
|
44
|
+
*/
|
|
45
|
+
export const withCloudflareSentry = Sentry.withSentry;
|
|
46
|
+
export const instrumentCloudflareDurableObjectWithSentry = Sentry.instrumentDurableObjectWithSentry;
|
|
47
|
+
/**
|
|
48
|
+
* Read current trace headers from the active Cloudflare Sentry scope.
|
|
49
|
+
*/
|
|
50
|
+
export function getCloudflareSentryTraceHeaders(traceData = Sentry.getTraceData()) {
|
|
51
|
+
const sentryTrace = traceData['sentry-trace']?.trim();
|
|
52
|
+
const baggage = traceData.baggage?.trim();
|
|
53
|
+
return {
|
|
54
|
+
...(sentryTrace ? { sentryTrace } : {}),
|
|
55
|
+
...(baggage ? { baggage } : {}),
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Clone a request and attach active Cloudflare trace headers when available.
|
|
60
|
+
*/
|
|
61
|
+
export function attachCloudflareSentryTraceHeaders(request, traceHeaders = getCloudflareSentryTraceHeaders()) {
|
|
62
|
+
if (!traceHeaders.sentryTrace && !traceHeaders.baggage) {
|
|
63
|
+
return request;
|
|
64
|
+
}
|
|
65
|
+
const headers = new Headers(request.headers);
|
|
66
|
+
if (traceHeaders.sentryTrace) {
|
|
67
|
+
headers.set('sentry-trace', traceHeaders.sentryTrace);
|
|
68
|
+
}
|
|
69
|
+
if (traceHeaders.baggage) {
|
|
70
|
+
headers.set('baggage', traceHeaders.baggage);
|
|
71
|
+
}
|
|
72
|
+
return new Request(request, { headers });
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Create a Syncular telemetry backend wired to `@sentry/cloudflare`.
|
|
76
|
+
*/
|
|
77
|
+
export function createCloudflareSentryTelemetry() {
|
|
78
|
+
return createSentrySyncTelemetry({
|
|
79
|
+
logger: Sentry.logger,
|
|
80
|
+
startSpan(options, callback) {
|
|
81
|
+
return Sentry.startSpan(options, (span) => callback({
|
|
82
|
+
setAttribute(name, value) {
|
|
83
|
+
span.setAttribute(name, value);
|
|
84
|
+
},
|
|
85
|
+
setAttributes(attributes) {
|
|
86
|
+
span.setAttributes(attributes);
|
|
87
|
+
},
|
|
88
|
+
setStatus(status) {
|
|
89
|
+
span.setStatus({
|
|
90
|
+
code: status === 'ok' ? 1 : 2,
|
|
91
|
+
});
|
|
92
|
+
},
|
|
93
|
+
}));
|
|
94
|
+
},
|
|
95
|
+
metrics: {
|
|
96
|
+
count(name, value, options) {
|
|
97
|
+
const metricOptions = toCountMetricOptions(options);
|
|
98
|
+
if (metricOptions) {
|
|
99
|
+
Sentry.metrics.count(name, value, metricOptions);
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
102
|
+
Sentry.metrics.count(name, value);
|
|
103
|
+
},
|
|
104
|
+
gauge(name, value, options) {
|
|
105
|
+
const metricOptions = toValueMetricOptions(options);
|
|
106
|
+
if (metricOptions) {
|
|
107
|
+
Sentry.metrics.gauge(name, value, metricOptions);
|
|
108
|
+
return;
|
|
109
|
+
}
|
|
110
|
+
Sentry.metrics.gauge(name, value);
|
|
111
|
+
},
|
|
112
|
+
distribution(name, value, options) {
|
|
113
|
+
const metricOptions = toValueMetricOptions(options);
|
|
114
|
+
if (metricOptions) {
|
|
115
|
+
Sentry.metrics.distribution(name, value, metricOptions);
|
|
116
|
+
return;
|
|
117
|
+
}
|
|
118
|
+
Sentry.metrics.distribution(name, value);
|
|
119
|
+
},
|
|
120
|
+
},
|
|
121
|
+
captureException(error) {
|
|
122
|
+
Sentry.captureException(error);
|
|
123
|
+
},
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Configure Syncular core telemetry to use the Cloudflare Sentry adapter.
|
|
128
|
+
*/
|
|
129
|
+
export function configureCloudflareSentryTelemetry() {
|
|
130
|
+
const telemetry = createCloudflareSentryTelemetry();
|
|
131
|
+
configureSyncTelemetry(telemetry);
|
|
132
|
+
return telemetry;
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Capture a worker message in Sentry with optional tags.
|
|
136
|
+
*/
|
|
137
|
+
export function captureCloudflareSentryMessage(message, options) {
|
|
138
|
+
if (!options?.tags || Object.keys(options.tags).length === 0) {
|
|
139
|
+
Sentry.captureMessage(message, options?.level);
|
|
140
|
+
return;
|
|
141
|
+
}
|
|
142
|
+
Sentry.withScope((scope) => {
|
|
143
|
+
for (const [name, value] of Object.entries(options.tags ?? {})) {
|
|
144
|
+
scope.setTag(name, value);
|
|
145
|
+
}
|
|
146
|
+
Sentry.captureMessage(message, options?.level);
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Emit a Cloudflare Sentry log entry.
|
|
151
|
+
*/
|
|
152
|
+
export function logCloudflareSentryMessage(message, options) {
|
|
153
|
+
const level = options?.level ?? 'info';
|
|
154
|
+
const logMethod = resolveCloudflareLogMethod(level);
|
|
155
|
+
if (!logMethod)
|
|
156
|
+
return;
|
|
157
|
+
if (!options?.attributes || Object.keys(options.attributes).length === 0) {
|
|
158
|
+
logMethod(message);
|
|
159
|
+
return;
|
|
160
|
+
}
|
|
161
|
+
logMethod(message, options.attributes);
|
|
162
|
+
}
|
|
163
|
+
//# sourceMappingURL=cloudflare.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cloudflare.js","sourceRoot":"","sources":["../src/cloudflare.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAC;AAC1B,cAAc,cAAc,CAAC;AAC7B,cAAc,UAAU,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAC;AAC1B,cAAc,cAAc,CAAC;AAC7B,cAAc,UAAU,CAAC"}
|
package/dist/shared.d.ts
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { SyncMetricOptions, SyncSpanOptions, SyncTelemetry, SyncTelemetryAttributes, SyncTelemetryAttributeValue } from '@syncular/core';
|
|
2
|
+
interface SentryLoggerAdapter {
|
|
3
|
+
trace?(message: string, attributes?: Record<string, unknown>): void;
|
|
4
|
+
debug?(message: string, attributes?: Record<string, unknown>): void;
|
|
5
|
+
info?(message: string, attributes?: Record<string, unknown>): void;
|
|
6
|
+
warn?(message: string, attributes?: Record<string, unknown>): void;
|
|
7
|
+
error?(message: string, attributes?: Record<string, unknown>): void;
|
|
8
|
+
fatal?(message: string, attributes?: Record<string, unknown>): void;
|
|
9
|
+
}
|
|
10
|
+
interface SentrySpanAdapter {
|
|
11
|
+
setAttribute?(name: string, value: SyncTelemetryAttributeValue): void;
|
|
12
|
+
setAttributes?(attributes: SyncTelemetryAttributes): void;
|
|
13
|
+
setStatus?(status: 'ok' | 'error' | string): void;
|
|
14
|
+
}
|
|
15
|
+
interface SentryMetricsAdapter {
|
|
16
|
+
count?(name: string, value: number, options?: SyncMetricOptions): void;
|
|
17
|
+
gauge?(name: string, value: number, options?: SyncMetricOptions): void;
|
|
18
|
+
distribution?(name: string, value: number, options?: SyncMetricOptions): void;
|
|
19
|
+
}
|
|
20
|
+
export interface SentryTelemetryAdapter {
|
|
21
|
+
logger?: SentryLoggerAdapter;
|
|
22
|
+
startSpan?<T>(options: SyncSpanOptions, callback: (span: SentrySpanAdapter) => T): T;
|
|
23
|
+
metrics?: SentryMetricsAdapter;
|
|
24
|
+
captureException?(error: unknown): void;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Create a Syncular telemetry adapter backed by Sentry primitives.
|
|
28
|
+
*/
|
|
29
|
+
export declare function createSentrySyncTelemetry(adapter: SentryTelemetryAdapter): SyncTelemetry;
|
|
30
|
+
export {};
|
|
31
|
+
//# sourceMappingURL=shared.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../src/shared.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,iBAAiB,EAGjB,eAAe,EACf,aAAa,EACb,uBAAuB,EACvB,2BAA2B,EAI5B,MAAM,gBAAgB,CAAC;AAExB,UAAU,mBAAmB;IAC3B,KAAK,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IACpE,KAAK,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IACpE,IAAI,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IACnE,IAAI,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IACnE,KAAK,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IACpE,KAAK,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;CACrE;AAED,UAAU,iBAAiB;IACzB,YAAY,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,2BAA2B,GAAG,IAAI,CAAC;IACtE,aAAa,CAAC,CAAC,UAAU,EAAE,uBAAuB,GAAG,IAAI,CAAC;IAC1D,SAAS,CAAC,CAAC,MAAM,EAAE,IAAI,GAAG,OAAO,GAAG,MAAM,GAAG,IAAI,CAAC;CACnD;AAED,UAAU,oBAAoB;IAC5B,KAAK,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,iBAAiB,GAAG,IAAI,CAAC;IACvE,KAAK,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,iBAAiB,GAAG,IAAI,CAAC;IACvE,YAAY,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,iBAAiB,GAAG,IAAI,CAAC;CAC/E;AAED,MAAM,WAAW,sBAAsB;IACrC,MAAM,CAAC,EAAE,mBAAmB,CAAC;IAC7B,SAAS,CAAC,CAAC,CAAC,EACV,OAAO,EAAE,eAAe,EACxB,QAAQ,EAAE,CAAC,IAAI,EAAE,iBAAiB,KAAK,CAAC,GACvC,CAAC,CAAC;IACL,OAAO,CAAC,EAAE,oBAAoB,CAAC;IAC/B,gBAAgB,CAAC,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI,CAAC;CACzC;AAyHD;;GAEG;AACH,wBAAgB,yBAAyB,CACvC,OAAO,EAAE,sBAAsB,GAC9B,aAAa,CA+Bf"}
|
package/dist/shared.js
ADDED
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
const noopSpan = {
|
|
2
|
+
setAttribute() { },
|
|
3
|
+
setAttributes() { },
|
|
4
|
+
setStatus() { },
|
|
5
|
+
};
|
|
6
|
+
function resolveLogLevel(event) {
|
|
7
|
+
if (event.level)
|
|
8
|
+
return event.level;
|
|
9
|
+
return event.error ? 'error' : 'info';
|
|
10
|
+
}
|
|
11
|
+
function resolveLogMethod(logger, level) {
|
|
12
|
+
if (!logger)
|
|
13
|
+
return null;
|
|
14
|
+
switch (level) {
|
|
15
|
+
case 'trace':
|
|
16
|
+
return logger.trace ?? logger.debug ?? logger.info ?? null;
|
|
17
|
+
case 'debug':
|
|
18
|
+
return logger.debug ?? logger.info ?? null;
|
|
19
|
+
case 'info':
|
|
20
|
+
return logger.info ?? null;
|
|
21
|
+
case 'warn':
|
|
22
|
+
return logger.warn ?? logger.info ?? null;
|
|
23
|
+
case 'error':
|
|
24
|
+
return logger.error ?? logger.warn ?? logger.info ?? null;
|
|
25
|
+
case 'fatal':
|
|
26
|
+
return logger.fatal ?? logger.error ?? logger.warn ?? logger.info ?? null;
|
|
27
|
+
default:
|
|
28
|
+
return logger.info ?? null;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
function toSpan(span) {
|
|
32
|
+
return {
|
|
33
|
+
setAttribute(name, value) {
|
|
34
|
+
span.setAttribute?.(name, value);
|
|
35
|
+
},
|
|
36
|
+
setAttributes(attributes) {
|
|
37
|
+
if (span.setAttributes) {
|
|
38
|
+
span.setAttributes(attributes);
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
for (const [key, value] of Object.entries(attributes)) {
|
|
42
|
+
span.setAttribute?.(key, value);
|
|
43
|
+
}
|
|
44
|
+
},
|
|
45
|
+
setStatus(status) {
|
|
46
|
+
span.setStatus?.(status);
|
|
47
|
+
},
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
function toLogAttributeValue(value) {
|
|
51
|
+
if (typeof value === 'string')
|
|
52
|
+
return value;
|
|
53
|
+
if (typeof value === 'number') {
|
|
54
|
+
return Number.isFinite(value) ? value : undefined;
|
|
55
|
+
}
|
|
56
|
+
if (typeof value === 'boolean')
|
|
57
|
+
return value;
|
|
58
|
+
if (typeof value === 'bigint') {
|
|
59
|
+
const asNumber = Number(value);
|
|
60
|
+
if (Number.isFinite(asNumber))
|
|
61
|
+
return asNumber;
|
|
62
|
+
return value.toString();
|
|
63
|
+
}
|
|
64
|
+
if (value instanceof Date)
|
|
65
|
+
return value.toISOString();
|
|
66
|
+
if (value === null || value === undefined)
|
|
67
|
+
return undefined;
|
|
68
|
+
if (Array.isArray(value) || typeof value === 'object') {
|
|
69
|
+
try {
|
|
70
|
+
return JSON.stringify(value);
|
|
71
|
+
}
|
|
72
|
+
catch {
|
|
73
|
+
return String(value);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
return String(value);
|
|
77
|
+
}
|
|
78
|
+
function sanitizeLogAttributes(attributes) {
|
|
79
|
+
const sanitized = {};
|
|
80
|
+
for (const [name, value] of Object.entries(attributes)) {
|
|
81
|
+
const normalized = toLogAttributeValue(value);
|
|
82
|
+
if (normalized !== undefined) {
|
|
83
|
+
sanitized[name] = normalized;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
return Object.keys(sanitized).length > 0 ? sanitized : null;
|
|
87
|
+
}
|
|
88
|
+
function createTracer(adapter) {
|
|
89
|
+
return {
|
|
90
|
+
startSpan(options, callback) {
|
|
91
|
+
if (!adapter.startSpan)
|
|
92
|
+
return callback(noopSpan);
|
|
93
|
+
return adapter.startSpan(options, (span) => callback(toSpan(span)));
|
|
94
|
+
},
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
function createMetrics(adapter) {
|
|
98
|
+
return {
|
|
99
|
+
count(name, value, options) {
|
|
100
|
+
adapter.metrics?.count?.(name, value ?? 1, options);
|
|
101
|
+
},
|
|
102
|
+
gauge(name, value, options) {
|
|
103
|
+
adapter.metrics?.gauge?.(name, value, options);
|
|
104
|
+
},
|
|
105
|
+
distribution(name, value, options) {
|
|
106
|
+
adapter.metrics?.distribution?.(name, value, options);
|
|
107
|
+
},
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Create a Syncular telemetry adapter backed by Sentry primitives.
|
|
112
|
+
*/
|
|
113
|
+
export function createSentrySyncTelemetry(adapter) {
|
|
114
|
+
return {
|
|
115
|
+
log(event) {
|
|
116
|
+
const level = resolveLogLevel(event);
|
|
117
|
+
const { event: message, ...attributes } = event;
|
|
118
|
+
const logMethod = resolveLogMethod(adapter.logger, level);
|
|
119
|
+
if (!logMethod)
|
|
120
|
+
return;
|
|
121
|
+
const sanitizedAttributes = sanitizeLogAttributes(attributes);
|
|
122
|
+
if (!sanitizedAttributes) {
|
|
123
|
+
logMethod(message);
|
|
124
|
+
return;
|
|
125
|
+
}
|
|
126
|
+
logMethod(message, sanitizedAttributes);
|
|
127
|
+
},
|
|
128
|
+
tracer: createTracer(adapter),
|
|
129
|
+
metrics: createMetrics(adapter),
|
|
130
|
+
captureException(error, context) {
|
|
131
|
+
adapter.captureException?.(error);
|
|
132
|
+
if (!context)
|
|
133
|
+
return;
|
|
134
|
+
const logMethod = resolveLogMethod(adapter.logger, 'error') ??
|
|
135
|
+
resolveLogMethod(adapter.logger, 'info');
|
|
136
|
+
if (!logMethod)
|
|
137
|
+
return;
|
|
138
|
+
const sanitizedContext = sanitizeLogAttributes(context);
|
|
139
|
+
if (!sanitizedContext) {
|
|
140
|
+
logMethod('sync.exception.context');
|
|
141
|
+
return;
|
|
142
|
+
}
|
|
143
|
+
logMethod('sync.exception.context', sanitizedContext);
|
|
144
|
+
},
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
//# sourceMappingURL=shared.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shared.js","sourceRoot":"","sources":["../src/shared.ts"],"names":[],"mappings":"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"}
|