@dxos/observability 0.4.7-next.f4b92be → 0.4.7

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.
Files changed (58) hide show
  1. package/dist/lib/browser/{chunk-XF67HMEA.mjs → chunk-3JYXUPHN.mjs} +149 -26
  2. package/dist/lib/browser/chunk-3JYXUPHN.mjs.map +7 -0
  3. package/dist/lib/browser/{chunk-6KUJPLEH.mjs → chunk-G5DKURIM.mjs} +38 -16
  4. package/dist/lib/browser/chunk-G5DKURIM.mjs.map +7 -0
  5. package/dist/lib/browser/index.mjs +2 -1
  6. package/dist/lib/browser/meta.json +1 -1
  7. package/dist/lib/browser/observability-HDPP5QG7.mjs +8 -0
  8. package/dist/lib/browser/segment/index.mjs +1 -1
  9. package/dist/lib/browser/sentry/index.mjs +7 -5
  10. package/dist/lib/node/{chunk-FSAOBKO2.cjs → chunk-VYXPK6C2.cjs} +38 -51
  11. package/dist/lib/node/chunk-VYXPK6C2.cjs.map +7 -0
  12. package/dist/lib/node/{chunk-T2S7C5J2.cjs → chunk-Z5MY7GRJ.cjs} +145 -29
  13. package/dist/lib/node/chunk-Z5MY7GRJ.cjs.map +7 -0
  14. package/dist/lib/node/index.cjs +16 -15
  15. package/dist/lib/node/index.cjs.map +2 -2
  16. package/dist/lib/node/meta.json +1 -1
  17. package/dist/lib/node/{observability-M64E2QBA.cjs → observability-R327UKSF.cjs} +7 -6
  18. package/dist/lib/node/observability-R327UKSF.cjs.map +7 -0
  19. package/dist/lib/node/segment/index.cjs +2 -2
  20. package/dist/lib/node/sentry/index.cjs +13 -13
  21. package/dist/lib/node/sentry/index.cjs.map +1 -1
  22. package/dist/types/src/helpers/browser-observability.js.map +1 -1
  23. package/dist/types/src/helpers/common.js.map +1 -1
  24. package/dist/types/src/helpers/node-observability.d.ts.map +1 -1
  25. package/dist/types/src/helpers/node-observability.js +0 -1
  26. package/dist/types/src/helpers/node-observability.js.map +1 -1
  27. package/dist/types/src/observability.d.ts +0 -2
  28. package/dist/types/src/observability.d.ts.map +1 -1
  29. package/dist/types/src/observability.js +6 -6
  30. package/dist/types/src/observability.js.map +1 -1
  31. package/dist/types/src/segment/browser.js.map +1 -1
  32. package/dist/types/src/segment/node.js.map +1 -1
  33. package/dist/types/src/sentry/browser.d.ts +3 -2
  34. package/dist/types/src/sentry/browser.d.ts.map +1 -1
  35. package/dist/types/src/sentry/browser.js +15 -5
  36. package/dist/types/src/sentry/browser.js.map +1 -1
  37. package/dist/types/src/sentry/node.d.ts +3 -4
  38. package/dist/types/src/sentry/node.d.ts.map +1 -1
  39. package/dist/types/src/sentry/node.js +11 -43
  40. package/dist/types/src/sentry/node.js.map +1 -1
  41. package/dist/types/src/sentry/sentry-log-processor.d.ts +9 -0
  42. package/dist/types/src/sentry/sentry-log-processor.d.ts.map +1 -0
  43. package/dist/types/src/sentry/sentry-log-processor.js +133 -0
  44. package/dist/types/src/sentry/sentry-log-processor.js.map +1 -0
  45. package/dist/types/src/sentry/tracing.js.map +1 -1
  46. package/package.json +14 -14
  47. package/src/helpers/node-observability.ts +0 -1
  48. package/src/observability.ts +8 -7
  49. package/src/sentry/browser.ts +17 -4
  50. package/src/sentry/node.ts +11 -48
  51. package/src/sentry/sentry-log-processor.ts +144 -0
  52. package/dist/lib/browser/chunk-6KUJPLEH.mjs.map +0 -7
  53. package/dist/lib/browser/chunk-XF67HMEA.mjs.map +0 -7
  54. package/dist/lib/browser/observability-MK4LFDOW.mjs +0 -7
  55. package/dist/lib/node/chunk-FSAOBKO2.cjs.map +0 -7
  56. package/dist/lib/node/chunk-T2S7C5J2.cjs.map +0 -7
  57. package/dist/lib/node/observability-M64E2QBA.cjs.map +0 -7
  58. /package/dist/lib/browser/{observability-MK4LFDOW.mjs.map → observability-HDPP5QG7.mjs.map} +0 -0
