@dxos/observability 0.6.11 → 0.6.12-main.5cc132e

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 (36) hide show
  1. package/dist/lib/node-esm/chunk-6DGCS5IE.mjs +937 -0
  2. package/dist/lib/node-esm/chunk-6DGCS5IE.mjs.map +7 -0
  3. package/dist/lib/node-esm/chunk-KDP3SESE.mjs +1 -0
  4. package/dist/lib/node-esm/chunk-KDP3SESE.mjs.map +7 -0
  5. package/dist/lib/node-esm/chunk-YEQOSJSQ.mjs +131 -0
  6. package/dist/lib/node-esm/chunk-YEQOSJSQ.mjs.map +7 -0
  7. package/dist/lib/node-esm/index.mjs +33 -0
  8. package/dist/lib/node-esm/index.mjs.map +7 -0
  9. package/dist/lib/node-esm/meta.json +1 -0
  10. package/dist/lib/node-esm/observability-UQRA6FNY.mjs +7 -0
  11. package/dist/lib/node-esm/observability-UQRA6FNY.mjs.map +7 -0
  12. package/dist/lib/node-esm/otel-DJUW53OF.mjs +256 -0
  13. package/dist/lib/node-esm/otel-DJUW53OF.mjs.map +7 -0
  14. package/dist/lib/node-esm/segment/index.mjs +143 -0
  15. package/dist/lib/node-esm/segment/index.mjs.map +7 -0
  16. package/dist/lib/node-esm/sentry/index.mjs +24 -0
  17. package/dist/lib/node-esm/sentry/index.mjs.map +7 -0
  18. package/dist/lib/node-esm/sentry-log-processor-HEWW7T3S.mjs +132 -0
  19. package/dist/lib/node-esm/sentry-log-processor-HEWW7T3S.mjs.map +7 -0
  20. package/dist/types/src/sentry/node.node.test.d.ts +2 -0
  21. package/dist/types/src/sentry/node.node.test.d.ts.map +1 -0
  22. package/dist/types/src/sentry/{node.test.js → node.node.test.js} +8 -15
  23. package/dist/types/src/sentry/node.node.test.js.map +1 -0
  24. package/dist/types/src/sentry/sentry.node.test.d.ts +2 -0
  25. package/dist/types/src/sentry/sentry.node.test.d.ts.map +1 -0
  26. package/dist/types/src/sentry/{sentry.test.js → sentry.node.test.js} +8 -15
  27. package/dist/types/src/sentry/sentry.node.test.js.map +1 -0
  28. package/package.json +21 -18
  29. package/src/sentry/{node.test.ts → node.node.test.ts} +2 -9
  30. package/src/sentry/{sentry.test.ts → sentry.node.test.ts} +2 -7
  31. package/dist/types/src/sentry/node.test.d.ts +0 -2
  32. package/dist/types/src/sentry/node.test.d.ts.map +0 -1
  33. package/dist/types/src/sentry/node.test.js.map +0 -1
  34. package/dist/types/src/sentry/sentry.test.d.ts +0 -2
  35. package/dist/types/src/sentry/sentry.test.d.ts.map +0 -1
  36. package/dist/types/src/sentry/sentry.test.js.map +0 -1
