@dxos/tracing 0.4.10-main.b9b4602 → 0.4.10-main.c2d5db5

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.
@@ -108,10 +108,9 @@ var TraceSender = class {
108
108
  // packages/common/tracing/src/trace-processor.ts
109
109
  var __dxlog_file = "/home/runner/work/dxos/dxos/packages/common/tracing/src/trace-processor.ts";
110
110
  var ResourceEntry = class {
111
- constructor(data, instance, annotation) {
111
+ constructor(data, instance) {
112
112
  this.data = data;
113
113
  this.instance = instance;
114
- this.annotation = annotation;
115
114
  this.sanitizedClassName = sanitizeClassName(data.className);
116
115
  }
117
116
  getMetric(name) {
@@ -165,7 +164,7 @@ var TraceProcessor = class {
165
164
  };
166
165
  log.addProcessor(this._logProcessor.bind(this), void 0, {
167
166
  F: __dxlog_file,
168
- L: 81,
167
+ L: 79,
169
168
  S: this,
170
169
  C: (f, a) => f(...a)
171
170
  });
@@ -185,7 +184,7 @@ var TraceProcessor = class {
185
184
  info: this.getResourceInfo(params.instance),
186
185
  links: [],
187
186
  metrics: this.getResourceMetrics(params.instance)
188
- }, new WeakRef(params.instance), params.annotation);
187
+ }, new WeakRef(params.instance));
189
188
  this.resources.set(id, entry);
190
189
  this.resourceInstanceIndex.set(params.instance, entry);
191
190
  this.resourceIdList.push(id);
@@ -258,14 +257,13 @@ var TraceProcessor = class {
258
257
  }
259
258
  }
260
259
  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);
260
+ const res = [];
261
+ for (const entry of this.resources.values()) {
262
+ if (entry.data.className === className || entry.sanitizedClassName === className) {
263
+ res.push(entry);
264
+ }
265
+ }
266
+ return res;
269
267
  }
270
268
  getDiagnostics() {
271
269
  this.refresh();
@@ -472,13 +470,12 @@ var isSetLike = (value) => value instanceof Set || typeof value === "object" &&
472
470
  var isMapLike = (value) => value instanceof Map || typeof value === "object" && value !== null && Object.getPrototypeOf(value).constructor.name === "ComplexMap";
473
471
 
474
472
  // packages/common/tracing/src/api.ts
475
- var resource = (options) => (constructor) => {
473
+ var resource = () => (constructor) => {
476
474
  const klass = /* @__PURE__ */ (() => class extends constructor {
477
475
  constructor(...rest) {
478
476
  super(...rest);
479
477
  TRACE_PROCESSOR.traceResourceConstructor({
480
478
  constructor,
481
- annotation: options?.annotation,
482
479
  instance: this
483
480
  });
484
481
  }
@@ -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.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\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\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 break;\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"]
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 () =>\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, 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};\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 data: Resource,\n public instance: WeakRef<any>,\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 );\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 const res: ResourceEntry[] = [];\n for (const entry of this.resources.values()) {\n if (entry.data.className === className || entry.sanitizedClassName === className) {\n res.push(entry);\n }\n }\n return res;\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\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\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 break;\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", "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", "getDiagnostics", "fromEntries", "Array", "from", "map", "filter", "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", "constructor", "klass", "rest", "TRACE_PROCESSOR", "traceResourceConstructor", "instance", "Object", "defineProperty", "value", "name", "info", "opts", "target", "propertyKey", "descriptor", "getTracingContext", "infoProperties", "options", "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":50544,"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":44185},"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":11726},"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":19972}}}
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":49988,"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":9224,"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":43806},"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":1588},"packages/common/tracing/src/symbols.ts":{"bytesInOutput":245},"packages/common/tracing/src/trace-processor.ts":{"bytesInOutput":11607},"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":19805}}}
@@ -136,10 +136,9 @@ var TraceSender = class {
136
136
  };
137
137
  var __dxlog_file = "/home/runner/work/dxos/dxos/packages/common/tracing/src/trace-processor.ts";
138
138
  var ResourceEntry = class {
139
- constructor(data, instance, annotation) {
139
+ constructor(data, instance) {
140
140
  this.data = data;
141
141
  this.instance = instance;
142
- this.annotation = annotation;
143
142
  this.sanitizedClassName = sanitizeClassName(data.className);
144
143
  }
145
144
  getMetric(name) {
@@ -193,7 +192,7 @@ var TraceProcessor = class {
193
192
  };
194
193
  import_log.log.addProcessor(this._logProcessor.bind(this), void 0, {
195
194
  F: __dxlog_file,
196
- L: 81,
195
+ L: 79,
197
196
  S: this,
198
197
  C: (f, a) => f(...a)
199
198
  });
@@ -213,7 +212,7 @@ var TraceProcessor = class {
213
212
  info: this.getResourceInfo(params.instance),
214
213
  links: [],
215
214
  metrics: this.getResourceMetrics(params.instance)
216
- }, new WeakRef(params.instance), params.annotation);
215
+ }, new WeakRef(params.instance));
217
216
  this.resources.set(id, entry);
218
217
  this.resourceInstanceIndex.set(params.instance, entry);
219
218
  this.resourceIdList.push(id);
@@ -286,14 +285,13 @@ var TraceProcessor = class {
286
285
  }
287
286
  }
288
287
  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);
288
+ const res = [];
289
+ for (const entry of this.resources.values()) {
290
+ if (entry.data.className === className || entry.sanitizedClassName === className) {
291
+ res.push(entry);
292
+ }
293
+ }
294
+ return res;
297
295
  }