@@ -26,7 +26,7 @@ var __importStar = (this && this.__importStar) || function (mod) {
26
26
  return result;
27
27
  };
28
28
  Object.defineProperty(exports, "__esModule", { value: true });
29
- exports.SENTRY_LOG_PROCESSOR = exports.enableSentryLogProcessor = exports.captureException = exports.addBreadcrumb = exports.init = exports.setUser = exports.setTags = exports.setTag = void 0;
29
+ exports.withScope = exports.captureMessage = exports.captureException = exports.addBreadcrumb = exports.init = exports.setUser = exports.setTags = exports.setTag = void 0;
30
30
  const integrations_1 = require("@sentry/integrations");
31
31
  const node_1 = require("@sentry/node");
32
32
  const log_1 = require("@dxos/log");
@@ -121,49 +121,17 @@ const captureException = (exception, captureContext) => {
121
121
  }
122
122
  };
123
123
  exports.captureException = captureException;
124
- // TODO(nf): move to log package as a first-class processor.
125
- const enableSentryLogProcessor = (filter) => {
126
- log_1.log.runtimeConfig.processors.push(exports.SENTRY_LOG_PROCESSOR);
127
- };
128
- exports.enableSentryLogProcessor = enableSentryLogProcessor;
129
- const SENTRY_LOG_PROCESSOR = (config, entry) => {
130
- const { message, level, meta, error } = entry;
131
- if (!(0, log_1.shouldLog)(entry, config.captureFilters)) {
132
- return;
133
- }
134
- // TODO(nf): add rate limiting to avoid spamming Sentry/consuming excessive quota.
135
- (0, node_1.withScope)((scope) => {
136
- scope.setLevel(convertLevel(level));
137
- scope.setContext('dxoslog', entry.context);
138
- if (meta) {
139
- scope.setTransactionName(`${getRelativeFilename(meta.F)}:${meta.L}`);
140
- }
141
- // Is this ever used?
142
- if (error) {
143
- scope.setExtra('message', message);
144
- return (0, node_1.captureException)(error);
145
- }
146
- (0, node_1.captureMessage)(message);
147
- });
148
- };
149
- exports.SENTRY_LOG_PROCESSOR = SENTRY_LOG_PROCESSOR;
150
- const convertLevel = (level) => {
151
- if (level === log_1.LogLevel.TRACE) {
152
- return 'debug';
153
- }
154
- if (level === log_1.LogLevel.WARN) {
155
- return 'warning';
124
+ const captureMessage = (exception, captureContext) => {
125
+ try {
126
+ const eventId = (0, node_1.captureMessage)(exception, captureContext);
127
+ (0, log_1.log)('capture message', { exception, eventId, captureContext });
128
+ return eventId;
156
129
  }
157
- return log_1.LogLevel[level].toLowerCase();
158
- };
159
- const getRelativeFilename = (filename) => {
160
- // TODO(burdon): Hack uses "packages" as an anchor (pre-parse NX?)
161
- // Including `packages/` part of the path so that excluded paths (e.g. from dist) are clickable in vscode.
162
- const match = filename.match(/.+\/(packages\/.+\/.+)/);
163
- if (match) {
164
- const [, filePath] = match;
165
- return filePath;
130
+ catch (err) {
131
+ log_1.log.catch('Failed to capture message', err);
132
+ return 'unknown';
166
133
  }
167
- return filename;
168
134
  };
135
+ exports.captureMessage = captureMessage;
136
+ exports.withScope = node_1.withScope;
169
137
  //# sourceMappingURL=node.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"node.js","sourceRoot":"","sources":["../../../../src/sentry/node.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"node.js","sourceRoot":"","sources":["../../../../src/sentry/node.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import type { Event } from '@sentry/types';
2
+ import { type LogProcessor } from '@dxos/log';
3
+ export declare class SentryLogProcessor {
4
+ private _breadcrumbs;
5
+ readonly logProcessor: LogProcessor;
6
+ addLogBreadcrumbsTo(event: Event): void;
7
+ private _addBreadcrumb;
8
+ }
9
+ //# sourceMappingURL=sentry-log-processor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sentry-log-processor.d.ts","sourceRoot":"","sources":["../../../../src/sentry/sentry-log-processor.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAA6B,KAAK,EAAE,MAAM,eAAe,CAAC;AAEtE,OAAO,EAA2C,KAAK,YAAY,EAAa,MAAM,WAAW,CAAC;AAOlG,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,YAAY,CAAuD;IAE3E,SAAgB,YAAY,EAAE,YAAY,CA+CxC;IAEK,mBAAmB,CAAC,KAAK,EAAE,KAAK;IAavC,OAAO,CAAC,cAAc;CA8BvB"}
@@ -0,0 +1,133 @@
1
+ "use strict";
2
+ //
3
+ // Copyright 2024 DXOS.org
4
+ //
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.SentryLogProcessor = void 0;
7
+ const log_1 = require("@dxos/log");
8
+ const util_1 = require("@dxos/util");
9
+ const _1 = require("./");
10
+ const MAX_LOG_BREADCRUMBS = 80;
11
+ class SentryLogProcessor {
12
+ constructor() {
13
+ this._breadcrumbs = new util_1.CircularBuffer(MAX_LOG_BREADCRUMBS);
14
+ this.logProcessor = (config, entry) => {
15
+ const { level, meta, error } = entry;
16
+ if (!(0, log_1.shouldLog)(entry, config.captureFilters)) {
17
+ return;
18
+ }
19
+ if (entry.level !== log_1.LogLevel.WARN && entry.level !== log_1.LogLevel.ERROR) {
20
+ return;
21
+ }
22
+ // TODO(nf): add rate limiting to avoid spamming Sentry/consuming excessive quota.
23
+ (0, _1.withScope)((scope) => {
24
+ var _a, _b, _c, _d, _e, _f;
25
+ const severity = convertLevel(level);
26
+ scope.setLevel(severity);
27
+ scope.setContext('dxoslog', (_a = entry.context) !== null && _a !== void 0 ? _a : null);
28
+ if (meta) {
29
+ scope.setTag('transaction', `${getRelativeFilename(meta.F)}:${meta.L}`);
30
+ if ((_b = meta.S) === null || _b === void 0 ? void 0 : _b.hostSessionId) {
31
+ scope.setTags({
32
+ service_host_issue: true,
33
+ service_host_session: (_c = meta.S) === null || _c === void 0 ? void 0 : _c.hostSessionId,
34
+ });
35
+ }
36
+ if (!Number.isNaN((_d = meta.S) === null || _d === void 0 ? void 0 : _d.uptimeSeconds)) {
37
+ scope.setExtra('uptime_seconds', (_e = meta.S) === null || _e === void 0 ? void 0 : _e.uptimeSeconds);
38
+ }
39
+ }
40
+ const extendedMessage = formatMessageForSentry(entry);
41
+ let capturedError = error;
42
+ if (capturedError == null && entry.level === log_1.LogLevel.ERROR) {
43
+ capturedError = Object.values((_f = entry.context) !== null && _f !== void 0 ? _f : {}).find((v) => v instanceof Error);
44
+ }
45
+ if (capturedError) {
46
+ const isMessageDifferentFromStackTrace = error == null;
47
+ if (isMessageDifferentFromStackTrace) {
48
+ scope.setExtra('message', extendedMessage);
49
+ }
50
+ const eventId = (0, _1.captureException)(capturedError);
51
+ this._addBreadcrumb(eventId, extendedMessage, severity, entry.context);
52
+ return;
53
+ }
54
+ scope.setFingerprint([entry.message]);
55
+ const eventId = (0, _1.captureMessage)(extendedMessage);
56
+ this._addBreadcrumb(eventId, extendedMessage, severity, entry.context);
57
+ });
58
+ };
59
+ }
60
+ addLogBreadcrumbsTo(event) {
61
+ var _a;
62
+ (_a = event.breadcrumbs) !== null && _a !== void 0 ? _a : (event.breadcrumbs = []);
63
+ for (const breadcrumb of this._breadcrumbs) {
64
+ event.breadcrumbs.push(breadcrumb);
65
+ }
66
+ event.breadcrumbs.sort((b1, b2) => {
67
+ if (b1.timestamp === undefined || b2.timestamp === undefined) {
68
+ return b1.timestamp === b2.timestamp ? 0 : b1.timestamp === undefined ? -1 : 1;
69
+ }
70
+ return b1.timestamp - b2.timestamp;
71
+ });
72
+ }
73
+ _addBreadcrumb(eventId, message, severity, context) {
74
+ var _a, _b, _c, _d, _e;
75
+ const breadcrumb = {
76
+ type: 'console',
77
+ level: severity,
78
+ event_id: eventId,
79
+ category: 'log',
80
+ message,
81
+ data: context,
82
+ timestamp: Math.floor(Date.now() / 1000),
83
+ };
84
+ const lastRecorded = this._breadcrumbs.getLast();
85
+ if (lastRecorded && lastRecorded.message === breadcrumb.message) {
86
+ const firstBreadcrumbData = (_c = (_b = (_a = lastRecorded.data) === null || _a === void 0 ? void 0 : _a.firstBreadcrumbData) !== null && _b !== void 0 ? _b : lastRecorded.data) !== null && _c !== void 0 ? _c : {};
87
+ const mergedBreadcrumbCount = Number.isNaN((_d = lastRecorded.data) === null || _d === void 0 ? void 0 : _d.mergedBreadcrumbCount)
88
+ ? 1
89
+ : Number((_e = lastRecorded.data) === null || _e === void 0 ? void 0 : _e.mergedBreadcrumbCount);
90
+ lastRecorded.data = {
91
+ mergedBreadcrumbCount: mergedBreadcrumbCount + 1,
92
+ firstBreadcrumbData,
93
+ lastBreadcrumbData: breadcrumb.data,
94
+ };
95
+ return;
96
+ }
97
+ this._breadcrumbs.push(breadcrumb);
98
+ }
99
+ }
100
+ exports.SentryLogProcessor = SentryLogProcessor;
101
+ const formatMessageForSentry = (entry) => {
102
+ var _a, _b, _c, _d;
103
+ let scopePrefix;
104
+ if ((_a = entry.meta) === null || _a === void 0 ? void 0 : _a.S) {
105
+ const scope = (_b = entry.meta) === null || _b === void 0 ? void 0 : _b.S;
106
+ scopePrefix = scope.name || (0, util_1.getDebugName)(scope);
107
+ }
108
+ if (scopePrefix == null) {
109
+ return entry.message;
110
+ }
111
+ const workerPrefix = ((_d = (_c = entry.meta) === null || _c === void 0 ? void 0 : _c.S) === null || _d === void 0 ? void 0 : _d.hostSessionId) ? '[worker] ' : '';
112
+ return `${workerPrefix}${scopePrefix} ${entry.message}`;
113
+ };
114
+ const convertLevel = (level) => {
115
+ if (level === log_1.LogLevel.TRACE) {
116
+ return 'debug';
117
+ }
118
+ if (level === log_1.LogLevel.WARN) {
119
+ return 'warning';
120
+ }
121
+ return log_1.LogLevel[level].toLowerCase();
122
+ };
123
+ const getRelativeFilename = (filename) => {
124
+ // TODO(burdon): Hack uses "packages" as an anchor (pre-parse NX?)
125
+ // Including `packages/` part of the path so that excluded paths (e.g. from dist) are clickable in vscode.
126
+ const match = filename.match(/.+\/(packages\/.+\/.+)/);
127
+ if (match) {
128
+ const [, filePath] = match;
129
+ return filePath;
130
+ }
131
+ return filename;
132
+ };
133
+ //# sourceMappingURL=sentry-log-processor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sentry-log-processor.js","sourceRoot":"","sources":["../../../../src/sentry/sentry-log-processor.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"tracing.js","sourceRoot":"","sources":["../../../../src/sentry/tracing.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"tracing.js","sourceRoot":"","sources":["../../../../src/sentry/tracing.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dxos/observability",
3
- "version": "0.4.7-next.f4b92be",
3
+ "version": "0.4.7",
4
4
  "description": "Provides a common interface for app and platform observability",
5
5
  "homepage": "https://dxos.org",
6
6
  "bugs": "https://github.com/dxos/dxos/issues",
@@ -69,19 +69,19 @@
69
69
  "js-yaml": "^4.1.0",
70
70
  "localforage": "^1.10.0",
71
71
  "uuid": "^8.3.2",
72
- "@dxos/async": "0.4.7-next.f4b92be",
73
- "@dxos/client-services": "0.4.7-next.f4b92be",
74
- "@dxos/config": "0.4.7-next.f4b92be",
75
- "@dxos/context": "0.4.7-next.f4b92be",
76
- "@dxos/debug": "0.4.7-next.f4b92be",
77
- "@dxos/client-protocol": "0.4.7-next.f4b92be",
78
- "@dxos/invariant": "0.4.7-next.f4b92be",
79
- "@dxos/log": "0.4.7-next.f4b92be",
80
- "@dxos/network-manager": "0.4.7-next.f4b92be",
81
- "@dxos/node-std": "0.4.7-next.f4b92be",
82
- "@dxos/protocols": "0.4.7-next.f4b92be",
83
- "@dxos/react-client": "0.4.7-next.f4b92be",
84
- "@dxos/util": "0.4.7-next.f4b92be"
72
+ "@dxos/async": "0.4.7",
73
+ "@dxos/client-protocol": "0.4.7",
74
+ "@dxos/config": "0.4.7",
75
+ "@dxos/client-services": "0.4.7",
76
+ "@dxos/debug": "0.4.7",
77
+ "@dxos/context": "0.4.7",
78
+ "@dxos/invariant": "0.4.7",
79
+ "@dxos/network-manager": "0.4.7",
80
+ "@dxos/node-std": "0.4.7",
81
+ "@dxos/log": "0.4.7",
82
+ "@dxos/protocols": "0.4.7",
83
+ "@dxos/react-client": "0.4.7",
84
+ "@dxos/util": "0.4.7"
85
85
  },
86
86
  "devDependencies": {
87
87
  "@sentry/types": "^7.100.1",
@@ -126,7 +126,6 @@ export const initializeNodeObservability = async ({
126
126
  // TODO(wittjosiah): Configure this.
127
127
  sampleRate: 1.0,
128
128
  },
129
- logProcessor: true,
130
129
  },
131
130
  });
132
131
 
@@ -17,6 +17,7 @@ import { type DatadogMetrics } from './datadog';
17
17
  import { type IPData, getTelemetryIdentifier, mapSpaces } from './helpers';
18
18
  import { type SegmentTelemetry, type EventOptions, type PageOptions } from './segment';
19
19
  import { type InitOptions, type captureException as SentryCaptureException } from './sentry';
20
+ import { SentryLogProcessor } from './sentry/sentry-log-processor';
20
21
 
21
22
  const SPACE_METRICS_MIN_INTERVAL = 1000 * 60;
22
23
  // const DATADOG_IDLE_INTERVAL = 1000 * 60 * 5;
@@ -55,7 +56,6 @@ export type ObservabilityOptions = {
55
56
 
56
57
  errorLog?: {
57
58
  sentryInitOptions?: InitOptions;
58
- logProcessor?: boolean;
59
59
  };
60
60
  };
61
61
 
@@ -71,7 +71,6 @@ export class Observability {
71
71
  private _telemetry?: SegmentTelemetry;
72
72
  // TODO(wittjosiah): Generic error logging interface.
73
73
  private _errorReportingOptions?: InitOptions;
74
- private _errorLogProcessor: boolean;
75
74
  private _captureException?: typeof SentryCaptureException;
76
75
  private _setTag?: (key: string, value: string) => void;
77
76
 
@@ -103,7 +102,6 @@ export class Observability {
103
102
  this._secrets = this._loadSecrets(config, secrets);
104
103
  this._telemetryBatchSize = telemetry?.batchSize ?? 30;
105
104
  this._errorReportingOptions = errorLog?.sentryInitOptions;
106
- this._errorLogProcessor = errorLog?.logProcessor ?? false;
107
105
 
108
106
  if (this._group) {
109
107
  this.setTag('group', this._group);
@@ -447,7 +445,7 @@ export class Observability {
447
445
 
448
446
  private async _initErrorLogs() {
449
447
  if (this._secrets.SENTRY_DESTINATION && this._mode !== 'disabled') {
450
- const { captureException, enableSentryLogProcessor, configureTracing, init, setTag } = await import('./sentry');
448
+ const { captureException, configureTracing, init, setTag } = await import('./sentry');
451
449
  this._captureException = captureException;
452
450
  this._setTag = setTag;
453
451
 
@@ -456,18 +454,21 @@ export class Observability {
456
454
  dest: this._secrets.SENTRY_DESTINATION,
457
455
  options: this._errorReportingOptions,
458
456
  });
457
+
458
+ const logProcessor = new SentryLogProcessor();
459
459
  init({
460
460
  ...this._errorReportingOptions,
461
461
  destination: this._secrets.SENTRY_DESTINATION,
462
462
  scrubFilenames: this._mode !== 'full',
463
+ onError: (event) => logProcessor.addLogBreadcrumbsTo(event),
463
464
  });
464
465
  if (this._errorReportingOptions?.tracing) {
465
466
  configureTracing();
466
467
  }
468
+
467
469
  // TODO(nf): set platform at instantiation? needed for node.
468
- if (this._errorLogProcessor) {
469
- enableSentryLogProcessor();
470
- }
470
+ log.runtimeConfig.processors.push(logProcessor.logProcessor);
471
+
471
472
  // TODO(nf): is this different than passing as properties in options?
472
473
  this._tags.forEach((v, k) => {
473
474
  if (v.scope === 'all' || v.scope === 'errors') {
@@ -7,10 +7,13 @@ import {
7
7
  setTag,
8
8
  addBreadcrumb as naturalAddBreadcrumb,
9
9
  captureException as naturalCaptureException,
10
+ captureMessage as naturalCaptureMessage,
11
+ withScope as naturalWithScope,
10
12
  BrowserTracing,
11
13
  replayIntegration,
14
+ breadcrumbsIntegration,
12
15
  } from '@sentry/browser';
13
- import { captureConsoleIntegration, httpClientIntegration } from '@sentry/integrations';
16
+ import { httpClientIntegration } from '@sentry/integrations';
14
17
 
15
18
  import { log } from '@dxos/log';
16
19
 
@@ -37,7 +40,7 @@ export const init = (options: InitOptions) => {
37
40
  release: options.release,
38
41
  environment: options.environment,
39
42
  integrations: [
40
- captureConsoleIntegration({ levels: ['error', 'warn'] }),
43
+ breadcrumbsIntegration({ console: false, fetch: false }),
41
44
  httpClientIntegration({ failedRequestStatusCodes: [[400, 599]] }),
42
45
  ...(options.tracing ? [new BrowserTracing()] : []),
43
46
  ...(options.replay ? [replayIntegration({ blockAllMedia: true, maskAllText: true })] : []),
@@ -96,5 +99,15 @@ export const captureException: typeof naturalCaptureException = (exception, capt
96
99
  }
97
100
  };
98
101
 
99
- // Not needed for browser.
100
- export const enableSentryLogProcessor = () => {};
102
+ export const captureMessage: typeof naturalCaptureMessage = (exception, captureContext) => {
103
+ try {
104
+ const eventId = naturalCaptureMessage(exception, captureContext);
105
+ log('capture message', { exception, eventId, captureContext });
106
+ return eventId;
107
+ } catch (err) {
108
+ log.catch('Failed to capture message', err);
109
+ return 'unknown';
110
+ }
111
+ };
112
+
113
+ export const withScope = naturalWithScope;
@@ -9,12 +9,11 @@ import {
9
9
  addBreadcrumb as naturalAddBreadcrumb,
10
10
  captureException as naturalCaptureException,
11
11
  captureMessage as naturalCaptureMessage,
12
- withScope,
12
+ withScope as naturalWithScope,
13
13
  } from '@sentry/node';
14
14
  import type { Event } from '@sentry/node';
15
- import type { SeverityLevel } from '@sentry/types';
16
15
 
17
- import { log, LogLevel, shouldLog } from '@dxos/log';
16
+ import { log } from '@dxos/log';
18
17
 
19
18
  import { type InitOptions } from './types';
20
19
 
@@ -103,51 +102,15 @@ export const captureException: typeof naturalCaptureException = (exception, capt
103
102
  }
104
103
  };
105
104
 
106
- // TODO(nf): move to log package as a first-class processor.
107
- export const enableSentryLogProcessor = (filter?: string | string[] | LogLevel) => {
108
- log.runtimeConfig.processors.push(SENTRY_LOG_PROCESSOR);
109
- };
110
-
111
- export const SENTRY_LOG_PROCESSOR = (config: any, entry: any) => {
112
- const { message, level, meta, error } = entry;
113
- if (!shouldLog(entry, config.captureFilters)) {
114
- return;
115
- }
116
- // TODO(nf): add rate limiting to avoid spamming Sentry/consuming excessive quota.
117
- withScope((scope) => {
118
- scope.setLevel(convertLevel(level));
119
- scope.setContext('dxoslog', entry.context);
120
- if (meta) {
121
- scope.setTransactionName(`${getRelativeFilename(meta.F)}:${meta.L}`);
122
- }
123
- // Is this ever used?
124
- if (error) {
125
- scope.setExtra('message', message);
126
- return naturalCaptureException(error);
127
- }
128
-
129
- naturalCaptureMessage(message);
130
- });
131
- };
132
-
133
- const convertLevel = (level: LogLevel): SeverityLevel => {
134
- if (level === LogLevel.TRACE) {
135
- return 'debug';
136
- }
137
- if (level === LogLevel.WARN) {
138
- return 'warning';
105
+ export const captureMessage: typeof naturalCaptureMessage = (exception, captureContext) => {
106
+ try {
107
+ const eventId = naturalCaptureMessage(exception, captureContext);
108
+ log('capture message', { exception, eventId, captureContext });
109
+ return eventId;
110
+ } catch (err) {
111
+ log.catch('Failed to capture message', err);
112
+ return 'unknown';
139
113
  }
140
- return LogLevel[level].toLowerCase() as SeverityLevel;
141
114
  };
142
115
 
143
- const getRelativeFilename = (filename: string) => {
144
- // TODO(burdon): Hack uses "packages" as an anchor (pre-parse NX?)
145
- // Including `packages/` part of the path so that excluded paths (e.g. from dist) are clickable in vscode.
146
- const match = filename.match(/.+\/(packages\/.+\/.+)/);
147
- if (match) {
148
- const [, filePath] = match;
149
- return filePath;
150
- }
151
-
152
- return filename;
153
- };
116
+ export const withScope = naturalWithScope;
@@ -0,0 +1,144 @@
1
+ //
2
+ // Copyright 2024 DXOS.org
3
+ //
4
+
5
+ import type { Breadcrumb, SeverityLevel, Event } from '@sentry/types';
6
+
7
+ import { type LogConfig, type LogEntry, LogLevel, type LogProcessor, shouldLog } from '@dxos/log';
8
+ import { CircularBuffer, getDebugName } from '@dxos/util';
9
+
10
+ import { withScope, captureException, captureMessage } from './';
11
+
12
+ const MAX_LOG_BREADCRUMBS = 80;
13
+
14
+ export class SentryLogProcessor {
15
+ private _breadcrumbs = new CircularBuffer<Breadcrumb>(MAX_LOG_BREADCRUMBS);
16
+
17
+ public readonly logProcessor: LogProcessor = (config: LogConfig, entry: LogEntry) => {
18
+ const { level, meta, error } = entry;
19
+ if (!shouldLog(entry, config.captureFilters)) {
20
+ return;
21
+ }
22
+ if (entry.level !== LogLevel.WARN && entry.level !== LogLevel.ERROR) {
23
+ return;
24
+ }
25
+ // TODO(nf): add rate limiting to avoid spamming Sentry/consuming excessive quota.
26
+ withScope((scope) => {
27
+ const severity = convertLevel(level);
28
+ scope.setLevel(severity);
29
+ scope.setContext('dxoslog', entry.context ?? null);
30
+ if (meta) {
31
+ scope.setTag('transaction', `${getRelativeFilename(meta.F)}:${meta.L}`);
32
+
33
+ if (meta.S?.hostSessionId) {
34
+ scope.setTags({
35
+ service_host_issue: true,
36
+ service_host_session: meta.S?.hostSessionId,
37
+ });
38
+ }
39
+
40
+ if (!Number.isNaN(meta.S?.uptimeSeconds)) {
41
+ scope.setExtra('uptime_seconds', meta.S?.uptimeSeconds);
42
+ }
43
+ }
44
+
45
+ const extendedMessage = formatMessageForSentry(entry);
46
+ let capturedError = error;
47
+ if (capturedError == null && entry.level === LogLevel.ERROR) {
48
+ capturedError = Object.values(entry.context ?? {}).find((v): v is Error => v instanceof Error);
49
+ }
50
+ if (capturedError) {
51
+ const isMessageDifferentFromStackTrace = error == null;
52
+ if (isMessageDifferentFromStackTrace) {
53
+ scope.setExtra('message', extendedMessage);
54
+ }
55
+ const eventId = captureException(capturedError);
56
+ this._addBreadcrumb(eventId, extendedMessage, severity, entry.context);
57
+ return;
58
+ }
59
+
60
+ scope.setFingerprint([entry.message]);
61
+ const eventId = captureMessage(extendedMessage);
62
+ this._addBreadcrumb(eventId, extendedMessage, severity, entry.context);
63
+ });
64
+ };
65
+
66
+ public addLogBreadcrumbsTo(event: Event) {
67
+ event.breadcrumbs ??= [];
68
+ for (const breadcrumb of this._breadcrumbs) {
69
+ event.breadcrumbs.push(breadcrumb);
70
+ }
71
+ event.breadcrumbs.sort((b1, b2) => {
72
+ if (b1.timestamp === undefined || b2.timestamp === undefined) {
73
+ return b1.timestamp === b2.timestamp ? 0 : b1.timestamp === undefined ? -1 : 1;
74
+ }
75
+ return b1.timestamp - b2.timestamp;
76
+ });
77
+ }
78
+
79
+ private _addBreadcrumb(
80
+ eventId: string,
81
+ message: string,
82
+ severity: SeverityLevel,
83
+ context: { [key: string]: any } | undefined,
84
+ ): void {
85
+ const breadcrumb: Breadcrumb = {
86
+ type: 'console',
87
+ level: severity,
88
+ event_id: eventId,
89
+ category: 'log',
90
+ message,
91
+ data: context,
92
+ timestamp: Math.floor(Date.now() / 1000),
93
+ };
94
+ const lastRecorded = this._breadcrumbs.getLast();
95
+ if (lastRecorded && lastRecorded.message === breadcrumb.message) {
96
+ const firstBreadcrumbData = lastRecorded.data?.firstBreadcrumbData ?? lastRecorded.data ?? {};
97
+ const mergedBreadcrumbCount = Number.isNaN(lastRecorded.data?.mergedBreadcrumbCount)
98
+ ? 1
99
+ : Number(lastRecorded.data?.mergedBreadcrumbCount);
100
+ lastRecorded.data = {
101
+ mergedBreadcrumbCount: mergedBreadcrumbCount + 1,
102
+ firstBreadcrumbData,
103
+ lastBreadcrumbData: breadcrumb.data,
104
+ };
105
+ return;
106
+ }
107
+ this._breadcrumbs.push(breadcrumb);
108
+ }
109
+ }
110
+
111
+ const formatMessageForSentry = (entry: LogEntry) => {
112
+ let scopePrefix: string | undefined;
113
+ if (entry.meta?.S) {
114
+ const scope = entry.meta?.S;
115
+ scopePrefix = scope.name || getDebugName(scope);
116
+ }
117
+ if (scopePrefix == null) {
118
+ return entry.message;
119
+ }
120
+ const workerPrefix = entry.meta?.S?.hostSessionId ? '[worker] ' : '';
121
+ return `${workerPrefix}${scopePrefix} ${entry.message}`;
122
+ };
123
+
124
+ const convertLevel = (level: LogLevel): SeverityLevel => {
125
+ if (level === LogLevel.TRACE) {
126
+ return 'debug';
127
+ }
128
+ if (level === LogLevel.WARN) {
129
+ return 'warning';
130
+ }
131
+ return LogLevel[level].toLowerCase() as SeverityLevel;
132
+ };
133
+
134
+ const getRelativeFilename = (filename: string) => {
135
+ // TODO(burdon): Hack uses "packages" as an anchor (pre-parse NX?)
136
+ // Including `packages/` part of the path so that excluded paths (e.g. from dist) are clickable in vscode.
137
+ const match = filename.match(/.+\/(packages\/.+\/.+)/);
138
+ if (match) {
139
+ const [, filePath] = match;
140
+ return filePath;
141
+ }
142
+
143
+ return filename;
144
+ };