@dxos/observability 0.6.2 → 0.6.3-main.038c693
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/lib/browser/{chunk-HKNRDUTP.mjs → chunk-2CXA7PYK.mjs} +187 -221
- package/dist/lib/browser/chunk-2CXA7PYK.mjs.map +7 -0
- package/dist/lib/browser/index.mjs +1 -2
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/browser/observability-MXAPN7J6.mjs +7 -0
- package/dist/lib/browser/otel-BUKBDMAL.mjs +275 -0
- package/dist/lib/browser/otel-BUKBDMAL.mjs.map +7 -0
- package/dist/lib/browser/sentry-log-processor-DVUUOZ6G.mjs +132 -0
- package/dist/lib/browser/sentry-log-processor-DVUUOZ6G.mjs.map +7 -0
- package/dist/lib/node/{chunk-6QQAPUDU.cjs → chunk-HBLKTDQE.cjs} +190 -217
- package/dist/lib/node/chunk-HBLKTDQE.cjs.map +7 -0
- package/dist/lib/node/index.cjs +15 -16
- package/dist/lib/node/index.cjs.map +2 -2
- package/dist/lib/node/meta.json +1 -1
- package/dist/lib/node/{observability-7TFOBOTA.cjs → observability-4R6M4JMU.cjs} +6 -7
- package/dist/lib/node/observability-4R6M4JMU.cjs.map +7 -0
- package/dist/lib/node/otel-TSHMOAB4.cjs +276 -0
- package/dist/lib/node/otel-TSHMOAB4.cjs.map +7 -0
- package/dist/lib/node/sentry-log-processor-H6FUSKZI.cjs +150 -0
- package/dist/lib/node/sentry-log-processor-H6FUSKZI.cjs.map +7 -0
- package/dist/types/src/cli-observability-secrets.json +3 -1
- package/dist/types/src/helpers/browser-observability.d.ts.map +1 -1
- package/dist/types/src/helpers/browser-observability.js +1 -0
- package/dist/types/src/helpers/browser-observability.js.map +1 -1
- package/dist/types/src/observability.d.ts +12 -2
- package/dist/types/src/observability.d.ts.map +1 -1
- package/dist/types/src/observability.js +125 -42
- package/dist/types/src/observability.js.map +1 -1
- package/dist/types/src/otel/index.d.ts +5 -0
- package/dist/types/src/otel/index.d.ts.map +1 -0
- package/dist/types/src/otel/index.js +24 -0
- package/dist/types/src/otel/index.js.map +1 -0
- package/dist/types/src/otel/logs.d.ts +11 -0
- package/dist/types/src/otel/logs.d.ts.map +1 -0
- package/dist/types/src/otel/logs.js +72 -0
- package/dist/types/src/otel/logs.js.map +1 -0
- package/dist/types/src/otel/metrics.d.ts +14 -0
- package/dist/types/src/otel/metrics.d.ts.map +1 -0
- package/dist/types/src/otel/metrics.js +91 -0
- package/dist/types/src/otel/metrics.js.map +1 -0
- package/dist/types/src/otel/otel.d.ts +12 -0
- package/dist/types/src/otel/otel.d.ts.map +1 -0
- package/dist/types/src/otel/otel.js +15 -0
- package/dist/types/src/otel/otel.js.map +1 -0
- package/dist/types/src/otel/traces-browser.d.ts +8 -0
- package/dist/types/src/otel/traces-browser.d.ts.map +1 -0
- package/dist/types/src/otel/traces-browser.js +51 -0
- package/dist/types/src/otel/traces-browser.js.map +1 -0
- package/dist/types/src/otel/traces.d.ts +8 -0
- package/dist/types/src/otel/traces.d.ts.map +1 -0
- package/dist/types/src/otel/traces.js +44 -0
- package/dist/types/src/otel/traces.js.map +1 -0
- package/package.json +35 -20
- package/src/cli-observability-secrets.json +3 -1
- package/src/helpers/browser-observability.ts +1 -0
- package/src/observability.ts +141 -42
- package/src/otel/index.ts +8 -0
- package/src/otel/logs.ts +86 -0
- package/src/otel/metrics.ts +111 -0
- package/src/otel/otel.ts +21 -0
- package/src/otel/traces-browser.ts +59 -0
- package/src/otel/traces.ts +57 -0
- package/dist/lib/browser/chunk-HKNRDUTP.mjs.map +0 -7
- package/dist/lib/browser/observability-6FYBCIL6.mjs +0 -8
- package/dist/lib/node/chunk-6QQAPUDU.cjs.map +0 -7
- package/dist/lib/node/observability-7TFOBOTA.cjs.map +0 -7
- /package/dist/lib/browser/{observability-6FYBCIL6.mjs.map → observability-MXAPN7J6.mjs.map} +0 -0
|
@@ -0,0 +1,276 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
var otel_TSHMOAB4_exports = {};
|
|
20
|
+
__export(otel_TSHMOAB4_exports, {
|
|
21
|
+
OtelLogs: () => OtelLogs,
|
|
22
|
+
OtelMetrics: () => OtelMetrics,
|
|
23
|
+
OtelTraces: () => OtelTraces,
|
|
24
|
+
setDiagLogger: () => setDiagLogger
|
|
25
|
+
});
|
|
26
|
+
module.exports = __toCommonJS(otel_TSHMOAB4_exports);
|
|
27
|
+
var import_api = require("@opentelemetry/api");
|
|
28
|
+
var import_api_logs = require("@opentelemetry/api-logs");
|
|
29
|
+
var import_exporter_logs_otlp_http = require("@opentelemetry/exporter-logs-otlp-http");
|
|
30
|
+
var import_resources = require("@opentelemetry/resources");
|
|
31
|
+
var import_sdk_logs = require("@opentelemetry/sdk-logs");
|
|
32
|
+
var import_semantic_conventions = require("@opentelemetry/semantic-conventions");
|
|
33
|
+
var import_log = require("@dxos/log");
|
|
34
|
+
var import_util = require("@dxos/util");
|
|
35
|
+
var import_exporter_metrics_otlp_http = require("@opentelemetry/exporter-metrics-otlp-http");
|
|
36
|
+
var import_resources2 = require("@opentelemetry/resources");
|
|
37
|
+
var import_sdk_metrics = require("@opentelemetry/sdk-metrics");
|
|
38
|
+
var import_semantic_conventions2 = require("@opentelemetry/semantic-conventions");
|
|
39
|
+
var import_log2 = require("@dxos/log");
|
|
40
|
+
var import_tracing = require("@dxos/tracing");
|
|
41
|
+
var import_api2 = require("@opentelemetry/api");
|
|
42
|
+
var import_exporter_trace_otlp_http = require("@opentelemetry/exporter-trace-otlp-http");
|
|
43
|
+
var import_resources3 = require("@opentelemetry/resources");
|
|
44
|
+
var import_sdk_trace_base = require("@opentelemetry/sdk-trace-base");
|
|
45
|
+
var import_semantic_conventions3 = require("@opentelemetry/semantic-conventions");
|
|
46
|
+
var import_debug = require("debug");
|
|
47
|
+
var import_tracing2 = require("@dxos/tracing");
|
|
48
|
+
var setDiagLogger = (level) => {
|
|
49
|
+
const logLevel = import_api.DiagLogLevel[level];
|
|
50
|
+
if (logLevel) {
|
|
51
|
+
import_api.diag.setLogger(new import_api.DiagConsoleLogger(), logLevel);
|
|
52
|
+
}
|
|
53
|
+
};
|
|
54
|
+
var OtelLogs = class {
|
|
55
|
+
constructor(options) {
|
|
56
|
+
this.options = options;
|
|
57
|
+
this.logProcessor = (config, entry) => {
|
|
58
|
+
const logger = this._loggerProvider.getLogger("dxos-observability", this.options.serviceVersion);
|
|
59
|
+
if (!(0, import_log.shouldLog)(entry, config.captureFilters) || entry.meta?.S?.remoteSessionId) {
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
const record = {
|
|
63
|
+
...entry,
|
|
64
|
+
...entry.meta ? {
|
|
65
|
+
meta: {
|
|
66
|
+
file: (0, import_log.getRelativeFilename)(entry.meta.F),
|
|
67
|
+
line: entry.meta.L
|
|
68
|
+
}
|
|
69
|
+
} : {},
|
|
70
|
+
context: (0, import_util.jsonlogify)((0, import_log.getContextFromEntry)(entry))
|
|
71
|
+
};
|
|
72
|
+
logger.emit({
|
|
73
|
+
severityNumber: convertLevel(entry.level),
|
|
74
|
+
body: JSON.stringify(record),
|
|
75
|
+
attributes: this.options.getTags()
|
|
76
|
+
});
|
|
77
|
+
};
|
|
78
|
+
setDiagLogger(options.consoleDiagLogLevel);
|
|
79
|
+
const resource = import_resources.Resource.default().merge(new import_resources.Resource({
|
|
80
|
+
[import_semantic_conventions.SEMRESATTRS_SERVICE_NAME]: this.options.serviceName,
|
|
81
|
+
[import_semantic_conventions.SEMRESATTRS_SERVICE_VERSION]: this.options.serviceVersion
|
|
82
|
+
}));
|
|
83
|
+
const logExporter = new import_exporter_logs_otlp_http.OTLPLogExporter({
|
|
84
|
+
url: this.options.endpoint + "/v1/logs",
|
|
85
|
+
headers: {
|
|
86
|
+
Authorization: this.options.authorizationHeader
|
|
87
|
+
},
|
|
88
|
+
concurrencyLimit: 10
|
|
89
|
+
});
|
|
90
|
+
this._loggerProvider = new import_sdk_logs.LoggerProvider({
|
|
91
|
+
resource
|
|
92
|
+
});
|
|
93
|
+
this._loggerProvider.addLogRecordProcessor(new import_sdk_logs.BatchLogRecordProcessor(logExporter));
|
|
94
|
+
}
|
|
95
|
+
flush() {
|
|
96
|
+
return this._loggerProvider.forceFlush();
|
|
97
|
+
}
|
|
98
|
+
close() {
|
|
99
|
+
return this._loggerProvider.shutdown();
|
|
100
|
+
}
|
|
101
|
+
};
|
|
102
|
+
var convertLevel = (level) => {
|
|
103
|
+
switch (level) {
|
|
104
|
+
case import_log.LogLevel.DEBUG:
|
|
105
|
+
return import_api_logs.SeverityNumber.DEBUG;
|
|
106
|
+
case import_log.LogLevel.INFO:
|
|
107
|
+
return import_api_logs.SeverityNumber.INFO;
|
|
108
|
+
case import_log.LogLevel.WARN:
|
|
109
|
+
return import_api_logs.SeverityNumber.WARN;
|
|
110
|
+
case import_log.LogLevel.ERROR:
|
|
111
|
+
return import_api_logs.SeverityNumber.ERROR;
|
|
112
|
+
default:
|
|
113
|
+
return import_api_logs.SeverityNumber.ERROR;
|
|
114
|
+
}
|
|
115
|
+
};
|
|
116
|
+
var __dxlog_file = "/home/runner/work/dxos/dxos/packages/sdk/observability/src/otel/metrics.ts";
|
|
117
|
+
var EXPORT_INTERVAL = 60 * 1e3;
|
|
118
|
+
var OtelMetrics = class {
|
|
119
|
+
constructor(options) {
|
|
120
|
+
this.options = options;
|
|
121
|
+
this._gauges = /* @__PURE__ */ new Map();
|
|
122
|
+
setDiagLogger(options.consoleDiagLogLevel);
|
|
123
|
+
const resource = import_resources2.Resource.default().merge(new import_resources2.Resource({
|
|
124
|
+
[import_semantic_conventions2.SEMRESATTRS_SERVICE_NAME]: this.options.serviceName,
|
|
125
|
+
[import_semantic_conventions2.SEMRESATTRS_SERVICE_VERSION]: this.options.serviceVersion
|
|
126
|
+
}));
|
|
127
|
+
const grafanaMetricReader = new import_sdk_metrics.PeriodicExportingMetricReader({
|
|
128
|
+
exporter: new import_exporter_metrics_otlp_http.OTLPMetricExporter({
|
|
129
|
+
url: this.options.endpoint + "/v1/metrics",
|
|
130
|
+
headers: {
|
|
131
|
+
Authorization: this.options.authorizationHeader
|
|
132
|
+
}
|
|
133
|
+
}),
|
|
134
|
+
exportIntervalMillis: EXPORT_INTERVAL
|
|
135
|
+
});
|
|
136
|
+
this._meterProvider = new import_sdk_metrics.MeterProvider({
|
|
137
|
+
resource,
|
|
138
|
+
readers: [
|
|
139
|
+
grafanaMetricReader
|
|
140
|
+
]
|
|
141
|
+
});
|
|
142
|
+
this._meter = this._meterProvider.getMeter("dxos-observability");
|
|
143
|
+
const metrics = {
|
|
144
|
+
// TODO: update metrics names and remove prefix?
|
|
145
|
+
increment: (name, value, data) => {
|
|
146
|
+
this.increment(name, value, convertTags(data));
|
|
147
|
+
},
|
|
148
|
+
distribution: (name, value, data) => {
|
|
149
|
+
this.distribution(name, value, convertTags(data));
|
|
150
|
+
},
|
|
151
|
+
set: (name, value, data) => {
|
|
152
|
+
},
|
|
153
|
+
gauge: (name, value, data) => {
|
|
154
|
+
this.gauge(name, value, convertTags(data));
|
|
155
|
+
}
|
|
156
|
+
};
|
|
157
|
+
import_tracing.TRACE_PROCESSOR.remoteMetrics.registerProcessor(metrics);
|
|
158
|
+
}
|
|
159
|
+
gauge(name, value, tags) {
|
|
160
|
+
const gauge = this._meter.createGauge(name);
|
|
161
|
+
(0, import_log2.log)("otel gauge", {
|
|
162
|
+
name,
|
|
163
|
+
value,
|
|
164
|
+
tags: {
|
|
165
|
+
...this.options.getTags(),
|
|
166
|
+
...tags
|
|
167
|
+
}
|
|
168
|
+
}, {
|
|
169
|
+
F: __dxlog_file,
|
|
170
|
+
L: 77,
|
|
171
|
+
S: this,
|
|
172
|
+
C: (f, a) => f(...a)
|
|
173
|
+
});
|
|
174
|
+
gauge.record(value, {
|
|
175
|
+
...this.options.getTags(),
|
|
176
|
+
...tags
|
|
177
|
+
});
|
|
178
|
+
}
|
|
179
|
+
increment(name, value, tags) {
|
|
180
|
+
const counter = this._meter.createCounter(name);
|
|
181
|
+
(0, import_log2.log)("otel counter", {
|
|
182
|
+
name,
|
|
183
|
+
value,
|
|
184
|
+
tags: {
|
|
185
|
+
...this.options.getTags(),
|
|
186
|
+
...tags
|
|
187
|
+
}
|
|
188
|
+
}, {
|
|
189
|
+
F: __dxlog_file,
|
|
190
|
+
L: 83,
|
|
191
|
+
S: this,
|
|
192
|
+
C: (f, a) => f(...a)
|
|
193
|
+
});
|
|
194
|
+
counter.add(value ?? 1, {
|
|
195
|
+
...this.options.getTags(),
|
|
196
|
+
...tags
|
|
197
|
+
});
|
|
198
|
+
}
|
|
199
|
+
distribution(name, value, tags) {
|
|
200
|
+
const distribution = this._meter.createHistogram(name);
|
|
201
|
+
(0, import_log2.log)("otel distribution", {
|
|
202
|
+
name,
|
|
203
|
+
value,
|
|
204
|
+
tags: {
|
|
205
|
+
...this.options.getTags(),
|
|
206
|
+
...tags
|
|
207
|
+
}
|
|
208
|
+
}, {
|
|
209
|
+
F: __dxlog_file,
|
|
210
|
+
L: 89,
|
|
211
|
+
S: this,
|
|
212
|
+
C: (f, a) => f(...a)
|
|
213
|
+
});
|
|
214
|
+
distribution.record(value, {
|
|
215
|
+
...this.options.getTags(),
|
|
216
|
+
...tags
|
|
217
|
+
});
|
|
218
|
+
}
|
|
219
|
+
flush() {
|
|
220
|
+
return this._meterProvider.forceFlush();
|
|
221
|
+
}
|
|
222
|
+
close() {
|
|
223
|
+
return this._meterProvider.shutdown();
|
|
224
|
+
}
|
|
225
|
+
};
|
|
226
|
+
var convertTags = (data) => {
|
|
227
|
+
if (data && data.tags) {
|
|
228
|
+
return Object.entries(data.tags).reduce((obj, [key, value]) => {
|
|
229
|
+
obj[key] = value;
|
|
230
|
+
return obj;
|
|
231
|
+
}, {});
|
|
232
|
+
} else {
|
|
233
|
+
return {};
|
|
234
|
+
}
|
|
235
|
+
};
|
|
236
|
+
var OtelTraces = class {
|
|
237
|
+
constructor(options) {
|
|
238
|
+
this.options = options;
|
|
239
|
+
const resource = import_resources3.Resource.default().merge(new import_resources3.Resource({
|
|
240
|
+
[import_semantic_conventions3.SEMRESATTRS_SERVICE_NAME]: this.options.serviceName,
|
|
241
|
+
[import_semantic_conventions3.SEMRESATTRS_SERVICE_VERSION]: this.options.serviceVersion
|
|
242
|
+
}));
|
|
243
|
+
const tracerProvider = new import_sdk_trace_base.BasicTracerProvider({
|
|
244
|
+
resource
|
|
245
|
+
});
|
|
246
|
+
tracerProvider.addSpanProcessor(new import_sdk_trace_base.SimpleSpanProcessor(new import_sdk_trace_base.ConsoleSpanExporter()));
|
|
247
|
+
tracerProvider.addSpanProcessor(new import_sdk_trace_base.BatchSpanProcessor(new import_exporter_trace_otlp_http.OTLPTraceExporter({
|
|
248
|
+
url: this.options.endpoint + "/v1/traces",
|
|
249
|
+
headers: {
|
|
250
|
+
Authorization: this.options.authorizationHeader
|
|
251
|
+
},
|
|
252
|
+
concurrencyLimit: 10
|
|
253
|
+
})));
|
|
254
|
+
tracerProvider.register();
|
|
255
|
+
this._tracer = import_api2.trace.getTracer("dxos-observability", this.options.serviceVersion);
|
|
256
|
+
}
|
|
257
|
+
start() {
|
|
258
|
+
(0, import_debug.log)("trace processor registered");
|
|
259
|
+
import_tracing2.TRACE_PROCESSOR.remoteTracing.registerProcessor({
|
|
260
|
+
startSpan: (options) => {
|
|
261
|
+
(0, import_debug.log)("begin otel trace", {
|
|
262
|
+
options
|
|
263
|
+
});
|
|
264
|
+
return this._tracer.startSpan(options.name, options);
|
|
265
|
+
}
|
|
266
|
+
});
|
|
267
|
+
}
|
|
268
|
+
};
|
|
269
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
270
|
+
0 && (module.exports = {
|
|
271
|
+
OtelLogs,
|
|
272
|
+
OtelMetrics,
|
|
273
|
+
OtelTraces,
|
|
274
|
+
setDiagLogger
|
|
275
|
+
});
|
|
276
|
+
//# sourceMappingURL=otel-TSHMOAB4.cjs.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": "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",
|
|
6
|
+
"names": ["import_resources", "import_semantic_conventions", "import_log", "import_api", "import_tracing", "setDiagLogger", "level", "logLevel", "DiagLogLevel", "diag", "setLogger", "DiagConsoleLogger", "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", "body", "JSON", "stringify", "attributes", "getTags", "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", "EXPORT_INTERVAL", "OtelMetrics", "_gauges", "Map", "grafanaMetricReader", "PeriodicExportingMetricReader", "exporter", "OTLPMetricExporter", "exportIntervalMillis", "_meterProvider", "MeterProvider", "readers", "_meter", "getMeter", "metrics", "increment", "name", "value", "data", "convertTags", "distribution", "set", "gauge", "TRACE_PROCESSOR", "remoteMetrics", "registerProcessor", "tags", "createGauge", "log", "counter", "createCounter", "add", "createHistogram", "Object", "entries", "reduce", "obj", "key", "OtelTraces", "tracerProvider", "BasicTracerProvider", "addSpanProcessor", "SimpleSpanProcessor", "ConsoleSpanExporter", "BatchSpanProcessor", "OTLPTraceExporter", "register", "_tracer", "trace", "getTracer", "start", "remoteTracing", "startSpan"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
var sentry_log_processor_H6FUSKZI_exports = {};
|
|
20
|
+
__export(sentry_log_processor_H6FUSKZI_exports, {
|
|
21
|
+
SentryLogProcessor: () => SentryLogProcessor
|
|
22
|
+
});
|
|
23
|
+
module.exports = __toCommonJS(sentry_log_processor_H6FUSKZI_exports);
|
|
24
|
+
var import_chunk_HKBUNAUG = require("./chunk-HKBUNAUG.cjs");
|
|
25
|
+
var import_invariant = require("@dxos/invariant");
|
|
26
|
+
var import_log = require("@dxos/log");
|
|
27
|
+
var import_util = require("@dxos/util");
|
|
28
|
+
var MAX_LOG_BREADCRUMBS = 80;
|
|
29
|
+
var SentryLogProcessor = class {
|
|
30
|
+
constructor() {
|
|
31
|
+
this._breadcrumbs = new import_util.CircularBuffer(MAX_LOG_BREADCRUMBS);
|
|
32
|
+
this.logProcessor = (config, entry) => {
|
|
33
|
+
const { level, meta, error } = entry;
|
|
34
|
+
if (!(0, import_log.shouldLog)(entry, config.captureFilters) || meta?.S?.remoteSessionId) {
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
if (entry.level !== import_log.LogLevel.WARN && entry.level !== import_log.LogLevel.ERROR) {
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
(0, import_chunk_HKBUNAUG.withScope)((scope) => {
|
|
41
|
+
const severity = convertLevel(level);
|
|
42
|
+
scope.setLevel(severity);
|
|
43
|
+
scope.setContext("dxoslog", entry.context ?? null);
|
|
44
|
+
if (meta) {
|
|
45
|
+
scope.setTag("transaction", `${getRelativeFilename(meta.F)}:${meta.L}`);
|
|
46
|
+
if (meta.S?.hostSessionId) {
|
|
47
|
+
scope.setTags({
|
|
48
|
+
service_host_issue: true,
|
|
49
|
+
service_host_session: meta.S?.hostSessionId
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
if (!Number.isNaN(meta.S?.uptimeSeconds)) {
|
|
53
|
+
scope.setExtra("uptime_seconds", meta.S?.uptimeSeconds);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
const extendedMessage = formatMessageForSentry(entry);
|
|
57
|
+
let capturedError = error;
|
|
58
|
+
if (capturedError == null && entry.level === import_log.LogLevel.ERROR) {
|
|
59
|
+
capturedError = Object.values(entry.context ?? {}).find((v) => v instanceof Error);
|
|
60
|
+
}
|
|
61
|
+
if (capturedError) {
|
|
62
|
+
if (capturedError instanceof import_invariant.InvariantViolation) {
|
|
63
|
+
scope.setExtra("invariant_violation", true);
|
|
64
|
+
}
|
|
65
|
+
const isMessageDifferentFromStackTrace = error == null;
|
|
66
|
+
if (isMessageDifferentFromStackTrace) {
|
|
67
|
+
scope.setExtra("message", extendedMessage);
|
|
68
|
+
}
|
|
69
|
+
const eventId2 = (0, import_chunk_HKBUNAUG.captureException)(capturedError);
|
|
70
|
+
this._addBreadcrumb(eventId2, extendedMessage, severity, entry.context);
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
scope.setFingerprint([
|
|
74
|
+
entry.message
|
|
75
|
+
]);
|
|
76
|
+
const eventId = (0, import_chunk_HKBUNAUG.captureMessage)(extendedMessage);
|
|
77
|
+
this._addBreadcrumb(eventId, extendedMessage, severity, entry.context);
|
|
78
|
+
});
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
addLogBreadcrumbsTo(event) {
|
|
82
|
+
event.breadcrumbs ??= [];
|
|
83
|
+
for (const breadcrumb of this._breadcrumbs) {
|
|
84
|
+
event.breadcrumbs.push(breadcrumb);
|
|
85
|
+
}
|
|
86
|
+
event.breadcrumbs.sort((b1, b2) => {
|
|
87
|
+
if (b1.timestamp === void 0 || b2.timestamp === void 0) {
|
|
88
|
+
return b1.timestamp === b2.timestamp ? 0 : b1.timestamp === void 0 ? -1 : 1;
|
|
89
|
+
}
|
|
90
|
+
return b1.timestamp - b2.timestamp;
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
_addBreadcrumb(eventId, message, severity, context) {
|
|
94
|
+
const breadcrumb = {
|
|
95
|
+
type: "console",
|
|
96
|
+
level: severity,
|
|
97
|
+
event_id: eventId,
|
|
98
|
+
category: "log",
|
|
99
|
+
message,
|
|
100
|
+
data: context,
|
|
101
|
+
timestamp: Math.floor(Date.now() / 1e3)
|
|
102
|
+
};
|
|
103
|
+
const lastRecorded = this._breadcrumbs.getLast();
|
|
104
|
+
if (lastRecorded && lastRecorded.message === breadcrumb.message) {
|
|
105
|
+
const firstBreadcrumbData = lastRecorded.data?.firstBreadcrumbData ?? lastRecorded.data ?? {};
|
|
106
|
+
const mergedBreadcrumbCount = Number.isNaN(lastRecorded.data?.mergedBreadcrumbCount) ? 1 : Number(lastRecorded.data?.mergedBreadcrumbCount);
|
|
107
|
+
lastRecorded.data = {
|
|
108
|
+
mergedBreadcrumbCount: mergedBreadcrumbCount + 1,
|
|
109
|
+
firstBreadcrumbData,
|
|
110
|
+
lastBreadcrumbData: breadcrumb.data
|
|
111
|
+
};
|
|
112
|
+
return;
|
|
113
|
+
}
|
|
114
|
+
this._breadcrumbs.push(breadcrumb);
|
|
115
|
+
}
|
|
116
|
+
};
|
|
117
|
+
var formatMessageForSentry = (entry) => {
|
|
118
|
+
let scopePrefix;
|
|
119
|
+
if (entry.meta?.S) {
|
|
120
|
+
const scope = entry.meta?.S;
|
|
121
|
+
scopePrefix = scope.name || (0, import_util.getDebugName)(scope);
|
|
122
|
+
}
|
|
123
|
+
if (scopePrefix == null) {
|
|
124
|
+
return entry.message;
|
|
125
|
+
}
|
|
126
|
+
const workerPrefix = entry.meta?.S?.hostSessionId ? "[worker] " : "";
|
|
127
|
+
return `${workerPrefix}${scopePrefix} ${entry.message}`;
|
|
128
|
+
};
|
|
129
|
+
var convertLevel = (level) => {
|
|
130
|
+
if (level === import_log.LogLevel.TRACE) {
|
|
131
|
+
return "debug";
|
|
132
|
+
}
|
|
133
|
+
if (level === import_log.LogLevel.WARN) {
|
|
134
|
+
return "warning";
|
|
135
|
+
}
|
|
136
|
+
return import_log.LogLevel[level].toLowerCase();
|
|
137
|
+
};
|
|
138
|
+
var getRelativeFilename = (filename) => {
|
|
139
|
+
const match = filename.match(/.+\/(packages\/.+\/.+)/);
|
|
140
|
+
if (match) {
|
|
141
|
+
const [, filePath] = match;
|
|
142
|
+
return filePath;
|
|
143
|
+
}
|
|
144
|
+
return filename;
|
|
145
|
+
};
|
|
146
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
147
|
+
0 && (module.exports = {
|
|
148
|
+
SentryLogProcessor
|
|
149
|
+
});
|
|
150
|
+
//# sourceMappingURL=sentry-log-processor-H6FUSKZI.cjs.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": ["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
|
+
}
|
|
@@ -3,5 +3,7 @@
|
|
|
3
3
|
"TELEMETRY_API_KEY": "B00QG6PtJJrJ0VVFe0H5a6bcUUShKyZM",
|
|
4
4
|
"IPDATA_API_KEY": "73dfdecdf979c18f07d50cf841bbdd9e589f237256326ac8cca23786",
|
|
5
5
|
"DATADOG_API_KEY": null,
|
|
6
|
-
"DATADOG_APP_KEY": null
|
|
6
|
+
"DATADOG_APP_KEY": null,
|
|
7
|
+
"OTEL_ENDPOINT": null,
|
|
8
|
+
"OTEL_AUTHORIZATION": null
|
|
7
9
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"browser-observability.d.ts","sourceRoot":"","sources":["../../../../src/helpers/browser-observability.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAI3C,OAAO,KAAK,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAE5D,eAAO,MAAM,0BAA0B,2BAA2B,CAAC;AACnE,eAAO,MAAM,uBAAuB,wBAAwB,CAAC;AAE7D,eAAO,MAAM,uBAAuB,cAAqB,MAAM,KAAG,QAAQ,OAAO,CAOhF,CAAC;AAEF,eAAO,MAAM,0BAA0B,cAAqB,MAAM,SAAS,OAAO,kBAMjF,CAAC;AAEF,eAAO,MAAM,qBAAqB,cAAqB,MAAM,KAAG,QAAQ,MAAM,GAAG,SAAS,CAMzF,CAAC;AAEF,eAAO,MAAM,uBAAuB,cAAqB,MAAM,SAAS,MAAM,kBAM7E,CAAC;AAEF,MAAM,MAAM,uBAAuB,GAAG;IACpC,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,IAAI,CAAC;IACZ,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,YAAY,CAAC,EAAE,OAAO,CAAC;CAExB,CAAC;AAKF,eAAO,MAAM,0BAA0B,8DAMpC,uBAAuB,KAAG,QAAQ,aAAa,
|
|
1
|
+
{"version":3,"file":"browser-observability.d.ts","sourceRoot":"","sources":["../../../../src/helpers/browser-observability.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAI3C,OAAO,KAAK,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAE5D,eAAO,MAAM,0BAA0B,2BAA2B,CAAC;AACnE,eAAO,MAAM,uBAAuB,wBAAwB,CAAC;AAE7D,eAAO,MAAM,uBAAuB,cAAqB,MAAM,KAAG,QAAQ,OAAO,CAOhF,CAAC;AAEF,eAAO,MAAM,0BAA0B,cAAqB,MAAM,SAAS,OAAO,kBAMjF,CAAC;AAEF,eAAO,MAAM,qBAAqB,cAAqB,MAAM,KAAG,QAAQ,MAAM,GAAG,SAAS,CAMzF,CAAC;AAEF,eAAO,MAAM,uBAAuB,cAAqB,MAAM,SAAS,MAAM,kBAM7E,CAAC;AAEF,MAAM,MAAM,uBAAuB,GAAG;IACpC,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,IAAI,CAAC;IACZ,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,YAAY,CAAC,EAAE,OAAO,CAAC;CAExB,CAAC;AAKF,eAAO,MAAM,0BAA0B,8DAMpC,uBAAuB,KAAG,QAAQ,aAAa,CA6GjD,CAAC"}
|
|
@@ -144,6 +144,7 @@ const initializeAppObservability = async ({ namespace, config, mode = 'basic', t
|
|
|
144
144
|
// TODO(nf): plugin state?
|
|
145
145
|
// TODO(nf): should provide capability to init Sentry earlier in booting process to capture errors during initialization.
|
|
146
146
|
await observability.initialize();
|
|
147
|
+
observability.startErrorLogs();
|
|
147
148
|
const ipData = await getIPData(config);
|
|
148
149
|
ipData && observability.addIPDataTelemetryTags(ipData);
|
|
149
150
|
if (typeof navigator !== 'undefined' && ((_b = navigator.storage) === null || _b === void 0 ? void 0 : _b.estimate)) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"browser-observability.js","sourceRoot":"","sources":["../../../../src/helpers/browser-observability.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"browser-observability.js","sourceRoot":"","sources":["../../../../src/helpers/browser-observability.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { type Client, type Config } from '@dxos/client';
|
|
2
|
+
import { type ClientServices } from '@dxos/client-protocol';
|
|
2
3
|
import { type IPData } from './helpers';
|
|
3
4
|
import { type EventOptions, type PageOptions } from './segment';
|
|
4
5
|
import { type InitOptions } from './sentry';
|
|
@@ -10,6 +11,8 @@ export type ObservabilitySecrets = {
|
|
|
10
11
|
IPDATA_API_KEY: string | null;
|
|
11
12
|
DATADOG_API_KEY: string | null;
|
|
12
13
|
DATADOG_APP_KEY: string | null;
|
|
14
|
+
OTEL_ENDPOINT: string | null;
|
|
15
|
+
OTEL_AUTHORIZATION: string | null;
|
|
13
16
|
};
|
|
14
17
|
export type Mode = 'basic' | 'full' | 'disabled';
|
|
15
18
|
export type TagScope = 'errors' | 'telemetry' | 'metrics' | 'all';
|
|
@@ -30,8 +33,12 @@ export type ObservabilityOptions = {
|
|
|
30
33
|
};
|
|
31
34
|
export declare class Observability {
|
|
32
35
|
private _metrics?;
|
|
36
|
+
private _otelMetrics?;
|
|
37
|
+
private _otelTraces?;
|
|
33
38
|
private _telemetryBatchSize;
|
|
34
39
|
private _telemetry?;
|
|
40
|
+
private _sentryLogProcessor?;
|
|
41
|
+
private _otelLogs?;
|
|
35
42
|
private _errorReportingOptions?;
|
|
36
43
|
private _captureException?;
|
|
37
44
|
private _captureUserFeedback?;
|
|
@@ -58,7 +65,7 @@ export declare class Observability {
|
|
|
58
65
|
scope: TagScope;
|
|
59
66
|
} | undefined;
|
|
60
67
|
addIPDataTelemetryTags: (ipData: IPData) => void;
|
|
61
|
-
setIdentityTags(
|
|
68
|
+
setIdentityTags(clientServices: Partial<ClientServices>): Promise<void>;
|
|
62
69
|
private _initMetrics;
|
|
63
70
|
/**
|
|
64
71
|
* Gauge metric.
|
|
@@ -66,7 +73,7 @@ export declare class Observability {
|
|
|
66
73
|
* The default implementation uses Datadog.
|
|
67
74
|
*/
|
|
68
75
|
gauge(name: string, value: number | any, extraTags?: any): void;
|
|
69
|
-
startNetworkMetrics(
|
|
76
|
+
startNetworkMetrics(clientServices: Partial<ClientServices>): void;
|
|
70
77
|
startSpacesMetrics(client: Client, namespace: string): void;
|
|
71
78
|
startRuntimeMetrics(client: Client, frequency?: number): Promise<void>;
|
|
72
79
|
private _initTelemetry;
|
|
@@ -83,6 +90,9 @@ export declare class Observability {
|
|
|
83
90
|
*/
|
|
84
91
|
page(options: PageOptions): void;
|
|
85
92
|
private _initErrorLogs;
|
|
93
|
+
startErrorLogs(): void;
|
|
94
|
+
startTraces(): void;
|
|
95
|
+
private _initTraces;
|
|
86
96
|
/**
|
|
87
97
|
* Manually capture an exception.
|
|
88
98
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"observability.d.ts","sourceRoot":"","sources":["../../../src/observability.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,KAAK,MAAM,EAAE,KAAK,MAAM,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"observability.d.ts","sourceRoot":"","sources":["../../../src/observability.ts"],"names":[],"mappings":"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"}
|