298
296
  getDiagnostics() {
299
297
  this.refresh();
@@ -498,13 +496,12 @@ var sanitizeClassName = (className) => {
498
496
  };
499
497
  var isSetLike = (value) => value instanceof Set || typeof value === "object" && value !== null && Object.getPrototypeOf(value).constructor.name === "ComplexSet";
500
498
  var isMapLike = (value) => value instanceof Map || typeof value === "object" && value !== null && Object.getPrototypeOf(value).constructor.name === "ComplexMap";
501
- var resource = (options) => (constructor) => {
499
+ var resource = () => (constructor) => {
502
500
  const klass = /* @__PURE__ */ (() => class extends constructor {
503
501
  constructor(...rest) {
504
502
  super(...rest);
505
503
  TRACE_PROCESSOR.traceResourceConstructor({
506
504
  constructor,
507
- annotation: options?.annotation,
508
505
  instance: this
509
506
  });
510
507
  }
@@ -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.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\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\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 break;\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"]
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 () =>\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, 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};\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 data: Resource,\n public instance: WeakRef<any>,\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 );\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 const res: ResourceEntry[] = [];\n for (const entry of this.resources.values()) {\n if (entry.data.className === className || entry.sanitizedClassName === className) {\n res.push(entry);\n }\n }\n return res;\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\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\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 break;\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", "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", "getDiagnostics", "fromEntries", "Array", "from", "map", "filter", "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":50544,"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":44185},"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":11726},"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":19972}}}
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":49988,"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":9224,"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":43806},"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":1588},"packages/common/tracing/src/symbols.ts":{"bytesInOutput":245},"packages/common/tracing/src/trace-processor.ts":{"bytesInOutput":11607},"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":19805}}}
@@ -24,9 +24,7 @@ export type SpanOptions = {
24
24
  };
25
25
  export type AddLinkOptions = {};
26
26
  export declare const trace: {
27
- resource: (options?: {
28
- annotation?: symbol;
29
- }) => <T extends new (...args: any[]) => {}>(constructor: T) => {
27
+ resource: () => <T extends new (...args: any[]) => {}>(constructor: T) => {
30
28
  new (...rest: any[]): {};
31
29
  } & T;
32
30
  info: (opts?: InfoOptions) => (target: any, propertyKey: string, descriptor?: PropertyDescriptor) => void;
@@ -1 +1 @@
1
- {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../../src/api.ts"],"names":[],"mappings":"AA2BA,MAAM,MAAM,WAAW,GAAG;IACxB;;;;;;;;;OASG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAE3B;;;;;;OAMG;IACH,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACvB,CAAC;AAeF,MAAM,MAAM,WAAW,GAAG;IACxB,qBAAqB,CAAC,EAAE,OAAO,CAAC;CACjC,CAAC;AAmCF,MAAM,MAAM,cAAc,GAAG,EAAE,CAAC;AAMhC,eAAO,MAAM,KAAK;yBA7FL;QAAE,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE,8BACP,GAAG,EAAE,KAAG,EAAE;sBAIV,GAAG,EAAE;;kBAoCzB,WAAW,cACT,GAAG,eAAe,MAAM,eAAe,kBAAkB;iBAIhD,MAAM;uCASY,WAAW,cACtC,GAAG,eAAe,MAAM,gDAAgD,GAAG,KAAK,GAAG;mCA2BxD,GAAG,eAAe,MAAM,eAAe,kBAAkB;sBAMtE,GAAG,SAAS,GAAG,SAAQ,cAAc;CAY7D,CAAC"}
1
+ {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../../src/api.ts"],"names":[],"mappings":"AA2BA,MAAM,MAAM,WAAW,GAAG;IACxB;;;;;;;;;OASG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAE3B;;;;;;OAMG;IACH,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACvB,CAAC;AAeF,MAAM,MAAM,WAAW,GAAG;IACxB,qBAAqB,CAAC,EAAE,OAAO,CAAC;CACjC,CAAC;AAmCF,MAAM,MAAM,cAAc,GAAG,EAAE,CAAC;AAMhC,eAAO,MAAM,KAAK;6CA5FW,GAAG,EAAE,KAAG,EAAE;sBAIV,GAAG,EAAE;;kBAoCzB,WAAW,cACT,GAAG,eAAe,MAAM,eAAe,kBAAkB;iBAIhD,MAAM;uCASY,WAAW,cACtC,GAAG,eAAe,MAAM,gDAAgD,GAAG,KAAK,GAAG;mCA2BxD,GAAG,eAAe,MAAM,eAAe,kBAAkB;sBAMtE,GAAG,SAAS,GAAG,SAAQ,cAAc;CAY7D,CAAC"}
@@ -9,7 +9,6 @@ export type TraceResourceConstructorParams = {
9
9
  new (...args: any[]): {};
10
10
  };
11
11
  instance: any;
12
- annotation?: symbol;
13
12
  };
14
13
  export type TraceSpanParams = {
15
14
  instance: any;
@@ -18,16 +17,15 @@ export type TraceSpanParams = {
18
17
  showInBrowserTimeline: boolean;
19
18
  };
20
19
  export declare class ResourceEntry {
21
- readonly data: Resource;
22
- readonly instance: WeakRef<any>;
23
- readonly annotation?: symbol | undefined;
20
+ data: Resource;
21
+ instance: WeakRef<any>;
24
22
  /**
25
23
  * Sometimes bundlers mangle class names: WebFile -> WebFile2.
26
24
  *
27
25
  * We use a heuristic to remove the suffix.
28
26
  */
29
27
  readonly sanitizedClassName: string;
30
- constructor(data: Resource, instance: WeakRef<any>, annotation?: symbol | undefined);
28
+ constructor(data: Resource, instance: WeakRef<any>);
31
29
  getMetric(name: string): Metric | undefined;
32
30
  }
33
31
  export type TraceSubscription = {
@@ -54,7 +52,6 @@ export declare class TraceProcessor {
54
52
  createTraceSender(): TraceSender;
55
53
  refresh(): void;
56
54
  findResourcesByClassName(className: string): ResourceEntry[];
57
- findByAnnotation(annotation: symbol): ResourceEntry[];
58
55
  getDiagnostics(): {
59
56
  resources: {
60
57
  [k: string]: Resource;
@@ -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.4.10-main.b9b4602",
3
+ "version": "0.4.10-main.c2d5db5",
4
4
  "description": "Async utilities.",
5
5
  "homepage": "https://dxos.org",
6
6
  "bugs": "https://github.com/dxos/dxos/issues",
@@ -16,19 +16,17 @@
16
16
  "src"
17
17
  ],
18
18
  "dependencies": {
19
- "@dxos/async": "0.4.10-main.b9b4602",
20
- "@dxos/context": "0.4.10-main.b9b4602",
21
- "@dxos/codec-protobuf": "0.4.10-main.b9b4602",
22
- "@dxos/debug": "0.4.10-main.b9b4602",
23
- "@dxos/invariant": "0.4.10-main.b9b4602",
24
- "@dxos/node-std": "0.4.10-main.b9b4602",
25
- "@dxos/log": "0.4.10-main.b9b4602",
26
- "@dxos/protocols": "0.4.10-main.b9b4602",
27
- "@dxos/util": "0.4.10-main.b9b4602"
28
- },
29
- "devDependencies": {
30
- "@dxos/test": "0.4.10-main.b9b4602"
19
+ "@dxos/async": "0.4.10-main.c2d5db5",
20
+ "@dxos/codec-protobuf": "0.4.10-main.c2d5db5",
21
+ "@dxos/debug": "0.4.10-main.c2d5db5",
22
+ "@dxos/log": "0.4.10-main.c2d5db5",
23
+ "@dxos/invariant": "0.4.10-main.c2d5db5",
24
+ "@dxos/context": "0.4.10-main.c2d5db5",
25
+ "@dxos/protocols": "0.4.10-main.c2d5db5",
26
+ "@dxos/node-std": "0.4.10-main.c2d5db5",
27
+ "@dxos/util": "0.4.10-main.c2d5db5"
31
28
  },
29
+ "devDependencies": {},
32
30
  "publishConfig": {
33
31
  "access": "public"
34
32
  }
package/src/api.ts CHANGED
@@ -11,14 +11,14 @@ import { TRACE_PROCESSOR } from './trace-processor';
11
11
  * Annotates a class as a tracked resource.
12
12
  */
13
13
  const resource =
14
- (options?: { annotation?: symbol }) =>
14
+ () =>
15
15
  <T extends { new (...args: any[]): {} }>(constructor: T) => {
16
16
  // Wrapping class declaration into an IIFE so it doesn't capture the `klass` class name.
17
17
  const klass = (() =>
18
18
  class extends constructor {
19
19
  constructor(...rest: any[]) {
20
20
  super(...rest);
21
- TRACE_PROCESSOR.traceResourceConstructor({ constructor, annotation: options?.annotation, instance: this });
21
+ TRACE_PROCESSOR.traceResourceConstructor({ constructor, instance: this });
22
22
  }
23
23
  })();
24
24
  Object.defineProperty(klass, 'name', { value: constructor.name });
@@ -18,7 +18,6 @@ import { TraceSender } from './trace-sender';
18
18
  export type TraceResourceConstructorParams = {
19
19
  constructor: { new (...args: any[]): {} };
20
20
  instance: any;
21
- annotation?: symbol;
22
21
  };
23
22
 
24
23
  export type TraceSpanParams = {
@@ -37,9 +36,8 @@ export class ResourceEntry {
37
36
  public readonly sanitizedClassName: string;
38
37
 
39
38
  constructor(
40
- public readonly data: Resource,
41
- public readonly instance: WeakRef<any>,
42
- public readonly annotation?: symbol,
39
+ public data: Resource,
40
+ public instance: WeakRef<any>,
43
41
  ) {
44
42
  this.sanitizedClassName = sanitizeClassName(data.className);
45
43
  }
@@ -103,7 +101,6 @@ export class TraceProcessor {
103
101
  metrics: this.getResourceMetrics(params.instance),
104
102
  },
105
103
  new WeakRef(params.instance),
106
- params.annotation,
107
104
  );
108
105
 
109
106
  this.resources.set(id, entry);
@@ -203,13 +200,13 @@ export class TraceProcessor {
203
200
  }
204
201
 
205
202
  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);
203
+ const res: ResourceEntry[] = [];
204
+ for (const entry of this.resources.values()) {
205
+ if (entry.data.className === className || entry.sanitizedClassName === className) {
206
+ res.push(entry);
207
+ }
208
+ }
209
+ return res;
213
210
  }
214
211
 
215
212
  getDiagnostics() {
@@ -2,18 +2,14 @@
2
2
  // Copyright 2023 DXOS.org
3
3
  //
4
4
 
5
- import { expect } from 'chai';
6
-
7
5
  import { Context } from '@dxos/context';
8
6
  import { log } from '@dxos/log';
9
- import { describe, test } from '@dxos/test';
7
+ import { test } from '@dxos/test';
10
8
 
11
9
  import { trace } from './api';
12
10
  import { TRACE_PROCESSOR } from './trace-processor';
13
11
 
14
- const FeedStoreResource = Symbol.for('FeedStore');
15
-
16
- @trace.resource({ annotation: FeedStoreResource })
12
+ @trace.resource()
17
13
  class FeedStore {
18
14
  private readonly _storage: any;
19
15
 
@@ -50,24 +46,13 @@ class Feed {
50
46
  }
51
47
  }
52
48
 
53
- describe('tracing', () => {
54
- beforeEach(() => {
55
- TRACE_PROCESSOR.resources.clear();
56
- });
57
-
58
- test('feed store tracing', async () => {
59
- const store = new FeedStore();
60
- const feed1 = await store.openFeed(new Context());
61
- const feed2 = await store.openFeed(new Context());
62
-
63
- await feed2.close().catch(() => {});
49
+ test('feed store tracing', async () => {
50
+ const store = new FeedStore();
51
+ await store.openFeed(new Context());
52
+ const feed = await store.openFeed(new Context());
64
53
 
65
- expect([...TRACE_PROCESSOR.resources.values()].map((r) => r.instance.deref())).to.deep.eq([store, feed1, feed2]);
66
- log.info('spans', TRACE_PROCESSOR.spans);
67
- });
54
+ await feed.close().catch(() => {});
68
55
 
69
- test('findByAnnotation', async () => {
70
- const store = new FeedStore();
71
- expect(TRACE_PROCESSOR.findByAnnotation(FeedStoreResource)[0].instance.deref()).to.eq(store);
72
- });
56
+ log.info('resources', TRACE_PROCESSOR.resources);
57
+ log.info('spans', TRACE_PROCESSOR.spans);
73
58
  });