@@ -0,0 +1,256 @@
1
+ // packages/sdk/observability/src/otel/otel.ts
2
+ import { diag, DiagConsoleLogger, DiagLogLevel } from "@opentelemetry/api";
3
+ var setDiagLogger = (level) => {
4
+ const logLevel = DiagLogLevel[level];
5
+ if (logLevel) {
6
+ diag.setLogger(new DiagConsoleLogger(), logLevel);
7
+ }
8
+ };
9
+
10
+ // packages/sdk/observability/src/otel/logs.ts
11
+ import { SeverityNumber } from "@opentelemetry/api-logs";
12
+ import { OTLPLogExporter } from "@opentelemetry/exporter-logs-otlp-http";
13
+ import { Resource } from "@opentelemetry/resources";
14
+ import { BatchLogRecordProcessor, LoggerProvider } from "@opentelemetry/sdk-logs";
15
+ import { SEMRESATTRS_SERVICE_NAME, SEMRESATTRS_SERVICE_VERSION } from "@opentelemetry/semantic-conventions";
16
+ import { getContextFromEntry, getRelativeFilename, LogLevel, shouldLog } from "@dxos/log";
17
+ import { jsonlogify } from "@dxos/util";
18
+ var OtelLogs = class {
19
+ constructor(options) {
20
+ this.options = options;
21
+ this.logProcessor = (config, entry) => {
22
+ const logger = this._loggerProvider.getLogger("dxos-observability", this.options.serviceVersion);
23
+ if (!shouldLog(entry, config.captureFilters) || entry.meta?.S?.remoteSessionId) {
24
+ return;
25
+ }
26
+ const record = {
27
+ ...entry,
28
+ ...entry.meta ? {
29
+ meta: {
30
+ file: getRelativeFilename(entry.meta.F),
31
+ line: entry.meta.L
32
+ }
33
+ } : {},
34
+ context: jsonlogify(getContextFromEntry(entry))
35
+ };
36
+ logger.emit({
37
+ severityNumber: convertLevel(entry.level),
38
+ body: JSON.stringify(record),
39
+ attributes: this.options.getTags()
40
+ });
41
+ };
42
+ setDiagLogger(options.consoleDiagLogLevel);
43
+ const resource = Resource.default().merge(new Resource({
44
+ [SEMRESATTRS_SERVICE_NAME]: this.options.serviceName,
45
+ [SEMRESATTRS_SERVICE_VERSION]: this.options.serviceVersion
46
+ }));
47
+ const logExporter = new OTLPLogExporter({
48
+ url: this.options.endpoint + "/v1/logs",
49
+ headers: {
50
+ Authorization: this.options.authorizationHeader
51
+ },
52
+ concurrencyLimit: 10
53
+ });
54
+ this._loggerProvider = new LoggerProvider({
55
+ resource
56
+ });
57
+ this._loggerProvider.addLogRecordProcessor(new BatchLogRecordProcessor(logExporter));
58
+ }
59
+ flush() {
60
+ return this._loggerProvider.forceFlush();
61
+ }
62
+ close() {
63
+ return this._loggerProvider.shutdown();
64
+ }
65
+ };
66
+ var convertLevel = (level) => {
67
+ switch (level) {
68
+ case LogLevel.DEBUG:
69
+ return SeverityNumber.DEBUG;
70
+ case LogLevel.INFO:
71
+ return SeverityNumber.INFO;
72
+ case LogLevel.WARN:
73
+ return SeverityNumber.WARN;
74
+ case LogLevel.ERROR:
75
+ return SeverityNumber.ERROR;
76
+ default:
77
+ return SeverityNumber.ERROR;
78
+ }
79
+ };
80
+
81
+ // packages/sdk/observability/src/otel/metrics.ts
82
+ import { OTLPMetricExporter } from "@opentelemetry/exporter-metrics-otlp-http";
83
+ import { Resource as Resource2 } from "@opentelemetry/resources";
84
+ import { MeterProvider, PeriodicExportingMetricReader } from "@opentelemetry/sdk-metrics";
85
+ import { SEMRESATTRS_SERVICE_NAME as SEMRESATTRS_SERVICE_NAME2, SEMRESATTRS_SERVICE_VERSION as SEMRESATTRS_SERVICE_VERSION2 } from "@opentelemetry/semantic-conventions";
86
+ import { log } from "@dxos/log";
87
+ import { TRACE_PROCESSOR } from "@dxos/tracing";
88
+ var __dxlog_file = "/home/runner/work/dxos/dxos/packages/sdk/observability/src/otel/metrics.ts";
89
+ var EXPORT_INTERVAL = 60 * 1e3;
90
+ var OtelMetrics = class {
91
+ constructor(options) {
92
+ this.options = options;
93
+ this._gauges = /* @__PURE__ */ new Map();
94
+ setDiagLogger(options.consoleDiagLogLevel);
95
+ const resource = Resource2.default().merge(new Resource2({
96
+ [SEMRESATTRS_SERVICE_NAME2]: this.options.serviceName,
97
+ [SEMRESATTRS_SERVICE_VERSION2]: this.options.serviceVersion
98
+ }));
99
+ const grafanaMetricReader = new PeriodicExportingMetricReader({
100
+ exporter: new OTLPMetricExporter({
101
+ url: this.options.endpoint + "/v1/metrics",
102
+ headers: {
103
+ Authorization: this.options.authorizationHeader
104
+ }
105
+ }),
106
+ exportIntervalMillis: EXPORT_INTERVAL
107
+ });
108
+ this._meterProvider = new MeterProvider({
109
+ resource,
110
+ readers: [
111
+ grafanaMetricReader
112
+ ]
113
+ });
114
+ this._meter = this._meterProvider.getMeter("dxos-observability");
115
+ const metrics = {
116
+ // TODO: update metrics names and remove prefix?
117
+ increment: (name, value, data) => {
118
+ this.increment(name, value, convertTags(data));
119
+ },
120
+ distribution: (name, value, data) => {
121
+ this.distribution(name, value, convertTags(data));
122
+ },
123
+ set: (name, value, data) => {
124
+ },
125
+ gauge: (name, value, data) => {
126
+ this.gauge(name, value, convertTags(data));
127
+ }
128
+ };
129
+ TRACE_PROCESSOR.remoteMetrics.registerProcessor(metrics);
130
+ }
131
+ gauge(name, value, tags) {
132
+ const gauge = this._meter.createGauge(name);
133
+ log("otel gauge", {
134
+ name,
135
+ value,
136
+ tags: {
137
+ ...this.options.getTags(),
138
+ ...tags
139
+ }
140
+ }, {
141
+ F: __dxlog_file,
142
+ L: 77,
143
+ S: this,
144
+ C: (f, a) => f(...a)
145
+ });
146
+ gauge.record(value, {
147
+ ...this.options.getTags(),
148
+ ...tags
149
+ });
150
+ }
151
+ increment(name, value, tags) {
152
+ const counter = this._meter.createCounter(name);
153
+ log("otel counter", {
154
+ name,
155
+ value,
156
+ tags: {
157
+ ...this.options.getTags(),
158
+ ...tags
159
+ }
160
+ }, {
161
+ F: __dxlog_file,
162
+ L: 83,
163
+ S: this,
164
+ C: (f, a) => f(...a)
165
+ });
166
+ counter.add(value ?? 1, {
167
+ ...this.options.getTags(),
168
+ ...tags
169
+ });
170
+ }
171
+ distribution(name, value, tags) {
172
+ const distribution = this._meter.createHistogram(name);
173
+ log("otel distribution", {
174
+ name,
175
+ value,
176
+ tags: {
177
+ ...this.options.getTags(),
178
+ ...tags
179
+ }
180
+ }, {
181
+ F: __dxlog_file,
182
+ L: 89,
183
+ S: this,
184
+ C: (f, a) => f(...a)
185
+ });
186
+ distribution.record(value, {
187
+ ...this.options.getTags(),
188
+ ...tags
189
+ });
190
+ }
191
+ flush() {
192
+ return this._meterProvider.forceFlush();
193
+ }
194
+ close() {
195
+ return this._meterProvider.shutdown();
196
+ }
197
+ };
198
+ var convertTags = (data) => {
199
+ if (data && data.tags) {
200
+ return Object.entries(data.tags).reduce((obj, [key, value]) => {
201
+ obj[key] = value;
202
+ return obj;
203
+ }, {});
204
+ } else {
205
+ return {};
206
+ }
207
+ };
208
+
209
+ // packages/sdk/observability/src/otel/traces.ts
210
+ import { trace } from "@opentelemetry/api";
211
+ import { OTLPTraceExporter } from "@opentelemetry/exporter-trace-otlp-http";
212
+ import { Resource as Resource3 } from "@opentelemetry/resources";
213
+ import { BasicTracerProvider, BatchSpanProcessor, ConsoleSpanExporter, SimpleSpanProcessor } from "@opentelemetry/sdk-trace-base";
214
+ import { SEMRESATTRS_SERVICE_NAME as SEMRESATTRS_SERVICE_NAME3, SEMRESATTRS_SERVICE_VERSION as SEMRESATTRS_SERVICE_VERSION3 } from "@opentelemetry/semantic-conventions";
215
+ import { log as log2 } from "debug";
216
+ import { TRACE_PROCESSOR as TRACE_PROCESSOR2 } from "@dxos/tracing";
217
+ var OtelTraces = class {
218
+ constructor(options) {
219
+ this.options = options;
220
+ const resource = Resource3.default().merge(new Resource3({
221
+ [SEMRESATTRS_SERVICE_NAME3]: this.options.serviceName,
222
+ [SEMRESATTRS_SERVICE_VERSION3]: this.options.serviceVersion
223
+ }));
224
+ const tracerProvider = new BasicTracerProvider({
225
+ resource
226
+ });
227
+ tracerProvider.addSpanProcessor(new SimpleSpanProcessor(new ConsoleSpanExporter()));
228
+ tracerProvider.addSpanProcessor(new BatchSpanProcessor(new OTLPTraceExporter({
229
+ url: this.options.endpoint + "/v1/traces",
230
+ headers: {
231
+ Authorization: this.options.authorizationHeader
232
+ },
233
+ concurrencyLimit: 10
234
+ })));
235
+ tracerProvider.register();
236
+ this._tracer = trace.getTracer("dxos-observability", this.options.serviceVersion);
237
+ }
238
+ start() {
239
+ log2("trace processor registered");
240
+ TRACE_PROCESSOR2.remoteTracing.registerProcessor({
241
+ startSpan: (options) => {
242
+ log2("begin otel trace", {
243
+ options
244
+ });
245
+ return this._tracer.startSpan(options.name, options);
246
+ }
247
+ });
248
+ }
249
+ };
250
+ export {
251
+ OtelLogs,
252
+ OtelMetrics,
253
+ OtelTraces,
254
+ setDiagLogger
255
+ };
256
+ //# sourceMappingURL=otel-DJUW53OF.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/otel/otel.ts", "../../../src/otel/logs.ts", "../../../src/otel/metrics.ts", "../../../src/otel/traces.ts"],
4
+ "sourcesContent": ["//\n// Copyright 2024 DXOS.org\n//\n\nimport { diag, DiagConsoleLogger, DiagLogLevel } from '@opentelemetry/api';\n\nexport type OtelOptions = {\n endpoint: string;\n authorizationHeader: string;\n serviceName: string; // For the Otel API, the name of the entity for which signals (metrics or trace) are collected.\n serviceVersion: string; // For the Otel API, The name of the entity for which signals (metrics or trace) are collected.\n getTags: () => { [key: string]: string };\n consoleDiagLogLevel?: string;\n};\n\nexport const setDiagLogger = (level?: string) => {\n const logLevel = DiagLogLevel[level as keyof typeof DiagLogLevel];\n if (logLevel) {\n diag.setLogger(new DiagConsoleLogger(), logLevel);\n }\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { SeverityNumber } from '@opentelemetry/api-logs';\nimport { OTLPLogExporter } from '@opentelemetry/exporter-logs-otlp-http';\nimport { Resource } from '@opentelemetry/resources';\nimport { BatchLogRecordProcessor, LoggerProvider } from '@opentelemetry/sdk-logs';\nimport { SEMRESATTRS_SERVICE_NAME, SEMRESATTRS_SERVICE_VERSION } from '@opentelemetry/semantic-conventions';\n\nimport {\n getContextFromEntry,\n getRelativeFilename,\n type LogConfig,\n type LogEntry,\n LogLevel,\n type LogProcessor,\n shouldLog,\n} from '@dxos/log';\nimport { jsonlogify } from '@dxos/util';\n\nimport { type OtelOptions, setDiagLogger } from './otel';\n\nexport class OtelLogs {\n private _loggerProvider: LoggerProvider;\n constructor(private readonly options: OtelOptions) {\n setDiagLogger(options.consoleDiagLogLevel);\n const resource = Resource.default().merge(\n new Resource({\n [SEMRESATTRS_SERVICE_NAME]: this.options.serviceName,\n [SEMRESATTRS_SERVICE_VERSION]: this.options.serviceVersion,\n }),\n );\n const logExporter = new OTLPLogExporter({\n url: this.options.endpoint + '/v1/logs',\n headers: {\n Authorization: this.options.authorizationHeader,\n },\n concurrencyLimit: 10, // an optional limit on pending requests\n });\n this._loggerProvider = new LoggerProvider({ resource });\n this._loggerProvider.addLogRecordProcessor(new BatchLogRecordProcessor(logExporter));\n }\n\n public readonly logProcessor: LogProcessor = (config: LogConfig, entry: LogEntry) => {\n const logger = this._loggerProvider.getLogger('dxos-observability', this.options.serviceVersion);\n\n if (!shouldLog(entry, config.captureFilters) || entry.meta?.S?.remoteSessionId) {\n return;\n }\n const record = {\n ...entry,\n ...(entry.meta ? { meta: { file: getRelativeFilename(entry.meta.F), line: entry.meta.L } } : {}),\n context: jsonlogify(getContextFromEntry(entry)),\n };\n\n logger.emit({\n severityNumber: convertLevel(entry.level),\n body: JSON.stringify(record),\n attributes: this.options.getTags(),\n });\n };\n\n flush() {\n return this._loggerProvider.forceFlush();\n }\n\n close() {\n return this._loggerProvider.shutdown();\n }\n}\n\nconst convertLevel = (level: LogLevel): SeverityNumber => {\n switch (level) {\n case LogLevel.DEBUG:\n return SeverityNumber.DEBUG;\n case LogLevel.INFO:\n return SeverityNumber.INFO;\n case LogLevel.WARN:\n return SeverityNumber.WARN;\n case LogLevel.ERROR:\n return SeverityNumber.ERROR;\n default:\n return SeverityNumber.ERROR;\n }\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { type Attributes, type Meter, type ObservableGauge } from '@opentelemetry/api';\nimport { OTLPMetricExporter } from '@opentelemetry/exporter-metrics-otlp-http';\nimport { Resource } from '@opentelemetry/resources';\nimport { MeterProvider, PeriodicExportingMetricReader } from '@opentelemetry/sdk-metrics';\nimport { SEMRESATTRS_SERVICE_NAME, SEMRESATTRS_SERVICE_VERSION } from '@opentelemetry/semantic-conventions';\n\nimport { log } from '@dxos/log';\nimport { TRACE_PROCESSOR, type MetricData } from '@dxos/tracing';\n\nimport { type OtelOptions, setDiagLogger } from './otel';\n\nconst EXPORT_INTERVAL = 60 * 1000;\n\ntype SynchronousGauge = {\n gauge: ObservableGauge<Attributes>;\n nextValue: number;\n nextTags?: any;\n};\n\nexport class OtelMetrics {\n private _meterProvider: MeterProvider;\n private _meter: Meter;\n private _gauges = new Map<string, SynchronousGauge>();\n\n constructor(private readonly options: OtelOptions) {\n // TODO: improve error handling/logging\n // https://github.com/open-telemetry/opentelemetry-js/issues/4823\n setDiagLogger(options.consoleDiagLogLevel);\n const resource = Resource.default().merge(\n new Resource({\n [SEMRESATTRS_SERVICE_NAME]: this.options.serviceName,\n [SEMRESATTRS_SERVICE_VERSION]: this.options.serviceVersion,\n }),\n );\n\n const grafanaMetricReader = new PeriodicExportingMetricReader({\n exporter: new OTLPMetricExporter({\n url: this.options.endpoint + '/v1/metrics',\n headers: {\n Authorization: this.options.authorizationHeader,\n },\n }),\n exportIntervalMillis: EXPORT_INTERVAL,\n });\n\n this._meterProvider = new MeterProvider({\n resource,\n readers: [grafanaMetricReader],\n });\n this._meter = this._meterProvider.getMeter('dxos-observability');\n\n const metrics = {\n // TODO: update metrics names and remove prefix?\n increment: (name: string, value?: number, data?: MetricData) => {\n this.increment(name, value, convertTags(data));\n },\n distribution: (name: string, value: number, data?: MetricData) => {\n this.distribution(name, value, convertTags(data));\n },\n set: (name: string, value: number | string, data?: MetricData) => {\n // Not implemented, not part of Otel spec.\n },\n gauge: (name: string, value: number, data?: MetricData) => {\n this.gauge(name, value, convertTags(data));\n },\n };\n\n TRACE_PROCESSOR.remoteMetrics.registerProcessor(metrics);\n }\n\n gauge(name: string, value: number, tags?: any) {\n const gauge = this._meter.createGauge(name);\n log('otel gauge', { name, value, tags: { ...this.options.getTags(), ...tags } });\n gauge.record(value, { ...this.options.getTags(), ...tags });\n }\n\n increment(name: string, value?: number, tags?: any) {\n const counter = this._meter.createCounter(name);\n log('otel counter', { name, value, tags: { ...this.options.getTags(), ...tags } });\n counter.add(value ?? 1, { ...this.options.getTags(), ...tags });\n }\n\n distribution(name: string, value: number, tags?: any) {\n const distribution = this._meter.createHistogram(name);\n log('otel distribution', { name, value, tags: { ...this.options.getTags(), ...tags } });\n distribution.record(value, { ...this.options.getTags(), ...tags });\n }\n\n flush() {\n return this._meterProvider.forceFlush();\n }\n\n close() {\n return this._meterProvider.shutdown();\n }\n}\n\nconst convertTags = (data?: MetricData) => {\n if (data && data.tags) {\n return Object.entries(data.tags).reduce<{ [key: string]: any }>((obj, [key, value]) => {\n obj[key] = value;\n return obj;\n }, {});\n } else {\n return {};\n }\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { trace, type Tracer } from '@opentelemetry/api';\nimport { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-http';\nimport { Resource } from '@opentelemetry/resources';\nimport {\n BasicTracerProvider,\n BatchSpanProcessor,\n ConsoleSpanExporter,\n SimpleSpanProcessor,\n} from '@opentelemetry/sdk-trace-base';\nimport { SEMRESATTRS_SERVICE_NAME, SEMRESATTRS_SERVICE_VERSION } from '@opentelemetry/semantic-conventions';\nimport { log } from 'debug';\n\nimport { TRACE_PROCESSOR, type StartSpanOptions } from '@dxos/tracing';\n\nimport { type OtelOptions } from './otel';\n\nexport class OtelTraces {\n private _tracer: Tracer;\n constructor(private readonly options: OtelOptions) {\n const resource = Resource.default().merge(\n new Resource({\n [SEMRESATTRS_SERVICE_NAME]: this.options.serviceName,\n [SEMRESATTRS_SERVICE_VERSION]: this.options.serviceVersion,\n }),\n );\n\n const tracerProvider = new BasicTracerProvider({ resource });\n tracerProvider.addSpanProcessor(new SimpleSpanProcessor(new ConsoleSpanExporter()));\n tracerProvider.addSpanProcessor(\n new BatchSpanProcessor(\n new OTLPTraceExporter({\n url: this.options.endpoint + '/v1/traces',\n headers: {\n Authorization: this.options.authorizationHeader,\n },\n concurrencyLimit: 10, // an optional limit on pending requests\n }),\n ),\n );\n tracerProvider.register();\n this._tracer = trace.getTracer('dxos-observability', this.options.serviceVersion);\n }\n\n public start() {\n log('trace processor registered');\n TRACE_PROCESSOR.remoteTracing.registerProcessor({\n startSpan: (options: StartSpanOptions) => {\n log('begin otel trace', { options });\n return this._tracer.startSpan(options.name, options);\n },\n });\n }\n}\n"],
5
+ "mappings": ";AAIA,SAASA,MAAMC,mBAAmBC,oBAAoB;AAW/C,IAAMC,gBAAgB,CAACC,UAAAA;AAC5B,QAAMC,WAAWC,aAAaF,KAAAA;AAC9B,MAAIC,UAAU;AACZE,SAAKC,UAAU,IAAIC,kBAAAA,GAAqBJ,QAAAA;EAC1C;AACF;;;AChBA,SAASK,sBAAsB;AAC/B,SAASC,uBAAuB;AAChC,SAASC,gBAAgB;AACzB,SAASC,yBAAyBC,sBAAsB;AACxD,SAASC,0BAA0BC,mCAAmC;AAEtE,SACEC,qBACAC,qBAGAC,UAEAC,iBACK;AACP,SAASC,kBAAkB;AAIpB,IAAMC,WAAN,MAAMA;EAEXC,YAA6BC,SAAsB;SAAtBA,UAAAA;SAmBbC,eAA6B,CAACC,QAAmBC,UAAAA;AAC/D,YAAMC,SAAS,KAAKC,gBAAgBC,UAAU,sBAAsB,KAAKN,QAAQO,cAAc;AAE/F,UAAI,CAACC,UAAUL,OAAOD,OAAOO,cAAc,KAAKN,MAAMO,MAAMC,GAAGC,iBAAiB;AAC9E;MACF;AACA,YAAMC,SAAS;QACb,GAAGV;QACH,GAAIA,MAAMO,OAAO;UAAEA,MAAM;YAAEI,MAAMC,oBAAoBZ,MAAMO,KAAKM,CAAC;YAAGC,MAAMd,MAAMO,KAAKQ;UAAE;QAAE,IAAI,CAAC;QAC9FC,SAASC,WAAWC,oBAAoBlB,KAAAA,CAAAA;MAC1C;AAEAC,aAAOkB,KAAK;QACVC,gBAAgBC,aAAarB,MAAMsB,KAAK;QACxCC,MAAMC,KAAKC,UAAUf,MAAAA;QACrBgB,YAAY,KAAK7B,QAAQ8B,QAAO;MAClC,CAAA;IACF;AAnCEC,kBAAc/B,QAAQgC,mBAAmB;AACzC,UAAMC,WAAWC,SAASC,QAAO,EAAGC,MAClC,IAAIF,SAAS;MACX,CAACG,wBAAAA,GAA2B,KAAKrC,QAAQsC;MACzC,CAACC,2BAAAA,GAA8B,KAAKvC,QAAQO;IAC9C,CAAA,CAAA;AAEF,UAAMiC,cAAc,IAAIC,gBAAgB;MACtCC,KAAK,KAAK1C,QAAQ2C,WAAW;MAC7BC,SAAS;QACPC,eAAe,KAAK7C,QAAQ8C;MAC9B;MACAC,kBAAkB;IACpB,CAAA;AACA,SAAK1C,kBAAkB,IAAI2C,eAAe;MAAEf;IAAS,CAAA;AACrD,SAAK5B,gBAAgB4C,sBAAsB,IAAIC,wBAAwBV,WAAAA,CAAAA;EACzE;EAqBAW,QAAQ;AACN,WAAO,KAAK9C,gBAAgB+C,WAAU;EACxC;EAEAC,QAAQ;AACN,WAAO,KAAKhD,gBAAgBiD,SAAQ;EACtC;AACF;AAEA,IAAM9B,eAAe,CAACC,UAAAA;AACpB,UAAQA,OAAAA;IACN,KAAK8B,SAASC;AACZ,aAAOC,eAAeD;IACxB,KAAKD,SAASG;AACZ,aAAOD,eAAeC;IACxB,KAAKH,SAASI;AACZ,aAAOF,eAAeE;IACxB,KAAKJ,SAASK;AACZ,aAAOH,eAAeG;IACxB;AACE,aAAOH,eAAeG;EAC1B;AACF;;;AChFA,SAASC,0BAA0B;AACnC,SAASC,YAAAA,iBAAgB;AACzB,SAASC,eAAeC,qCAAqC;AAC7D,SAASC,4BAAAA,2BAA0BC,+BAAAA,oCAAmC;AAEtE,SAASC,WAAW;AACpB,SAASC,uBAAwC;;AAIjD,IAAMC,kBAAkB,KAAK;AAQtB,IAAMC,cAAN,MAAMA;EAKXC,YAA6BC,SAAsB;SAAtBA,UAAAA;SAFrBC,UAAU,oBAAIC,IAAAA;AAKpBC,kBAAcH,QAAQI,mBAAmB;AACzC,UAAMC,WAAWC,UAASC,QAAO,EAAGC,MAClC,IAAIF,UAAS;MACX,CAACG,yBAAAA,GAA2B,KAAKT,QAAQU;MACzC,CAACC,4BAAAA,GAA8B,KAAKX,QAAQY;IAC9C,CAAA,CAAA;AAGF,UAAMC,sBAAsB,IAAIC,8BAA8B;MAC5DC,UAAU,IAAIC,mBAAmB;QAC/BC,KAAK,KAAKjB,QAAQkB,WAAW;QAC7BC,SAAS;UACPC,eAAe,KAAKpB,QAAQqB;QAC9B;MACF,CAAA;MACAC,sBAAsBzB;IACxB,CAAA;AAEA,SAAK0B,iBAAiB,IAAIC,cAAc;MACtCnB;MACAoB,SAAS;QAACZ;;IACZ,CAAA;AACA,SAAKa,SAAS,KAAKH,eAAeI,SAAS,oBAAA;AAE3C,UAAMC,UAAU;;MAEdC,WAAW,CAACC,MAAcC,OAAgBC,SAAAA;AACxC,aAAKH,UAAUC,MAAMC,OAAOE,YAAYD,IAAAA,CAAAA;MAC1C;MACAE,cAAc,CAACJ,MAAcC,OAAeC,SAAAA;AAC1C,aAAKE,aAAaJ,MAAMC,OAAOE,YAAYD,IAAAA,CAAAA;MAC7C;MACAG,KAAK,CAACL,MAAcC,OAAwBC,SAAAA;MAE5C;MACAI,OAAO,CAACN,MAAcC,OAAeC,SAAAA;AACnC,aAAKI,MAAMN,MAAMC,OAAOE,YAAYD,IAAAA,CAAAA;MACtC;IACF;AAEAK,oBAAgBC,cAAcC,kBAAkBX,OAAAA;EAClD;EAEAQ,MAAMN,MAAcC,OAAeS,MAAY;AAC7C,UAAMJ,QAAQ,KAAKV,OAAOe,YAAYX,IAAAA;AACtCY,QAAI,cAAc;MAAEZ;MAAMC;MAAOS,MAAM;QAAE,GAAG,KAAKxC,QAAQ2C,QAAO;QAAI,GAAGH;MAAK;IAAE,GAAA;;;;;;AAC9EJ,UAAMQ,OAAOb,OAAO;MAAE,GAAG,KAAK/B,QAAQ2C,QAAO;MAAI,GAAGH;IAAK,CAAA;EAC3D;EAEAX,UAAUC,MAAcC,OAAgBS,MAAY;AAClD,UAAMK,UAAU,KAAKnB,OAAOoB,cAAchB,IAAAA;AAC1CY,QAAI,gBAAgB;MAAEZ;MAAMC;MAAOS,MAAM;QAAE,GAAG,KAAKxC,QAAQ2C,QAAO;QAAI,GAAGH;MAAK;IAAE,GAAA;;;;;;AAChFK,YAAQE,IAAIhB,SAAS,GAAG;MAAE,GAAG,KAAK/B,QAAQ2C,QAAO;MAAI,GAAGH;IAAK,CAAA;EAC/D;EAEAN,aAAaJ,MAAcC,OAAeS,MAAY;AACpD,UAAMN,eAAe,KAAKR,OAAOsB,gBAAgBlB,IAAAA;AACjDY,QAAI,qBAAqB;MAAEZ;MAAMC;MAAOS,MAAM;QAAE,GAAG,KAAKxC,QAAQ2C,QAAO;QAAI,GAAGH;MAAK;IAAE,GAAA;;;;;;AACrFN,iBAAaU,OAAOb,OAAO;MAAE,GAAG,KAAK/B,QAAQ2C,QAAO;MAAI,GAAGH;IAAK,CAAA;EAClE;EAEAS,QAAQ;AACN,WAAO,KAAK1B,eAAe2B,WAAU;EACvC;EAEAC,QAAQ;AACN,WAAO,KAAK5B,eAAe6B,SAAQ;EACrC;AACF;AAEA,IAAMnB,cAAc,CAACD,SAAAA;AACnB,MAAIA,QAAQA,KAAKQ,MAAM;AACrB,WAAOa,OAAOC,QAAQtB,KAAKQ,IAAI,EAAEe,OAA+B,CAACC,KAAK,CAACC,KAAK1B,KAAAA,MAAM;AAChFyB,UAAIC,GAAAA,IAAO1B;AACX,aAAOyB;IACT,GAAG,CAAC,CAAA;EACN,OAAO;AACL,WAAO,CAAC;EACV;AACF;;;AC1GA,SAASE,aAA0B;AACnC,SAASC,yBAAyB;AAClC,SAASC,YAAAA,iBAAgB;AACzB,SACEC,qBACAC,oBACAC,qBACAC,2BACK;AACP,SAASC,4BAAAA,2BAA0BC,+BAAAA,oCAAmC;AACtE,SAASC,OAAAA,YAAW;AAEpB,SAASC,mBAAAA,wBAA8C;AAIhD,IAAMC,aAAN,MAAMA;EAEXC,YAA6BC,SAAsB;SAAtBA,UAAAA;AAC3B,UAAMC,WAAWC,UAASC,QAAO,EAAGC,MAClC,IAAIF,UAAS;MACX,CAACG,yBAAAA,GAA2B,KAAKL,QAAQM;MACzC,CAACC,4BAAAA,GAA8B,KAAKP,QAAQQ;IAC9C,CAAA,CAAA;AAGF,UAAMC,iBAAiB,IAAIC,oBAAoB;MAAET;IAAS,CAAA;AAC1DQ,mBAAeE,iBAAiB,IAAIC,oBAAoB,IAAIC,oBAAAA,CAAAA,CAAAA;AAC5DJ,mBAAeE,iBACb,IAAIG,mBACF,IAAIC,kBAAkB;MACpBC,KAAK,KAAKhB,QAAQiB,WAAW;MAC7BC,SAAS;QACPC,eAAe,KAAKnB,QAAQoB;MAC9B;MACAC,kBAAkB;IACpB,CAAA,CAAA,CAAA;AAGJZ,mBAAea,SAAQ;AACvB,SAAKC,UAAUC,MAAMC,UAAU,sBAAsB,KAAKzB,QAAQQ,cAAc;EAClF;EAEOkB,QAAQ;AACbC,IAAAA,KAAI,4BAAA;AACJC,IAAAA,iBAAgBC,cAAcC,kBAAkB;MAC9CC,WAAW,CAAC/B,YAAAA;AACV2B,QAAAA,KAAI,oBAAoB;UAAE3B;QAAQ,CAAA;AAClC,eAAO,KAAKuB,QAAQQ,UAAU/B,QAAQgC,MAAMhC,OAAAA;MAC9C;IACF,CAAA;EACF;AACF;",
6
+ "names": ["diag", "DiagConsoleLogger", "DiagLogLevel", "setDiagLogger", "level", "logLevel", "DiagLogLevel", "diag", "setLogger", "DiagConsoleLogger", "SeverityNumber", "OTLPLogExporter", "Resource", "BatchLogRecordProcessor", "LoggerProvider", "SEMRESATTRS_SERVICE_NAME", "SEMRESATTRS_SERVICE_VERSION", "getContextFromEntry", "getRelativeFilename", "LogLevel", "shouldLog", "jsonlogify", "OtelLogs", "constructor", "options", "logProcessor", "config", "entry", "logger", "_loggerProvider", "getLogger", "serviceVersion", "shouldLog", "captureFilters", "meta", "S", "remoteSessionId", "record", "file", "getRelativeFilename", "F", "line", "L", "context", "jsonlogify", "getContextFromEntry", "emit", "severityNumber", "convertLevel", "level", "body", "JSON", "stringify", "attributes", "getTags", "setDiagLogger", "consoleDiagLogLevel", "resource", "Resource", "default", "merge", "SEMRESATTRS_SERVICE_NAME", "serviceName", "SEMRESATTRS_SERVICE_VERSION", "logExporter", "OTLPLogExporter", "url", "endpoint", "headers", "Authorization", "authorizationHeader", "concurrencyLimit", "LoggerProvider", "addLogRecordProcessor", "BatchLogRecordProcessor", "flush", "forceFlush", "close", "shutdown", "LogLevel", "DEBUG", "SeverityNumber", "INFO", "WARN", "ERROR", "OTLPMetricExporter", "Resource", "MeterProvider", "PeriodicExportingMetricReader", "SEMRESATTRS_SERVICE_NAME", "SEMRESATTRS_SERVICE_VERSION", "log", "TRACE_PROCESSOR", "EXPORT_INTERVAL", "OtelMetrics", "constructor", "options", "_gauges", "Map", "setDiagLogger", "consoleDiagLogLevel", "resource", "Resource", "default", "merge", "SEMRESATTRS_SERVICE_NAME", "serviceName", "SEMRESATTRS_SERVICE_VERSION", "serviceVersion", "grafanaMetricReader", "PeriodicExportingMetricReader", "exporter", "OTLPMetricExporter", "url", "endpoint", "headers", "Authorization", "authorizationHeader", "exportIntervalMillis", "_meterProvider", "MeterProvider", "readers", "_meter", "getMeter", "metrics", "increment", "name", "value", "data", "convertTags", "distribution", "set", "gauge", "TRACE_PROCESSOR", "remoteMetrics", "registerProcessor", "tags", "createGauge", "log", "getTags", "record", "counter", "createCounter", "add", "createHistogram", "flush", "forceFlush", "close", "shutdown", "Object", "entries", "reduce", "obj", "key", "trace", "OTLPTraceExporter", "Resource", "BasicTracerProvider", "BatchSpanProcessor", "ConsoleSpanExporter", "SimpleSpanProcessor", "SEMRESATTRS_SERVICE_NAME", "SEMRESATTRS_SERVICE_VERSION", "log", "TRACE_PROCESSOR", "OtelTraces", "constructor", "options", "resource", "Resource", "default", "merge", "SEMRESATTRS_SERVICE_NAME", "serviceName", "SEMRESATTRS_SERVICE_VERSION", "serviceVersion", "tracerProvider", "BasicTracerProvider", "addSpanProcessor", "SimpleSpanProcessor", "ConsoleSpanExporter", "BatchSpanProcessor", "OTLPTraceExporter", "url", "endpoint", "headers", "Authorization", "authorizationHeader", "concurrencyLimit", "register", "_tracer", "trace", "getTracer", "start", "log", "TRACE_PROCESSOR", "remoteTracing", "registerProcessor", "startSpan", "name"]
7
+ }
@@ -0,0 +1,143 @@
1
+ import "../chunk-KDP3SESE.mjs";
2
+ import {
3
+ captureException
4
+ } from "../chunk-YEQOSJSQ.mjs";
5
+
6
+ // packages/sdk/observability/src/segment/node.ts
7
+ import { Analytics } from "@segment/analytics-node";
8
+ import { invariant } from "@dxos/invariant";
9
+ import { log } from "@dxos/log";
10
+ var __dxlog_file = "/home/runner/work/dxos/dxos/packages/sdk/observability/src/segment/node.ts";
11
+ var SegmentTelemetry = class {
12
+ constructor({ apiKey, batchSize, getTags }) {
13
+ this._getTags = getTags;
14
+ try {
15
+ invariant(apiKey, "Key required to send telemetry", {
16
+ F: __dxlog_file,
17
+ L: 20,
18
+ S: this,
19
+ A: [
20
+ "apiKey",
21
+ "'Key required to send telemetry'"
22
+ ]
23
+ });
24
+ this._analytics = new Analytics({
25
+ writeKey: apiKey,
26
+ flushAt: batchSize
27
+ });
28
+ } catch (err) {
29
+ log.catch("Failed to initialize telemetry", err, {
30
+ F: __dxlog_file,
31
+ L: 27,
32
+ S: this,
33
+ C: (f, a) => f(...a)
34
+ });
35
+ }
36
+ }
37
+ /**
38
+ * Track a page view.
39
+ */
40
+ page({ installationId: anonymousId, identityId: userId, ...options } = {}) {
41
+ if (!this._analytics) {
42
+ log("Analytics not initialized", {
43
+ action: "page"
44
+ }, {
45
+ F: __dxlog_file,
46
+ L: 36,
47
+ S: this,
48
+ C: (f, a) => f(...a)
49
+ });
50
+ return;
51
+ }
52
+ try {
53
+ this._analytics.page({
54
+ ...options,
55
+ userId,
56
+ anonymousId
57
+ });
58
+ } catch (err) {
59
+ log.catch("Failed to track page", err, {
60
+ F: __dxlog_file,
61
+ L: 47,
62
+ S: this,
63
+ C: (f, a) => f(...a)
64
+ });
65
+ }
66
+ }
67
+ /**
68
+ * Track an event.
69
+ */
70
+ event({ installationId: anonymousId, identityId: userId, name: event, ...options }) {
71
+ log("sending event to telemetry", {
72
+ event,
73
+ options,
74
+ tags: this._getTags()
75
+ }, {
76
+ F: __dxlog_file,
77
+ L: 55,
78
+ S: this,
79
+ C: (f, a) => f(...a)
80
+ });
81
+ if (!this._analytics) {
82
+ log("Analytics not initialized", {
83
+ action: "event"
84
+ }, {
85
+ F: __dxlog_file,
86
+ L: 57,
87
+ S: this,
88
+ C: (f, a) => f(...a)
89
+ });
90
+ return;
91
+ }
92
+ try {
93
+ this._analytics.track({
94
+ ...options,
95
+ properties: {
96
+ ...options.properties,
97
+ ...this._getTags()
98
+ },
99
+ userId,
100
+ anonymousId,
101
+ event
102
+ });
103
+ } catch (err) {
104
+ log.catch("Failed to track event", err, {
105
+ F: __dxlog_file,
106
+ L: 70,
107
+ S: this,
108
+ C: (f, a) => f(...a)
109
+ });
110
+ }
111
+ }
112
+ /**
113
+ * Flush the event queue.
114
+ */
115
+ async flush() {
116
+ if (!this._analytics) {
117
+ log("Analytics not initialized", {
118
+ action: "flush"
119
+ }, {
120
+ F: __dxlog_file,
121
+ L: 79,
122
+ S: this,
123
+ C: (f, a) => f(...a)
124
+ });
125
+ return;
126
+ }
127
+ try {
128
+ await this._analytics.flush();
129
+ } catch (err) {
130
+ captureException(err);
131
+ }
132
+ }
133
+ async close() {
134
+ if (!this._analytics) {
135
+ return;
136
+ }
137
+ await this._analytics.closeAndFlush();
138
+ }
139
+ };
140
+ export {
141
+ SegmentTelemetry
142
+ };
143
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/segment/node.ts"],
4
+ "sourcesContent": ["//\n// Copyright 2022 DXOS.org\n//\n\nimport { Analytics } from '@segment/analytics-node';\n\nimport { invariant } from '@dxos/invariant';\nimport { log } from '@dxos/log';\n\nimport type { EventOptions, SegmentTelemetryOptions, PageOptions } from './types';\nimport { captureException } from '../sentry';\n\nexport class SegmentTelemetry {\n private _analytics?: Analytics;\n private _getTags: () => { [key: string]: string };\n\n constructor({ apiKey, batchSize, getTags }: SegmentTelemetryOptions) {\n this._getTags = getTags;\n try {\n invariant(apiKey, 'Key required to send telemetry');\n\n this._analytics = new Analytics({\n writeKey: apiKey,\n flushAt: batchSize,\n });\n } catch (err) {\n log.catch('Failed to initialize telemetry', err);\n }\n }\n\n /**\n * Track a page view.\n */\n page({ installationId: anonymousId, identityId: userId, ...options }: PageOptions = {}) {\n if (!this._analytics) {\n log('Analytics not initialized', { action: 'page' });\n return;\n }\n\n try {\n this._analytics.page({\n ...options,\n userId,\n anonymousId: anonymousId!,\n });\n } catch (err) {\n log.catch('Failed to track page', err);\n }\n }\n\n /**\n * Track an event.\n */\n event({ installationId: anonymousId, identityId: userId, name: event, ...options }: EventOptions) {\n log('sending event to telemetry', { event, options, tags: this._getTags() });\n if (!this._analytics) {\n log('Analytics not initialized', { action: 'event' });\n return;\n }\n\n try {\n this._analytics.track({\n ...options,\n properties: { ...options.properties, ...this._getTags() },\n userId,\n anonymousId: anonymousId!,\n event,\n });\n } catch (err) {\n log.catch('Failed to track event', err);\n }\n }\n\n /**\n * Flush the event queue.\n */\n async flush() {\n if (!this._analytics) {\n log('Analytics not initialized', { action: 'flush' });\n return;\n }\n\n try {\n await this._analytics.flush();\n } catch (err) {\n // are these errors worth capturing?\n captureException(err);\n }\n }\n\n async close() {\n if (!this._analytics) {\n return;\n }\n await this._analytics.closeAndFlush();\n }\n}\n"],
5
+ "mappings": ";;;;;;AAIA,SAASA,iBAAiB;AAE1B,SAASC,iBAAiB;AAC1B,SAASC,WAAW;;AAKb,IAAMC,mBAAN,MAAMA;EAIXC,YAAY,EAAEC,QAAQC,WAAWC,QAAO,GAA6B;AACnE,SAAKC,WAAWD;AAChB,QAAI;AACFE,gBAAUJ,QAAQ,kCAAA;;;;;;;;;AAElB,WAAKK,aAAa,IAAIC,UAAU;QAC9BC,UAAUP;QACVQ,SAASP;MACX,CAAA;IACF,SAASQ,KAAK;AACZC,UAAIC,MAAM,kCAAkCF,KAAAA;;;;;;IAC9C;EACF;;;;EAKAG,KAAK,EAAEC,gBAAgBC,aAAaC,YAAYC,QAAQ,GAAGC,QAAAA,IAAyB,CAAC,GAAG;AACtF,QAAI,CAAC,KAAKZ,YAAY;AACpBK,UAAI,6BAA6B;QAAEQ,QAAQ;MAAO,GAAA;;;;;;AAClD;IACF;AAEA,QAAI;AACF,WAAKb,WAAWO,KAAK;QACnB,GAAGK;QACHD;QACAF;MACF,CAAA;IACF,SAASL,KAAK;AACZC,UAAIC,MAAM,wBAAwBF,KAAAA;;;;;;IACpC;EACF;;;;EAKAU,MAAM,EAAEN,gBAAgBC,aAAaC,YAAYC,QAAQI,MAAMD,OAAO,GAAGF,QAAAA,GAAyB;AAChGP,QAAI,8BAA8B;MAAES;MAAOF;MAASI,MAAM,KAAKlB,SAAQ;IAAG,GAAA;;;;;;AAC1E,QAAI,CAAC,KAAKE,YAAY;AACpBK,UAAI,6BAA6B;QAAEQ,QAAQ;MAAQ,GAAA;;;;;;AACnD;IACF;AAEA,QAAI;AACF,WAAKb,WAAWiB,MAAM;QACpB,GAAGL;QACHM,YAAY;UAAE,GAAGN,QAAQM;UAAY,GAAG,KAAKpB,SAAQ;QAAG;QACxDa;QACAF;QACAK;MACF,CAAA;IACF,SAASV,KAAK;AACZC,UAAIC,MAAM,yBAAyBF,KAAAA;;;;;;IACrC;EACF;;;;EAKA,MAAMe,QAAQ;AACZ,QAAI,CAAC,KAAKnB,YAAY;AACpBK,UAAI,6BAA6B;QAAEQ,QAAQ;MAAQ,GAAA;;;;;;AACnD;IACF;AAEA,QAAI;AACF,YAAM,KAAKb,WAAWmB,MAAK;IAC7B,SAASf,KAAK;AAEZgB,uBAAiBhB,GAAAA;IACnB;EACF;EAEA,MAAMiB,QAAQ;AACZ,QAAI,CAAC,KAAKrB,YAAY;AACpB;IACF;AACA,UAAM,KAAKA,WAAWsB,cAAa;EACrC;AACF;",
6
+ "names": ["Analytics", "invariant", "log", "SegmentTelemetry", "constructor", "apiKey", "batchSize", "getTags", "_getTags", "invariant", "_analytics", "Analytics", "writeKey", "flushAt", "err", "log", "catch", "page", "installationId", "anonymousId", "identityId", "userId", "options", "action", "event", "name", "tags", "track", "properties", "flush", "captureException", "close", "closeAndFlush"]
7
+ }
@@ -0,0 +1,24 @@
1
+ import "../chunk-KDP3SESE.mjs";
2
+ import {
3
+ addBreadcrumb,
4
+ captureException,
5
+ captureMessage,
6
+ captureUserFeedback,
7
+ init,
8
+ setTag,
9
+ setTags,
10
+ setUser,
11
+ withScope
12
+ } from "../chunk-YEQOSJSQ.mjs";
13
+ export {
14
+ addBreadcrumb,
15
+ captureException,
16
+ captureMessage,
17
+ captureUserFeedback,
18
+ init,
19
+ setTag,
20
+ setTags,
21
+ setUser,
22
+ withScope
23
+ };
24
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": [],
4
+ "sourcesContent": [],
5
+ "mappings": "",
6
+ "names": []
7
+ }
@@ -0,0 +1,132 @@
1
+ import {
2
+ captureException,
3
+ captureMessage,
4
+ withScope
5
+ } from "./chunk-YEQOSJSQ.mjs";
6
+
7
+ // packages/sdk/observability/src/sentry/sentry-log-processor.ts
8
+ import { InvariantViolation } from "@dxos/invariant";
9
+ import { LogLevel, shouldLog } from "@dxos/log";
10
+ import { CircularBuffer, getDebugName } from "@dxos/util";
11
+ var MAX_LOG_BREADCRUMBS = 80;
12
+ var SentryLogProcessor = class {
13
+ constructor() {
14
+ this._breadcrumbs = new CircularBuffer(MAX_LOG_BREADCRUMBS);
15
+ this.logProcessor = (config, entry) => {
16
+ const { level, meta, error } = entry;
17
+ if (!shouldLog(entry, config.captureFilters) || meta?.S?.remoteSessionId) {
18
+ return;
19
+ }
20
+ if (entry.level !== LogLevel.WARN && entry.level !== LogLevel.ERROR) {
21
+ return;
22
+ }
23
+ withScope((scope) => {
24
+ const severity = convertLevel(level);
25
+ scope.setLevel(severity);
26
+ scope.setContext("dxoslog", entry.context ?? null);
27
+ if (meta) {
28
+ scope.setTag("transaction", `${getRelativeFilename(meta.F)}:${meta.L}`);
29
+ if (meta.S?.hostSessionId) {
30
+ scope.setTags({
31
+ service_host_issue: true,
32
+ service_host_session: meta.S?.hostSessionId
33
+ });
34
+ }
35
+ if (!Number.isNaN(meta.S?.uptimeSeconds)) {
36
+ scope.setExtra("uptime_seconds", meta.S?.uptimeSeconds);
37
+ }
38
+ }
39
+ const extendedMessage = formatMessageForSentry(entry);
40
+ let capturedError = error;
41
+ if (capturedError == null && entry.level === LogLevel.ERROR) {
42
+ capturedError = Object.values(entry.context ?? {}).find((v) => v instanceof Error);
43
+ }
44
+ if (capturedError) {
45
+ if (capturedError instanceof InvariantViolation) {
46
+ scope.setExtra("invariant_violation", true);
47
+ }
48
+ const isMessageDifferentFromStackTrace = error == null;
49
+ if (isMessageDifferentFromStackTrace) {
50
+ scope.setExtra("message", extendedMessage);
51
+ }
52
+ const eventId2 = captureException(capturedError);
53
+ this._addBreadcrumb(eventId2, extendedMessage, severity, entry.context);
54
+ return;
55
+ }
56
+ scope.setFingerprint([
57
+ entry.message
58
+ ]);
59
+ const eventId = captureMessage(extendedMessage);
60
+ this._addBreadcrumb(eventId, extendedMessage, severity, entry.context);
61
+ });
62
+ };
63
+ }
64
+ addLogBreadcrumbsTo(event) {
65
+ event.breadcrumbs ??= [];
66
+ for (const breadcrumb of this._breadcrumbs) {
67
+ event.breadcrumbs.push(breadcrumb);
68
+ }
69
+ event.breadcrumbs.sort((b1, b2) => {
70
+ if (b1.timestamp === void 0 || b2.timestamp === void 0) {
71
+ return b1.timestamp === b2.timestamp ? 0 : b1.timestamp === void 0 ? -1 : 1;
72
+ }
73
+ return b1.timestamp - b2.timestamp;
74
+ });
75
+ }
76
+ _addBreadcrumb(eventId, message, severity, context) {
77
+ const breadcrumb = {
78
+ type: "console",
79
+ level: severity,
80
+ event_id: eventId,
81
+ category: "log",
82
+ message,
83
+ data: context,
84
+ timestamp: Math.floor(Date.now() / 1e3)
85
+ };
86
+ const lastRecorded = this._breadcrumbs.getLast();
87
+ if (lastRecorded && lastRecorded.message === breadcrumb.message) {
88
+ const firstBreadcrumbData = lastRecorded.data?.firstBreadcrumbData ?? lastRecorded.data ?? {};
89
+ const mergedBreadcrumbCount = Number.isNaN(lastRecorded.data?.mergedBreadcrumbCount) ? 1 : Number(lastRecorded.data?.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
+ var formatMessageForSentry = (entry) => {
101
+ let scopePrefix;
102
+ if (entry.meta?.S) {
103
+ const scope = entry.meta?.S;
104
+ scopePrefix = scope.name || getDebugName(scope);
105
+ }
106
+ if (scopePrefix == null) {
107
+ return entry.message;
108
+ }
109
+ const workerPrefix = entry.meta?.S?.hostSessionId ? "[worker] " : "";
110
+ return `${workerPrefix}${scopePrefix} ${entry.message}`;
111
+ };
112
+ var convertLevel = (level) => {
113
+ if (level === LogLevel.TRACE) {
114
+ return "debug";
115
+ }
116
+ if (level === LogLevel.WARN) {
117
+ return "warning";
118
+ }
119
+ return LogLevel[level].toLowerCase();
120
+ };
121
+ var getRelativeFilename = (filename) => {
122
+ const match = filename.match(/.+\/(packages\/.+\/.+)/);
123
+ if (match) {
124
+ const [, filePath] = match;
125
+ return filePath;
126
+ }
127
+ return filename;
128
+ };
129
+ export {
130
+ SentryLogProcessor
131
+ };
132
+ //# sourceMappingURL=sentry-log-processor-HEWW7T3S.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/sentry/sentry-log-processor.ts"],
4
+ "sourcesContent": ["//\n// Copyright 2024 DXOS.org\n//\n\nimport type { Breadcrumb, SeverityLevel, Event } from '@sentry/types';\n\nimport { InvariantViolation } from '@dxos/invariant';\nimport { type LogConfig, type LogEntry, LogLevel, type LogProcessor, shouldLog } from '@dxos/log';\nimport { CircularBuffer, getDebugName } from '@dxos/util';\n\nimport { withScope, captureException, captureMessage } from './node';\n\nconst MAX_LOG_BREADCRUMBS = 80;\n\nexport class SentryLogProcessor {\n private _breadcrumbs = new CircularBuffer<Breadcrumb>(MAX_LOG_BREADCRUMBS);\n\n public readonly logProcessor: LogProcessor = (config: LogConfig, entry: LogEntry) => {\n const { level, meta, error } = entry;\n // Don't forward logs from remote sessions.\n if (!shouldLog(entry, config.captureFilters) || meta?.S?.remoteSessionId) {\n return;\n }\n if (entry.level !== LogLevel.WARN && entry.level !== LogLevel.ERROR) {\n return;\n }\n // TODO(nf): add rate limiting to avoid spamming Sentry/consuming excessive quota.\n withScope((scope) => {\n const severity = convertLevel(level);\n scope.setLevel(severity);\n scope.setContext('dxoslog', entry.context ?? null);\n if (meta) {\n scope.setTag('transaction', `${getRelativeFilename(meta.F)}:${meta.L}`);\n\n if (meta.S?.hostSessionId) {\n scope.setTags({\n service_host_issue: true,\n service_host_session: meta.S?.hostSessionId,\n });\n }\n\n if (!Number.isNaN(meta.S?.uptimeSeconds)) {\n scope.setExtra('uptime_seconds', meta.S?.uptimeSeconds);\n }\n }\n\n const extendedMessage = formatMessageForSentry(entry);\n let capturedError = error;\n if (capturedError == null && entry.level === LogLevel.ERROR) {\n capturedError = Object.values(entry.context ?? {}).find((v): v is Error => v instanceof Error);\n }\n if (capturedError) {\n if (capturedError instanceof InvariantViolation) {\n scope.setExtra('invariant_violation', true);\n }\n const isMessageDifferentFromStackTrace = error == null;\n if (isMessageDifferentFromStackTrace) {\n scope.setExtra('message', extendedMessage);\n }\n const eventId = captureException(capturedError);\n this._addBreadcrumb(eventId, extendedMessage, severity, entry.context);\n return;\n }\n\n scope.setFingerprint([entry.message]);\n const eventId = captureMessage(extendedMessage);\n this._addBreadcrumb(eventId, extendedMessage, severity, entry.context);\n });\n };\n\n public addLogBreadcrumbsTo(event: Event) {\n event.breadcrumbs ??= [];\n for (const breadcrumb of this._breadcrumbs) {\n event.breadcrumbs.push(breadcrumb);\n }\n event.breadcrumbs.sort((b1, b2) => {\n if (b1.timestamp === undefined || b2.timestamp === undefined) {\n return b1.timestamp === b2.timestamp ? 0 : b1.timestamp === undefined ? -1 : 1;\n }\n return b1.timestamp - b2.timestamp;\n });\n }\n\n private _addBreadcrumb(\n eventId: string,\n message: string,\n severity: SeverityLevel,\n context: { [key: string]: any } | undefined,\n ): void {\n const breadcrumb: Breadcrumb = {\n type: 'console',\n level: severity,\n event_id: eventId,\n category: 'log',\n message,\n data: context,\n timestamp: Math.floor(Date.now() / 1000),\n };\n const lastRecorded = this._breadcrumbs.getLast();\n if (lastRecorded && lastRecorded.message === breadcrumb.message) {\n const firstBreadcrumbData = lastRecorded.data?.firstBreadcrumbData ?? lastRecorded.data ?? {};\n const mergedBreadcrumbCount = Number.isNaN(lastRecorded.data?.mergedBreadcrumbCount)\n ? 1\n : Number(lastRecorded.data?.mergedBreadcrumbCount);\n lastRecorded.data = {\n mergedBreadcrumbCount: mergedBreadcrumbCount + 1,\n firstBreadcrumbData,\n lastBreadcrumbData: breadcrumb.data,\n };\n return;\n }\n this._breadcrumbs.push(breadcrumb);\n }\n}\n\nconst formatMessageForSentry = (entry: LogEntry) => {\n let scopePrefix: string | undefined;\n if (entry.meta?.S) {\n const scope = entry.meta?.S;\n scopePrefix = scope.name || getDebugName(scope);\n }\n if (scopePrefix == null) {\n return entry.message;\n }\n const workerPrefix = entry.meta?.S?.hostSessionId ? '[worker] ' : '';\n return `${workerPrefix}${scopePrefix} ${entry.message}`;\n};\n\nconst convertLevel = (level: LogLevel): SeverityLevel => {\n if (level === LogLevel.TRACE) {\n return 'debug';\n }\n if (level === LogLevel.WARN) {\n return 'warning';\n }\n return LogLevel[level].toLowerCase() as SeverityLevel;\n};\n\nconst getRelativeFilename = (filename: string) => {\n // TODO(burdon): Hack uses \"packages\" as an anchor (pre-parse NX?)\n // Including `packages/` part of the path so that excluded paths (e.g. from dist) are clickable in vscode.\n const match = filename.match(/.+\\/(packages\\/.+\\/.+)/);\n if (match) {\n const [, filePath] = match;\n return filePath;\n }\n\n return filename;\n};\n"],
5
+ "mappings": "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",
6
+ "names": ["InvariantViolation", "LogLevel", "shouldLog", "CircularBuffer", "getDebugName", "MAX_LOG_BREADCRUMBS", "SentryLogProcessor", "_breadcrumbs", "CircularBuffer", "logProcessor", "config", "entry", "level", "meta", "error", "shouldLog", "captureFilters", "S", "remoteSessionId", "LogLevel", "WARN", "ERROR", "withScope", "scope", "severity", "convertLevel", "setLevel", "setContext", "context", "setTag", "getRelativeFilename", "F", "L", "hostSessionId", "setTags", "service_host_issue", "service_host_session", "Number", "isNaN", "uptimeSeconds", "setExtra", "extendedMessage", "formatMessageForSentry", "capturedError", "Object", "values", "find", "v", "Error", "InvariantViolation", "isMessageDifferentFromStackTrace", "eventId", "captureException", "_addBreadcrumb", "setFingerprint", "message", "captureMessage", "addLogBreadcrumbsTo", "event", "breadcrumbs", "breadcrumb", "push", "sort", "b1", "b2", "timestamp", "undefined", "type", "event_id", "category", "data", "Math", "floor", "Date", "now", "lastRecorded", "getLast", "firstBreadcrumbData", "mergedBreadcrumbCount", "lastBreadcrumbData", "scopePrefix", "name", "getDebugName", "workerPrefix", "TRACE", "toLowerCase", "filename", "match", "filePath"]
7
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=node.node.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node.node.test.d.ts","sourceRoot":"","sources":["../../../../src/sentry/node.node.test.ts"],"names":[],"mappings":""}