@syncular/observability-sentry 0.0.1-98 → 0.0.2-126
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 +28 -0
- package/dist/cloudflare.d.ts +13 -0
- package/dist/cloudflare.d.ts.map +1 -1
- package/dist/cloudflare.js +28 -0
- package/dist/cloudflare.js.map +1 -1
- package/package.json +2 -2
- package/src/cloudflare.test.ts +49 -0
- package/src/cloudflare.ts +43 -0
package/README.md
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
# @syncular/observability-sentry
|
|
2
|
+
|
|
3
|
+
Sentry adapter for Syncular telemetry (`SyncTelemetry`): logs, traces, metrics, and exceptions.
|
|
4
|
+
|
|
5
|
+
## Install
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install @syncular/observability-sentry
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## Usage
|
|
12
|
+
|
|
13
|
+
```ts
|
|
14
|
+
import { createBrowserSentryTelemetry } from '@syncular/observability-sentry';
|
|
15
|
+
|
|
16
|
+
const telemetry = createBrowserSentryTelemetry();
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
## Documentation
|
|
20
|
+
|
|
21
|
+
- Observability guide: https://syncular.dev/docs/build/observability
|
|
22
|
+
|
|
23
|
+
## Links
|
|
24
|
+
|
|
25
|
+
- GitHub: https://github.com/syncular/syncular
|
|
26
|
+
- Issues: https://github.com/syncular/syncular/issues
|
|
27
|
+
|
|
28
|
+
> Status: Alpha. APIs and storage layouts may change between releases.
|
package/dist/cloudflare.d.ts
CHANGED
|
@@ -14,6 +14,19 @@ interface CloudflareSentryLogOptions {
|
|
|
14
14
|
* Re-export Cloudflare Sentry worker wrapper.
|
|
15
15
|
*/
|
|
16
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;
|
|
17
30
|
/**
|
|
18
31
|
* Create a Syncular telemetry backend wired to `@sentry/cloudflare`.
|
|
19
32
|
*/
|
package/dist/cloudflare.d.ts.map
CHANGED
|
@@ -1 +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;
|
|
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"}
|
package/dist/cloudflare.js
CHANGED
|
@@ -43,6 +43,34 @@ function resolveCloudflareLogMethod(level) {
|
|
|
43
43
|
* Re-export Cloudflare Sentry worker wrapper.
|
|
44
44
|
*/
|
|
45
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
|
+
}
|
|
46
74
|
/**
|
|
47
75
|
* Create a Syncular telemetry backend wired to `@sentry/cloudflare`.
|
|
48
76
|
*/
|
package/dist/cloudflare.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cloudflare.js","sourceRoot":"","sources":["../src/cloudflare.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,oBAAoB,CAAC;AAC7C,OAAO,EACL,sBAAsB,GAIvB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,yBAAyB,EAAE,MAAM,UAAU,CAAC;AAErD,SAAS,oBAAoB,CAC3B,OAA2B,EAC6B;IACxD,IAAI,CAAC,OAAO,EAAE,UAAU;QAAE,OAAO,SAAS,CAAC;IAC3C,OAAO,EAAE,UAAU,EAAE,OAAO,CAAC,UAAU,EAAE,CAAC;AAAA,CAC3C;AAED,SAAS,oBAAoB,CAC3B,OAA2B,EAC6B;IACxD,IAAI,CAAC,OAAO;QAAE,OAAO,SAAS,CAAC;IAC/B,MAAM,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IAClD,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACtC,IAAI,CAAC,aAAa,IAAI,CAAC,OAAO;QAAE,OAAO,SAAS,CAAC;IACjD,OAAO;QACL,UAAU,EAAE,OAAO,CAAC,UAAU;QAC9B,IAAI,EAAE,OAAO,CAAC,IAAI;KACnB,CAAC;AAAA,CACH;AAwBD,SAAS,0BAA0B,CACjC,KAA+B,EAMxB;IACP,QAAQ,KAAK,EAAE,CAAC;QACd,KAAK,OAAO;YACV,OAAO,MAAM,CAAC,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC;QAC1E,KAAK,OAAO;YACV,OAAO,MAAM,CAAC,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC;QACnD,KAAK,MAAM;YACT,OAAO,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC;QAC5B,KAAK,MAAM;YACT,OAAO,MAAM,CAAC,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC;QAClD,KAAK,OAAO;YACV,OAAO,MAAM,CAAC,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC;QACzE,KAAK,OAAO;YACV,OAAO,CACL,MAAM,CAAC,MAAM,CAAC,KAAK;gBACnB,MAAM,CAAC,MAAM,CAAC,KAAK;gBACnB,MAAM,CAAC,MAAM,CAAC,IAAI;gBAClB,MAAM,CAAC,MAAM,CAAC,IAAI,CACnB,CAAC;QACJ;YACE,OAAO,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC;IAC9B,CAAC;AAAA,CACF;AAED;;GAEG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG,MAAM,CAAC,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"cloudflare.js","sourceRoot":"","sources":["../src/cloudflare.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@syncular/observability-sentry",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.2-126",
|
|
4
4
|
"description": "Sentry adapters for Syncular telemetry",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "Benjamin Kniffler",
|
|
@@ -43,7 +43,7 @@
|
|
|
43
43
|
"dependencies": {
|
|
44
44
|
"@sentry/cloudflare": "^10.38.0",
|
|
45
45
|
"@sentry/react": "^10.38.0",
|
|
46
|
-
"@syncular/core": "0.0.
|
|
46
|
+
"@syncular/core": "0.0.2-126"
|
|
47
47
|
},
|
|
48
48
|
"devDependencies": {
|
|
49
49
|
"@syncular/config": "0.0.0"
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { describe, expect, test } from 'bun:test';
|
|
2
|
+
import {
|
|
3
|
+
attachCloudflareSentryTraceHeaders,
|
|
4
|
+
getCloudflareSentryTraceHeaders,
|
|
5
|
+
} from './cloudflare';
|
|
6
|
+
|
|
7
|
+
describe('cloudflare tracing helpers', () => {
|
|
8
|
+
test('extracts trace headers from sentry trace data', () => {
|
|
9
|
+
expect(
|
|
10
|
+
getCloudflareSentryTraceHeaders({
|
|
11
|
+
'sentry-trace': 'trace-id-span-id-1',
|
|
12
|
+
baggage: 'sample_rate=1',
|
|
13
|
+
})
|
|
14
|
+
).toEqual({
|
|
15
|
+
sentryTrace: 'trace-id-span-id-1',
|
|
16
|
+
baggage: 'sample_rate=1',
|
|
17
|
+
});
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
test('returns original request when trace headers are missing', () => {
|
|
21
|
+
const request = new Request('https://example.com/api/sync', {
|
|
22
|
+
method: 'POST',
|
|
23
|
+
headers: { 'x-custom': '1' },
|
|
24
|
+
body: '{}',
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
const result = attachCloudflareSentryTraceHeaders(request, {});
|
|
28
|
+
expect(result).toBe(request);
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
test('adds sentry trace headers to cloned request', async () => {
|
|
32
|
+
const request = new Request('https://example.com/api/sync', {
|
|
33
|
+
method: 'POST',
|
|
34
|
+
headers: { 'x-custom': '1' },
|
|
35
|
+
body: '{"ok":true}',
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
const result = attachCloudflareSentryTraceHeaders(request, {
|
|
39
|
+
sentryTrace: 'trace-id-span-id-1',
|
|
40
|
+
baggage: 'sample_rate=1',
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
expect(result).not.toBe(request);
|
|
44
|
+
expect(result.headers.get('x-custom')).toBe('1');
|
|
45
|
+
expect(result.headers.get('sentry-trace')).toBe('trace-id-span-id-1');
|
|
46
|
+
expect(result.headers.get('baggage')).toBe('sample_rate=1');
|
|
47
|
+
expect(await result.text()).toBe('{"ok":true}');
|
|
48
|
+
});
|
|
49
|
+
});
|
package/src/cloudflare.ts
CHANGED
|
@@ -84,6 +84,49 @@ function resolveCloudflareLogMethod(
|
|
|
84
84
|
* Re-export Cloudflare Sentry worker wrapper.
|
|
85
85
|
*/
|
|
86
86
|
export const withCloudflareSentry = Sentry.withSentry;
|
|
87
|
+
export const instrumentCloudflareDurableObjectWithSentry =
|
|
88
|
+
Sentry.instrumentDurableObjectWithSentry;
|
|
89
|
+
|
|
90
|
+
export interface CloudflareSentryTraceHeaders {
|
|
91
|
+
sentryTrace?: string;
|
|
92
|
+
baggage?: string;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
/**
|
|
96
|
+
* Read current trace headers from the active Cloudflare Sentry scope.
|
|
97
|
+
*/
|
|
98
|
+
export function getCloudflareSentryTraceHeaders(
|
|
99
|
+
traceData: ReturnType<typeof Sentry.getTraceData> = Sentry.getTraceData()
|
|
100
|
+
): CloudflareSentryTraceHeaders {
|
|
101
|
+
const sentryTrace = traceData['sentry-trace']?.trim();
|
|
102
|
+
const baggage = traceData.baggage?.trim();
|
|
103
|
+
return {
|
|
104
|
+
...(sentryTrace ? { sentryTrace } : {}),
|
|
105
|
+
...(baggage ? { baggage } : {}),
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
/**
|
|
110
|
+
* Clone a request and attach active Cloudflare trace headers when available.
|
|
111
|
+
*/
|
|
112
|
+
export function attachCloudflareSentryTraceHeaders(
|
|
113
|
+
request: Request,
|
|
114
|
+
traceHeaders: CloudflareSentryTraceHeaders = getCloudflareSentryTraceHeaders()
|
|
115
|
+
): Request {
|
|
116
|
+
if (!traceHeaders.sentryTrace && !traceHeaders.baggage) {
|
|
117
|
+
return request;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
const headers = new Headers(request.headers);
|
|
121
|
+
if (traceHeaders.sentryTrace) {
|
|
122
|
+
headers.set('sentry-trace', traceHeaders.sentryTrace);
|
|
123
|
+
}
|
|
124
|
+
if (traceHeaders.baggage) {
|
|
125
|
+
headers.set('baggage', traceHeaders.baggage);
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
return new Request(request, { headers });
|
|
129
|
+
}
|
|
87
130
|
|
|
88
131
|
/**
|
|
89
132
|
* Create a Syncular telemetry backend wired to `@sentry/cloudflare`.
|