@dxos/tracing 0.1.56-main.c19b7cd → 0.1.56-main.c277f68

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/browser/index.mjs +307 -33
  2. package/dist/lib/browser/index.mjs.map +4 -4
  3. package/dist/lib/browser/meta.json +1 -1
  4. package/dist/lib/node/index.cjs +311 -33
  5. package/dist/lib/node/index.cjs.map +4 -4
  6. package/dist/lib/node/meta.json +1 -1
  7. package/dist/types/src/api.d.ts +1 -0
  8. package/dist/types/src/api.d.ts.map +1 -1
  9. package/dist/types/src/index.d.ts +1 -0
  10. package/dist/types/src/index.d.ts.map +1 -1
  11. package/dist/types/src/metrics/base.d.ts +7 -0
  12. package/dist/types/src/metrics/base.d.ts.map +1 -0
  13. package/dist/types/src/metrics/index.d.ts +5 -0
  14. package/dist/types/src/metrics/index.d.ts.map +1 -0
  15. package/dist/types/src/metrics/time-series-counter.d.ts +15 -0
  16. package/dist/types/src/metrics/time-series-counter.d.ts.map +1 -0
  17. package/dist/types/src/metrics/time-usage-counter.d.ts +15 -0
  18. package/dist/types/src/metrics/time-usage-counter.d.ts.map +1 -0
  19. package/dist/types/src/metrics/unary-counter.d.ts +12 -0
  20. package/dist/types/src/metrics/unary-counter.d.ts.map +1 -0
  21. package/dist/types/src/symbols.d.ts +1 -0
  22. package/dist/types/src/symbols.d.ts.map +1 -1
  23. package/dist/types/src/trace-processor.d.ts +10 -1
  24. package/dist/types/src/trace-processor.d.ts.map +1 -1
  25. package/dist/types/src/trace-sender.d.ts.map +1 -1
  26. package/package.json +10 -9
  27. package/src/api.ts +17 -1
  28. package/src/index.ts +1 -0
  29. package/src/metrics/base.ts +26 -0
  30. package/src/metrics/index.ts +8 -0
  31. package/src/metrics/time-series-counter.ts +52 -0
  32. package/src/metrics/time-usage-counter.ts +62 -0
  33. package/src/metrics/unary-counter.ts +31 -0
  34. package/src/symbols.ts +4 -2
  35. package/src/trace-processor.ts +158 -2
  36. package/src/trace-sender.ts +28 -18
@@ -20,11 +20,15 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
20
20
  // packages/common/tracing/src/index.ts
21
21
  var src_exports = {};
