@dxos/tracing 0.5.1-next.638da00 → 0.5.1-next.65aaa36

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.
@@ -125,13 +125,13 @@ var REFRESH_INTERVAL = 1e3;
125
125
  var MAX_INFO_OBJECT_DEPTH = 8;
126
126
  var TraceProcessor = class {
127
127
  constructor() {
128
- this.subscriptions = /* @__PURE__ */ new Set();
129
128
  this.resources = /* @__PURE__ */ new Map();
130
129
  this.resourceInstanceIndex = /* @__PURE__ */ new WeakMap();
131
130
  this.resourceIdList = [];
132
131
  this.spans = /* @__PURE__ */ new Map();
133
132
  this.spanIdList = [];
134
133
  this.logs = [];
134
+ this.subscriptions = /* @__PURE__ */ new Set();
135
135
  this._logProcessor = (config, entry) => {
136
136
  switch (entry.level) {
137
137
  case LogLevel.ERROR:
@@ -165,18 +165,14 @@ var TraceProcessor = class {
165
165
  };
166
166
  log.addProcessor(this._logProcessor.bind(this), void 0, {
167
167
  F: __dxlog_file,
168
- L: 87,
168
+ L: 81,
169
169
  S: this,
170
170
  C: (f, a) => f(...a)
171
171
  });
172
172
  const refreshInterval = setInterval(this.refresh.bind(this), REFRESH_INTERVAL);
173
173
  unrefTimeout(refreshInterval);
174
174
  }
175
- /**
176
- * @internal
177
- */
178
- // TODO(burdon): Comment.
179
- createTraceResource(params) {
175
+ traceResourceConstructor(params) {
180
176
  const id = this.resources.size;
181
177
  const tracingContext = getTracingContext(Object.getPrototypeOf(params.instance));
182
178
  for (const key of Object.keys(tracingContext.metricsProperties)) {
@@ -198,33 +194,6 @@ var TraceProcessor = class {
198
194
  }
199
195
  this._markResourceDirty(id);
200
196
  }
201
- createTraceSender() {
202
- return new TraceSender(this);
203
- }
204
- traceSpan(params) {
205
- const span2 = new TracingSpan(this, params);
206
- this._flushSpan(span2);
207
- return span2;
208
- }
209
- // TODO(burdon): Not implemented.
210
- addLink(parent, child, opts) {
211
- }
212
- //
213
- // Getters
214
- //
215
- // TODO(burdon): Define type.
216
- // TODO(burdon): Reconcile with system service.
217
- getDiagnostics() {
218
- this.refresh();
219
- return {
220
- resources: Object.fromEntries(Array.from(this.resources.entries()).map(([id, entry]) => [
221
- `${entry.sanitizedClassName}#${entry.data.instanceId}`,
222
- entry.data
223
- ])),
224
- spans: Array.from(this.spans.values()),
225
- logs: this.logs.filter((log2) => log2.level >= LogLevel.INFO)
226
- };
227
- }
228
197
  getResourceInfo(instance) {
229
198
  const res = {};
230
199
  const tracingContext = getTracingContext(Object.getPrototypeOf(instance));
@@ -250,19 +219,19 @@ var TraceProcessor = class {
250
219
  }
251
220
  return res;
252
221
  }
222
+ traceSpan(params) {
223
+ const span2 = new TracingSpan(this, params);
224
+ this._flushSpan(span2);
225
+ return span2;
226
+ }
227
+ addLink(parent, child, opts) {
228
+ }
253
229
  getResourceId(instance) {
254
230
  const entry = this.resourceInstanceIndex.get(instance);
255
231
  return entry ? entry.data.id : null;
256
232
  }
257
- findResourcesByClassName(className) {
258
- return [
259
- ...this.resources.values()
260
- ].filter((res) => res.data.className === className || res.sanitizedClassName === className);
261
- }
262
- findResourcesByAnnotation(annotation) {
263
- return [
264
- ...this.resources.values()
265
- ].filter((res) => res.annotation === annotation);
233
+ createTraceSender() {
234
+ return new TraceSender(this);
266
235
  }
267
236
  refresh() {
268
237
  for (const resource2 of this.resources.values()) {
@@ -288,9 +257,27 @@ var TraceProcessor = class {
288
257
  subscription.flush();
289
258
  }
290
259
  }
291
- //
292
- // Implementation
293
- //
260
+ findResourcesByClassName(className) {
261
+ return [
262
+ ...this.resources.values()
263
+ ].filter((r) => r.data.className === className || r.sanitizedClassName === className);
264
+ }
265
+ findByAnnotation(annotation) {
266
+ return [
267
+ ...this.resources.values()
268
+ ].filter((r) => r.annotation === annotation);
269
+ }
270
+ getDiagnostics() {
271
+ this.refresh();
272
+ return {
273
+ resources: Object.fromEntries(Array.from(this.resources.entries()).map(([id, entry]) => [
274
+ `${entry.sanitizedClassName}#${entry.data.instanceId}`,
275
+ entry.data
276
+ ])),
277
+ spans: Array.from(this.spans.values()),
278
+ logs: this.logs.filter((log2) => log2.level >= LogLevel.INFO)
279
+ };
280
+ }
294
281
  /**
295
282
  * @internal
296
283
  */
@@ -488,7 +475,7 @@ var resource = (options) => (constructor) => {
488
475
  const klass = /* @__PURE__ */ (() => class extends constructor {
489
476
  constructor(...rest) {
490
477
  super(...rest);
491
- TRACE_PROCESSOR.createTraceResource({
478
+ TRACE_PROCESSOR.traceResourceConstructor({
492
479
  constructor,
493
480
  annotation: options?.annotation,
494
481
  instance: this
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../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", "../../../src/metrics/map-counter.ts"],
4
- "sourcesContent": ["//\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 (options?: { annotation?: symbol }) =>\n <T extends { new (...args: any[]): {} }>(constructor: T) => {\n // Wrapping class declaration into an IIFE so it doesn't capture the `klass` class name.\n const klass = (() =>\n class extends constructor {\n constructor(...rest: any[]) {\n super(...rest);\n TRACE_PROCESSOR.createTraceResource({ constructor, annotation: options?.annotation, instance: this });\n }\n })();\n Object.defineProperty(klass, 'name', { value: constructor.name });\n return klass;\n };\n\nexport type InfoOptions = {\n /**\n * Value is of enum type and should be converted to string.\n *\n * Example:\n *\n * ```ts\n * @trace.info({ enum: SpaceState })\n * get state(): SpaceState { ... }\n * ```\n */\n enum?: Record<string, any>;\n\n /**\n * Max depth of the object to be included in the resource info section.\n *\n * null means no limit (a limit of 8 nested objects is still imposed).\n *\n * Default: 0 - objects will be stringified with toString.\n */\n depth?: number | null;\n};\n\n/**\n * Marks a property or a method to be included in the resource info section.\n */\nconst info =\n (opts: InfoOptions = {}) =>\n (target: any, propertyKey: string, descriptor?: PropertyDescriptor) => {\n getTracingContext(target).infoProperties[propertyKey] = { options: opts };\n };\n\nconst mark = (name: string) => {\n performance.mark(name);\n};\n\nexport type SpanOptions = {\n showInBrowserTimeline?: boolean;\n};\n\nconst span =\n ({ showInBrowserTimeline = false }: SpanOptions = {}) =>\n (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({\n parentCtx,\n methodName: propertyKey,\n instance: this,\n showInBrowserTimeline,\n });\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 mark,\n span,\n metricsCounter,\n\n addLink,\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { type InfoOptions } from './api';\n\nexport const symbolTracingContext = Symbol('dxos.tracing.context');\n\nexport type TracingContext = {\n infoProperties: Record<\n string,\n {\n options: InfoOptions;\n }\n >;\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 { type Context } from '@dxos/context';\nimport { LogLevel, type LogProcessor, getContextFromEntry, log } from '@dxos/log';\nimport { type LogEntry } from '@dxos/protocols/proto/dxos/client/services';\nimport { type Error as SerializedError } from '@dxos/protocols/proto/dxos/error';\nimport { type Metric, type Resource, type Span } from '@dxos/protocols/proto/dxos/tracing';\nimport { getPrototypeSpecificInstanceId } from '@dxos/util';\n\nimport type { AddLinkOptions } from './api';\nimport { type BaseCounter } from './metrics';\nimport { TRACE_SPAN_ATTRIBUTE, getTracingContext } from './symbols';\nimport { TraceSender } from './trace-sender';\n\nexport type Diagnostics = {\n resources: Record<string, Resource>;\n spans: Span[];\n logs: LogEntry[];\n};\n\nexport type TraceResourceConstructorParams = {\n constructor: { new (...args: any[]): {} };\n instance: any;\n annotation?: symbol;\n};\n\nexport type TraceSpanParams = {\n instance: any;\n methodName: string;\n parentCtx: Context | null;\n showInBrowserTimeline: boolean;\n};\n\nexport class ResourceEntry {\n /**\n * Sometimes bundlers mangle class names: WebFile -> WebFile2.\n *\n * We use a heuristic to remove the suffix.\n */\n public readonly sanitizedClassName: string;\n\n constructor(\n public readonly data: Resource,\n public readonly instance: WeakRef<any>,\n public readonly annotation?: symbol,\n ) {\n this.sanitizedClassName = sanitizeClassName(data.className);\n }\n\n getMetric(name: string): Metric | undefined {\n return this.data.metrics?.find((metric) => metric.name === name);\n }\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 = 2_000;\nconst MAX_SPAN_RECORDS = 1_000;\nconst MAX_LOG_RECORDS = 1_000;\n\nconst REFRESH_INTERVAL = 1_000;\n\nconst MAX_INFO_OBJECT_DEPTH = 8;\n\nexport class TraceProcessor {\n readonly subscriptions: Set<TraceSubscription> = new Set();\n\n readonly resources = new Map<number, ResourceEntry>();\n readonly resourceInstanceIndex = new WeakMap<any, ResourceEntry>();\n readonly resourceIdList: number[] = [];\n\n readonly spans = new Map<number, Span>();\n readonly spanIdList: number[] = [];\n\n readonly logs: LogEntry[] = [];\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 /**\n * @internal\n */\n // TODO(burdon): Comment.\n createTraceResource(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 = new ResourceEntry(\n {\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 new WeakRef(params.instance),\n params.annotation,\n );\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\n this._markResourceDirty(id);\n }\n\n createTraceSender() {\n return new TraceSender(this);\n }\n\n traceSpan(params: TraceSpanParams): TracingSpan {\n const span = new TracingSpan(this, params);\n this._flushSpan(span);\n return span;\n }\n\n // TODO(burdon): Not implemented.\n addLink(parent: any, child: any, opts: AddLinkOptions) {}\n\n //\n // Getters\n //\n\n // TODO(burdon): Define type.\n // TODO(burdon): Reconcile with system service.\n getDiagnostics(): Diagnostics {\n this.refresh();\n\n return {\n resources: Object.fromEntries(\n Array.from(this.resources.entries()).map(([id, entry]) => [\n `${entry.sanitizedClassName}#${entry.data.instanceId}`,\n entry.data,\n ]),\n ),\n spans: Array.from(this.spans.values()),\n logs: this.logs.filter((log) => log.level >= LogLevel.INFO),\n };\n }\n\n getResourceInfo(instance: any): Record<string, any> {\n const res: Record<string, any> = {};\n const tracingContext = getTracingContext(Object.getPrototypeOf(instance));\n for (const [key, { options }] of Object.entries(tracingContext.infoProperties)) {\n try {\n const value = typeof instance[key] === 'function' ? instance[key]() : instance[key];\n if (options.enum) {\n res[key] = options.enum[value];\n } else {\n res[key] = sanitizeValue(\n value,\n options.depth === undefined ? 1 : options.depth ?? MAX_INFO_OBJECT_DEPTH,\n this,\n );\n }\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 for (const [key, _opts] of Object.entries(tracingContext.metricsProperties)) {\n res.push(instance[key].getData());\n }\n\n return res;\n }\n\n getResourceId(instance: any): number | null {\n const entry = this.resourceInstanceIndex.get(instance);\n return entry ? entry.data.id : null;\n }\n\n findResourcesByClassName(className: string): ResourceEntry[] {\n return [...this.resources.values()].filter(\n (res) => res.data.className === className || res.sanitizedClassName === className,\n );\n }\n\n findResourcesByAnnotation(annotation: symbol): ResourceEntry[] {\n return [...this.resources.values()].filter((res) => res.annotation === annotation);\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 // Implementation\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 for (const key of Object.keys(context)) {\n context[key] = sanitizeValue(context[key], 0, this);\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\n// TODO(burdon): Comment.\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 _showInBrowserTimeline: boolean;\n private readonly _ctx: Context | null = null;\n\n constructor(\n private _traceProcessor: TraceProcessor,\n params: TraceSpanParams,\n ) {\n this.id = TracingSpan.nextId++;\n this.methodName = params.methodName;\n this.resourceId = _traceProcessor.getResourceId(params.instance);\n this.startTs = performance.now();\n this._showInBrowserTimeline = params.showInBrowserTimeline;\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 if (this._showInBrowserTimeline) {\n this._markInBrowserTimeline();\n }\n }\n\n markError(err: unknown) {\n this.endTs = performance.now();\n this.error = serializeError(err);\n this._traceProcessor._flushSpan(this);\n\n if (this._showInBrowserTimeline) {\n this._markInBrowserTimeline();\n }\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 private _markInBrowserTimeline() {\n const resource = this._traceProcessor.resources.get(this.resourceId!);\n const name = resource\n ? `${resource.sanitizedClassName}#${resource.data.instanceId}.${this.methodName}`\n : this.methodName;\n performance.measure(name, { start: this.startTs, end: this.endTs! });\n }\n}\n\n// TODO(burdon): Log cause.\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\n// TODO(burdon): Rename singleton and move out of package.\nexport const TRACE_PROCESSOR: TraceProcessor = ((globalThis as any).TRACE_PROCESSOR ??= new TraceProcessor());\n\nconst sanitizeValue = (value: any, depth: number, traceProcessor: TraceProcessor): any => {\n switch (typeof value) {\n case 'string':\n case 'number':\n case 'boolean':\n case 'undefined':\n return value;\n case 'object':\n case 'function':\n if (value === null) {\n return value;\n }\n\n {\n const resourceEntry = traceProcessor.resourceInstanceIndex.get(value);\n if (resourceEntry) {\n return `${resourceEntry.sanitizedClassName}#${resourceEntry.data.instanceId}`;\n }\n }\n\n if (typeof value.toJSON === 'function') {\n // TODO(dmaretskyi): This has potential to cause infinite recursion.\n return sanitizeValue(value.toJSON(), depth, traceProcessor);\n }\n\n if (depth > 0) {\n if (isSetLike(value)) {\n return Object.fromEntries(\n Array.from(value.entries()).map((value) => sanitizeValue(value, depth - 1, traceProcessor)),\n );\n } else if (isMapLike(value)) {\n return Object.fromEntries(\n Array.from(value.entries()).map(([key, value]) => [key, sanitizeValue(value, depth - 1, traceProcessor)]),\n );\n } else if (Array.isArray(value)) {\n return value.map((item: any) => sanitizeValue(item, depth - 1, traceProcessor));\n } else if (typeof value === 'object') {\n const res: any = {};\n for (const key of Object.keys(value)) {\n res[key] = sanitizeValue(value[key], depth - 1, traceProcessor);\n }\n return res;\n }\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\nexport const sanitizeClassName = (className: string) => {\n const SANITIZE_REGEX = /[^_](\\d+)$/;\n const m = className.match(SANITIZE_REGEX);\n if (!m) {\n return className;\n } else {\n return className.slice(0, -m[1].length);\n }\n};\n\nconst isSetLike = (value: any): value is Set<any> =>\n value instanceof Set ||\n (typeof value === 'object' && value !== null && Object.getPrototypeOf(value).constructor.name === 'ComplexSet');\n\nconst isMapLike = (value: any): value is Map<any, any> =>\n value instanceof Map ||\n (typeof value === 'object' && value !== null && Object.getPrototypeOf(value).constructor.name === 'ComplexMap');\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { Stream } from '@dxos/codec-protobuf';\nimport { type LogEntry } from '@dxos/protocols/proto/dxos/client/services';\nimport { type StreamTraceEvent, type TracingService } from '@dxos/protocols/proto/dxos/tracing';\n\nimport { type TraceProcessor, type 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 { type 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 { type 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 { type 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 { type 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", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { type Metric } from '@dxos/protocols/proto/dxos/tracing';\n\nimport { BaseCounter } from './base';\n\nexport class MapCounter extends BaseCounter {\n values = new Map<string, number>();\n units?: string;\n\n constructor({ units }: { units?: string } = {}) {\n super();\n this.units = units;\n }\n\n inc(key: string, by = 1) {\n const prev = this.values.get(key) ?? 0;\n this.values.set(key, prev + by);\n }\n\n getData(): Metric {\n return {\n name: this.name!,\n multiCounter: {\n records: Array.from(this.values.entries()).map(([key, value]) => ({\n key,\n value,\n })),\n units: this.units,\n },\n };\n }\n}\n"],
5
- "mappings": "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",
6
- "names": ["Context", "symbolTracingContext", "Symbol", "getTracingContext", "target", "infoProperties", "metricsProperties", "TRACE_SPAN_ATTRIBUTE", "unrefTimeout", "LogLevel", "getContextFromEntry", "log", "getPrototypeSpecificInstanceId", "Stream", "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", "ResourceEntry", "constructor", "data", "instance", "annotation", "sanitizedClassName", "sanitizeClassName", "className", "getMetric", "name", "metrics", "find", "metric", "MAX_RESOURCE_RECORDS", "MAX_SPAN_RECORDS", "MAX_LOG_RECORDS", "REFRESH_INTERVAL", "MAX_INFO_OBJECT_DEPTH", "TraceProcessor", "subscriptions", "Set", "resources", "Map", "resourceInstanceIndex", "WeakMap", "resourceIdList", "spans", "spanIdList", "logs", "_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", "id", "_pushLog", "log", "addProcessor", "bind", "refreshInterval", "setInterval", "refresh", "unrefTimeout", "createTraceResource", "params", "size", "tracingContext", "getTracingContext", "getPrototypeOf", "metricsProperties", "_assign", "instanceId", "getPrototypeSpecificInstanceId", "info", "getResourceInfo", "links", "getResourceMetrics", "WeakRef", "set", "push", "length", "_clearResources", "_markResourceDirty", "createTraceSender", "TraceSender", "traceSpan", "span", "TracingSpan", "_flushSpan", "addLink", "parent", "child", "opts", "getDiagnostics", "fromEntries", "Array", "from", "entries", "map", "values", "filter", "INFO", "res", "options", "infoProperties", "value", "enum", "depth", "undefined", "err", "_opts", "getData", "getResourceId", "findResourcesByClassName", "findResourcesByAnnotation", "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", "_showInBrowserTimeline", "showInBrowserTimeline", "parentCtx", "derive", "attributes", "TRACE_SPAN_ATTRIBUTE", "getAttribute", "ctx", "markSuccess", "_markInBrowserTimeline", "markError", "serializeError", "toFixed", "measure", "start", "end", "Error", "String", "TRACE_PROCESSOR", "globalThis", "traceProcessor", "resourceEntry", "toJSON", "isSetLike", "isMapLike", "isArray", "item", "truncate", "toString", "a", "b", "SANITIZE_REGEX", "m", "match", "slice", "resource", "options", "constructor", "klass", "rest", "TRACE_PROCESSOR", "createTraceResource", "annotation", "instance", "Object", "defineProperty", "value", "name", "info", "opts", "target", "propertyKey", "descriptor", "getTracingContext", "infoProperties", "mark", "performance", "span", "showInBrowserTimeline", "method", "args", "parentCtx", "Context", "traceSpan", "methodName", "callArgs", "ctx", "slice", "apply", "err", "markError", "markSuccess", "metricsCounter", "metricsProperties", "addLink", "parent", "child", "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", "MapCounter", "BaseCounter", "constructor", "units", "values", "Map", "inc", "key", "by", "prev", "get", "set", "getData", "name", "multiCounter", "records", "Array", "from", "entries", "map", "value"]
4
+ "sourcesContent": ["//\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 (options?: { annotation?: symbol }) =>\n <T extends { new (...args: any[]): {} }>(constructor: T) => {\n // Wrapping class declaration into an IIFE so it doesn't capture the `klass` class name.\n const klass = (() =>\n class extends constructor {\n constructor(...rest: any[]) {\n super(...rest);\n TRACE_PROCESSOR.traceResourceConstructor({ constructor, annotation: options?.annotation, instance: this });\n }\n })();\n Object.defineProperty(klass, 'name', { value: constructor.name });\n return klass;\n };\n\nexport type InfoOptions = {\n /**\n * Value is of enum type and should be converted to string.\n *\n * Example:\n *\n * ```ts\n * @trace.info({ enum: SpaceState })\n * get state(): SpaceState { ... }\n * ```\n */\n enum?: Record<string, any>;\n\n /**\n * Max depth of the object to be included in the resource info section.\n *\n * null means no limit (a limit of 8 nested objects is still imposed).\n *\n * Default: 0 - objects will be stringified with toString.\n */\n depth?: number | null;\n};\n\n/**\n * Marks a property or a method to be included in the resource info section.\n */\nconst info =\n (opts: InfoOptions = {}) =>\n (target: any, propertyKey: string, descriptor?: PropertyDescriptor) => {\n getTracingContext(target).infoProperties[propertyKey] = { options: opts };\n };\n\nconst mark = (name: string) => {\n performance.mark(name);\n};\n\nexport type SpanOptions = {\n showInBrowserTimeline?: boolean;\n};\n\nconst span =\n ({ showInBrowserTimeline = false }: SpanOptions = {}) =>\n (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({\n parentCtx,\n methodName: propertyKey,\n instance: this,\n showInBrowserTimeline,\n });\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 mark,\n span,\n metricsCounter,\n\n addLink,\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { type InfoOptions } from './api';\n\nexport const symbolTracingContext = Symbol('dxos.tracing.context');\n\nexport type TracingContext = {\n infoProperties: Record<\n string,\n {\n options: InfoOptions;\n }\n >;\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 { type Context } from '@dxos/context';\nimport { LogLevel, type LogProcessor, getContextFromEntry, log } from '@dxos/log';\nimport { type LogEntry } from '@dxos/protocols/proto/dxos/client/services';\nimport { type Error as SerializedError } from '@dxos/protocols/proto/dxos/error';\nimport { type Metric, type Resource, type Span } from '@dxos/protocols/proto/dxos/tracing';\nimport { getPrototypeSpecificInstanceId } from '@dxos/util';\n\nimport type { AddLinkOptions } from './api';\nimport { type 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 annotation?: symbol;\n};\n\nexport type TraceSpanParams = {\n instance: any;\n methodName: string;\n parentCtx: Context | null;\n showInBrowserTimeline: boolean;\n};\n\nexport class ResourceEntry {\n /**\n * Sometimes bundlers mangle class names: WebFile -> WebFile2.\n *\n * We use a heuristic to remove the suffix.\n */\n public readonly sanitizedClassName: string;\n\n constructor(\n public readonly data: Resource,\n public readonly instance: WeakRef<any>,\n public readonly annotation?: symbol,\n ) {\n this.sanitizedClassName = sanitizeClassName(data.className);\n }\n\n getMetric(name: string): Metric | undefined {\n return this.data.metrics?.find((metric) => metric.name === name);\n }\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 = 2_000;\nconst MAX_SPAN_RECORDS = 1_000;\nconst MAX_LOG_RECORDS = 1_000;\n\nconst REFRESH_INTERVAL = 1_000;\n\nconst MAX_INFO_OBJECT_DEPTH = 8;\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 = new ResourceEntry(\n {\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 new WeakRef(params.instance),\n params.annotation,\n );\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, { options }] of Object.entries(tracingContext.infoProperties)) {\n try {\n const value = typeof instance[key] === 'function' ? instance[key]() : instance[key];\n\n if (options.enum) {\n res[key] = options.enum[value];\n } else {\n res[key] = sanitizeValue(\n value,\n options.depth === undefined ? 1 : options.depth ?? MAX_INFO_OBJECT_DEPTH,\n this,\n );\n }\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 findResourcesByClassName(className: string): ResourceEntry[] {\n return [...this.resources.values()].filter(\n (r) => r.data.className === className || r.sanitizedClassName === className,\n );\n }\n\n findByAnnotation(annotation: symbol): ResourceEntry[] {\n return [...this.resources.values()].filter((r) => r.annotation === annotation);\n }\n\n getDiagnostics() {\n this.refresh();\n\n return {\n resources: Object.fromEntries(\n Array.from(this.resources.entries()).map(([id, entry]) => [\n `${entry.sanitizedClassName}#${entry.data.instanceId}`,\n entry.data,\n ]),\n ),\n spans: Array.from(this.spans.values()),\n logs: this.logs.filter((log) => log.level >= LogLevel.INFO),\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 for (const key of Object.keys(context)) {\n context[key] = sanitizeValue(context[key], 0, this);\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 _showInBrowserTimeline: boolean;\n private readonly _ctx: Context | null = null;\n\n constructor(\n private _traceProcessor: TraceProcessor,\n params: TraceSpanParams,\n ) {\n this.id = TracingSpan.nextId++;\n this.methodName = params.methodName;\n this.resourceId = _traceProcessor.getResourceId(params.instance);\n this.startTs = performance.now();\n this._showInBrowserTimeline = params.showInBrowserTimeline;\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 if (this._showInBrowserTimeline) {\n this._markInBrowserTimeline();\n }\n }\n\n markError(err: unknown) {\n this.endTs = performance.now();\n this.error = serializeError(err);\n this._traceProcessor._flushSpan(this);\n\n if (this._showInBrowserTimeline) {\n this._markInBrowserTimeline();\n }\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 private _markInBrowserTimeline() {\n const resource = this._traceProcessor.resources.get(this.resourceId!);\n const name = resource\n ? `${resource.sanitizedClassName}#${resource.data.instanceId}.${this.methodName}`\n : this.methodName;\n performance.measure(name, { start: this.startTs, end: this.endTs! });\n }\n}\n\n// TODO(burdon): Log cause.\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, depth: number, traceProcessor: TraceProcessor): any => {\n switch (typeof value) {\n case 'string':\n case 'number':\n case 'boolean':\n case 'undefined':\n return value;\n case 'object':\n case 'function':\n if (value === null) {\n return value;\n }\n\n {\n const resourceEntry = traceProcessor.resourceInstanceIndex.get(value);\n if (resourceEntry) {\n return `${resourceEntry.sanitizedClassName}#${resourceEntry.data.instanceId}`;\n }\n }\n\n if (typeof value.toJSON === 'function') {\n // TODO(dmaretskyi): This has potential to cause infinite recursion.\n return sanitizeValue(value.toJSON(), depth, traceProcessor);\n }\n\n if (depth > 0) {\n if (isSetLike(value)) {\n return Object.fromEntries(\n Array.from(value.entries()).map((value) => sanitizeValue(value, depth - 1, traceProcessor)),\n );\n } else if (isMapLike(value)) {\n return Object.fromEntries(\n Array.from(value.entries()).map(([key, value]) => [key, sanitizeValue(value, depth - 1, traceProcessor)]),\n );\n } else if (Array.isArray(value)) {\n return value.map((item: any) => sanitizeValue(item, depth - 1, traceProcessor));\n } else if (typeof value === 'object') {\n const res: any = {};\n for (const key of Object.keys(value)) {\n res[key] = sanitizeValue(value[key], depth - 1, traceProcessor);\n }\n return res;\n }\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\nexport const sanitizeClassName = (className: string) => {\n const SANITIZE_REGEX = /[^_](\\d+)$/;\n const m = className.match(SANITIZE_REGEX);\n if (!m) {\n return className;\n } else {\n return className.slice(0, -m[1].length);\n }\n};\n\nconst isSetLike = (value: any): value is Set<any> =>\n value instanceof Set ||\n (typeof value === 'object' && value !== null && Object.getPrototypeOf(value).constructor.name === 'ComplexSet');\n\nconst isMapLike = (value: any): value is Map<any, any> =>\n value instanceof Map ||\n (typeof value === 'object' && value !== null && Object.getPrototypeOf(value).constructor.name === 'ComplexMap');\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { Stream } from '@dxos/codec-protobuf';\nimport { type LogEntry } from '@dxos/protocols/proto/dxos/client/services';\nimport { type StreamTraceEvent, type TracingService } from '@dxos/protocols/proto/dxos/tracing';\n\nimport { type TraceProcessor, type 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 { type 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 { type 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 { type 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 { type 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", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { type Metric } from '@dxos/protocols/proto/dxos/tracing';\n\nimport { BaseCounter } from './base';\n\nexport class MapCounter extends BaseCounter {\n values = new Map<string, number>();\n units?: string;\n\n constructor({ units }: { units?: string } = {}) {\n super();\n this.units = units;\n }\n\n inc(key: string, by = 1) {\n const prev = this.values.get(key) ?? 0;\n this.values.set(key, prev + by);\n }\n\n getData(): Metric {\n return {\n name: this.name!,\n multiCounter: {\n records: Array.from(this.values.entries()).map(([key, value]) => ({\n key,\n value,\n })),\n units: this.units,\n },\n };\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["Context", "symbolTracingContext", "Symbol", "getTracingContext", "target", "infoProperties", "metricsProperties", "TRACE_SPAN_ATTRIBUTE", "unrefTimeout", "LogLevel", "getContextFromEntry", "log", "getPrototypeSpecificInstanceId", "Stream", "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", "ResourceEntry", "constructor", "data", "instance", "annotation", "sanitizedClassName", "sanitizeClassName", "className", "getMetric", "name", "metrics", "find", "metric", "MAX_RESOURCE_RECORDS", "MAX_SPAN_RECORDS", "MAX_LOG_RECORDS", "REFRESH_INTERVAL", "MAX_INFO_OBJECT_DEPTH", "TraceProcessor", "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", "id", "_pushLog", "log", "addProcessor", "bind", "refreshInterval", "setInterval", "refresh", "unrefTimeout", "traceResourceConstructor", "params", "size", "tracingContext", "getTracingContext", "getPrototypeOf", "metricsProperties", "_assign", "instanceId", "getPrototypeSpecificInstanceId", "info", "getResourceInfo", "links", "getResourceMetrics", "WeakRef", "set", "push", "length", "_clearResources", "_markResourceDirty", "res", "options", "entries", "infoProperties", "value", "enum", "depth", "undefined", "err", "_opts", "getData", "traceSpan", "span", "TracingSpan", "_flushSpan", "addLink", "parent", "child", "opts", "getResourceId", "createTraceSender", "TraceSender", "values", "deref", "time", "performance", "now", "_tick", "_changed", "oldInfo", "areEqualShallow", "oldMetrics", "subscription", "flush", "findResourcesByClassName", "filter", "r", "findByAnnotation", "getDiagnostics", "fromEntries", "Array", "from", "map", "INFO", "runtimeSpan", "serialize", "_clearSpans", "_markSpanDirty", "dirtyResources", "add", "dirtySpans", "shift", "delete", "newLogs", "nextId", "_traceProcessor", "parentId", "endTs", "error", "_ctx", "methodName", "startTs", "_showInBrowserTimeline", "showInBrowserTimeline", "parentCtx", "derive", "attributes", "TRACE_SPAN_ATTRIBUTE", "getAttribute", "ctx", "markSuccess", "_markInBrowserTimeline", "markError", "serializeError", "toFixed", "measure", "start", "end", "Error", "String", "TRACE_PROCESSOR", "globalThis", "traceProcessor", "resourceEntry", "toJSON", "isSetLike", "isMapLike", "isArray", "item", "truncate", "toString", "a", "b", "SANITIZE_REGEX", "m", "match", "slice", "resource", "options", "constructor", "klass", "rest", "TRACE_PROCESSOR", "traceResourceConstructor", "annotation", "instance", "Object", "defineProperty", "value", "name", "info", "opts", "target", "propertyKey", "descriptor", "getTracingContext", "infoProperties", "mark", "performance", "span", "showInBrowserTimeline", "method", "args", "parentCtx", "Context", "traceSpan", "methodName", "callArgs", "ctx", "slice", "apply", "err", "markError", "markSuccess", "metricsCounter", "metricsProperties", "addLink", "parent", "child", "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", "MapCounter", "BaseCounter", "constructor", "units", "values", "Map", "inc", "key", "by", "prev", "get", "set", "getData", "name", "multiCounter", "records", "Array", "from", "entries", "map", "value"]
7
7
  }
@@ -1 +1 @@
1
- {"inputs":{"packages/common/tracing/src/symbols.ts":{"bytes":1811,"imports":[],"format":"esm"},"packages/common/tracing/src/trace-sender.ts":{"bytes":10386,"imports":[{"path":"@dxos/codec-protobuf","kind":"import-statement","external":true}],"format":"esm"},"packages/common/tracing/src/trace-processor.ts":{"bytes":51824,"imports":[{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true},{"path":"packages/common/tracing/src/symbols.ts","kind":"import-statement","original":"./symbols"},{"path":"packages/common/tracing/src/trace-sender.ts","kind":"import-statement","original":"./trace-sender"}],"format":"esm"},"packages/common/tracing/src/api.ts":{"bytes":9411,"imports":[{"path":"@dxos/context","kind":"import-statement","external":true},{"path":"packages/common/tracing/src/symbols.ts","kind":"import-statement","original":"./symbols"},{"path":"packages/common/tracing/src/trace-processor.ts","kind":"import-statement","original":"./trace-processor"}],"format":"esm"},"packages/common/tracing/src/metrics/base.ts":{"bytes":1450,"imports":[],"format":"esm"},"packages/common/tracing/src/metrics/unary-counter.ts":{"bytes":2128,"imports":[{"path":"packages/common/tracing/src/metrics/base.ts","kind":"import-statement","original":"./base"}],"format":"esm"},"packages/common/tracing/src/metrics/time-series-counter.ts":{"bytes":4268,"imports":[{"path":"packages/common/tracing/src/metrics/base.ts","kind":"import-statement","original":"./base"}],"format":"esm"},"packages/common/tracing/src/metrics/time-usage-counter.ts":{"bytes":5249,"imports":[{"path":"packages/common/tracing/src/metrics/base.ts","kind":"import-statement","original":"./base"}],"format":"esm"},"packages/common/tracing/src/metrics/map-counter.ts":{"bytes":2977,"imports":[{"path":"packages/common/tracing/src/metrics/base.ts","kind":"import-statement","original":"./base"}],"format":"esm"},"packages/common/tracing/src/metrics/index.ts":{"bytes":892,"imports":[{"path":"packages/common/tracing/src/metrics/base.ts","kind":"import-statement","original":"./base"},{"path":"packages/common/tracing/src/metrics/unary-counter.ts","kind":"import-statement","original":"./unary-counter"},{"path":"packages/common/tracing/src/metrics/time-series-counter.ts","kind":"import-statement","original":"./time-series-counter"},{"path":"packages/common/tracing/src/metrics/time-usage-counter.ts","kind":"import-statement","original":"./time-usage-counter"},{"path":"packages/common/tracing/src/metrics/map-counter.ts","kind":"import-statement","original":"./map-counter"}],"format":"esm"},"packages/common/tracing/src/index.ts":{"bytes":831,"imports":[{"path":"packages/common/tracing/src/api.ts","kind":"import-statement","original":"./api"},{"path":"packages/common/tracing/src/symbols.ts","kind":"import-statement","original":"./symbols"},{"path":"packages/common/tracing/src/trace-processor.ts","kind":"import-statement","original":"./trace-processor"},{"path":"packages/common/tracing/src/trace-sender.ts","kind":"import-statement","original":"./trace-sender"},{"path":"packages/common/tracing/src/metrics/index.ts","kind":"import-statement","original":"./metrics"}],"format":"esm"}},"outputs":{"packages/common/tracing/dist/lib/browser/index.mjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":44718},"packages/common/tracing/dist/lib/browser/index.mjs":{"imports":[{"path":"@dxos/context","kind":"import-statement","external":true},{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true},{"path":"@dxos/codec-protobuf","kind":"import-statement","external":true}],"exports":["BaseCounter","MapCounter","ResourceEntry","TRACE_PROCESSOR","TRACE_SPAN_ATTRIBUTE","TimeSeriesCounter","TimeUsageCounter","TraceProcessor","TraceSender","TracingSpan","UnaryCounter","getTracingContext","sanitizeClassName","symbolTracingContext","trace"],"entryPoint":"packages/common/tracing/src/index.ts","inputs":{"packages/common/tracing/src/api.ts":{"bytesInOutput":1631},"packages/common/tracing/src/symbols.ts":{"bytesInOutput":245},"packages/common/tracing/src/trace-processor.ts":{"bytesInOutput":11951},"packages/common/tracing/src/trace-sender.ts":{"bytesInOutput":2555},"packages/common/tracing/src/index.ts":{"bytesInOutput":0},"packages/common/tracing/src/metrics/base.ts":{"bytesInOutput":159},"packages/common/tracing/src/metrics/index.ts":{"bytesInOutput":0},"packages/common/tracing/src/metrics/unary-counter.ts":{"bytesInOutput":324},"packages/common/tracing/src/metrics/time-series-counter.ts":{"bytesInOutput":812},"packages/common/tracing/src/metrics/time-usage-counter.ts":{"bytesInOutput":1136},"packages/common/tracing/src/metrics/map-counter.ts":{"bytesInOutput":509}},"bytes":20192}}}
1
+ {"inputs":{"packages/common/tracing/src/symbols.ts":{"bytes":1811,"imports":[],"format":"esm"},"packages/common/tracing/src/trace-sender.ts":{"bytes":10386,"imports":[{"path":"@dxos/codec-protobuf","kind":"import-statement","external":true}],"format":"esm"},"packages/common/tracing/src/trace-processor.ts":{"bytes":50581,"imports":[{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true},{"path":"packages/common/tracing/src/symbols.ts","kind":"import-statement","original":"./symbols"},{"path":"packages/common/tracing/src/trace-sender.ts","kind":"import-statement","original":"./trace-sender"}],"format":"esm"},"packages/common/tracing/src/api.ts":{"bytes":9432,"imports":[{"path":"@dxos/context","kind":"import-statement","external":true},{"path":"packages/common/tracing/src/symbols.ts","kind":"import-statement","original":"./symbols"},{"path":"packages/common/tracing/src/trace-processor.ts","kind":"import-statement","original":"./trace-processor"}],"format":"esm"},"packages/common/tracing/src/metrics/base.ts":{"bytes":1450,"imports":[],"format":"esm"},"packages/common/tracing/src/metrics/unary-counter.ts":{"bytes":2128,"imports":[{"path":"packages/common/tracing/src/metrics/base.ts","kind":"import-statement","original":"./base"}],"format":"esm"},"packages/common/tracing/src/metrics/time-series-counter.ts":{"bytes":4268,"imports":[{"path":"packages/common/tracing/src/metrics/base.ts","kind":"import-statement","original":"./base"}],"format":"esm"},"packages/common/tracing/src/metrics/time-usage-counter.ts":{"bytes":5249,"imports":[{"path":"packages/common/tracing/src/metrics/base.ts","kind":"import-statement","original":"./base"}],"format":"esm"},"packages/common/tracing/src/metrics/map-counter.ts":{"bytes":2977,"imports":[{"path":"packages/common/tracing/src/metrics/base.ts","kind":"import-statement","original":"./base"}],"format":"esm"},"packages/common/tracing/src/metrics/index.ts":{"bytes":892,"imports":[{"path":"packages/common/tracing/src/metrics/base.ts","kind":"import-statement","original":"./base"},{"path":"packages/common/tracing/src/metrics/unary-counter.ts","kind":"import-statement","original":"./unary-counter"},{"path":"packages/common/tracing/src/metrics/time-series-counter.ts","kind":"import-statement","original":"./time-series-counter"},{"path":"packages/common/tracing/src/metrics/time-usage-counter.ts","kind":"import-statement","original":"./time-usage-counter"},{"path":"packages/common/tracing/src/metrics/map-counter.ts","kind":"import-statement","original":"./map-counter"}],"format":"esm"},"packages/common/tracing/src/index.ts":{"bytes":831,"imports":[{"path":"packages/common/tracing/src/api.ts","kind":"import-statement","original":"./api"},{"path":"packages/common/tracing/src/symbols.ts","kind":"import-statement","original":"./symbols"},{"path":"packages/common/tracing/src/trace-processor.ts","kind":"import-statement","original":"./trace-processor"},{"path":"packages/common/tracing/src/trace-sender.ts","kind":"import-statement","original":"./trace-sender"},{"path":"packages/common/tracing/src/metrics/index.ts","kind":"import-statement","original":"./metrics"}],"format":"esm"}},"outputs":{"packages/common/tracing/dist/lib/browser/index.mjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":44193},"packages/common/tracing/dist/lib/browser/index.mjs":{"imports":[{"path":"@dxos/context","kind":"import-statement","external":true},{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true},{"path":"@dxos/codec-protobuf","kind":"import-statement","external":true}],"exports":["BaseCounter","MapCounter","ResourceEntry","TRACE_PROCESSOR","TRACE_SPAN_ATTRIBUTE","TimeSeriesCounter","TimeUsageCounter","TraceProcessor","TraceSender","TracingSpan","UnaryCounter","getTracingContext","sanitizeClassName","symbolTracingContext","trace"],"entryPoint":"packages/common/tracing/src/index.ts","inputs":{"packages/common/tracing/src/api.ts":{"bytesInOutput":1636},"packages/common/tracing/src/symbols.ts":{"bytesInOutput":245},"packages/common/tracing/src/trace-processor.ts":{"bytesInOutput":11713},"packages/common/tracing/src/trace-sender.ts":{"bytesInOutput":2555},"packages/common/tracing/src/index.ts":{"bytesInOutput":0},"packages/common/tracing/src/metrics/base.ts":{"bytesInOutput":159},"packages/common/tracing/src/metrics/index.ts":{"bytesInOutput":0},"packages/common/tracing/src/metrics/unary-counter.ts":{"bytesInOutput":324},"packages/common/tracing/src/metrics/time-series-counter.ts":{"bytesInOutput":812},"packages/common/tracing/src/metrics/time-usage-counter.ts":{"bytesInOutput":1136},"packages/common/tracing/src/metrics/map-counter.ts":{"bytesInOutput":509}},"bytes":19959}}}
@@ -153,13 +153,13 @@ var REFRESH_INTERVAL = 1e3;
153
153
  var MAX_INFO_OBJECT_DEPTH = 8;
154
154
  var TraceProcessor = class {
155
155
  constructor() {
156
- this.subscriptions = /* @__PURE__ */ new Set();
157
156
  this.resources = /* @__PURE__ */ new Map();
158
157
  this.resourceInstanceIndex = /* @__PURE__ */ new WeakMap();
159
158
  this.resourceIdList = [];
160
159
  this.spans = /* @__PURE__ */ new Map();
161
160
  this.spanIdList = [];
162
161
  this.logs = [];
162
+ this.subscriptions = /* @__PURE__ */ new Set();
163
163
  this._logProcessor = (config, entry) => {
164
164
  switch (entry.level) {
165
165
  case import_log.LogLevel.ERROR:
@@ -193,18 +193,14 @@ var TraceProcessor = class {
193
193
  };
194
194
  import_log.log.addProcessor(this._logProcessor.bind(this), void 0, {
195
195
  F: __dxlog_file,
196
- L: 87,
196
+ L: 81,
197
197
  S: this,
198
198
  C: (f, a) => f(...a)
199
199
  });
200
200
  const refreshInterval = setInterval(this.refresh.bind(this), REFRESH_INTERVAL);
201
201
  (0, import_async.unrefTimeout)(refreshInterval);
202
202
  }
203
- /**
204
- * @internal
205
- */
206
- // TODO(burdon): Comment.
207
- createTraceResource(params) {
203
+ traceResourceConstructor(params) {
208
204
  const id = this.resources.size;
209
205
  const tracingContext = getTracingContext(Object.getPrototypeOf(params.instance));
210
206
  for (const key of Object.keys(tracingContext.metricsProperties)) {
@@ -226,33 +222,6 @@ var TraceProcessor = class {
226
222
  }
227
223
  this._markResourceDirty(id);
228
224
  }
229
- createTraceSender() {
230
- return new TraceSender(this);
231
- }
232
- traceSpan(params) {
233
- const span2 = new TracingSpan(this, params);
234
- this._flushSpan(span2);
235
- return span2;
236
- }
237
- // TODO(burdon): Not implemented.
238
- addLink(parent, child, opts) {
239
- }
240
- //
241
- // Getters
242
- //
243
- // TODO(burdon): Define type.
244
- // TODO(burdon): Reconcile with system service.
245
- getDiagnostics() {
246
- this.refresh();
247
- return {
248
- resources: Object.fromEntries(Array.from(this.resources.entries()).map(([id, entry]) => [
249
- `${entry.sanitizedClassName}#${entry.data.instanceId}`,
250
- entry.data
251
- ])),
252
- spans: Array.from(this.spans.values()),
253
- logs: this.logs.filter((log2) => log2.level >= import_log.LogLevel.INFO)
254
- };
255
- }
256
225
  getResourceInfo(instance) {
257
226
  const res = {};
258
227
  const tracingContext = getTracingContext(Object.getPrototypeOf(instance));
@@ -278,19 +247,19 @@ var TraceProcessor = class {
278
247
  }
279
248
  return res;
280
249
  }
250
+ traceSpan(params) {
251
+ const span2 = new TracingSpan(this, params);
252
+ this._flushSpan(span2);
253
+ return span2;
254
+ }
255
+ addLink(parent, child, opts) {
256
+ }
281
257
  getResourceId(instance) {
282
258
  const entry = this.resourceInstanceIndex.get(instance);
283
259
  return entry ? entry.data.id : null;
284
260
  }
285
- findResourcesByClassName(className) {
286
- return [
287
- ...this.resources.values()
288
- ].filter((res) => res.data.className === className || res.sanitizedClassName === className);
289
- }
290
- findResourcesByAnnotation(annotation) {
291
- return [
292
- ...this.resources.values()
293
- ].filter((res) => res.annotation === annotation);
261
+ createTraceSender() {
262
+ return new TraceSender(this);
294
263
  }
295
264
  refresh() {
296
265
  for (const resource2 of this.resources.values()) {
@@ -316,9 +285,27 @@ var TraceProcessor = class {
316
285
  subscription.flush();
317
286
  }
318
287
  }
319
- //
320
- // Implementation
321
- //
288
+ findResourcesByClassName(className) {
289
+ return [
290
+ ...this.resources.values()
291
+ ].filter((r) => r.data.className === className || r.sanitizedClassName === className);
292
+ }
293
+ findByAnnotation(annotation) {
294
+ return [
295
+ ...this.resources.values()
296
+ ].filter((r) => r.annotation === annotation);
297
+ }
298
+ getDiagnostics() {
299
+ this.refresh();
300
+ return {
301
+ resources: Object.fromEntries(Array.from(this.resources.entries()).map(([id, entry]) => [
302
+ `${entry.sanitizedClassName}#${entry.data.instanceId}`,
303
+ entry.data
304
+ ])),
305
+ spans: Array.from(this.spans.values()),
306
+ logs: this.logs.filter((log2) => log2.level >= import_log.LogLevel.INFO)
307
+ };
308
+ }
322
309
  /**
323
310
  * @internal
324
311
  */
@@ -514,7 +501,7 @@ var resource = (options) => (constructor) => {
514
501
  const klass = /* @__PURE__ */ (() => class extends constructor {
515
502
  constructor(...rest) {
516
503
  super(...rest);
517
- TRACE_PROCESSOR.createTraceResource({
504
+ TRACE_PROCESSOR.traceResourceConstructor({
518
505
  constructor,
519
506
  annotation: options?.annotation,
520
507
  instance: this
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../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", "../../../src/metrics/map-counter.ts"],
4
- "sourcesContent": ["//\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 (options?: { annotation?: symbol }) =>\n <T extends { new (...args: any[]): {} }>(constructor: T) => {\n // Wrapping class declaration into an IIFE so it doesn't capture the `klass` class name.\n const klass = (() =>\n class extends constructor {\n constructor(...rest: any[]) {\n super(...rest);\n TRACE_PROCESSOR.createTraceResource({ constructor, annotation: options?.annotation, instance: this });\n }\n })();\n Object.defineProperty(klass, 'name', { value: constructor.name });\n return klass;\n };\n\nexport type InfoOptions = {\n /**\n * Value is of enum type and should be converted to string.\n *\n * Example:\n *\n * ```ts\n * @trace.info({ enum: SpaceState })\n * get state(): SpaceState { ... }\n * ```\n */\n enum?: Record<string, any>;\n\n /**\n * Max depth of the object to be included in the resource info section.\n *\n * null means no limit (a limit of 8 nested objects is still imposed).\n *\n * Default: 0 - objects will be stringified with toString.\n */\n depth?: number | null;\n};\n\n/**\n * Marks a property or a method to be included in the resource info section.\n */\nconst info =\n (opts: InfoOptions = {}) =>\n (target: any, propertyKey: string, descriptor?: PropertyDescriptor) => {\n getTracingContext(target).infoProperties[propertyKey] = { options: opts };\n };\n\nconst mark = (name: string) => {\n performance.mark(name);\n};\n\nexport type SpanOptions = {\n showInBrowserTimeline?: boolean;\n};\n\nconst span =\n ({ showInBrowserTimeline = false }: SpanOptions = {}) =>\n (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({\n parentCtx,\n methodName: propertyKey,\n instance: this,\n showInBrowserTimeline,\n });\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 mark,\n span,\n metricsCounter,\n\n addLink,\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { type InfoOptions } from './api';\n\nexport const symbolTracingContext = Symbol('dxos.tracing.context');\n\nexport type TracingContext = {\n infoProperties: Record<\n string,\n {\n options: InfoOptions;\n }\n >;\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 { type Context } from '@dxos/context';\nimport { LogLevel, type LogProcessor, getContextFromEntry, log } from '@dxos/log';\nimport { type LogEntry } from '@dxos/protocols/proto/dxos/client/services';\nimport { type Error as SerializedError } from '@dxos/protocols/proto/dxos/error';\nimport { type Metric, type Resource, type Span } from '@dxos/protocols/proto/dxos/tracing';\nimport { getPrototypeSpecificInstanceId } from '@dxos/util';\n\nimport type { AddLinkOptions } from './api';\nimport { type BaseCounter } from './metrics';\nimport { TRACE_SPAN_ATTRIBUTE, getTracingContext } from './symbols';\nimport { TraceSender } from './trace-sender';\n\nexport type Diagnostics = {\n resources: Record<string, Resource>;\n spans: Span[];\n logs: LogEntry[];\n};\n\nexport type TraceResourceConstructorParams = {\n constructor: { new (...args: any[]): {} };\n instance: any;\n annotation?: symbol;\n};\n\nexport type TraceSpanParams = {\n instance: any;\n methodName: string;\n parentCtx: Context | null;\n showInBrowserTimeline: boolean;\n};\n\nexport class ResourceEntry {\n /**\n * Sometimes bundlers mangle class names: WebFile -> WebFile2.\n *\n * We use a heuristic to remove the suffix.\n */\n public readonly sanitizedClassName: string;\n\n constructor(\n public readonly data: Resource,\n public readonly instance: WeakRef<any>,\n public readonly annotation?: symbol,\n ) {\n this.sanitizedClassName = sanitizeClassName(data.className);\n }\n\n getMetric(name: string): Metric | undefined {\n return this.data.metrics?.find((metric) => metric.name === name);\n }\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 = 2_000;\nconst MAX_SPAN_RECORDS = 1_000;\nconst MAX_LOG_RECORDS = 1_000;\n\nconst REFRESH_INTERVAL = 1_000;\n\nconst MAX_INFO_OBJECT_DEPTH = 8;\n\nexport class TraceProcessor {\n readonly subscriptions: Set<TraceSubscription> = new Set();\n\n readonly resources = new Map<number, ResourceEntry>();\n readonly resourceInstanceIndex = new WeakMap<any, ResourceEntry>();\n readonly resourceIdList: number[] = [];\n\n readonly spans = new Map<number, Span>();\n readonly spanIdList: number[] = [];\n\n readonly logs: LogEntry[] = [];\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 /**\n * @internal\n */\n // TODO(burdon): Comment.\n createTraceResource(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 = new ResourceEntry(\n {\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 new WeakRef(params.instance),\n params.annotation,\n );\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\n this._markResourceDirty(id);\n }\n\n createTraceSender() {\n return new TraceSender(this);\n }\n\n traceSpan(params: TraceSpanParams): TracingSpan {\n const span = new TracingSpan(this, params);\n this._flushSpan(span);\n return span;\n }\n\n // TODO(burdon): Not implemented.\n addLink(parent: any, child: any, opts: AddLinkOptions) {}\n\n //\n // Getters\n //\n\n // TODO(burdon): Define type.\n // TODO(burdon): Reconcile with system service.\n getDiagnostics(): Diagnostics {\n this.refresh();\n\n return {\n resources: Object.fromEntries(\n Array.from(this.resources.entries()).map(([id, entry]) => [\n `${entry.sanitizedClassName}#${entry.data.instanceId}`,\n entry.data,\n ]),\n ),\n spans: Array.from(this.spans.values()),\n logs: this.logs.filter((log) => log.level >= LogLevel.INFO),\n };\n }\n\n getResourceInfo(instance: any): Record<string, any> {\n const res: Record<string, any> = {};\n const tracingContext = getTracingContext(Object.getPrototypeOf(instance));\n for (const [key, { options }] of Object.entries(tracingContext.infoProperties)) {\n try {\n const value = typeof instance[key] === 'function' ? instance[key]() : instance[key];\n if (options.enum) {\n res[key] = options.enum[value];\n } else {\n res[key] = sanitizeValue(\n value,\n options.depth === undefined ? 1 : options.depth ?? MAX_INFO_OBJECT_DEPTH,\n this,\n );\n }\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 for (const [key, _opts] of Object.entries(tracingContext.metricsProperties)) {\n res.push(instance[key].getData());\n }\n\n return res;\n }\n\n getResourceId(instance: any): number | null {\n const entry = this.resourceInstanceIndex.get(instance);\n return entry ? entry.data.id : null;\n }\n\n findResourcesByClassName(className: string): ResourceEntry[] {\n return [...this.resources.values()].filter(\n (res) => res.data.className === className || res.sanitizedClassName === className,\n );\n }\n\n findResourcesByAnnotation(annotation: symbol): ResourceEntry[] {\n return [...this.resources.values()].filter((res) => res.annotation === annotation);\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 // Implementation\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 for (const key of Object.keys(context)) {\n context[key] = sanitizeValue(context[key], 0, this);\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\n// TODO(burdon): Comment.\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 _showInBrowserTimeline: boolean;\n private readonly _ctx: Context | null = null;\n\n constructor(\n private _traceProcessor: TraceProcessor,\n params: TraceSpanParams,\n ) {\n this.id = TracingSpan.nextId++;\n this.methodName = params.methodName;\n this.resourceId = _traceProcessor.getResourceId(params.instance);\n this.startTs = performance.now();\n this._showInBrowserTimeline = params.showInBrowserTimeline;\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 if (this._showInBrowserTimeline) {\n this._markInBrowserTimeline();\n }\n }\n\n markError(err: unknown) {\n this.endTs = performance.now();\n this.error = serializeError(err);\n this._traceProcessor._flushSpan(this);\n\n if (this._showInBrowserTimeline) {\n this._markInBrowserTimeline();\n }\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 private _markInBrowserTimeline() {\n const resource = this._traceProcessor.resources.get(this.resourceId!);\n const name = resource\n ? `${resource.sanitizedClassName}#${resource.data.instanceId}.${this.methodName}`\n : this.methodName;\n performance.measure(name, { start: this.startTs, end: this.endTs! });\n }\n}\n\n// TODO(burdon): Log cause.\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\n// TODO(burdon): Rename singleton and move out of package.\nexport const TRACE_PROCESSOR: TraceProcessor = ((globalThis as any).TRACE_PROCESSOR ??= new TraceProcessor());\n\nconst sanitizeValue = (value: any, depth: number, traceProcessor: TraceProcessor): any => {\n switch (typeof value) {\n case 'string':\n case 'number':\n case 'boolean':\n case 'undefined':\n return value;\n case 'object':\n case 'function':\n if (value === null) {\n return value;\n }\n\n {\n const resourceEntry = traceProcessor.resourceInstanceIndex.get(value);\n if (resourceEntry) {\n return `${resourceEntry.sanitizedClassName}#${resourceEntry.data.instanceId}`;\n }\n }\n\n if (typeof value.toJSON === 'function') {\n // TODO(dmaretskyi): This has potential to cause infinite recursion.\n return sanitizeValue(value.toJSON(), depth, traceProcessor);\n }\n\n if (depth > 0) {\n if (isSetLike(value)) {\n return Object.fromEntries(\n Array.from(value.entries()).map((value) => sanitizeValue(value, depth - 1, traceProcessor)),\n );\n } else if (isMapLike(value)) {\n return Object.fromEntries(\n Array.from(value.entries()).map(([key, value]) => [key, sanitizeValue(value, depth - 1, traceProcessor)]),\n );\n } else if (Array.isArray(value)) {\n return value.map((item: any) => sanitizeValue(item, depth - 1, traceProcessor));\n } else if (typeof value === 'object') {\n const res: any = {};\n for (const key of Object.keys(value)) {\n res[key] = sanitizeValue(value[key], depth - 1, traceProcessor);\n }\n return res;\n }\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\nexport const sanitizeClassName = (className: string) => {\n const SANITIZE_REGEX = /[^_](\\d+)$/;\n const m = className.match(SANITIZE_REGEX);\n if (!m) {\n return className;\n } else {\n return className.slice(0, -m[1].length);\n }\n};\n\nconst isSetLike = (value: any): value is Set<any> =>\n value instanceof Set ||\n (typeof value === 'object' && value !== null && Object.getPrototypeOf(value).constructor.name === 'ComplexSet');\n\nconst isMapLike = (value: any): value is Map<any, any> =>\n value instanceof Map ||\n (typeof value === 'object' && value !== null && Object.getPrototypeOf(value).constructor.name === 'ComplexMap');\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { Stream } from '@dxos/codec-protobuf';\nimport { type LogEntry } from '@dxos/protocols/proto/dxos/client/services';\nimport { type StreamTraceEvent, type TracingService } from '@dxos/protocols/proto/dxos/tracing';\n\nimport { type TraceProcessor, type 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 { type 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 { type 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 { type 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 { type 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", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { type Metric } from '@dxos/protocols/proto/dxos/tracing';\n\nimport { BaseCounter } from './base';\n\nexport class MapCounter extends BaseCounter {\n values = new Map<string, number>();\n units?: string;\n\n constructor({ units }: { units?: string } = {}) {\n super();\n this.units = units;\n }\n\n inc(key: string, by = 1) {\n const prev = this.values.get(key) ?? 0;\n this.values.set(key, prev + by);\n }\n\n getData(): Metric {\n return {\n name: this.name!,\n multiCounter: {\n records: Array.from(this.values.entries()).map(([key, value]) => ({\n key,\n value,\n })),\n units: this.units,\n },\n };\n }\n}\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAIA,qBAAwB;AEAxB,mBAA6B;AAE7B,iBAAsE;AAItE,kBAA+C;ACN/C,4BAAuB;AFEhB,IAAMA,uBAAuBC,OAAO,sBAAA;AAYpC,IAAMC,oBAAoB,CAACC,WAAAA;AAChC,SAASA,OAAOH,oBAAAA,MAAyD;IACvEI,gBAAgB,CAAC;IACjBC,mBAAmB,CAAC;EACtB;AACF;AAEO,IAAMC,uBAAuB;AEf7B,IAAMC,cAAN,MAAMA;EACXC,YAAoBC,iBAAiC;SAAjCA,kBAAAA;EAAkC;EAEtDC,YAAYC,SAAyC;AACnD,WAAO,IAAIC,6BAAO,CAAC,EAAEC,KAAKC,KAAI,MAAE;AAC9B,YAAMC,cAAc,CAACC,WAA+BC,OAA2BC,SAAAA;AAC7E,cAAMC,QAA0B;UAC9BC,eAAe,CAAA;UACfC,iBAAiB,CAAA;UACjBC,WAAW,CAAA;UACXC,UAAU,CAAA;QACZ;AAEA,YAAIP,WAAW;AACb,qBAAWQ,MAAMR,WAAW;AAC1B,kBAAMS,QAAQ,KAAKhB,gBAAgBO,UAAUU,IAAIF,EAAAA;AACjD,gBAAIC,OAAO;AACTN,oBAAMC,cAAeO,KAAK;gBAAEC,UAAUH,MAAMI;cAAK,CAAA;YACnD,OAAO;AACLV,oBAAME,gBAAiBM,KAAK;gBAAEH;cAAG,CAAA;YACnC;UACF;QACF,OAAO;AACL,qBAAWC,SAAS,KAAKhB,gBAAgBO,UAAUc,OAAM,GAAI;AAC3DX,kBAAMC,cAAeO,KAAK;cAAEC,UAAUH,MAAMI;YAAK,CAAA;UACnD;QACF;AAEA,YAAIZ,OAAO;AACT,qBAAWO,MAAMP,OAAO;AACtB,kBAAMc,QAAO,KAAKtB,gBAAgBQ,MAAMS,IAAIF,EAAAA;AAC5C,gBAAIO,OAAM;AACRZ,oBAAMG,UAAWK,KAAK;gBAAEI,MAAAA;cAAK,CAAA;YAC/B;UACF;QACF,OAAO;AACL,qBAAWA,SAAQ,KAAKtB,gBAAgBQ,MAAMa,OAAM,GAAI;AACtDX,kBAAMG,UAAWK,KAAK;cAAEI,MAAAA;YAAK,CAAA;UAC/B;QACF;AAEA,YAAIb,MAAM;AACR,qBAAWc,QAAOd,MAAM;AACtBC,kBAAMI,SAAUI,KAAK;cAAEK,KAAAA;YAAI,CAAA;UAC7B;QACF,OAAO;AACL,qBAAWA,QAAO,KAAKvB,gBAAgBS,MAAM;AAC3CC,kBAAMI,SAAUI,KAAK;cAAEK,KAAAA;YAAI,CAAA;UAC7B;QACF;AAEA,YAAIb,MAAMC,cAAea,SAAS,KAAKd,MAAME,gBAAiBY,SAAS,KAAKd,MAAMG,UAAWW,SAAS,GAAG;AACvGnB,eAAKK,KAAAA;QACP;MACF;AAEA,YAAMe,QAAQ,MAAA;AACZnB,oBAAYoB,aAAaC,gBAAgBD,aAAaE,YAAYF,aAAaG,OAAO;AACtFH,qBAAaC,eAAeG,MAAK;AACjCJ,qBAAaE,WAAWE,MAAK;AAC7BJ,qBAAaG,QAAQL,SAAS;MAChC;AAEA,YAAME,eAAkC;QACtCD;QACAE,gBAAgB,oBAAII,IAAAA;QACpBH,YAAY,oBAAIG,IAAAA;QAChBF,SAAS,CAAA;MACX;AACA,WAAK7B,gBAAgBgC,cAAcC,IAAIP,YAAAA;AACvCtB,UAAI8B,UAAU,MAAA;AACZ,aAAKlC,gBAAgBgC,cAAcG,OAAOT,YAAAA;MAC5C,CAAA;AAEApB,kBAAY,MAAM,MAAM,IAAA;IAC1B,CAAA;EACF;AACF;;ADnDO,IAAM8B,gBAAN,MAAMA;EAQXrC,YACkBqB,MACAiB,UACAC,YAChB;SAHgBlB,OAAAA;SACAiB,WAAAA;SACAC,aAAAA;AAEhB,SAAKC,qBAAqBC,kBAAkBpB,KAAKqB,SAAS;EAC5D;EAEAC,UAAUC,MAAkC;AAC1C,WAAO,KAAKvB,KAAKwB,SAASC,KAAK,CAACC,WAAWA,OAAOH,SAASA,IAAAA;EAC7D;AACF;AAUA,IAAMI,uBAAuB;AAC7B,IAAMC,mBAAmB;AACzB,IAAMC,kBAAkB;AAExB,IAAMC,mBAAmB;AAEzB,IAAMC,wBAAwB;AAEvB,IAAMC,iBAAN,MAAMA;EAYXrD,cAAc;AAXLiC,SAAAA,gBAAwC,oBAAID,IAAAA;AAE5CxB,SAAAA,YAAY,oBAAI8C,IAAAA;AAChBC,SAAAA,wBAAwB,oBAAIC,QAAAA;AAC5BC,SAAAA,iBAA2B,CAAA;AAE3BhD,SAAAA,QAAQ,oBAAI6C,IAAAA;AACZI,SAAAA,aAAuB,CAAA;AAEvBhD,SAAAA,OAAmB,CAAA;AAwNpBiD,SAAAA,gBAA8B,CAACC,QAAQ3C,UAAAA;AAC7C,cAAQA,MAAM4C,OAAK;QACjB,KAAKC,oBAASC;QACd,KAAKD,oBAASE;QACd,KAAKF,oBAASG,OAAO;AACnB,gBAAMC,QAAQjD,MAAMkD,MAAMC;AAC1B,gBAAMhD,YAAW,KAAKmC,sBAAsBrC,IAAIgD,KAAAA;AAChD,cAAI,CAAC9C,WAAU;AACb;UACF;AAEA,gBAAMiD,cAAUC,gCAAoBrD,KAAAA,KAAU,CAAC;AAC/C,qBAAWsD,OAAOC,OAAOC,KAAKJ,OAAAA,GAAU;AACtCA,oBAAQE,GAAAA,IAAOG,cAAcL,QAAQE,GAAAA,GAAM,GAAG,IAAI;UACpD;AAEA,gBAAMI,cAAwB;YAC5Bd,OAAO5C,MAAM4C;YACbe,SAAS3D,MAAM2D;YACfP;YACAQ,WAAW,oBAAIC,KAAAA;YACfX,MAAM;cACJY,MAAM9D,MAAMkD,MAAMa,KAAK;cACvBC,MAAMhE,MAAMkD,MAAMe,KAAK;cACvBC,YAAY/D,UAASC,KAAKL;YAC5B;UACF;AACA,eAAKoE,SAAST,WAAAA;AACd;QACF;QACA;MACF;IACF;AArPEnD,mBAAI6D,aAAa,KAAK1B,cAAc2B,KAAK,IAAI,GAAA,QAAA;;;;;;AAE7C,UAAMC,kBAAkBC,YAAY,KAAKC,QAAQH,KAAK,IAAI,GAAGnC,gBAAAA;AAC7DuC,mCAAaH,eAAAA;EACf;;;;;EAMAI,oBAAoBC,QAAwC;AAC1D,UAAM5E,KAAK,KAAKR,UAAUqF;AAG1B,UAAMC,iBAAiBpG,kBAAkB8E,OAAOuB,eAAeH,OAAOtD,QAAQ,CAAA;AAC9E,eAAWiC,OAAOC,OAAOC,KAAKqB,eAAejG,iBAAiB,GAAG;AAC9D+F,aAAOtD,SAASiC,GAAAA,EAAqByB,QAAQJ,OAAOtD,UAAUiC,GAAAA;IACjE;AAEA,UAAMtD,QAAQ,IAAIoB,cAChB;MACErB;MACA0B,WAAWkD,OAAO5F,YAAY4C;MAC9BqD,gBAAYC,4CAA+BN,OAAOtD,QAAQ;MAC1D6D,MAAM,KAAKC,gBAAgBR,OAAOtD,QAAQ;MAC1C+D,OAAO,CAAA;MACPxD,SAAS,KAAKyD,mBAAmBV,OAAOtD,QAAQ;IAClD,GACA,IAAIiE,QAAQX,OAAOtD,QAAQ,GAC3BsD,OAAOrD,UAAU;AAGnB,SAAK/B,UAAUgG,IAAIxF,IAAIC,KAAAA;AACvB,SAAKsC,sBAAsBiD,IAAIZ,OAAOtD,UAAUrB,KAAAA;AAChD,SAAKwC,eAAetC,KAAKH,EAAAA;AACzB,QAAI,KAAKyC,eAAehC,SAASuB,sBAAsB;AACrD,WAAKyD,gBAAe;IACtB;AAEA,SAAKC,mBAAmB1F,EAAAA;EAC1B;EAEA2F,oBAAoB;AAClB,WAAO,IAAI5G,YAAY,IAAI;EAC7B;EAEA6G,UAAUhB,QAAsC;AAC9C,UAAMrE,QAAO,IAAIsF,YAAY,MAAMjB,MAAAA;AACnC,SAAKkB,WAAWvF,KAAAA;AAChB,WAAOA;EACT;;EAGAwF,QAAQC,QAAaC,OAAYC,MAAsB;EAAC;;;;;;EAQxDC,iBAA8B;AAC5B,SAAK1B,QAAO;AAEZ,WAAO;MACLjF,WAAWgE,OAAO4C,YAChBC,MAAMC,KAAK,KAAK9G,UAAU+G,QAAO,CAAA,EAAIC,IAAI,CAAC,CAACxG,IAAIC,KAAAA,MAAW;QACxD,GAAGA,MAAMuB,kBAAkB,IAAIvB,MAAMI,KAAK4E,UAAU;QACpDhF,MAAMI;OACP,CAAA;MAEHZ,OAAO4G,MAAMC,KAAK,KAAK7G,MAAMa,OAAM,CAAA;MACnCZ,MAAM,KAAKA,KAAK+G,OAAO,CAACjG,SAAQA,KAAIqC,SAASC,oBAAS4D,IAAI;IAC5D;EACF;EAEAtB,gBAAgB9D,UAAoC;AAClD,UAAMqF,MAA2B,CAAC;AAClC,UAAM7B,iBAAiBpG,kBAAkB8E,OAAOuB,eAAezD,QAAAA,CAAAA;AAC/D,eAAW,CAACiC,KAAK,EAAEqD,QAAO,CAAE,KAAKpD,OAAO+C,QAAQzB,eAAelG,cAAc,GAAG;AAC9E,UAAI;AACF,cAAMiI,QAAQ,OAAOvF,SAASiC,GAAAA,MAAS,aAAajC,SAASiC,GAAAA,EAAI,IAAKjC,SAASiC,GAAAA;AAC/E,YAAIqD,QAAQE,MAAM;AAChBH,cAAIpD,GAAAA,IAAOqD,QAAQE,KAAKD,KAAAA;QAC1B,OAAO;AACLF,cAAIpD,GAAAA,IAAOG,cACTmD,OACAD,QAAQG,UAAUC,SAAY,IAAIJ,QAAQG,SAAS3E,uBACnD,IAAI;QAER;MACF,SAAS6E,KAAU;AACjBN,YAAIpD,GAAAA,IAAO0D,IAAIrD;MACjB;IACF;AAEA,WAAO+C;EACT;EAEArB,mBAAmBhE,UAAyB;AAC1C,UAAMqF,MAAgB,CAAA;AACtB,UAAM7B,iBAAiBpG,kBAAkB8E,OAAOuB,eAAezD,QAAAA,CAAAA;AAC/D,eAAW,CAACiC,KAAK2D,KAAAA,KAAU1D,OAAO+C,QAAQzB,eAAejG,iBAAiB,GAAG;AAC3E8H,UAAIxG,KAAKmB,SAASiC,GAAAA,EAAK4D,QAAO,CAAA;IAChC;AAEA,WAAOR;EACT;EAEAS,cAAc9F,UAA8B;AAC1C,UAAMrB,QAAQ,KAAKsC,sBAAsBrC,IAAIoB,QAAAA;AAC7C,WAAOrB,QAAQA,MAAMI,KAAKL,KAAK;EACjC;EAEAqH,yBAAyB3F,WAAoC;AAC3D,WAAO;SAAI,KAAKlC,UAAUc,OAAM;MAAImG,OAClC,CAACE,QAAQA,IAAItG,KAAKqB,cAAcA,aAAaiF,IAAInF,uBAAuBE,SAAAA;EAE5E;EAEA4F,0BAA0B/F,YAAqC;AAC7D,WAAO;SAAI,KAAK/B,UAAUc,OAAM;MAAImG,OAAO,CAACE,QAAQA,IAAIpF,eAAeA,UAAAA;EACzE;EAEAkD,UAAU;AACR,eAAWrE,aAAY,KAAKZ,UAAUc,OAAM,GAAI;AAC9C,YAAMgB,WAAWlB,UAASkB,SAASiG,MAAK;AACxC,UAAI,CAACjG,UAAU;AACb;MACF;AAEA,YAAMwD,iBAAiBpG,kBAAkB8E,OAAOuB,eAAezD,QAAAA,CAAAA;AAC/D,YAAMkG,OAAOC,YAAYC,IAAG;AAC5B,iBAAWnE,OAAOC,OAAOC,KAAKqB,eAAejG,iBAAiB,GAAG;AAC9DyC,iBAASiC,GAAAA,EAAqBoE,QAAQH,IAAAA;MACzC;AAEA,UAAII,WAAW;AAEf,YAAMC,UAAUzH,UAASC,KAAK8E;AAC9B/E,gBAASC,KAAK8E,OAAO,KAAKC,gBAAgB9D,QAAAA;AAC1CsG,mBAAa,CAACE,gBAAgBD,SAASzH,UAASC,KAAK8E,IAAI;AAEzD,YAAM4C,aAAa3H,UAASC,KAAKwB;AACjCzB,gBAASC,KAAKwB,UAAU,KAAKyD,mBAAmBhE,QAAAA;AAChDsG,mBAAa,CAACE,gBAAgBC,YAAY3H,UAASC,KAAKwB,OAAO;AAI/D,WAAK6D,mBAAmBtF,UAASC,KAAKL,EAAE;IAE1C;AAEA,eAAWW,gBAAgB,KAAKM,eAAe;AAC7CN,mBAAaD,MAAK;IACpB;EACF;;;;;;;EASAoF,WAAWkC,aAA0B;AACnC,UAAMzH,QAAOyH,YAAYC,UAAS;AAClC,SAAKxI,MAAM+F,IAAIjF,MAAKP,IAAIO,KAAAA;AACxB,SAAKmC,WAAWvC,KAAKI,MAAKP,EAAE;AAC5B,QAAI,KAAK0C,WAAWjC,SAASwB,kBAAkB;AAC7C,WAAKiG,YAAW;IAClB;AACA,SAAKC,eAAe5H,MAAKP,EAAE;EAC7B;EAEQ0F,mBAAmB1F,IAAY;AACrC,eAAWW,gBAAgB,KAAKM,eAAe;AAC7CN,mBAAaC,eAAeM,IAAIlB,EAAAA;IAClC;EACF;EAEQmI,eAAenI,IAAY;AACjC,eAAWW,gBAAgB,KAAKM,eAAe;AAC7CN,mBAAaE,WAAWK,IAAIlB,EAAAA;IAC9B;EACF;EAEQyF,kBAAkB;AAExB,WAAO,KAAKhD,eAAehC,SAASuB,sBAAsB;AACxD,YAAMhC,KAAK,KAAKyC,eAAe2F,MAAK;AACpC,WAAK5I,UAAU4B,OAAOpB,EAAAA;IACxB;EACF;EAEQkI,cAAc;AACpB,WAAO,KAAKxF,WAAWjC,SAASwB,kBAAkB;AAChD,YAAMjC,KAAK,KAAK0C,WAAW0F,MAAK;AAChC,WAAK3I,MAAM2B,OAAOpB,EAAAA;IACpB;EACF;EAEQoE,SAAS5D,MAAe;AAC9B,SAAKd,KAAKS,KAAKK,IAAAA;AACf,QAAI,KAAKd,KAAKe,SAASyB,iBAAiB;AACtC,WAAKxC,KAAK0I,MAAK;IACjB;AAEA,eAAWzH,gBAAgB,KAAKM,eAAe;AAC7CN,mBAAaG,QAAQX,KAAKK,IAAAA;IAC5B;EACF;AAmCF;AAGO,IAAMqF,cAAN,MAAMA,aAAAA;EACX,OAAA;SAAOwC,SAAS;;EAahBrJ,YACUC,iBACR2F,QACA;SAFQ3F,kBAAAA;SAXDqJ,WAA0B;SAE1BnE,aAA4B;SAErCoE,QAAuB;SACvBC,QAAgC;SAGfC,OAAuB;AAMtC,SAAKzI,KAAK6F,aAAYwC;AACtB,SAAKK,aAAa9D,OAAO8D;AACzB,SAAKvE,aAAalF,gBAAgBmI,cAAcxC,OAAOtD,QAAQ;AAC/D,SAAKqH,UAAUlB,YAAYC,IAAG;AAC9B,SAAKkB,yBAAyBhE,OAAOiE;AAErC,QAAIjE,OAAOkE,WAAW;AACpB,WAAKL,OAAO7D,OAAOkE,UAAUC,OAAO;QAClCC,YAAY;UACV,CAAClK,oBAAAA,GAAuB,KAAKkB;QAC/B;MACF,CAAA;AACA,YAAMsI,WAAW1D,OAAOkE,UAAUG,aAAanK,oBAAAA;AAC/C,UAAI,OAAOwJ,aAAa,UAAU;AAChC,aAAKA,WAAWA;MAClB;IACF;EACF;EAEA,IAAIjJ,MAAsB;AACxB,WAAO,KAAKoJ;EACd;EAEAS,cAAc;AACZ,SAAKX,QAAQd,YAAYC,IAAG;AAC5B,SAAKzI,gBAAgB6G,WAAW,IAAI;AAEpC,QAAI,KAAK8C,wBAAwB;AAC/B,WAAKO,uBAAsB;IAC7B;EACF;EAEAC,UAAUnC,KAAc;AACtB,SAAKsB,QAAQd,YAAYC,IAAG;AAC5B,SAAKc,QAAQa,eAAepC,GAAAA;AAC5B,SAAKhI,gBAAgB6G,WAAW,IAAI;AAEpC,QAAI,KAAK8C,wBAAwB;AAC/B,WAAKO,uBAAsB;IAC7B;EACF;EAEAlB,YAAkB;AAChB,WAAO;MACLjI,IAAI,KAAKA;MACTmE,YAAY,KAAKA,cAAc6C;MAC/B0B,YAAY,KAAKA;MACjBJ,UAAU,KAAKA,YAAYtB;MAC3B2B,SAAS,KAAKA,QAAQW,QAAQ,CAAA;MAC9Bf,OAAO,KAAKA,OAAOe,QAAQ,CAAA,KAAMtC;MACjCwB,OAAO,KAAKA,SAASxB;IACvB;EACF;EAEQmC,yBAAyB;AAC/B,UAAM/I,YAAW,KAAKnB,gBAAgBO,UAAUU,IAAI,KAAKiE,UAAU;AACnE,UAAMvC,OAAOxB,YACT,GAAGA,UAASoB,kBAAkB,IAAIpB,UAASC,KAAK4E,UAAU,IAAI,KAAKyD,UAAU,KAC7E,KAAKA;AACTjB,gBAAY8B,QAAQ3H,MAAM;MAAE4H,OAAO,KAAKb;MAASc,KAAK,KAAKlB;IAAO,CAAA;EACpE;AACF;AAGA,IAAMc,iBAAiB,CAACpC,QAAAA;AACtB,MAAIA,eAAeyC,OAAO;AACxB,WAAO;MACL9H,MAAMqF,IAAIrF;MACVgC,SAASqD,IAAIrD;IACf;EACF;AAEA,SAAO;IACLA,SAAS+F,OAAO1C,GAAAA;EAClB;AACF;AAGO,IAAM2C,kBAAoCC,WAAmBD,oBAAoB,IAAIvH,eAAAA;AAE5F,IAAMqB,gBAAgB,CAACmD,OAAYE,OAAe+C,mBAAAA;AAChD,UAAQ,OAAOjD,OAAAA;IACb,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;AACH,aAAOA;IACT,KAAK;IACL,KAAK;AACH,UAAIA,UAAU,MAAM;AAClB,eAAOA;MACT;AAEA;AACE,cAAMkD,gBAAgBD,eAAevH,sBAAsBrC,IAAI2G,KAAAA;AAC/D,YAAIkD,eAAe;AACjB,iBAAO,GAAGA,cAAcvI,kBAAkB,IAAIuI,cAAc1J,KAAK4E,UAAU;QAC7E;MACF;AAEA,UAAI,OAAO4B,MAAMmD,WAAW,YAAY;AAEtC,eAAOtG,cAAcmD,MAAMmD,OAAM,GAAIjD,OAAO+C,cAAAA;MAC9C;AAEA,UAAI/C,QAAQ,GAAG;AACb,YAAIkD,UAAUpD,KAAAA,GAAQ;AACpB,iBAAOrD,OAAO4C,YACZC,MAAMC,KAAKO,MAAMN,QAAO,CAAA,EAAIC,IAAI,CAACK,WAAUnD,cAAcmD,QAAOE,QAAQ,GAAG+C,cAAAA,CAAAA,CAAAA;QAE/E,WAAWI,UAAUrD,KAAAA,GAAQ;AAC3B,iBAAOrD,OAAO4C,YACZC,MAAMC,KAAKO,MAAMN,QAAO,CAAA,EAAIC,IAAI,CAAC,CAACjD,KAAKsD,MAAAA,MAAW;YAACtD;YAAKG,cAAcmD,QAAOE,QAAQ,GAAG+C,cAAAA;WAAgB,CAAA;QAE5G,WAAWzD,MAAM8D,QAAQtD,KAAAA,GAAQ;AAC/B,iBAAOA,MAAML,IAAI,CAAC4D,SAAc1G,cAAc0G,MAAMrD,QAAQ,GAAG+C,cAAAA,CAAAA;QACjE,WAAW,OAAOjD,UAAU,UAAU;AACpC,gBAAMF,MAAW,CAAC;AAClB,qBAAWpD,OAAOC,OAAOC,KAAKoD,KAAAA,GAAQ;AACpCF,gBAAIpD,GAAAA,IAAOG,cAAcmD,MAAMtD,GAAAA,GAAMwD,QAAQ,GAAG+C,cAAAA;UAClD;AACA,iBAAOnD;QACT;MACF;AAGA,UAAI,OAAOE,MAAMwD,aAAa,YAAY;AACxC,eAAOxD,MAAMwD,SAAQ;MACvB;AAEA,aAAOxD,MAAMyD,SAAQ;EACzB;AACF;AAEA,IAAMxC,kBAAkB,CAACyC,GAAQC,MAAAA;AAC/B,aAAWjH,OAAOgH,GAAG;AACnB,QAAI,EAAEhH,OAAOiH,MAAMD,EAAEhH,GAAAA,MAASiH,EAAEjH,GAAAA,GAAM;AACpC,aAAO;IACT;EACF;AACA,aAAWA,OAAOiH,GAAG;AACnB,QAAI,EAAEjH,OAAOgH,MAAMA,EAAEhH,GAAAA,MAASiH,EAAEjH,GAAAA,GAAM;AACpC,aAAO;IACT;EACF;AACA,SAAO;AACT;AAEO,IAAM9B,oBAAoB,CAACC,cAAAA;AAChC,QAAM+I,iBAAiB;AACvB,QAAMC,IAAIhJ,UAAUiJ,MAAMF,cAAAA;AAC1B,MAAI,CAACC,GAAG;AACN,WAAOhJ;EACT,OAAO;AACL,WAAOA,UAAUkJ,MAAM,GAAG,CAACF,EAAE,CAAA,EAAGjK,MAAM;EACxC;AACF;AAEA,IAAMwJ,YAAY,CAACpD,UACjBA,iBAAiB7F,OAChB,OAAO6F,UAAU,YAAYA,UAAU,QAAQrD,OAAOuB,eAAe8B,KAAAA,EAAO7H,YAAY4C,SAAS;AAEpG,IAAMsI,YAAY,CAACrD,UACjBA,iBAAiBvE,OAChB,OAAOuE,UAAU,YAAYA,UAAU,QAAQrD,OAAOuB,eAAe8B,KAAAA,EAAO7H,YAAY4C,SAAS;AFzfpG,IAAMxB,WACJ,CAACwG,YACD,CAAyC5H,gBAAAA;AAEvC,QAAM6L,QAAS,uBACb,cAAc7L,YAAAA;IACZA,eAAe8L,MAAa;AAC1B,YAAK,GAAIA,IAAAA;AACTlB,sBAAgBjF,oBAAoB;QAAE3F;QAAauC,YAAYqF,SAASrF;QAAYD,UAAU;MAAK,CAAA;IACrG;EACF,GAAA;AACFkC,SAAOuH,eAAeF,OAAO,QAAQ;IAAEhE,OAAO7H,YAAY4C;EAAK,CAAA;AAC/D,SAAOiJ;AACT;AA4BF,IAAM1F,OACJ,CAACe,OAAoB,CAAC,MACtB,CAACvH,QAAaqM,aAAqBC,eAAAA;AACjCvM,oBAAkBC,MAAAA,EAAQC,eAAeoM,WAAAA,IAAe;IAAEpE,SAASV;EAAK;AAC1E;AAEF,IAAMgF,OAAO,CAACtJ,SAAAA;AACZ6F,cAAYyD,KAAKtJ,IAAAA;AACnB;AAMA,IAAMrB,OACJ,CAAC,EAAEsI,wBAAwB,MAAK,IAAkB,CAAC,MACnD,CAAClK,QAAaqM,aAAqBC,eAAAA;AACjC,QAAME,SAASF,WAAWpE;AAE1BoE,aAAWpE,QAAQ,kBAA8BuE,MAAS;AACxD,UAAMtC,YAAYsC,KAAK,CAAA,aAAcC,yBAAUD,KAAK,CAAA,IAAK;AACzD,UAAM7K,QAAOqJ,gBAAgBhE,UAAU;MACrCkD;MACAJ,YAAYsC;MACZ1J,UAAU;MACVuH;IACF,CAAA;AAEA,UAAMyC,WAAW/K,MAAKlB,MAAM;MAACkB,MAAKlB;SAAQ+L,KAAKR,MAAM,CAAA;QAAMQ;AAC3D,QAAI;AACF,aAAO,MAAMD,OAAOI,MAAM,MAAMD,QAAAA;IAClC,SAASrE,KAAK;AACZ1G,YAAK6I,UAAUnC,GAAAA;AACf,YAAMA;IACR,UAAA;AACE1G,YAAK2I,YAAW;IAClB;EACF;AACF;AAKF,IAAMsC,iBAAiB,MAAM,CAAC7M,QAAaqM,aAAqBC,eAAAA;AAC9DvM,oBAAkBC,MAAAA,EAAQE,kBAAkBmM,WAAAA,IAAe,CAAC;AAC9D;AAIA,IAAMjF,UAAU,CAACC,QAAaC,OAAYC,OAAuB,CAAC,MAAC;AACjE0D,kBAAgB7D,QAAQC,QAAQC,OAAOC,IAAAA;AACzC;AAEO,IAAMuF,QAAQ;EACnBrL;EACA+E;EACA+F;EACA3K;EACAiL;EAEAzF;AACF;AI5GO,IAAe2F,cAAf,MAAeA;;;;EAWpB1G,QAAQ1D,UAAeM,MAAc;AACnC,SAAK+J,YAAYrK;AACjB,SAAKM,OAAOA;EACd;EAIA+F,MAAMH,MAAoB;EAAC;AAC7B;ACjBO,IAAMoE,eAAN,cAA2BF,YAAAA;EAIhC1M,YAAY,EAAE6M,MAAK,IAAyB,CAAC,GAAG;AAC9C,UAAK;AAJPhF,SAAAA,QAAQ;AAKN,SAAKgF,QAAQA;EACf;EAEAC,IAAIC,KAAK,GAAG;AACV,SAAKlF,SAASkF;EAChB;EAEA5E,UAAkB;AAChB,WAAO;MACLvF,MAAM,KAAKA;MACXoK,SAAS;QACPnF,OAAO,KAAKA;QACZgF,OAAO,KAAKA;MACd;IACF;EACF;AACF;ACtBA,IAAMI,cAAc;AAEb,IAAMC,oBAAN,cAAgCR,YAAAA;EAMrC1M,YAAY,EAAE6M,MAAK,IAAyB,CAAC,GAAG;AAC9C,UAAK;AANCM,SAAAA,gBAAgB;AAChBC,SAAAA,cAAc;AACdC,SAAAA,WAAqB,CAAA;AAK3B,SAAKR,QAAQA;EACf;EAEAC,IAAIC,KAAK,GAAG;AACV,SAAKI,iBAAiBJ;AACtB,SAAKK,eAAeL;EACtB;EAESpE,MAAMH,MAAoB;AACjC,SAAK6E,SAASlM,KAAK,KAAKgM,aAAa;AACrC,QAAI,KAAKE,SAAS5L,SAASwL,aAAa;AACtC,WAAKI,SAASjE,MAAK;IACrB;AACA,SAAK+D,gBAAgB;EACvB;EAEShF,UAAkB;AACzB,WAAO;MACLvF,MAAM,KAAKA;MACX0K,YAAY;QACVC,QAAQ;UACN;YACE3K,MAAM,KAAKA;YACXiK,OAAO,KAAKA;YACZW,QAAQ,KAAKH,SAAS7F,IAAI,CAACK,OAAO4F,WAAW;cAC3C5F;YACF,EAAA;YACA6F,OAAO,KAAKN;UACd;;MAEJ;IACF;EACF;AACF;AC3CA,IAAMH,eAAc;AAEb,IAAMU,mBAAN,cAA+BjB,YAAAA;EAA/B,cAAA;;AACGS,SAAAA,gBAAgB;AAChBC,SAAAA,cAAc;AACdC,SAAAA,WAAqB,CAAA;AAErBO,SAAAA,gBAAgBnF,YAAYC,IAAG;;EAEvCmF,OAAOrF,MAAc;AACnB,SAAK2E,iBAAiB3E;AACtB,SAAK4E,eAAe5E;EACtB;EAEAsF,iBAAsC;AACpC,UAAMtD,QAAQ/B,YAAYC,IAAG;AAC7B,WAAO;MACL+B,KAAK,MAAA;AACH,cAAMA,MAAMhC,YAAYC,IAAG;AAC3B,aAAKmF,OAAOpD,MAAMD,KAAAA;MACpB;IACF;EACF;EAES7B,MAAMH,MAAoB;AACjC,UAAMuF,QAAQvF,OAAO,KAAKoF;AAC1B,SAAKA,gBAAgBpF;AAErB,UAAMwF,aAAc,KAAKb,gBAAgBY,QAAS;AAClD,SAAKV,SAASlM,KAAK6M,UAAAA;AACnB,QAAI,KAAKX,SAAS5L,SAASwL,cAAa;AACtC,WAAKI,SAASjE,MAAK;IACrB;AACA,SAAK+D,gBAAgB;EACvB;EAEShF,UAAkB;AACzB,WAAO;MACLvF,MAAM,KAAKA;MACX0K,YAAY;QACVC,QAAQ;UACN;YACE3K,MAAM,KAAKA;YACXiK,OAAO;YACPW,QAAQ,KAAKH,SAAS7F,IAAI,CAACK,OAAO4F,WAAW;cAC3C5F;YACF,EAAA;YACA6F,OAAO,KAAKN;UACd;;MAEJ;IACF;EACF;AACF;ACrDO,IAAMa,aAAN,cAAyBvB,YAAAA;EAI9B1M,YAAY,EAAE6M,MAAK,IAAyB,CAAC,GAAG;AAC9C,UAAK;AAJPvL,SAAAA,SAAS,oBAAIgC,IAAAA;AAKX,SAAKuJ,QAAQA;EACf;EAEAC,IAAIvI,KAAawI,KAAK,GAAG;AACvB,UAAMmB,OAAO,KAAK5M,OAAOJ,IAAIqD,GAAAA,KAAQ;AACrC,SAAKjD,OAAOkF,IAAIjC,KAAK2J,OAAOnB,EAAAA;EAC9B;EAEA5E,UAAkB;AAChB,WAAO;MACLvF,MAAM,KAAKA;MACXuL,cAAc;QACZC,SAAS/G,MAAMC,KAAK,KAAKhG,OAAOiG,QAAO,CAAA,EAAIC,IAAI,CAAC,CAACjD,KAAKsD,KAAAA,OAAY;UAChEtD;UACAsD;QACF,EAAA;QACAgF,OAAO,KAAKA;MACd;IACF;EACF;AACF;",
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", "ResourceEntry", "instance", "annotation", "sanitizedClassName", "sanitizeClassName", "className", "getMetric", "name", "metrics", "find", "metric", "MAX_RESOURCE_RECORDS", "MAX_SPAN_RECORDS", "MAX_LOG_RECORDS", "REFRESH_INTERVAL", "MAX_INFO_OBJECT_DEPTH", "TraceProcessor", "Map", "resourceInstanceIndex", "WeakMap", "resourceIdList", "spanIdList", "_logProcessor", "config", "level", "LogLevel", "ERROR", "WARN", "TRACE", "scope", "meta", "S", "context", "getContextFromEntry", "key", "Object", "keys", "sanitizeValue", "entryToPush", "message", "timestamp", "Date", "file", "F", "line", "L", "resourceId", "_pushLog", "addProcessor", "bind", "refreshInterval", "setInterval", "refresh", "unrefTimeout", "createTraceResource", "params", "size", "tracingContext", "getPrototypeOf", "_assign", "instanceId", "getPrototypeSpecificInstanceId", "info", "getResourceInfo", "links", "getResourceMetrics", "WeakRef", "set", "_clearResources", "_markResourceDirty", "createTraceSender", "traceSpan", "TracingSpan", "_flushSpan", "addLink", "parent", "child", "opts", "getDiagnostics", "fromEntries", "Array", "from", "entries", "map", "filter", "INFO", "res", "options", "value", "enum", "depth", "undefined", "err", "_opts", "getData", "getResourceId", "findResourcesByClassName", "findResourcesByAnnotation", "deref", "time", "performance", "now", "_tick", "_changed", "oldInfo", "areEqualShallow", "oldMetrics", "runtimeSpan", "serialize", "_clearSpans", "_markSpanDirty", "shift", "nextId", "parentId", "endTs", "error", "_ctx", "methodName", "startTs", "_showInBrowserTimeline", "showInBrowserTimeline", "parentCtx", "derive", "attributes", "getAttribute", "markSuccess", "_markInBrowserTimeline", "markError", "serializeError", "toFixed", "measure", "start", "end", "Error", "String", "TRACE_PROCESSOR", "globalThis", "traceProcessor", "resourceEntry", "toJSON", "isSetLike", "isMapLike", "isArray", "item", "truncate", "toString", "a", "b", "SANITIZE_REGEX", "m", "match", "slice", "klass", "rest", "defineProperty", "propertyKey", "descriptor", "mark", "method", "args", "Context", "callArgs", "apply", "metricsCounter", "trace", "BaseCounter", "_instance", "UnaryCounter", "units", "inc", "by", "counter", "MAX_BUCKETS", "TimeSeriesCounter", "_currentValue", "_totalValue", "_buckets", "timeSeries", "tracks", "points", "index", "total", "TimeUsageCounter", "_lastTickTime", "record", "beginRecording", "delta", "percentage", "MapCounter", "prev", "multiCounter", "records"]
4
+ "sourcesContent": ["//\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 (options?: { annotation?: symbol }) =>\n <T extends { new (...args: any[]): {} }>(constructor: T) => {\n // Wrapping class declaration into an IIFE so it doesn't capture the `klass` class name.\n const klass = (() =>\n class extends constructor {\n constructor(...rest: any[]) {\n super(...rest);\n TRACE_PROCESSOR.traceResourceConstructor({ constructor, annotation: options?.annotation, instance: this });\n }\n })();\n Object.defineProperty(klass, 'name', { value: constructor.name });\n return klass;\n };\n\nexport type InfoOptions = {\n /**\n * Value is of enum type and should be converted to string.\n *\n * Example:\n *\n * ```ts\n * @trace.info({ enum: SpaceState })\n * get state(): SpaceState { ... }\n * ```\n */\n enum?: Record<string, any>;\n\n /**\n * Max depth of the object to be included in the resource info section.\n *\n * null means no limit (a limit of 8 nested objects is still imposed).\n *\n * Default: 0 - objects will be stringified with toString.\n */\n depth?: number | null;\n};\n\n/**\n * Marks a property or a method to be included in the resource info section.\n */\nconst info =\n (opts: InfoOptions = {}) =>\n (target: any, propertyKey: string, descriptor?: PropertyDescriptor) => {\n getTracingContext(target).infoProperties[propertyKey] = { options: opts };\n };\n\nconst mark = (name: string) => {\n performance.mark(name);\n};\n\nexport type SpanOptions = {\n showInBrowserTimeline?: boolean;\n};\n\nconst span =\n ({ showInBrowserTimeline = false }: SpanOptions = {}) =>\n (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({\n parentCtx,\n methodName: propertyKey,\n instance: this,\n showInBrowserTimeline,\n });\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 mark,\n span,\n metricsCounter,\n\n addLink,\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { type InfoOptions } from './api';\n\nexport const symbolTracingContext = Symbol('dxos.tracing.context');\n\nexport type TracingContext = {\n infoProperties: Record<\n string,\n {\n options: InfoOptions;\n }\n >;\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 { type Context } from '@dxos/context';\nimport { LogLevel, type LogProcessor, getContextFromEntry, log } from '@dxos/log';\nimport { type LogEntry } from '@dxos/protocols/proto/dxos/client/services';\nimport { type Error as SerializedError } from '@dxos/protocols/proto/dxos/error';\nimport { type Metric, type Resource, type Span } from '@dxos/protocols/proto/dxos/tracing';\nimport { getPrototypeSpecificInstanceId } from '@dxos/util';\n\nimport type { AddLinkOptions } from './api';\nimport { type 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 annotation?: symbol;\n};\n\nexport type TraceSpanParams = {\n instance: any;\n methodName: string;\n parentCtx: Context | null;\n showInBrowserTimeline: boolean;\n};\n\nexport class ResourceEntry {\n /**\n * Sometimes bundlers mangle class names: WebFile -> WebFile2.\n *\n * We use a heuristic to remove the suffix.\n */\n public readonly sanitizedClassName: string;\n\n constructor(\n public readonly data: Resource,\n public readonly instance: WeakRef<any>,\n public readonly annotation?: symbol,\n ) {\n this.sanitizedClassName = sanitizeClassName(data.className);\n }\n\n getMetric(name: string): Metric | undefined {\n return this.data.metrics?.find((metric) => metric.name === name);\n }\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 = 2_000;\nconst MAX_SPAN_RECORDS = 1_000;\nconst MAX_LOG_RECORDS = 1_000;\n\nconst REFRESH_INTERVAL = 1_000;\n\nconst MAX_INFO_OBJECT_DEPTH = 8;\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 = new ResourceEntry(\n {\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 new WeakRef(params.instance),\n params.annotation,\n );\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, { options }] of Object.entries(tracingContext.infoProperties)) {\n try {\n const value = typeof instance[key] === 'function' ? instance[key]() : instance[key];\n\n if (options.enum) {\n res[key] = options.enum[value];\n } else {\n res[key] = sanitizeValue(\n value,\n options.depth === undefined ? 1 : options.depth ?? MAX_INFO_OBJECT_DEPTH,\n this,\n );\n }\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 findResourcesByClassName(className: string): ResourceEntry[] {\n return [...this.resources.values()].filter(\n (r) => r.data.className === className || r.sanitizedClassName === className,\n );\n }\n\n findByAnnotation(annotation: symbol): ResourceEntry[] {\n return [...this.resources.values()].filter((r) => r.annotation === annotation);\n }\n\n getDiagnostics() {\n this.refresh();\n\n return {\n resources: Object.fromEntries(\n Array.from(this.resources.entries()).map(([id, entry]) => [\n `${entry.sanitizedClassName}#${entry.data.instanceId}`,\n entry.data,\n ]),\n ),\n spans: Array.from(this.spans.values()),\n logs: this.logs.filter((log) => log.level >= LogLevel.INFO),\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 for (const key of Object.keys(context)) {\n context[key] = sanitizeValue(context[key], 0, this);\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 _showInBrowserTimeline: boolean;\n private readonly _ctx: Context | null = null;\n\n constructor(\n private _traceProcessor: TraceProcessor,\n params: TraceSpanParams,\n ) {\n this.id = TracingSpan.nextId++;\n this.methodName = params.methodName;\n this.resourceId = _traceProcessor.getResourceId(params.instance);\n this.startTs = performance.now();\n this._showInBrowserTimeline = params.showInBrowserTimeline;\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 if (this._showInBrowserTimeline) {\n this._markInBrowserTimeline();\n }\n }\n\n markError(err: unknown) {\n this.endTs = performance.now();\n this.error = serializeError(err);\n this._traceProcessor._flushSpan(this);\n\n if (this._showInBrowserTimeline) {\n this._markInBrowserTimeline();\n }\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 private _markInBrowserTimeline() {\n const resource = this._traceProcessor.resources.get(this.resourceId!);\n const name = resource\n ? `${resource.sanitizedClassName}#${resource.data.instanceId}.${this.methodName}`\n : this.methodName;\n performance.measure(name, { start: this.startTs, end: this.endTs! });\n }\n}\n\n// TODO(burdon): Log cause.\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, depth: number, traceProcessor: TraceProcessor): any => {\n switch (typeof value) {\n case 'string':\n case 'number':\n case 'boolean':\n case 'undefined':\n return value;\n case 'object':\n case 'function':\n if (value === null) {\n return value;\n }\n\n {\n const resourceEntry = traceProcessor.resourceInstanceIndex.get(value);\n if (resourceEntry) {\n return `${resourceEntry.sanitizedClassName}#${resourceEntry.data.instanceId}`;\n }\n }\n\n if (typeof value.toJSON === 'function') {\n // TODO(dmaretskyi): This has potential to cause infinite recursion.\n return sanitizeValue(value.toJSON(), depth, traceProcessor);\n }\n\n if (depth > 0) {\n if (isSetLike(value)) {\n return Object.fromEntries(\n Array.from(value.entries()).map((value) => sanitizeValue(value, depth - 1, traceProcessor)),\n );\n } else if (isMapLike(value)) {\n return Object.fromEntries(\n Array.from(value.entries()).map(([key, value]) => [key, sanitizeValue(value, depth - 1, traceProcessor)]),\n );\n } else if (Array.isArray(value)) {\n return value.map((item: any) => sanitizeValue(item, depth - 1, traceProcessor));\n } else if (typeof value === 'object') {\n const res: any = {};\n for (const key of Object.keys(value)) {\n res[key] = sanitizeValue(value[key], depth - 1, traceProcessor);\n }\n return res;\n }\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\nexport const sanitizeClassName = (className: string) => {\n const SANITIZE_REGEX = /[^_](\\d+)$/;\n const m = className.match(SANITIZE_REGEX);\n if (!m) {\n return className;\n } else {\n return className.slice(0, -m[1].length);\n }\n};\n\nconst isSetLike = (value: any): value is Set<any> =>\n value instanceof Set ||\n (typeof value === 'object' && value !== null && Object.getPrototypeOf(value).constructor.name === 'ComplexSet');\n\nconst isMapLike = (value: any): value is Map<any, any> =>\n value instanceof Map ||\n (typeof value === 'object' && value !== null && Object.getPrototypeOf(value).constructor.name === 'ComplexMap');\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { Stream } from '@dxos/codec-protobuf';\nimport { type LogEntry } from '@dxos/protocols/proto/dxos/client/services';\nimport { type StreamTraceEvent, type TracingService } from '@dxos/protocols/proto/dxos/tracing';\n\nimport { type TraceProcessor, type 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 { type 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 { type 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 { type 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 { type 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", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { type Metric } from '@dxos/protocols/proto/dxos/tracing';\n\nimport { BaseCounter } from './base';\n\nexport class MapCounter extends BaseCounter {\n values = new Map<string, number>();\n units?: string;\n\n constructor({ units }: { units?: string } = {}) {\n super();\n this.units = units;\n }\n\n inc(key: string, by = 1) {\n const prev = this.values.get(key) ?? 0;\n this.values.set(key, prev + by);\n }\n\n getData(): Metric {\n return {\n name: this.name!,\n multiCounter: {\n records: Array.from(this.values.entries()).map(([key, value]) => ({\n key,\n value,\n })),\n units: this.units,\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", "ResourceEntry", "instance", "annotation", "sanitizedClassName", "sanitizeClassName", "className", "getMetric", "name", "metrics", "find", "metric", "MAX_RESOURCE_RECORDS", "MAX_SPAN_RECORDS", "MAX_LOG_RECORDS", "REFRESH_INTERVAL", "MAX_INFO_OBJECT_DEPTH", "TraceProcessor", "Map", "resourceInstanceIndex", "WeakMap", "resourceIdList", "spanIdList", "_logProcessor", "config", "level", "LogLevel", "ERROR", "WARN", "TRACE", "scope", "meta", "S", "context", "getContextFromEntry", "key", "Object", "keys", "sanitizeValue", "entryToPush", "message", "timestamp", "Date", "file", "F", "line", "L", "resourceId", "_pushLog", "addProcessor", "bind", "refreshInterval", "setInterval", "refresh", "unrefTimeout", "traceResourceConstructor", "params", "size", "tracingContext", "getPrototypeOf", "_assign", "instanceId", "getPrototypeSpecificInstanceId", "info", "getResourceInfo", "links", "getResourceMetrics", "WeakRef", "set", "_clearResources", "_markResourceDirty", "res", "options", "entries", "value", "enum", "depth", "undefined", "err", "_opts", "getData", "traceSpan", "TracingSpan", "_flushSpan", "addLink", "parent", "child", "opts", "getResourceId", "createTraceSender", "deref", "time", "performance", "now", "_tick", "_changed", "oldInfo", "areEqualShallow", "oldMetrics", "findResourcesByClassName", "filter", "r", "findByAnnotation", "getDiagnostics", "fromEntries", "Array", "from", "map", "INFO", "runtimeSpan", "serialize", "_clearSpans", "_markSpanDirty", "shift", "nextId", "parentId", "endTs", "error", "_ctx", "methodName", "startTs", "_showInBrowserTimeline", "showInBrowserTimeline", "parentCtx", "derive", "attributes", "getAttribute", "markSuccess", "_markInBrowserTimeline", "markError", "serializeError", "toFixed", "measure", "start", "end", "Error", "String", "TRACE_PROCESSOR", "globalThis", "traceProcessor", "resourceEntry", "toJSON", "isSetLike", "isMapLike", "isArray", "item", "truncate", "toString", "a", "b", "SANITIZE_REGEX", "m", "match", "slice", "klass", "rest", "defineProperty", "propertyKey", "descriptor", "mark", "method", "args", "Context", "callArgs", "apply", "metricsCounter", "trace", "BaseCounter", "_instance", "UnaryCounter", "units", "inc", "by", "counter", "MAX_BUCKETS", "TimeSeriesCounter", "_currentValue", "_totalValue", "_buckets", "timeSeries", "tracks", "points", "index", "total", "TimeUsageCounter", "_lastTickTime", "record", "beginRecording", "delta", "percentage", "MapCounter", "prev", "multiCounter", "records"]
7
7
  }
@@ -1 +1 @@
1
- {"inputs":{"packages/common/tracing/src/symbols.ts":{"bytes":1811,"imports":[],"format":"esm"},"packages/common/tracing/src/trace-sender.ts":{"bytes":10386,"imports":[{"path":"@dxos/codec-protobuf","kind":"import-statement","external":true}],"format":"esm"},"packages/common/tracing/src/trace-processor.ts":{"bytes":51824,"imports":[{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true},{"path":"packages/common/tracing/src/symbols.ts","kind":"import-statement","original":"./symbols"},{"path":"packages/common/tracing/src/trace-sender.ts","kind":"import-statement","original":"./trace-sender"}],"format":"esm"},"packages/common/tracing/src/api.ts":{"bytes":9411,"imports":[{"path":"@dxos/context","kind":"import-statement","external":true},{"path":"packages/common/tracing/src/symbols.ts","kind":"import-statement","original":"./symbols"},{"path":"packages/common/tracing/src/trace-processor.ts","kind":"import-statement","original":"./trace-processor"}],"format":"esm"},"packages/common/tracing/src/metrics/base.ts":{"bytes":1450,"imports":[],"format":"esm"},"packages/common/tracing/src/metrics/unary-counter.ts":{"bytes":2128,"imports":[{"path":"packages/common/tracing/src/metrics/base.ts","kind":"import-statement","original":"./base"}],"format":"esm"},"packages/common/tracing/src/metrics/time-series-counter.ts":{"bytes":4268,"imports":[{"path":"packages/common/tracing/src/metrics/base.ts","kind":"import-statement","original":"./base"}],"format":"esm"},"packages/common/tracing/src/metrics/time-usage-counter.ts":{"bytes":5249,"imports":[{"path":"packages/common/tracing/src/metrics/base.ts","kind":"import-statement","original":"./base"}],"format":"esm"},"packages/common/tracing/src/metrics/map-counter.ts":{"bytes":2977,"imports":[{"path":"packages/common/tracing/src/metrics/base.ts","kind":"import-statement","original":"./base"}],"format":"esm"},"packages/common/tracing/src/metrics/index.ts":{"bytes":892,"imports":[{"path":"packages/common/tracing/src/metrics/base.ts","kind":"import-statement","original":"./base"},{"path":"packages/common/tracing/src/metrics/unary-counter.ts","kind":"import-statement","original":"./unary-counter"},{"path":"packages/common/tracing/src/metrics/time-series-counter.ts","kind":"import-statement","original":"./time-series-counter"},{"path":"packages/common/tracing/src/metrics/time-usage-counter.ts","kind":"import-statement","original":"./time-usage-counter"},{"path":"packages/common/tracing/src/metrics/map-counter.ts","kind":"import-statement","original":"./map-counter"}],"format":"esm"},"packages/common/tracing/src/index.ts":{"bytes":831,"imports":[{"path":"packages/common/tracing/src/api.ts","kind":"import-statement","original":"./api"},{"path":"packages/common/tracing/src/symbols.ts","kind":"import-statement","original":"./symbols"},{"path":"packages/common/tracing/src/trace-processor.ts","kind":"import-statement","original":"./trace-processor"},{"path":"packages/common/tracing/src/trace-sender.ts","kind":"import-statement","original":"./trace-sender"},{"path":"packages/common/tracing/src/metrics/index.ts","kind":"import-statement","original":"./metrics"}],"format":"esm"}},"outputs":{"packages/common/tracing/dist/lib/node/index.cjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":44718},"packages/common/tracing/dist/lib/node/index.cjs":{"imports":[{"path":"@dxos/context","kind":"import-statement","external":true},{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true},{"path":"@dxos/codec-protobuf","kind":"import-statement","external":true}],"exports":["BaseCounter","MapCounter","ResourceEntry","TRACE_PROCESSOR","TRACE_SPAN_ATTRIBUTE","TimeSeriesCounter","TimeUsageCounter","TraceProcessor","TraceSender","TracingSpan","UnaryCounter","getTracingContext","sanitizeClassName","symbolTracingContext","trace"],"entryPoint":"packages/common/tracing/src/index.ts","inputs":{"packages/common/tracing/src/api.ts":{"bytesInOutput":1631},"packages/common/tracing/src/symbols.ts":{"bytesInOutput":245},"packages/common/tracing/src/trace-processor.ts":{"bytesInOutput":11951},"packages/common/tracing/src/trace-sender.ts":{"bytesInOutput":2555},"packages/common/tracing/src/index.ts":{"bytesInOutput":0},"packages/common/tracing/src/metrics/base.ts":{"bytesInOutput":159},"packages/common/tracing/src/metrics/index.ts":{"bytesInOutput":0},"packages/common/tracing/src/metrics/unary-counter.ts":{"bytesInOutput":324},"packages/common/tracing/src/metrics/time-series-counter.ts":{"bytesInOutput":812},"packages/common/tracing/src/metrics/time-usage-counter.ts":{"bytesInOutput":1136},"packages/common/tracing/src/metrics/map-counter.ts":{"bytesInOutput":509}},"bytes":20192}}}
1
+ {"inputs":{"packages/common/tracing/src/symbols.ts":{"bytes":1811,"imports":[],"format":"esm"},"packages/common/tracing/src/trace-sender.ts":{"bytes":10386,"imports":[{"path":"@dxos/codec-protobuf","kind":"import-statement","external":true}],"format":"esm"},"packages/common/tracing/src/trace-processor.ts":{"bytes":50581,"imports":[{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true},{"path":"packages/common/tracing/src/symbols.ts","kind":"import-statement","original":"./symbols"},{"path":"packages/common/tracing/src/trace-sender.ts","kind":"import-statement","original":"./trace-sender"}],"format":"esm"},"packages/common/tracing/src/api.ts":{"bytes":9432,"imports":[{"path":"@dxos/context","kind":"import-statement","external":true},{"path":"packages/common/tracing/src/symbols.ts","kind":"import-statement","original":"./symbols"},{"path":"packages/common/tracing/src/trace-processor.ts","kind":"import-statement","original":"./trace-processor"}],"format":"esm"},"packages/common/tracing/src/metrics/base.ts":{"bytes":1450,"imports":[],"format":"esm"},"packages/common/tracing/src/metrics/unary-counter.ts":{"bytes":2128,"imports":[{"path":"packages/common/tracing/src/metrics/base.ts","kind":"import-statement","original":"./base"}],"format":"esm"},"packages/common/tracing/src/metrics/time-series-counter.ts":{"bytes":4268,"imports":[{"path":"packages/common/tracing/src/metrics/base.ts","kind":"import-statement","original":"./base"}],"format":"esm"},"packages/common/tracing/src/metrics/time-usage-counter.ts":{"bytes":5249,"imports":[{"path":"packages/common/tracing/src/metrics/base.ts","kind":"import-statement","original":"./base"}],"format":"esm"},"packages/common/tracing/src/metrics/map-counter.ts":{"bytes":2977,"imports":[{"path":"packages/common/tracing/src/metrics/base.ts","kind":"import-statement","original":"./base"}],"format":"esm"},"packages/common/tracing/src/metrics/index.ts":{"bytes":892,"imports":[{"path":"packages/common/tracing/src/metrics/base.ts","kind":"import-statement","original":"./base"},{"path":"packages/common/tracing/src/metrics/unary-counter.ts","kind":"import-statement","original":"./unary-counter"},{"path":"packages/common/tracing/src/metrics/time-series-counter.ts","kind":"import-statement","original":"./time-series-counter"},{"path":"packages/common/tracing/src/metrics/time-usage-counter.ts","kind":"import-statement","original":"./time-usage-counter"},{"path":"packages/common/tracing/src/metrics/map-counter.ts","kind":"import-statement","original":"./map-counter"}],"format":"esm"},"packages/common/tracing/src/index.ts":{"bytes":831,"imports":[{"path":"packages/common/tracing/src/api.ts","kind":"import-statement","original":"./api"},{"path":"packages/common/tracing/src/symbols.ts","kind":"import-statement","original":"./symbols"},{"path":"packages/common/tracing/src/trace-processor.ts","kind":"import-statement","original":"./trace-processor"},{"path":"packages/common/tracing/src/trace-sender.ts","kind":"import-statement","original":"./trace-sender"},{"path":"packages/common/tracing/src/metrics/index.ts","kind":"import-statement","original":"./metrics"}],"format":"esm"}},"outputs":{"packages/common/tracing/dist/lib/node/index.cjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":44193},"packages/common/tracing/dist/lib/node/index.cjs":{"imports":[{"path":"@dxos/context","kind":"import-statement","external":true},{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true},{"path":"@dxos/codec-protobuf","kind":"import-statement","external":true}],"exports":["BaseCounter","MapCounter","ResourceEntry","TRACE_PROCESSOR","TRACE_SPAN_ATTRIBUTE","TimeSeriesCounter","TimeUsageCounter","TraceProcessor","TraceSender","TracingSpan","UnaryCounter","getTracingContext","sanitizeClassName","symbolTracingContext","trace"],"entryPoint":"packages/common/tracing/src/index.ts","inputs":{"packages/common/tracing/src/api.ts":{"bytesInOutput":1636},"packages/common/tracing/src/symbols.ts":{"bytesInOutput":245},"packages/common/tracing/src/trace-processor.ts":{"bytesInOutput":11713},"packages/common/tracing/src/trace-sender.ts":{"bytesInOutput":2555},"packages/common/tracing/src/index.ts":{"bytesInOutput":0},"packages/common/tracing/src/metrics/base.ts":{"bytesInOutput":159},"packages/common/tracing/src/metrics/index.ts":{"bytesInOutput":0},"packages/common/tracing/src/metrics/unary-counter.ts":{"bytesInOutput":324},"packages/common/tracing/src/metrics/time-series-counter.ts":{"bytesInOutput":812},"packages/common/tracing/src/metrics/time-usage-counter.ts":{"bytesInOutput":1136},"packages/common/tracing/src/metrics/map-counter.ts":{"bytesInOutput":509}},"bytes":19959}}}
@@ -4,11 +4,6 @@ import { type Error as SerializedError } from '@dxos/protocols/proto/dxos/error'
4
4
  import { type Metric, type Resource, type Span } from '@dxos/protocols/proto/dxos/tracing';
5
5
  import type { AddLinkOptions } from './api';
6
6
  import { TraceSender } from './trace-sender';
7
- export type Diagnostics = {
8
- resources: Record<string, Resource>;
9
- spans: Span[];
10
- logs: LogEntry[];
11
- };
12
7
  export type TraceResourceConstructorParams = {
13
8
  constructor: {
14
9
  new (...args: any[]): {};
@@ -42,24 +37,31 @@ export type TraceSubscription = {
42
37
  newLogs: LogEntry[];
43
38
  };
44
39
  export declare class TraceProcessor {
45
- readonly subscriptions: Set<TraceSubscription>;
46
- readonly resources: Map<number, ResourceEntry>;
47
- readonly resourceInstanceIndex: WeakMap<any, ResourceEntry>;
48
- readonly resourceIdList: number[];
49
- readonly spans: Map<number, Span>;
50
- readonly spanIdList: number[];
51
- readonly logs: LogEntry[];
40
+ resources: Map<number, ResourceEntry>;
41
+ resourceInstanceIndex: WeakMap<any, ResourceEntry>;
42
+ resourceIdList: number[];
43
+ spans: Map<number, Span>;
44
+ spanIdList: number[];
45
+ logs: LogEntry[];
46
+ subscriptions: Set<TraceSubscription>;
52
47
  constructor();
53
- createTraceSender(): TraceSender;
54
- traceSpan(params: TraceSpanParams): TracingSpan;
55
- addLink(parent: any, child: any, opts: AddLinkOptions): void;
56
- getDiagnostics(): Diagnostics;
48
+ traceResourceConstructor(params: TraceResourceConstructorParams): void;
57
49
  getResourceInfo(instance: any): Record<string, any>;
58
50
  getResourceMetrics(instance: any): Metric[];
51
+ traceSpan(params: TraceSpanParams): TracingSpan;
52
+ addLink(parent: any, child: any, opts: AddLinkOptions): void;
59
53
  getResourceId(instance: any): number | null;
60
- findResourcesByClassName(className: string): ResourceEntry[];
61
- findResourcesByAnnotation(annotation: symbol): ResourceEntry[];
54
+ createTraceSender(): TraceSender;
62
55
  refresh(): void;
56
+ findResourcesByClassName(className: string): ResourceEntry[];
57
+ findByAnnotation(annotation: symbol): ResourceEntry[];
58
+ getDiagnostics(): {
59
+ resources: {
60
+ [k: string]: Resource;
61
+ };
62
+ spans: Span[];
63
+ logs: LogEntry[];
64
+ };
63
65
  private _markResourceDirty;
64
66
  private _markSpanDirty;
65
67
  private _clearResources;
@@ -1 +1 @@
1
- {"version":3,"file":"trace-processor.d.ts","sourceRoot":"","sources":["../../../src/trace-processor.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"trace-processor.d.ts","sourceRoot":"","sources":["../../../src/trace-processor.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dxos/tracing",
3
- "version": "0.5.1-next.638da00",
3
+ "version": "0.5.1-next.65aaa36",
4
4
  "description": "Async utilities.",
5
5
  "homepage": "https://dxos.org",
6
6
  "bugs": "https://github.com/dxos/dxos/issues",
@@ -16,18 +16,18 @@
16
16
  "src"
17
17
  ],
18
18
  "dependencies": {
19
- "@dxos/async": "0.5.1-next.638da00",
20
- "@dxos/codec-protobuf": "0.5.1-next.638da00",
21
- "@dxos/context": "0.5.1-next.638da00",
22
- "@dxos/debug": "0.5.1-next.638da00",
23
- "@dxos/invariant": "0.5.1-next.638da00",
24
- "@dxos/log": "0.5.1-next.638da00",
25
- "@dxos/node-std": "0.5.1-next.638da00",
26
- "@dxos/protocols": "0.5.1-next.638da00",
27
- "@dxos/util": "0.5.1-next.638da00"
19
+ "@dxos/codec-protobuf": "0.5.1-next.65aaa36",
20
+ "@dxos/async": "0.5.1-next.65aaa36",
21
+ "@dxos/context": "0.5.1-next.65aaa36",
22
+ "@dxos/debug": "0.5.1-next.65aaa36",
23
+ "@dxos/invariant": "0.5.1-next.65aaa36",
24
+ "@dxos/log": "0.5.1-next.65aaa36",
25
+ "@dxos/node-std": "0.5.1-next.65aaa36",
26
+ "@dxos/protocols": "0.5.1-next.65aaa36",
27
+ "@dxos/util": "0.5.1-next.65aaa36"
28
28
  },
29
29
  "devDependencies": {
30
- "@dxos/test": "0.5.1-next.638da00"
30
+ "@dxos/test": "0.5.1-next.65aaa36"
31
31
  },
32
32
  "publishConfig": {
33
33
  "access": "public"
package/src/api.ts CHANGED
@@ -18,7 +18,7 @@ const resource =
18
18
  class extends constructor {
19
19
  constructor(...rest: any[]) {
20
20
  super(...rest);
21
- TRACE_PROCESSOR.createTraceResource({ constructor, annotation: options?.annotation, instance: this });
21
+ TRACE_PROCESSOR.traceResourceConstructor({ constructor, annotation: options?.annotation, instance: this });
22
22
  }
23
23
  })();
24
24
  Object.defineProperty(klass, 'name', { value: constructor.name });
@@ -15,12 +15,6 @@ import { type BaseCounter } from './metrics';
15
15
  import { TRACE_SPAN_ATTRIBUTE, getTracingContext } from './symbols';
16
16
  import { TraceSender } from './trace-sender';
17
17
 
18
- export type Diagnostics = {
19
- resources: Record<string, Resource>;
20
- spans: Span[];
21
- logs: LogEntry[];
22
- };
23
-
24
18
  export type TraceResourceConstructorParams = {
25
19
  constructor: { new (...args: any[]): {} };
26
20
  instance: any;
@@ -72,16 +66,16 @@ const REFRESH_INTERVAL = 1_000;
72
66
  const MAX_INFO_OBJECT_DEPTH = 8;
73
67
 
74
68
  export class TraceProcessor {
75
- readonly subscriptions: Set<TraceSubscription> = new Set();
69
+ resources = new Map<number, ResourceEntry>();
70
+ resourceInstanceIndex = new WeakMap<any, ResourceEntry>();
71
+ resourceIdList: number[] = [];
76
72
 
77
- readonly resources = new Map<number, ResourceEntry>();
78
- readonly resourceInstanceIndex = new WeakMap<any, ResourceEntry>();
79
- readonly resourceIdList: number[] = [];
73
+ spans = new Map<number, Span>();
74
+ spanIdList: number[] = [];
80
75
 
81
- readonly spans = new Map<number, Span>();
82
- readonly spanIdList: number[] = [];
76
+ logs: LogEntry[] = [];
83
77
 
84
- readonly logs: LogEntry[] = [];
78
+ subscriptions: Set<TraceSubscription> = new Set();
85
79
 
86
80
  constructor() {
87
81
  log.addProcessor(this._logProcessor.bind(this));
@@ -90,14 +84,10 @@ export class TraceProcessor {
90
84
  unrefTimeout(refreshInterval);
91
85
  }
92
86
 
93
- /**
94
- * @internal
95
- */
96
- // TODO(burdon): Comment.
97
- createTraceResource(params: TraceResourceConstructorParams) {
87
+ traceResourceConstructor(params: TraceResourceConstructorParams) {
98
88
  const id = this.resources.size;
99
89
 
100
- // Init metrics counters.
90
+ // init metrics counters.
101
91
  const tracingContext = getTracingContext(Object.getPrototypeOf(params.instance));
102
92
  for (const key of Object.keys(tracingContext.metricsProperties)) {
103
93
  (params.instance[key] as BaseCounter)._assign(params.instance, key);
@@ -122,50 +112,17 @@ export class TraceProcessor {
122
112
  if (this.resourceIdList.length > MAX_RESOURCE_RECORDS) {
123
113
  this._clearResources();
124
114
  }
125
-
126
115
  this._markResourceDirty(id);
127
116
  }
128
117
 
129
- createTraceSender() {
130
- return new TraceSender(this);
131
- }
132
-
133
- traceSpan(params: TraceSpanParams): TracingSpan {
134
- const span = new TracingSpan(this, params);
135
- this._flushSpan(span);
136
- return span;
137
- }
138
-
139
- // TODO(burdon): Not implemented.
140
- addLink(parent: any, child: any, opts: AddLinkOptions) {}
141
-
142
- //
143
- // Getters
144
- //
145
-
146
- // TODO(burdon): Define type.
147
- // TODO(burdon): Reconcile with system service.
148
- getDiagnostics(): Diagnostics {
149
- this.refresh();
150
-
151
- return {
152
- resources: Object.fromEntries(
153
- Array.from(this.resources.entries()).map(([id, entry]) => [
154
- `${entry.sanitizedClassName}#${entry.data.instanceId}`,
155
- entry.data,
156
- ]),
157
- ),
158
- spans: Array.from(this.spans.values()),
159
- logs: this.logs.filter((log) => log.level >= LogLevel.INFO),
160
- };
161
- }
162
-
163
118
  getResourceInfo(instance: any): Record<string, any> {
164
119
  const res: Record<string, any> = {};
165
120
  const tracingContext = getTracingContext(Object.getPrototypeOf(instance));
121
+
166
122
  for (const [key, { options }] of Object.entries(tracingContext.infoProperties)) {
167
123
  try {
168
124
  const value = typeof instance[key] === 'function' ? instance[key]() : instance[key];
125
+
169
126
  if (options.enum) {
170
127
  res[key] = options.enum[value];
171
128
  } else {
@@ -186,6 +143,7 @@ export class TraceProcessor {
186
143
  getResourceMetrics(instance: any): Metric[] {
187
144
  const res: Metric[] = [];
188
145
  const tracingContext = getTracingContext(Object.getPrototypeOf(instance));
146
+
189
147
  for (const [key, _opts] of Object.entries(tracingContext.metricsProperties)) {
190
148
  res.push(instance[key].getData());
191
149
  }
@@ -193,19 +151,21 @@ export class TraceProcessor {
193
151
  return res;
194
152
  }
195
153
 
154
+ traceSpan(params: TraceSpanParams): TracingSpan {
155
+ const span = new TracingSpan(this, params);
156
+ this._flushSpan(span);
157
+ return span;
158
+ }
159
+
160
+ addLink(parent: any, child: any, opts: AddLinkOptions) {}
161
+
196
162
  getResourceId(instance: any): number | null {
197
163
  const entry = this.resourceInstanceIndex.get(instance);
198
164
  return entry ? entry.data.id : null;
199
165
  }
200
166
 
201
- findResourcesByClassName(className: string): ResourceEntry[] {
202
- return [...this.resources.values()].filter(
203
- (res) => res.data.className === className || res.sanitizedClassName === className,
204
- );
205
- }
206
-
207
- findResourcesByAnnotation(annotation: symbol): ResourceEntry[] {
208
- return [...this.resources.values()].filter((res) => res.annotation === annotation);
167
+ createTraceSender() {
168
+ return new TraceSender(this);
209
169
  }
210
170
 
211
171
  refresh() {
@@ -242,9 +202,30 @@ export class TraceProcessor {
242
202
  }
243
203
  }
244
204
 
245
- //
246
- // Implementation
247
- //
205
+ findResourcesByClassName(className: string): ResourceEntry[] {
206
+ return [...this.resources.values()].filter(
207
+ (r) => r.data.className === className || r.sanitizedClassName === className,
208
+ );
209
+ }
210
+
211
+ findByAnnotation(annotation: symbol): ResourceEntry[] {
212
+ return [...this.resources.values()].filter((r) => r.annotation === annotation);
213
+ }
214
+
215
+ getDiagnostics() {
216
+ this.refresh();
217
+
218
+ return {
219
+ resources: Object.fromEntries(
220
+ Array.from(this.resources.entries()).map(([id, entry]) => [
221
+ `${entry.sanitizedClassName}#${entry.data.instanceId}`,
222
+ entry.data,
223
+ ]),
224
+ ),
225
+ spans: Array.from(this.spans.values()),
226
+ logs: this.logs.filter((log) => log.level >= LogLevel.INFO),
227
+ };
228
+ }
248
229
 
249
230
  /**
250
231
  * @internal
@@ -332,7 +313,6 @@ export class TraceProcessor {
332
313
  };
333
314
  }
334
315
 
335
- // TODO(burdon): Comment.
336
316
  export class TracingSpan {
337
317
  static nextId = 0;
338
318
 
@@ -428,7 +408,6 @@ const serializeError = (err: unknown): SerializedError => {
428
408
  };
429
409
  };
430
410
 
431
- // TODO(burdon): Rename singleton and move out of package.
432
411
  export const TRACE_PROCESSOR: TraceProcessor = ((globalThis as any).TRACE_PROCESSOR ??= new TraceProcessor());
433
412
 
434
413
  const sanitizeValue = (value: any, depth: number, traceProcessor: TraceProcessor): any => {
@@ -68,6 +68,6 @@ describe('tracing', () => {
68
68
 
69
69
  test('findByAnnotation', async () => {
70
70
  const store = new FeedStore();
71
- expect(TRACE_PROCESSOR.findResourcesByAnnotation(FeedStoreResource)[0].instance.deref()).to.eq(store);
71
+ expect(TRACE_PROCESSOR.findByAnnotation(FeedStoreResource)[0].instance.deref()).to.eq(store);
72
72
  });
73
73
  });