22
22
  __export(src_exports, {
23
+ BaseCounter: () => BaseCounter,
23
24
  TRACE_PROCESSOR: () => TRACE_PROCESSOR,
24
25
  TRACE_SPAN_ATTRIBUTE: () => TRACE_SPAN_ATTRIBUTE,
26
+ TimeSeriesCounter: () => TimeSeriesCounter,
27
+ TimeUsageCounter: () => TimeUsageCounter,
25
28
  TraceProcessor: () => TraceProcessor,
26
29
  TraceSender: () => TraceSender,
27
30
  TracingSpan: () => TracingSpan,
31
+ UnaryCounter: () => UnaryCounter,
28
32
  getTracingContext: () => getTracingContext,
29
33
  symbolTracingContext: () => symbolTracingContext,
30
34
  trace: () => trace
@@ -35,40 +39,34 @@ module.exports = __toCommonJS(src_exports);
35
39
  var import_context = require("@dxos/context");
36
40
 
37
41
  // packages/common/tracing/src/symbols.ts
38
- var symbolTracingContext = Symbol("dxos.tracing-context");
42
+ var symbolTracingContext = Symbol("dxos.tracing.context");
39
43
  var getTracingContext = (target) => {
40
- var _a2;
41
- return (_a2 = target[symbolTracingContext]) != null ? _a2 : target[symbolTracingContext] = {
42
- infoProperties: {}
44
+ return target[symbolTracingContext] ??= {
45
+ infoProperties: {},
46
+ metricsProperties: {}
43
47
  };
44
48
  };
45
49
  var TRACE_SPAN_ATTRIBUTE = "dxos.trace-span";
46
50
 
47
51
  // packages/common/tracing/src/trace-processor.ts
52
+ var import_async = require("@dxos/async");
53
+ var import_log = require("@dxos/log");
48
54
  var import_util = require("@dxos/util");
49
55
 
50
56
  // packages/common/tracing/src/trace-sender.ts
51
57
  var import_codec_protobuf = require("@dxos/codec-protobuf");
52
- var FLUSH_INTERVAL = 1e3;
53
58
  var TraceSender = class {
54
59
  constructor(_traceProcessor) {
55
60
  this._traceProcessor = _traceProcessor;
56
61
  }
57
62
  streamTrace(request) {
58
63
  return new import_codec_protobuf.Stream(({ ctx, next }) => {
59
- const subscription = {
60
- dirtyResources: /* @__PURE__ */ new Set(),
61
- dirtySpans: /* @__PURE__ */ new Set()
62
- };
63
- this._traceProcessor.subscriptions.add(subscription);
64
- ctx.onDispose(() => {
65
- this._traceProcessor.subscriptions.delete(subscription);
66
- });
67
- const flushEvents = (resources, spans) => {
64
+ const flushEvents = (resources, spans, logs) => {
68
65
  const event = {
69
66
  resourceAdded: [],
70
67
  resourceRemoved: [],
71
- spanAdded: []
68
+ spanAdded: [],
69
+ logAdded: []
72
70
  };
73
71
  if (resources) {
74
72
  for (const id of resources) {
@@ -106,26 +104,50 @@ var TraceSender = class {
106
104
  });
107
105
  }
108
106
  }
107
+ if (logs) {
108
+ for (const log2 of logs) {
109
+ event.logAdded.push({
110
+ log: log2
111
+ });
112
+ }
113
+ } else {
114
+ for (const log2 of this._traceProcessor.logs) {
115
+ event.logAdded.push({
116
+ log: log2
117
+ });
118
+ }
119
+ }
109
120
  if (event.resourceAdded.length > 0 || event.resourceRemoved.length > 0 || event.spanAdded.length > 0) {
110
121
  next(event);
111
122
  }
112
123
  };
113
- flushEvents(null, null);
114
- const timer = setInterval(() => {
115
- flushEvents(subscription.dirtyResources, subscription.dirtySpans);
124
+ const flush = () => {
125
+ flushEvents(subscription.dirtyResources, subscription.dirtySpans, subscription.newLogs);
116
126
  subscription.dirtyResources.clear();
117
127
  subscription.dirtySpans.clear();
118
- }, FLUSH_INTERVAL);
128
+ subscription.newLogs.length = 0;
129
+ };
130
+ const subscription = {
131
+ flush,
132
+ dirtyResources: /* @__PURE__ */ new Set(),
133
+ dirtySpans: /* @__PURE__ */ new Set(),
134
+ newLogs: []
135
+ };
136
+ this._traceProcessor.subscriptions.add(subscription);
119
137
  ctx.onDispose(() => {
120
- clearInterval(timer);
138
+ this._traceProcessor.subscriptions.delete(subscription);
121
139
  });
140
+ flushEvents(null, null, null);
122
141
  });
123
142
  }
124
143
  };
125
144
 
126
145
  // packages/common/tracing/src/trace-processor.ts
146
+ var __dxlog_file = "/home/runner/work/dxos/dxos/packages/common/tracing/src/trace-processor.ts";
127
147
  var MAX_RESOURCE_RECORDS = 500;
128
148
  var MAX_SPAN_RECORDS = 1e3;
149
+ var MAX_LOG_RECORDS = 1e3;
150
+ var REFRESH_INTERVAL = 1e3;
129
151
  var TraceProcessor = class {
130
152
  constructor() {
131
153
  this.resources = /* @__PURE__ */ new Map();
@@ -133,17 +155,62 @@ var TraceProcessor = class {
133
155
  this.resourceIdList = [];
134
156
  this.spans = /* @__PURE__ */ new Map();
135
157
  this.spanIdList = [];
158
+ this.logs = [];
136
159
  this.subscriptions = /* @__PURE__ */ new Set();
160
+ this._logProcessor = (config, entry) => {
161
+ switch (entry.level) {
162
+ case import_log.LogLevel.ERROR:
163
+ case import_log.LogLevel.WARN:
164
+ case import_log.LogLevel.TRACE: {
165
+ const scope = entry.meta?.S;
166
+ const resource2 = this.resourceInstanceIndex.get(scope);
167
+ if (!resource2) {
168
+ return;
169
+ }
170
+ const context = (0, import_log.getContextFromEntry)(entry) ?? {};
171
+ for (const key of Object.keys(context)) {
172
+ context[key] = sanitizeValue(context[key]);
173
+ }
174
+ const entryToPush = {
175
+ level: entry.level,
176
+ message: entry.message,
177
+ context,
178
+ timestamp: /* @__PURE__ */ new Date(),
179
+ meta: {
180
+ file: entry.meta?.F ?? "",
181
+ line: entry.meta?.L ?? 0,
182
+ resourceId: resource2.data.id
183
+ }
184
+ };
185
+ this._pushLog(entryToPush);
186
+ break;
187
+ }
188
+ default:
189
+ }
190
+ };
191
+ import_log.log.addProcessor(this._logProcessor.bind(this), void 0, {
192
+ F: __dxlog_file,
193
+ L: 61,
194
+ S: this,
195
+ C: (f, a) => f(...a)
196
+ });
197
+ const refreshInterval = setInterval(this.refresh.bind(this), REFRESH_INTERVAL);
198
+ (0, import_async.unrefTimeout)(refreshInterval);
137
199
  }
138
200
  traceResourceConstructor(params) {
139
201
  const id = this.resources.size;
202
+ const tracingContext = getTracingContext(Object.getPrototypeOf(params.instance));
203
+ for (const key of Object.keys(tracingContext.metricsProperties)) {
204
+ params.instance[key]._assign(params.instance, key);
205
+ }
140
206
  const entry = {
141
207
  data: {
142
208
  id,
143
209
  className: params.constructor.name,
144
210
  instanceId: (0, import_util.getPrototypeSpecificInstanceId)(params.instance),
145
211
  info: this.getResourceInfo(params.instance),
146
- links: []
212
+ links: [],
213
+ metrics: this.getResourceMetrics(params.instance)
147
214
  },
148
215
  instance: new WeakRef(params.instance)
149
216
  };
@@ -160,13 +227,21 @@ var TraceProcessor = class {
160
227
  const tracingContext = getTracingContext(Object.getPrototypeOf(instance));
161
228
  for (const [key, _opts] of Object.entries(tracingContext.infoProperties)) {
162
229
  try {
163
- res[key] = typeof instance[key] === "function" ? instance[key]() : instance[key];
230
+ res[key] = sanitizeValue(typeof instance[key] === "function" ? instance[key]() : instance[key]);
164
231
  } catch (err) {
165
232
  res[key] = err.message;
166
233
  }
167
234
  }
168
235
  return res;
169
236
  }
237
+ getResourceMetrics(instance) {
238
+ const res = [];
239
+ const tracingContext = getTracingContext(Object.getPrototypeOf(instance));
240
+ for (const [key, _opts] of Object.entries(tracingContext.metricsProperties)) {
241
+ res.push(instance[key].getData());
242
+ }
243
+ return res;
244
+ }
170
245
  traceSpan(params) {
171
246
  const span2 = new TracingSpan(this, params);
172
247
  this._flushSpan(span2);
@@ -181,6 +256,30 @@ var TraceProcessor = class {
181
256
  createTraceSender() {
182
257
  return new TraceSender(this);
183
258
  }
259
+ refresh() {
260
+ for (const resource2 of this.resources.values()) {
261
+ const instance = resource2.instance.deref();
262
+ if (!instance) {
263
+ continue;
264
+ }
265
+ const tracingContext = getTracingContext(Object.getPrototypeOf(instance));
266
+ const time = performance.now();
267
+ for (const key of Object.keys(tracingContext.metricsProperties)) {
268
+ instance[key]._tick?.(time);
269
+ }
270
+ let _changed = false;
271
+ const oldInfo = resource2.data.info;
272
+ resource2.data.info = this.getResourceInfo(instance);
273
+ _changed ||= !areEqualShallow(oldInfo, resource2.data.info);
274
+ const oldMetrics = resource2.data.metrics;
275
+ resource2.data.metrics = this.getResourceMetrics(instance);
276
+ _changed ||= !areEqualShallow(oldMetrics, resource2.data.metrics);
277
+ this._markResourceDirty(resource2.data.id);
278
+ }
279
+ for (const subscription of this.subscriptions) {
280
+ subscription.flush();
281
+ }
282
+ }
184
283
  /**
185
284
  * @internal
186
285
  */
@@ -215,8 +314,20 @@ var TraceProcessor = class {
215
314
  this.spans.delete(id);
216
315
  }
217
316
  }
317
+ _pushLog(log1) {
318
+ this.logs.push(log1);
319
+ if (this.logs.length > MAX_LOG_RECORDS) {
320
+ this.logs.shift();
321
+ }
322
+ for (const subscription of this.subscriptions) {
323
+ subscription.newLogs.push(log1);
324
+ }
325
+ }
218
326
  };
219
- var _TracingSpan = class {
327
+ var TracingSpan = class _TracingSpan {
328
+ static {
329
+ this.nextId = 0;
330
+ }
220
331
  constructor(_traceProcessor, params) {
221
332
  this._traceProcessor = _traceProcessor;
222
333
  this.parentId = null;
@@ -253,20 +364,17 @@ var _TracingSpan = class {
253
364
  this._traceProcessor._flushSpan(this);
254
365
  }
255
366
  serialize() {
256
- var _a2, _b, _c, _d, _e;
257
367
  return {
258
368
  id: this.id,
259
- resourceId: (_a2 = this.resourceId) != null ? _a2 : void 0,
369
+ resourceId: this.resourceId ?? void 0,
260
370
  methodName: this.methodName,
261
- parentId: (_b = this.parentId) != null ? _b : void 0,
371
+ parentId: this.parentId ?? void 0,
262
372
  startTs: this.startTs.toFixed(3),
263
- endTs: (_d = (_c = this.endTs) == null ? void 0 : _c.toFixed(3)) != null ? _d : void 0,
264
- error: (_e = this.error) != null ? _e : void 0
373
+ endTs: this.endTs?.toFixed(3) ?? void 0,
374
+ error: this.error ?? void 0
265
375
  };
266
376
  }
267
377
  };
268
- var TracingSpan = _TracingSpan;
269
- TracingSpan.nextId = 0;
270
378
  var serializeError = (err) => {
271
379
  if (err instanceof Error) {
272
380
  return {
@@ -278,12 +386,44 @@ var serializeError = (err) => {
278
386
  message: String(err)
279
387
  };
280
388
  };
281
- var _a;
282
- var TRACE_PROCESSOR = (_a = globalThis.TRACE_PROCESSOR) != null ? _a : globalThis.TRACE_PROCESSOR = new TraceProcessor();
389
+ var TRACE_PROCESSOR = globalThis.TRACE_PROCESSOR ??= new TraceProcessor();
390
+ var sanitizeValue = (value) => {
391
+ switch (typeof value) {
392
+ case "string":
393
+ case "number":
394
+ case "boolean":
395
+ case "undefined":
396
+ return value;
397
+ break;
398
+ case "object":
399
+ case "function":
400
+ if (value === null) {
401
+ return value;
402
+ break;
403
+ }
404
+ if (typeof value.truncate === "function") {
405
+ return value.truncate();
406
+ }
407
+ return value.toString();
408
+ }
409
+ };
410
+ var areEqualShallow = (a, b) => {
411
+ for (const key in a) {
412
+ if (!(key in b) || a[key] !== b[key]) {
413
+ return false;
414
+ }
415
+ }
416
+ for (const key in b) {
417
+ if (!(key in a) || a[key] !== b[key]) {
418
+ return false;
419
+ }
420
+ }
421
+ return true;
422
+ };
283
423
 
284
424
  // packages/common/tracing/src/api.ts
285
425
  var resource = () => (constructor) => {
286
- return class extends constructor {
426
+ const klass = class extends constructor {
287
427
  constructor(...rest) {
288
428
  super(...rest);
289
429
  TRACE_PROCESSOR.traceResourceConstructor({
@@ -292,6 +432,10 @@ var resource = () => (constructor) => {
292
432
  });
293
433
  }
294
434
  };
435
+ Object.defineProperty(klass, "name", {
436
+ value: constructor.name
437
+ });
438
+ return klass;
295
439
  };
296
440
  var info = () => (target, propertyKey, descriptor) => {
297
441
  getTracingContext(target).infoProperties[propertyKey] = {};
@@ -319,6 +463,9 @@ var span = () => (target, propertyKey, descriptor) => {
319
463
  }
320
464
  };
321
465
  };
466
+ var metricsCounter = () => (target, propertyKey, descriptor) => {
467
+ getTracingContext(target).metricsProperties[propertyKey] = {};
468
+ };
322
469
  var addLink = (parent, child, opts = {}) => {
323
470
  TRACE_PROCESSOR.addLink(parent, child, opts);
324
471
  };
@@ -326,15 +473,146 @@ var trace = {
326
473
  resource,
327
474
  info,
328
475
  span,
476
+ metricsCounter,
329
477
  addLink
330
478
  };
479
+
480
+ // packages/common/tracing/src/metrics/base.ts
481
+ var BaseCounter = class {
482
+ /**
483
+ * @internal
484
+ */
485
+ _assign(instance, name) {
486
+ this._instance = instance;
487
+ this.name = name;
488
+ }
489
+ _tick(time) {
490
+ }
491
+ };
492
+
493
+ // packages/common/tracing/src/metrics/unary-counter.ts
494
+ var UnaryCounter = class extends BaseCounter {
495
+ constructor({ units } = {}) {
496
+ super();
497
+ this.value = 0;
498
+ this.units = units;
499
+ }
500
+ inc(by = 1) {
501
+ this.value += by;
502
+ }
503
+ getData() {
504
+ return {
505
+ name: this.name,
506
+ counter: {
507
+ value: this.value,
508
+ units: this.units
509
+ }
510
+ };
511
+ }
512
+ };
513
+
514
+ // packages/common/tracing/src/metrics/time-series-counter.ts
515
+ var MAX_BUCKETS = 60;
516
+ var TimeSeriesCounter = class extends BaseCounter {
517
+ constructor({ units } = {}) {
518
+ super();
519
+ this._currentValue = 0;
520
+ this._totalValue = 0;
521
+ this._buckets = [];
522
+ this.units = units;
523
+ }
524
+ inc(by = 1) {
525
+ this._currentValue += by;
526
+ this._totalValue += by;
527
+ }
528
+ _tick(time) {
529
+ this._buckets.push(this._currentValue);
530
+ if (this._buckets.length > MAX_BUCKETS) {
531
+ this._buckets.shift();
532
+ }
533
+ this._currentValue = 0;
534
+ }
535
+ getData() {
536
+ return {
537
+ name: this.name,
538
+ timeSeries: {
539
+ tracks: [
540
+ {
541
+ name: this.name,
542
+ units: this.units,
543
+ points: this._buckets.map((value, index) => ({
544
+ value
545
+ })),
546
+ total: this._totalValue
547
+ }
548
+ ]
549
+ }
550
+ };
551
+ }
552
+ };
553
+
554
+ // packages/common/tracing/src/metrics/time-usage-counter.ts
555
+ var MAX_BUCKETS2 = 60;
556
+ var TimeUsageCounter = class extends BaseCounter {
557
+ constructor() {
558
+ super(...arguments);
559
+ this._currentValue = 0;
560
+ this._totalValue = 0;
561
+ this._buckets = [];
562
+ this._lastTickTime = performance.now();
563
+ }
564
+ record(time) {
565
+ this._currentValue += time;
566
+ this._totalValue += time;
567
+ }
568
+ beginRecording() {
569
+ const start = performance.now();
570
+ return {
571
+ end: () => {
572
+ const end = performance.now();
573
+ this.record(end - start);
574
+ }
575
+ };
576
+ }
577
+ _tick(time) {
578
+ const delta = time - this._lastTickTime;
579
+ this._lastTickTime = time;
580
+ const percentage = this._currentValue / delta * 100;
581
+ this._buckets.push(percentage);
582
+ if (this._buckets.length > MAX_BUCKETS2) {
583
+ this._buckets.shift();
584
+ }
585
+ this._currentValue = 0;
586
+ }
587
+ getData() {
588
+ return {
589
+ name: this.name,
590
+ timeSeries: {
591
+ tracks: [
592
+ {
593
+ name: this.name,
594
+ units: "%",
595
+ points: this._buckets.map((value, index) => ({
596
+ value
597
+ })),
598
+ total: this._totalValue
599
+ }
600
+ ]
601
+ }
602
+ };
603
+ }
604
+ };
331
605
  // Annotate the CommonJS export names for ESM import in node:
332
606
  0 && (module.exports = {
607
+ BaseCounter,
333
608
  TRACE_PROCESSOR,
334
609
  TRACE_SPAN_ATTRIBUTE,
610
+ TimeSeriesCounter,
611
+ TimeUsageCounter,
335
612
  TraceProcessor,
336
613
  TraceSender,
337
614
  TracingSpan,
615
+ UnaryCounter,
338
616
  getTracingContext,
339
617
  symbolTracingContext,
340
618
  trace
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../../../src/index.ts", "../../../src/api.ts", "../../../src/symbols.ts", "../../../src/trace-processor.ts", "../../../src/trace-sender.ts"],
4
- "sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nexport * from './api';\nexport * from './symbols';\nexport * from './trace-processor';\nexport * from './trace-sender';\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { Context } from '@dxos/context';\n\nimport { getTracingContext } from './symbols';\nimport { TRACE_PROCESSOR } from './trace-processor';\n\nconst resource =\n () =>\n <T extends { new (...args: any[]): {} }>(constructor: T) => {\n return class extends constructor {\n constructor(...rest: any[]) {\n super(...rest);\n TRACE_PROCESSOR.traceResourceConstructor({ constructor, instance: this });\n }\n };\n };\n\nconst info = () => (target: any, propertyKey: string, descriptor?: PropertyDescriptor) => {\n getTracingContext(target).infoProperties[propertyKey] = {};\n};\n\nconst span = () => (target: any, propertyKey: string, descriptor: TypedPropertyDescriptor<(...args: any) => any>) => {\n const method = descriptor.value!;\n\n descriptor.value = async function (this: any, ...args: any) {\n const parentCtx = args[0] instanceof Context ? args[0] : null;\n const span = TRACE_PROCESSOR.traceSpan({ parentCtx, methodName: propertyKey, instance: this });\n\n const callArgs = span.ctx ? [span.ctx, ...args.slice(1)] : args;\n try {\n return await method.apply(this, callArgs);\n } catch (err) {\n span.markError(err);\n throw err;\n } finally {\n span.markSuccess();\n }\n };\n};\n\nexport type AddLinkOptions = {};\n\nconst addLink = (parent: any, child: any, opts: AddLinkOptions = {}) => {\n TRACE_PROCESSOR.addLink(parent, child, opts);\n};\n\nexport const trace = {\n resource,\n info,\n span,\n\n addLink,\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nexport const symbolTracingContext = Symbol('dxos.tracing-context');\n\nexport type TracingContext = {\n infoProperties: Record<string, {}>;\n};\n\nexport const getTracingContext = (target: any): TracingContext => {\n return (target[symbolTracingContext] ??= {\n infoProperties: {},\n });\n};\n\nexport const TRACE_SPAN_ATTRIBUTE = 'dxos.trace-span';\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { Context } from '@dxos/context';\nimport { Error as SerializedError } from '@dxos/protocols/proto/dxos/error';\nimport { Resource, Span } from '@dxos/protocols/proto/dxos/tracing';\nimport { getPrototypeSpecificInstanceId } from '@dxos/util';\n\nimport type { AddLinkOptions } from './api';\nimport { TRACE_SPAN_ATTRIBUTE, getTracingContext } from './symbols';\nimport { TraceSender } from './trace-sender';\n\nexport type TraceResourceConstructorParams = {\n constructor: { new (...args: any[]): {} };\n instance: any;\n};\n\nexport type TraceSpanParams = {\n instance: any;\n methodName: string;\n parentCtx: Context | null;\n};\n\nexport type ResourceEntry = {\n data: Resource;\n instance: WeakRef<any>;\n};\n\nexport type TraceSubscription = {\n dirtyResources: Set<number>;\n dirtySpans: Set<number>;\n};\n\nconst MAX_RESOURCE_RECORDS = 500;\nconst MAX_SPAN_RECORDS = 1_000;\n\nexport class TraceProcessor {\n resources = new Map<number, ResourceEntry>();\n resourceInstanceIndex = new WeakMap<any, ResourceEntry>();\n resourceIdList: number[] = [];\n\n spans = new Map<number, Span>();\n spanIdList: number[] = [];\n\n subscriptions: Set<TraceSubscription> = new Set();\n\n traceResourceConstructor(params: TraceResourceConstructorParams) {\n const id = this.resources.size;\n const entry: ResourceEntry = {\n data: {\n id,\n className: params.constructor.name,\n instanceId: getPrototypeSpecificInstanceId(params.instance),\n info: this.getResourceInfo(params.instance),\n links: [],\n },\n instance: new WeakRef(params.instance),\n };\n this.resources.set(id, entry);\n this.resourceInstanceIndex.set(params.instance, entry);\n this.resourceIdList.push(id);\n if (this.resourceIdList.length > MAX_RESOURCE_RECORDS) {\n this._clearResources();\n }\n this._markResourceDirty(id);\n }\n\n getResourceInfo(instance: any): Record<string, any> {\n const res: Record<string, any> = {};\n const tracingContext = getTracingContext(Object.getPrototypeOf(instance));\n\n for (const [key, _opts] of Object.entries(tracingContext.infoProperties)) {\n try {\n res[key] = typeof instance[key] === 'function' ? instance[key]() : instance[key];\n } catch (err: any) {\n res[key] = err.message;\n }\n }\n\n return res;\n }\n\n traceSpan(params: TraceSpanParams): TracingSpan {\n const span = new TracingSpan(this, params);\n this._flushSpan(span);\n return span;\n }\n\n addLink(parent: any, child: any, opts: AddLinkOptions) {}\n\n getResourceId(instance: any): number | null {\n const entry = this.resourceInstanceIndex.get(instance);\n return entry ? entry.data.id : null;\n }\n\n createTraceSender() {\n return new TraceSender(this);\n }\n\n /**\n * @internal\n */\n _flushSpan(runtimeSpan: TracingSpan) {\n const span = runtimeSpan.serialize();\n this.spans.set(span.id, span);\n this.spanIdList.push(span.id);\n if (this.spanIdList.length > MAX_SPAN_RECORDS) {\n this._clearSpans();\n }\n this._markSpanDirty(span.id);\n }\n\n private _markResourceDirty(id: number) {\n for (const subscription of this.subscriptions) {\n subscription.dirtyResources.add(id);\n }\n }\n\n private _markSpanDirty(id: number) {\n for (const subscription of this.subscriptions) {\n subscription.dirtySpans.add(id);\n }\n }\n\n private _clearResources() {\n // TODO(dmaretskyi): Use FinalizationRegistry to delete finalized resources first.\n while (this.resourceIdList.length > MAX_RESOURCE_RECORDS) {\n const id = this.resourceIdList.shift()!;\n this.resources.delete(id);\n }\n }\n\n private _clearSpans() {\n while (this.spanIdList.length > MAX_SPAN_RECORDS) {\n const id = this.spanIdList.shift()!;\n this.spans.delete(id);\n }\n }\n}\n\nexport class TracingSpan {\n static nextId = 0;\n\n readonly id: number;\n readonly parentId: number | null = null;\n readonly methodName: string;\n readonly resourceId: number | null = null;\n startTs: number;\n endTs: number | null = null;\n error: SerializedError | null = null;\n\n private readonly _ctx: Context | null = null;\n\n constructor(private _traceProcessor: TraceProcessor, params: TraceSpanParams) {\n this.id = TracingSpan.nextId++;\n this.methodName = params.methodName;\n this.resourceId = _traceProcessor.getResourceId(params.instance);\n this.startTs = performance.now();\n\n if (params.parentCtx) {\n this._ctx = params.parentCtx.derive({\n attributes: {\n [TRACE_SPAN_ATTRIBUTE]: this.id,\n },\n });\n const parentId = params.parentCtx.getAttribute(TRACE_SPAN_ATTRIBUTE);\n if (typeof parentId === 'number') {\n this.parentId = parentId;\n }\n }\n }\n\n get ctx(): Context | null {\n return this._ctx;\n }\n\n markSuccess() {\n this.endTs = performance.now();\n this._traceProcessor._flushSpan(this);\n }\n\n markError(err: unknown) {\n this.endTs = performance.now();\n this.error = serializeError(err);\n this._traceProcessor._flushSpan(this);\n }\n\n serialize(): Span {\n return {\n id: this.id,\n resourceId: this.resourceId ?? undefined,\n methodName: this.methodName,\n parentId: this.parentId ?? undefined,\n startTs: this.startTs.toFixed(3),\n endTs: this.endTs?.toFixed(3) ?? undefined,\n error: this.error ?? undefined,\n };\n }\n}\n\nconst serializeError = (err: unknown): SerializedError => {\n if (err instanceof Error) {\n return {\n name: err.name,\n message: err.message,\n };\n }\n\n return {\n message: String(err),\n };\n};\n\nexport const TRACE_PROCESSOR: TraceProcessor = ((globalThis as any).TRACE_PROCESSOR ??= new TraceProcessor());\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { Stream } from '@dxos/codec-protobuf';\nimport { StreamTraceEvent, TracingService } from '@dxos/protocols/proto/dxos/tracing';\n\nimport { TraceProcessor, TraceSubscription } from './trace-processor';\n\nconst FLUSH_INTERVAL = 1_000;\n\nexport class TraceSender implements TracingService {\n constructor(private _traceProcessor: TraceProcessor) {}\n\n streamTrace(request: void): Stream<StreamTraceEvent> {\n return new Stream(({ ctx, next }) => {\n const subscription: TraceSubscription = {\n dirtyResources: new Set(),\n dirtySpans: new Set(),\n };\n this._traceProcessor.subscriptions.add(subscription);\n ctx.onDispose(() => {\n this._traceProcessor.subscriptions.delete(subscription);\n });\n\n const flushEvents = (resources: Set<number> | null, spans: Set<number> | null) => {\n const event: StreamTraceEvent = {\n resourceAdded: [],\n resourceRemoved: [],\n spanAdded: [],\n };\n\n if (resources) {\n for (const id of resources) {\n const entry = this._traceProcessor.resources.get(id);\n if (entry) {\n event.resourceAdded!.push({ resource: entry.data });\n } else {\n event.resourceRemoved!.push({ id });\n }\n }\n } else {\n for (const entry of this._traceProcessor.resources.values()) {\n event.resourceAdded!.push({ resource: entry.data });\n }\n }\n\n if (spans) {\n for (const id of spans) {\n const span = this._traceProcessor.spans.get(id);\n if (span) {\n event.spanAdded!.push({ span });\n }\n }\n } else {\n for (const span of this._traceProcessor.spans.values()) {\n event.spanAdded!.push({ span });\n }\n }\n\n if (event.resourceAdded!.length > 0 || event.resourceRemoved!.length > 0 || event.spanAdded!.length > 0) {\n next(event);\n }\n };\n\n flushEvents(null, null);\n\n const timer = setInterval(() => {\n flushEvents(subscription.dirtyResources, subscription.dirtySpans);\n subscription.dirtyResources.clear();\n subscription.dirtySpans.clear();\n }, FLUSH_INTERVAL);\n ctx.onDispose(() => {\n clearInterval(timer);\n });\n });\n }\n}\n"],
5
- "mappings": "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",
6
- "names": ["symbolTracingContext", "Symbol", "getTracingContext", "target", "_a", "infoProperties", "TRACE_SPAN_ATTRIBUTE", "FLUSH_INTERVAL", "TraceSender", "constructor", "_traceProcessor", "streamTrace", "request", "Stream", "ctx", "next", "subscription", "dirtyResources", "Set", "dirtySpans", "subscriptions", "add", "onDispose", "delete", "flushEvents", "resources", "spans", "event", "resourceAdded", "resourceRemoved", "spanAdded", "id", "entry", "get", "push", "resource", "data", "values", "span", "length", "timer", "setInterval", "clear", "clearInterval", "MAX_RESOURCE_RECORDS", "MAX_SPAN_RECORDS", "TraceProcessor", "resources", "Map", "resourceInstanceIndex", "WeakMap", "resourceIdList", "spans", "spanIdList", "subscriptions", "Set", "traceResourceConstructor", "params", "id", "size", "entry", "data", "className", "constructor", "name", "instanceId", "getPrototypeSpecificInstanceId", "instance", "info", "getResourceInfo", "links", "WeakRef", "set", "push", "length", "_clearResources", "_markResourceDirty", "res", "tracingContext", "getTracingContext", "Object", "getPrototypeOf", "key", "_opts", "entries", "infoProperties", "err", "message", "traceSpan", "span", "TracingSpan", "_flushSpan", "addLink", "parent", "child", "opts", "getResourceId", "get", "createTraceSender", "TraceSender", "runtimeSpan", "serialize", "_clearSpans", "_markSpanDirty", "subscription", "dirtyResources", "add", "dirtySpans", "shift", "delete", "_traceProcessor", "parentId", "resourceId", "endTs", "error", "_ctx", "nextId", "methodName", "startTs", "performance", "now", "parentCtx", "derive", "attributes", "TRACE_SPAN_ATTRIBUTE", "getAttribute", "ctx", "markSuccess", "markError", "serializeError", "_a", "undefined", "toFixed", "Error", "String", "TRACE_PROCESSOR", "globalThis", "resource", "constructor", "rest", "TRACE_PROCESSOR", "traceResourceConstructor", "instance", "info", "target", "propertyKey", "descriptor", "getTracingContext", "infoProperties", "span", "method", "value", "args", "parentCtx", "Context", "traceSpan", "methodName", "callArgs", "ctx", "slice", "apply", "err", "markError", "markSuccess", "addLink", "parent", "child", "opts", "trace"]
3
+ "sources": ["../../../src/index.ts", "../../../src/api.ts", "../../../src/symbols.ts", "../../../src/trace-processor.ts", "../../../src/trace-sender.ts", "../../../src/metrics/base.ts", "../../../src/metrics/unary-counter.ts", "../../../src/metrics/time-series-counter.ts", "../../../src/metrics/time-usage-counter.ts"],
4
+ "sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nexport * from './api';\nexport * from './symbols';\nexport * from './trace-processor';\nexport * from './trace-sender';\nexport * from './metrics';\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { Context } from '@dxos/context';\n\nimport { getTracingContext } from './symbols';\nimport { TRACE_PROCESSOR } from './trace-processor';\n\n/**\n * Annotates a class as a tracked resource.\n */\nconst resource =\n () =>\n <T extends { new (...args: any[]): {} }>(constructor: T) => {\n const klass = class extends constructor {\n constructor(...rest: any[]) {\n super(...rest);\n TRACE_PROCESSOR.traceResourceConstructor({ constructor, instance: this });\n }\n };\n Object.defineProperty(klass, 'name', { value: constructor.name });\n return klass;\n };\n\n/**\n * Marks a property or a method to be included in the resource info section.\n */\nconst info = () => (target: any, propertyKey: string, descriptor?: PropertyDescriptor) => {\n getTracingContext(target).infoProperties[propertyKey] = {};\n};\n\nconst span = () => (target: any, propertyKey: string, descriptor: TypedPropertyDescriptor<(...args: any) => any>) => {\n const method = descriptor.value!;\n\n descriptor.value = async function (this: any, ...args: any) {\n const parentCtx = args[0] instanceof Context ? args[0] : null;\n const span = TRACE_PROCESSOR.traceSpan({ parentCtx, methodName: propertyKey, instance: this });\n\n const callArgs = span.ctx ? [span.ctx, ...args.slice(1)] : args;\n try {\n return await method.apply(this, callArgs);\n } catch (err) {\n span.markError(err);\n throw err;\n } finally {\n span.markSuccess();\n }\n };\n};\n\n/**\n * Attaches metrics counter to the resource.\n */\nconst metricsCounter = () => (target: any, propertyKey: string, descriptor?: PropertyDescriptor) => {\n getTracingContext(target).metricsProperties[propertyKey] = {};\n};\n\nexport type AddLinkOptions = {};\n\nconst addLink = (parent: any, child: any, opts: AddLinkOptions = {}) => {\n TRACE_PROCESSOR.addLink(parent, child, opts);\n};\n\nexport const trace = {\n resource,\n info,\n span,\n metricsCounter,\n\n addLink,\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nexport const symbolTracingContext = Symbol('dxos.tracing.context');\n\nexport type TracingContext = {\n infoProperties: Record<string, {}>;\n metricsProperties: Record<string, {}>;\n};\n\nexport const getTracingContext = (target: any): TracingContext => {\n return ((target[symbolTracingContext] as TracingContext | undefined) ??= {\n infoProperties: {},\n metricsProperties: {},\n });\n};\n\nexport const TRACE_SPAN_ATTRIBUTE = 'dxos.trace-span';\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { unrefTimeout } from '@dxos/async';\nimport { Context } from '@dxos/context';\nimport { LogLevel, LogProcessor, getContextFromEntry, log } from '@dxos/log';\nimport { LogEntry } from '@dxos/protocols/proto/dxos/client/services';\nimport { Error as SerializedError } from '@dxos/protocols/proto/dxos/error';\nimport { Metric, Resource, Span } from '@dxos/protocols/proto/dxos/tracing';\nimport { getPrototypeSpecificInstanceId } from '@dxos/util';\n\nimport type { AddLinkOptions } from './api';\nimport { BaseCounter } from './metrics';\nimport { TRACE_SPAN_ATTRIBUTE, getTracingContext } from './symbols';\nimport { TraceSender } from './trace-sender';\n\nexport type TraceResourceConstructorParams = {\n constructor: { new (...args: any[]): {} };\n instance: any;\n};\n\nexport type TraceSpanParams = {\n instance: any;\n methodName: string;\n parentCtx: Context | null;\n};\n\nexport type ResourceEntry = {\n data: Resource;\n instance: WeakRef<any>;\n};\n\nexport type TraceSubscription = {\n flush: () => void;\n\n dirtyResources: Set<number>;\n dirtySpans: Set<number>;\n newLogs: LogEntry[];\n};\n\nconst MAX_RESOURCE_RECORDS = 500;\nconst MAX_SPAN_RECORDS = 1_000;\nconst MAX_LOG_RECORDS = 1_000;\n\nconst REFRESH_INTERVAL = 1_000;\n\nexport class TraceProcessor {\n resources = new Map<number, ResourceEntry>();\n resourceInstanceIndex = new WeakMap<any, ResourceEntry>();\n resourceIdList: number[] = [];\n\n spans = new Map<number, Span>();\n spanIdList: number[] = [];\n\n logs: LogEntry[] = [];\n\n subscriptions: Set<TraceSubscription> = new Set();\n\n constructor() {\n log.addProcessor(this._logProcessor.bind(this));\n\n const refreshInterval = setInterval(this.refresh.bind(this), REFRESH_INTERVAL);\n unrefTimeout(refreshInterval);\n }\n\n traceResourceConstructor(params: TraceResourceConstructorParams) {\n const id = this.resources.size;\n\n // init metrics counters.\n const tracingContext = getTracingContext(Object.getPrototypeOf(params.instance));\n for (const key of Object.keys(tracingContext.metricsProperties)) {\n (params.instance[key] as BaseCounter)._assign(params.instance, key);\n }\n\n const entry: ResourceEntry = {\n data: {\n id,\n className: params.constructor.name,\n instanceId: getPrototypeSpecificInstanceId(params.instance),\n info: this.getResourceInfo(params.instance),\n links: [],\n metrics: this.getResourceMetrics(params.instance),\n },\n instance: new WeakRef(params.instance),\n };\n this.resources.set(id, entry);\n this.resourceInstanceIndex.set(params.instance, entry);\n this.resourceIdList.push(id);\n if (this.resourceIdList.length > MAX_RESOURCE_RECORDS) {\n this._clearResources();\n }\n this._markResourceDirty(id);\n }\n\n getResourceInfo(instance: any): Record<string, any> {\n const res: Record<string, any> = {};\n const tracingContext = getTracingContext(Object.getPrototypeOf(instance));\n\n for (const [key, _opts] of Object.entries(tracingContext.infoProperties)) {\n try {\n res[key] = sanitizeValue(typeof instance[key] === 'function' ? instance[key]() : instance[key]);\n } catch (err: any) {\n res[key] = err.message;\n }\n }\n\n return res;\n }\n\n getResourceMetrics(instance: any): Metric[] {\n const res: Metric[] = [];\n const tracingContext = getTracingContext(Object.getPrototypeOf(instance));\n\n for (const [key, _opts] of Object.entries(tracingContext.metricsProperties)) {\n res.push(instance[key].getData());\n }\n\n return res;\n }\n\n traceSpan(params: TraceSpanParams): TracingSpan {\n const span = new TracingSpan(this, params);\n this._flushSpan(span);\n return span;\n }\n\n addLink(parent: any, child: any, opts: AddLinkOptions) {}\n\n getResourceId(instance: any): number | null {\n const entry = this.resourceInstanceIndex.get(instance);\n return entry ? entry.data.id : null;\n }\n\n createTraceSender() {\n return new TraceSender(this);\n }\n\n refresh() {\n for (const resource of this.resources.values()) {\n const instance = resource.instance.deref();\n if (!instance) {\n continue;\n }\n\n const tracingContext = getTracingContext(Object.getPrototypeOf(instance));\n const time = performance.now();\n for (const key of Object.keys(tracingContext.metricsProperties)) {\n (instance[key] as BaseCounter)._tick?.(time);\n }\n\n let _changed = false;\n\n const oldInfo = resource.data.info;\n resource.data.info = this.getResourceInfo(instance);\n _changed ||= !areEqualShallow(oldInfo, resource.data.info);\n\n const oldMetrics = resource.data.metrics;\n resource.data.metrics = this.getResourceMetrics(instance);\n _changed ||= !areEqualShallow(oldMetrics, resource.data.metrics);\n\n // TODO(dmaretskyi): Test if works and enable.\n // if (changed) {\n this._markResourceDirty(resource.data.id);\n // }\n }\n\n for (const subscription of this.subscriptions) {\n subscription.flush();\n }\n }\n\n /**\n * @internal\n */\n _flushSpan(runtimeSpan: TracingSpan) {\n const span = runtimeSpan.serialize();\n this.spans.set(span.id, span);\n this.spanIdList.push(span.id);\n if (this.spanIdList.length > MAX_SPAN_RECORDS) {\n this._clearSpans();\n }\n this._markSpanDirty(span.id);\n }\n\n private _markResourceDirty(id: number) {\n for (const subscription of this.subscriptions) {\n subscription.dirtyResources.add(id);\n }\n }\n\n private _markSpanDirty(id: number) {\n for (const subscription of this.subscriptions) {\n subscription.dirtySpans.add(id);\n }\n }\n\n private _clearResources() {\n // TODO(dmaretskyi): Use FinalizationRegistry to delete finalized resources first.\n while (this.resourceIdList.length > MAX_RESOURCE_RECORDS) {\n const id = this.resourceIdList.shift()!;\n this.resources.delete(id);\n }\n }\n\n private _clearSpans() {\n while (this.spanIdList.length > MAX_SPAN_RECORDS) {\n const id = this.spanIdList.shift()!;\n this.spans.delete(id);\n }\n }\n\n private _pushLog(log: LogEntry) {\n this.logs.push(log);\n if (this.logs.length > MAX_LOG_RECORDS) {\n this.logs.shift();\n }\n\n for (const subscription of this.subscriptions) {\n subscription.newLogs.push(log);\n }\n }\n\n private _logProcessor: LogProcessor = (config, entry) => {\n switch (entry.level) {\n case LogLevel.ERROR:\n case LogLevel.WARN:\n case LogLevel.TRACE: {\n const scope = entry.meta?.S;\n const resource = this.resourceInstanceIndex.get(scope);\n if (!resource) {\n return;\n }\n\n const context = getContextFromEntry(entry) ?? {};\n\n for (const key of Object.keys(context)) {\n context[key] = sanitizeValue(context[key]);\n }\n\n const entryToPush: LogEntry = {\n level: entry.level,\n message: entry.message,\n context,\n timestamp: new Date(),\n meta: {\n file: entry.meta?.F ?? '',\n line: entry.meta?.L ?? 0,\n resourceId: resource.data.id,\n },\n };\n this._pushLog(entryToPush);\n break;\n }\n default:\n }\n };\n}\n\nexport class TracingSpan {\n static nextId = 0;\n\n readonly id: number;\n readonly parentId: number | null = null;\n readonly methodName: string;\n readonly resourceId: number | null = null;\n startTs: number;\n endTs: number | null = null;\n error: SerializedError | null = null;\n\n private readonly _ctx: Context | null = null;\n\n constructor(private _traceProcessor: TraceProcessor, params: TraceSpanParams) {\n this.id = TracingSpan.nextId++;\n this.methodName = params.methodName;\n this.resourceId = _traceProcessor.getResourceId(params.instance);\n this.startTs = performance.now();\n\n if (params.parentCtx) {\n this._ctx = params.parentCtx.derive({\n attributes: {\n [TRACE_SPAN_ATTRIBUTE]: this.id,\n },\n });\n const parentId = params.parentCtx.getAttribute(TRACE_SPAN_ATTRIBUTE);\n if (typeof parentId === 'number') {\n this.parentId = parentId;\n }\n }\n }\n\n get ctx(): Context | null {\n return this._ctx;\n }\n\n markSuccess() {\n this.endTs = performance.now();\n this._traceProcessor._flushSpan(this);\n }\n\n markError(err: unknown) {\n this.endTs = performance.now();\n this.error = serializeError(err);\n this._traceProcessor._flushSpan(this);\n }\n\n serialize(): Span {\n return {\n id: this.id,\n resourceId: this.resourceId ?? undefined,\n methodName: this.methodName,\n parentId: this.parentId ?? undefined,\n startTs: this.startTs.toFixed(3),\n endTs: this.endTs?.toFixed(3) ?? undefined,\n error: this.error ?? undefined,\n };\n }\n}\n\nconst serializeError = (err: unknown): SerializedError => {\n if (err instanceof Error) {\n return {\n name: err.name,\n message: err.message,\n };\n }\n\n return {\n message: String(err),\n };\n};\n\nexport const TRACE_PROCESSOR: TraceProcessor = ((globalThis as any).TRACE_PROCESSOR ??= new TraceProcessor());\n\nconst sanitizeValue = (value: any) => {\n switch (typeof value) {\n case 'string':\n case 'number':\n case 'boolean':\n case 'undefined':\n return value;\n break;\n case 'object':\n case 'function':\n if (value === null) {\n return value;\n break;\n }\n\n // TODO(dmaretskyi): Expose trait.\n if (typeof value.truncate === 'function') {\n return value.truncate();\n }\n\n return value.toString();\n }\n};\n\nconst areEqualShallow = (a: any, b: any) => {\n for (const key in a) {\n if (!(key in b) || a[key] !== b[key]) {\n return false;\n }\n }\n for (const key in b) {\n if (!(key in a) || a[key] !== b[key]) {\n return false;\n }\n }\n return true;\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { Stream } from '@dxos/codec-protobuf';\nimport { LogEntry } from '@dxos/protocols/proto/dxos/client/services';\nimport { StreamTraceEvent, TracingService } from '@dxos/protocols/proto/dxos/tracing';\n\nimport { TraceProcessor, TraceSubscription } from './trace-processor';\n\nexport class TraceSender implements TracingService {\n constructor(private _traceProcessor: TraceProcessor) {}\n\n streamTrace(request: void): Stream<StreamTraceEvent> {\n return new Stream(({ ctx, next }) => {\n const flushEvents = (resources: Set<number> | null, spans: Set<number> | null, logs: LogEntry[] | null) => {\n const event: StreamTraceEvent = {\n resourceAdded: [],\n resourceRemoved: [],\n spanAdded: [],\n logAdded: [],\n };\n\n if (resources) {\n for (const id of resources) {\n const entry = this._traceProcessor.resources.get(id);\n if (entry) {\n event.resourceAdded!.push({ resource: entry.data });\n } else {\n event.resourceRemoved!.push({ id });\n }\n }\n } else {\n for (const entry of this._traceProcessor.resources.values()) {\n event.resourceAdded!.push({ resource: entry.data });\n }\n }\n\n if (spans) {\n for (const id of spans) {\n const span = this._traceProcessor.spans.get(id);\n if (span) {\n event.spanAdded!.push({ span });\n }\n }\n } else {\n for (const span of this._traceProcessor.spans.values()) {\n event.spanAdded!.push({ span });\n }\n }\n\n if (logs) {\n for (const log of logs) {\n event.logAdded!.push({ log });\n }\n } else {\n for (const log of this._traceProcessor.logs) {\n event.logAdded!.push({ log });\n }\n }\n\n if (event.resourceAdded!.length > 0 || event.resourceRemoved!.length > 0 || event.spanAdded!.length > 0) {\n next(event);\n }\n };\n\n const flush = () => {\n flushEvents(subscription.dirtyResources, subscription.dirtySpans, subscription.newLogs);\n subscription.dirtyResources.clear();\n subscription.dirtySpans.clear();\n subscription.newLogs.length = 0;\n };\n\n const subscription: TraceSubscription = {\n flush,\n dirtyResources: new Set(),\n dirtySpans: new Set(),\n newLogs: [],\n };\n this._traceProcessor.subscriptions.add(subscription);\n ctx.onDispose(() => {\n this._traceProcessor.subscriptions.delete(subscription);\n });\n\n flushEvents(null, null, null);\n });\n }\n}\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { Metric } from '@dxos/protocols/proto/dxos/tracing';\n\nexport abstract class BaseCounter {\n /**\n * @internal\n */\n _instance: any;\n\n name?: string;\n\n /**\n * @internal\n */\n _assign(instance: any, name: string) {\n this._instance = instance;\n this.name = name;\n }\n\n abstract getData(): Metric;\n\n _tick(time: number): void {}\n}\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { Metric } from '@dxos/protocols/proto/dxos/tracing';\n\nimport { BaseCounter } from './base';\n\nexport class UnaryCounter extends BaseCounter {\n value = 0;\n units?: string;\n\n constructor({ units }: { units?: string } = {}) {\n super();\n this.units = units;\n }\n\n inc(by = 1) {\n this.value += by;\n }\n\n getData(): Metric {\n return {\n name: this.name!,\n counter: {\n value: this.value,\n units: this.units,\n },\n };\n }\n}\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { Metric } from '@dxos/protocols/proto/dxos/tracing';\n\nimport { BaseCounter } from './base';\n\nconst MAX_BUCKETS = 60;\n\nexport class TimeSeriesCounter extends BaseCounter {\n private _currentValue = 0;\n private _totalValue = 0;\n private _buckets: number[] = [];\n units?: string;\n\n constructor({ units }: { units?: string } = {}) {\n super();\n this.units = units;\n }\n\n inc(by = 1) {\n this._currentValue += by;\n this._totalValue += by;\n }\n\n override _tick(time: number): void {\n this._buckets.push(this._currentValue);\n if (this._buckets.length > MAX_BUCKETS) {\n this._buckets.shift();\n }\n this._currentValue = 0;\n }\n\n override getData(): Metric {\n return {\n name: this.name!,\n timeSeries: {\n tracks: [\n {\n name: this.name!,\n units: this.units,\n points: this._buckets.map((value, index) => ({\n value,\n })),\n total: this._totalValue,\n },\n ],\n },\n };\n }\n}\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { Metric } from '@dxos/protocols/proto/dxos/tracing';\n\nimport { BaseCounter } from './base';\n\nconst MAX_BUCKETS = 60;\n\nexport class TimeUsageCounter extends BaseCounter {\n private _currentValue = 0;\n private _totalValue = 0;\n private _buckets: number[] = [];\n\n private _lastTickTime = performance.now();\n\n record(time: number) {\n this._currentValue += time;\n this._totalValue += time;\n }\n\n beginRecording(): { end: () => void } {\n const start = performance.now();\n return {\n end: () => {\n const end = performance.now();\n this.record(end - start);\n },\n };\n }\n\n override _tick(time: number): void {\n const delta = time - this._lastTickTime;\n this._lastTickTime = time;\n\n const percentage = (this._currentValue / delta) * 100;\n this._buckets.push(percentage);\n if (this._buckets.length > MAX_BUCKETS) {\n this._buckets.shift();\n }\n this._currentValue = 0;\n }\n\n override getData(): Metric {\n return {\n name: this.name!,\n timeSeries: {\n tracks: [\n {\n name: this.name!,\n units: '%',\n points: this._buckets.map((value, index) => ({\n value,\n })),\n total: this._totalValue,\n },\n ],\n },\n };\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["symbolTracingContext", "Symbol", "getTracingContext", "target", "infoProperties", "metricsProperties", "TRACE_SPAN_ATTRIBUTE", "TraceSender", "constructor", "_traceProcessor", "streamTrace", "request", "Stream", "ctx", "next", "flushEvents", "resources", "spans", "logs", "event", "resourceAdded", "resourceRemoved", "spanAdded", "logAdded", "id", "entry", "get", "push", "resource", "data", "values", "span", "log", "length", "flush", "subscription", "dirtyResources", "dirtySpans", "newLogs", "clear", "Set", "subscriptions", "add", "onDispose", "delete", "MAX_RESOURCE_RECORDS", "MAX_SPAN_RECORDS", "MAX_LOG_RECORDS", "REFRESH_INTERVAL", "TraceProcessor", "constructor", "resources", "Map", "resourceInstanceIndex", "WeakMap", "resourceIdList", "spans", "spanIdList", "logs", "subscriptions", "Set", "_logProcessor", "config", "entry", "level", "LogLevel", "ERROR", "WARN", "TRACE", "scope", "meta", "S", "resource", "get", "context", "getContextFromEntry", "key", "Object", "keys", "sanitizeValue", "entryToPush", "message", "timestamp", "Date", "file", "F", "line", "L", "resourceId", "data", "id", "_pushLog", "log", "addProcessor", "bind", "refreshInterval", "setInterval", "refresh", "unrefTimeout", "traceResourceConstructor", "params", "size", "tracingContext", "getTracingContext", "getPrototypeOf", "instance", "metricsProperties", "_assign", "className", "name", "instanceId", "getPrototypeSpecificInstanceId", "info", "getResourceInfo", "links", "metrics", "getResourceMetrics", "WeakRef", "set", "push", "length", "_clearResources", "_markResourceDirty", "res", "_opts", "entries", "infoProperties", "err", "getData", "traceSpan", "span", "TracingSpan", "_flushSpan", "addLink", "parent", "child", "opts", "getResourceId", "createTraceSender", "TraceSender", "values", "deref", "time", "performance", "now", "_tick", "_changed", "oldInfo", "areEqualShallow", "oldMetrics", "subscription", "flush", "runtimeSpan", "serialize", "_clearSpans", "_markSpanDirty", "dirtyResources", "add", "dirtySpans", "shift", "delete", "newLogs", "nextId", "_traceProcessor", "parentId", "endTs", "error", "_ctx", "methodName", "startTs", "parentCtx", "derive", "attributes", "TRACE_SPAN_ATTRIBUTE", "getAttribute", "ctx", "markSuccess", "markError", "serializeError", "undefined", "toFixed", "Error", "String", "TRACE_PROCESSOR", "globalThis", "value", "truncate", "toString", "a", "b", "resource", "constructor", "klass", "rest", "TRACE_PROCESSOR", "traceResourceConstructor", "instance", "Object", "defineProperty", "value", "name", "info", "target", "propertyKey", "descriptor", "getTracingContext", "infoProperties", "span", "method", "args", "parentCtx", "Context", "traceSpan", "methodName", "callArgs", "ctx", "slice", "apply", "err", "markError", "markSuccess", "metricsCounter", "metricsProperties", "addLink", "parent", "child", "opts", "trace", "BaseCounter", "_assign", "instance", "name", "_instance", "_tick", "time", "UnaryCounter", "BaseCounter", "constructor", "units", "value", "inc", "by", "getData", "name", "counter", "MAX_BUCKETS", "TimeSeriesCounter", "BaseCounter", "constructor", "units", "_currentValue", "_totalValue", "_buckets", "inc", "by", "_tick", "time", "push", "length", "shift", "getData", "name", "timeSeries", "tracks", "points", "map", "value", "index", "total", "MAX_BUCKETS", "TimeUsageCounter", "BaseCounter", "_currentValue", "_totalValue", "_buckets", "_lastTickTime", "performance", "now", "record", "time", "beginRecording", "start", "end", "_tick", "delta", "percentage", "push", "length", "shift", "getData", "name", "timeSeries", "tracks", "units", "points", "map", "value", "index", "total"]
7
7
  }