@dxos/tracing 0.5.0 → 0.5.1-main.0ba1ecb

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -125,13 +125,13 @@ var REFRESH_INTERVAL = 1e3;
125
125
  var MAX_INFO_OBJECT_DEPTH = 8;
126
126
  var TraceProcessor = class {
127
127
  constructor() {
128
+ this.subscriptions = /* @__PURE__ */ new Set();
128
129
  this.resources = /* @__PURE__ */ new Map();
129
130
  this.resourceInstanceIndex = /* @__PURE__ */ new WeakMap();
130
131
  this.resourceIdList = [];
131
132
  this.spans = /* @__PURE__ */ new Map();
132
133
  this.spanIdList = [];
133
134
  this.logs = [];
134
- this.subscriptions = /* @__PURE__ */ new Set();
135
135
  this._logProcessor = (config, entry) => {
136
136
  switch (entry.level) {
137
137
  case LogLevel.ERROR:
@@ -165,14 +165,18 @@ var TraceProcessor = class {
165
165
  };
166
166
  log.addProcessor(this._logProcessor.bind(this), void 0, {
167
167
  F: __dxlog_file,
168
- L: 81,
168
+ L: 87,
169
169
  S: this,
170
170
  C: (f, a) => f(...a)
171
171
  });
172
172
  const refreshInterval = setInterval(this.refresh.bind(this), REFRESH_INTERVAL);
173
173
  unrefTimeout(refreshInterval);
174
174
  }
175
- traceResourceConstructor(params) {
175
+ /**
176
+ * @internal
177
+ */
178
+ // TODO(burdon): Comment.
179
+ createTraceResource(params) {
176
180
  const id = this.resources.size;
177
181
  const tracingContext = getTracingContext(Object.getPrototypeOf(params.instance));
178
182
  for (const key of Object.keys(tracingContext.metricsProperties)) {
@@ -194,6 +198,33 @@ var TraceProcessor = class {
194
198
  }
195
199
  this._markResourceDirty(id);
196
200
  }
201
+ createTraceSender() {
202
+ return new TraceSender(this);
203
+ }
204
+ traceSpan(params) {
205
+ const span2 = new TracingSpan(this, params);
206
+ this._flushSpan(span2);
207
+ return span2;
208
+ }
209
+ // TODO(burdon): Not implemented.
210
+ addLink(parent, child, opts) {
211
+ }
212
+ //
213
+ // Getters
214
+ //
215
+ // TODO(burdon): Define type.
216
+ // TODO(burdon): Reconcile with system service.
217
+ getDiagnostics() {
218
+ this.refresh();
219
+ return {
220
+ resources: Object.fromEntries(Array.from(this.resources.entries()).map(([id, entry]) => [
221
+ `${entry.sanitizedClassName}#${entry.data.instanceId}`,
222
+ entry.data
223
+ ])),
224
+ spans: Array.from(this.spans.values()),
225
+ logs: this.logs.filter((log2) => log2.level >= LogLevel.INFO)
226
+ };
227
+ }
197
228
  getResourceInfo(instance) {
198
229
  const res = {};
199
230
  const tracingContext = getTracingContext(Object.getPrototypeOf(instance));
@@ -219,19 +250,19 @@ var TraceProcessor = class {
219
250
  }
220
251
  return res;
221
252
  }
222
- traceSpan(params) {
223
- const span2 = new TracingSpan(this, params);
224
- this._flushSpan(span2);
225
- return span2;
226
- }
227
- addLink(parent, child, opts) {
228
- }
229
253
  getResourceId(instance) {
230
254
  const entry = this.resourceInstanceIndex.get(instance);
231
255
  return entry ? entry.data.id : null;
232
256
  }
233
- createTraceSender() {
234
- return new TraceSender(this);
257
+ findResourcesByClassName(className) {
258
+ return [
259
+ ...this.resources.values()
260
+ ].filter((res) => res.data.className === className || res.sanitizedClassName === className);
261
+ }
262
+ findResourcesByAnnotation(annotation) {
263
+ return [
264
+ ...this.resources.values()
265
+ ].filter((res) => res.annotation === annotation);
235
266
  }
236
267
  refresh() {
237
268
  for (const resource2 of this.resources.values()) {
@@ -257,27 +288,9 @@ var TraceProcessor = class {
257
288
  subscription.flush();
258
289
  }
259
290
  }
260
- findResourcesByClassName(className) {
261
- return [
262
- ...this.resources.values()
263
- ].filter((r) => r.data.className === className || r.sanitizedClassName === className);
264
- }
265
- findByAnnotation(annotation) {
266
- return [
267
- ...this.resources.values()
268
- ].filter((r) => r.annotation === annotation);
269
- }
270
- getDiagnostics() {
271
- this.refresh();
272
- return {
273
- resources: Object.fromEntries(Array.from(this.resources.entries()).map(([id, entry]) => [
274
- `${entry.sanitizedClassName}#${entry.data.instanceId}`,
275
- entry.data
276
- ])),
277
- spans: Array.from(this.spans.values()),
278
- logs: this.logs.filter((log2) => log2.level >= LogLevel.INFO)
279
- };
280
- }
291
+ //
292
+ // Implementation
293
+ //
281
294
  /**
282
295
  * @internal
283
296
  */
@@ -407,7 +420,6 @@ var sanitizeValue = (value, depth, traceProcessor) => {
407
420
  case "boolean":
408
421
  case "undefined":
409
422
  return value;
410
- break;
411
423
  case "object":
412
424
  case "function":
413
425
  if (value === null) {
@@ -476,7 +488,7 @@ var resource = (options) => (constructor) => {
476
488
  const klass = /* @__PURE__ */ (() => class extends constructor {
477
489
  constructor(...rest) {
478
490
  super(...rest);
479
- TRACE_PROCESSOR.traceResourceConstructor({
491
+ TRACE_PROCESSOR.createTraceResource({
480
492
  constructor,
481
493
  annotation: options?.annotation,
482
494
  instance: this
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/api.ts", "../../../src/symbols.ts", "../../../src/trace-processor.ts", "../../../src/trace-sender.ts", "../../../src/metrics/base.ts", "../../../src/metrics/unary-counter.ts", "../../../src/metrics/time-series-counter.ts", "../../../src/metrics/time-usage-counter.ts", "../../../src/metrics/map-counter.ts"],
4
- "sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nimport { Context } from '@dxos/context';\n\nimport { getTracingContext } from './symbols';\nimport { TRACE_PROCESSOR } from './trace-processor';\n\n/**\n * Annotates a class as a tracked resource.\n */\nconst resource =\n (options?: { annotation?: symbol }) =>\n <T extends { new (...args: any[]): {} }>(constructor: T) => {\n // Wrapping class declaration into an IIFE so it doesn't capture the `klass` class name.\n const klass = (() =>\n class extends constructor {\n constructor(...rest: any[]) {\n super(...rest);\n TRACE_PROCESSOR.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 (options?: { annotation?: symbol }) =>\n <T extends { new (...args: any[]): {} }>(constructor: T) => {\n // Wrapping class declaration into an IIFE so it doesn't capture the `klass` class name.\n const klass = (() =>\n class extends constructor {\n constructor(...rest: any[]) {\n super(...rest);\n TRACE_PROCESSOR.createTraceResource({ constructor, annotation: options?.annotation, instance: this });\n }\n })();\n Object.defineProperty(klass, 'name', { value: constructor.name });\n return klass;\n };\n\nexport type InfoOptions = {\n /**\n * Value is of enum type and should be converted to string.\n *\n * Example:\n *\n * ```ts\n * @trace.info({ enum: SpaceState })\n * get state(): SpaceState { ... }\n * ```\n */\n enum?: Record<string, any>;\n\n /**\n * Max depth of the object to be included in the resource info section.\n *\n * null means no limit (a limit of 8 nested objects is still imposed).\n *\n * Default: 0 - objects will be stringified with toString.\n */\n depth?: number | null;\n};\n\n/**\n * Marks a property or a method to be included in the resource info section.\n */\nconst info =\n (opts: InfoOptions = {}) =>\n (target: any, propertyKey: string, descriptor?: PropertyDescriptor) => {\n getTracingContext(target).infoProperties[propertyKey] = { options: opts };\n };\n\nconst mark = (name: string) => {\n performance.mark(name);\n};\n\nexport type SpanOptions = {\n showInBrowserTimeline?: boolean;\n};\n\nconst span =\n ({ showInBrowserTimeline = false }: SpanOptions = {}) =>\n (target: any, propertyKey: string, descriptor: TypedPropertyDescriptor<(...args: any) => any>) => {\n const method = descriptor.value!;\n\n descriptor.value = async function (this: any, ...args: any) {\n const parentCtx = args[0] instanceof Context ? args[0] : null;\n const span = TRACE_PROCESSOR.traceSpan({\n parentCtx,\n methodName: propertyKey,\n instance: this,\n showInBrowserTimeline,\n });\n\n const callArgs = span.ctx ? [span.ctx, ...args.slice(1)] : args;\n try {\n return await method.apply(this, callArgs);\n } catch (err) {\n span.markError(err);\n throw err;\n } finally {\n span.markSuccess();\n }\n };\n };\n\n/**\n * Attaches metrics counter to the resource.\n */\nconst metricsCounter = () => (target: any, propertyKey: string, descriptor?: PropertyDescriptor) => {\n getTracingContext(target).metricsProperties[propertyKey] = {};\n};\n\nexport type AddLinkOptions = {};\n\nconst addLink = (parent: any, child: any, opts: AddLinkOptions = {}) => {\n TRACE_PROCESSOR.addLink(parent, child, opts);\n};\n\nexport const trace = {\n resource,\n info,\n mark,\n span,\n metricsCounter,\n\n addLink,\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { type InfoOptions } from './api';\n\nexport const symbolTracingContext = Symbol('dxos.tracing.context');\n\nexport type TracingContext = {\n infoProperties: Record<\n string,\n {\n options: InfoOptions;\n }\n >;\n metricsProperties: Record<string, {}>;\n};\n\nexport const getTracingContext = (target: any): TracingContext => {\n return ((target[symbolTracingContext] as TracingContext | undefined) ??= {\n infoProperties: {},\n metricsProperties: {},\n });\n};\n\nexport const TRACE_SPAN_ATTRIBUTE = 'dxos.trace-span';\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { unrefTimeout } from '@dxos/async';\nimport { type Context } from '@dxos/context';\nimport { LogLevel, type LogProcessor, getContextFromEntry, log } from '@dxos/log';\nimport { type LogEntry } from '@dxos/protocols/proto/dxos/client/services';\nimport { type Error as SerializedError } from '@dxos/protocols/proto/dxos/error';\nimport { type Metric, type Resource, type Span } from '@dxos/protocols/proto/dxos/tracing';\nimport { getPrototypeSpecificInstanceId } from '@dxos/util';\n\nimport type { AddLinkOptions } from './api';\nimport { type BaseCounter } from './metrics';\nimport { TRACE_SPAN_ATTRIBUTE, getTracingContext } from './symbols';\nimport { TraceSender } from './trace-sender';\n\nexport type Diagnostics = {\n resources: Record<string, Resource>;\n spans: Span[];\n logs: LogEntry[];\n};\n\nexport type TraceResourceConstructorParams = {\n constructor: { new (...args: any[]): {} };\n instance: any;\n annotation?: symbol;\n};\n\nexport type TraceSpanParams = {\n instance: any;\n methodName: string;\n parentCtx: Context | null;\n showInBrowserTimeline: boolean;\n};\n\nexport class ResourceEntry {\n /**\n * Sometimes bundlers mangle class names: WebFile -> WebFile2.\n *\n * We use a heuristic to remove the suffix.\n */\n public readonly sanitizedClassName: string;\n\n constructor(\n public readonly data: Resource,\n public readonly instance: WeakRef<any>,\n public readonly annotation?: symbol,\n ) {\n this.sanitizedClassName = sanitizeClassName(data.className);\n }\n\n getMetric(name: string): Metric | undefined {\n return this.data.metrics?.find((metric) => metric.name === name);\n }\n}\n\nexport type TraceSubscription = {\n flush: () => void;\n\n dirtyResources: Set<number>;\n dirtySpans: Set<number>;\n newLogs: LogEntry[];\n};\n\nconst MAX_RESOURCE_RECORDS = 2_000;\nconst MAX_SPAN_RECORDS = 1_000;\nconst MAX_LOG_RECORDS = 1_000;\n\nconst REFRESH_INTERVAL = 1_000;\n\nconst MAX_INFO_OBJECT_DEPTH = 8;\n\nexport class TraceProcessor {\n readonly subscriptions: Set<TraceSubscription> = new Set();\n\n readonly resources = new Map<number, ResourceEntry>();\n readonly resourceInstanceIndex = new WeakMap<any, ResourceEntry>();\n readonly resourceIdList: number[] = [];\n\n readonly spans = new Map<number, Span>();\n readonly spanIdList: number[] = [];\n\n readonly logs: LogEntry[] = [];\n\n constructor() {\n log.addProcessor(this._logProcessor.bind(this));\n\n const refreshInterval = setInterval(this.refresh.bind(this), REFRESH_INTERVAL);\n unrefTimeout(refreshInterval);\n }\n\n /**\n * @internal\n */\n // TODO(burdon): Comment.\n createTraceResource(params: TraceResourceConstructorParams) {\n const id = this.resources.size;\n\n // Init metrics counters.\n const tracingContext = getTracingContext(Object.getPrototypeOf(params.instance));\n for (const key of Object.keys(tracingContext.metricsProperties)) {\n (params.instance[key] as BaseCounter)._assign(params.instance, key);\n }\n\n const entry = new ResourceEntry(\n {\n id,\n className: params.constructor.name,\n instanceId: getPrototypeSpecificInstanceId(params.instance),\n info: this.getResourceInfo(params.instance),\n links: [],\n metrics: this.getResourceMetrics(params.instance),\n },\n new WeakRef(params.instance),\n params.annotation,\n );\n\n this.resources.set(id, entry);\n this.resourceInstanceIndex.set(params.instance, entry);\n this.resourceIdList.push(id);\n if (this.resourceIdList.length > MAX_RESOURCE_RECORDS) {\n this._clearResources();\n }\n\n this._markResourceDirty(id);\n }\n\n createTraceSender() {\n return new TraceSender(this);\n }\n\n traceSpan(params: TraceSpanParams): TracingSpan {\n const span = new TracingSpan(this, params);\n this._flushSpan(span);\n return span;\n }\n\n // TODO(burdon): Not implemented.\n addLink(parent: any, child: any, opts: AddLinkOptions) {}\n\n //\n // Getters\n //\n\n // TODO(burdon): Define type.\n // TODO(burdon): Reconcile with system service.\n getDiagnostics(): Diagnostics {\n this.refresh();\n\n return {\n resources: Object.fromEntries(\n Array.from(this.resources.entries()).map(([id, entry]) => [\n `${entry.sanitizedClassName}#${entry.data.instanceId}`,\n entry.data,\n ]),\n ),\n spans: Array.from(this.spans.values()),\n logs: this.logs.filter((log) => log.level >= LogLevel.INFO),\n };\n }\n\n getResourceInfo(instance: any): Record<string, any> {\n const res: Record<string, any> = {};\n const tracingContext = getTracingContext(Object.getPrototypeOf(instance));\n for (const [key, { options }] of Object.entries(tracingContext.infoProperties)) {\n try {\n const value = typeof instance[key] === 'function' ? instance[key]() : instance[key];\n if (options.enum) {\n res[key] = options.enum[value];\n } else {\n res[key] = sanitizeValue(\n value,\n options.depth === undefined ? 1 : options.depth ?? MAX_INFO_OBJECT_DEPTH,\n this,\n );\n }\n } catch (err: any) {\n res[key] = err.message;\n }\n }\n\n return res;\n }\n\n getResourceMetrics(instance: any): Metric[] {\n const res: Metric[] = [];\n const tracingContext = getTracingContext(Object.getPrototypeOf(instance));\n for (const [key, _opts] of Object.entries(tracingContext.metricsProperties)) {\n res.push(instance[key].getData());\n }\n\n return res;\n }\n\n getResourceId(instance: any): number | null {\n const entry = this.resourceInstanceIndex.get(instance);\n return entry ? entry.data.id : null;\n }\n\n findResourcesByClassName(className: string): ResourceEntry[] {\n return [...this.resources.values()].filter(\n (res) => res.data.className === className || res.sanitizedClassName === className,\n );\n }\n\n findResourcesByAnnotation(annotation: symbol): ResourceEntry[] {\n return [...this.resources.values()].filter((res) => res.annotation === annotation);\n }\n\n refresh() {\n for (const resource of this.resources.values()) {\n const instance = resource.instance.deref();\n if (!instance) {\n continue;\n }\n\n const tracingContext = getTracingContext(Object.getPrototypeOf(instance));\n const time = performance.now();\n for (const key of Object.keys(tracingContext.metricsProperties)) {\n (instance[key] as BaseCounter)._tick?.(time);\n }\n\n let _changed = false;\n\n const oldInfo = resource.data.info;\n resource.data.info = this.getResourceInfo(instance);\n _changed ||= !areEqualShallow(oldInfo, resource.data.info);\n\n const oldMetrics = resource.data.metrics;\n resource.data.metrics = this.getResourceMetrics(instance);\n _changed ||= !areEqualShallow(oldMetrics, resource.data.metrics);\n\n // TODO(dmaretskyi): Test if works and enable.\n // if (changed) {\n this._markResourceDirty(resource.data.id);\n // }\n }\n\n for (const subscription of this.subscriptions) {\n subscription.flush();\n }\n }\n\n //\n // Implementation\n //\n\n /**\n * @internal\n */\n _flushSpan(runtimeSpan: TracingSpan) {\n const span = runtimeSpan.serialize();\n this.spans.set(span.id, span);\n this.spanIdList.push(span.id);\n if (this.spanIdList.length > MAX_SPAN_RECORDS) {\n this._clearSpans();\n }\n this._markSpanDirty(span.id);\n }\n\n private _markResourceDirty(id: number) {\n for (const subscription of this.subscriptions) {\n subscription.dirtyResources.add(id);\n }\n }\n\n private _markSpanDirty(id: number) {\n for (const subscription of this.subscriptions) {\n subscription.dirtySpans.add(id);\n }\n }\n\n private _clearResources() {\n // TODO(dmaretskyi): Use FinalizationRegistry to delete finalized resources first.\n while (this.resourceIdList.length > MAX_RESOURCE_RECORDS) {\n const id = this.resourceIdList.shift()!;\n this.resources.delete(id);\n }\n }\n\n private _clearSpans() {\n while (this.spanIdList.length > MAX_SPAN_RECORDS) {\n const id = this.spanIdList.shift()!;\n this.spans.delete(id);\n }\n }\n\n private _pushLog(log: LogEntry) {\n this.logs.push(log);\n if (this.logs.length > MAX_LOG_RECORDS) {\n this.logs.shift();\n }\n\n for (const subscription of this.subscriptions) {\n subscription.newLogs.push(log);\n }\n }\n\n private _logProcessor: LogProcessor = (config, entry) => {\n switch (entry.level) {\n case LogLevel.ERROR:\n case LogLevel.WARN:\n case LogLevel.TRACE: {\n const scope = entry.meta?.S;\n const resource = this.resourceInstanceIndex.get(scope);\n if (!resource) {\n return;\n }\n\n const context = getContextFromEntry(entry) ?? {};\n for (const key of Object.keys(context)) {\n context[key] = sanitizeValue(context[key], 0, this);\n }\n\n const entryToPush: LogEntry = {\n level: entry.level,\n message: entry.message,\n context,\n timestamp: new Date(),\n meta: {\n file: entry.meta?.F ?? '',\n line: entry.meta?.L ?? 0,\n resourceId: resource.data.id,\n },\n };\n this._pushLog(entryToPush);\n break;\n }\n default:\n }\n };\n}\n\n// TODO(burdon): Comment.\nexport class TracingSpan {\n static nextId = 0;\n\n readonly id: number;\n readonly parentId: number | null = null;\n readonly methodName: string;\n readonly resourceId: number | null = null;\n startTs: number;\n endTs: number | null = null;\n error: SerializedError | null = null;\n\n private _showInBrowserTimeline: boolean;\n private readonly _ctx: Context | null = null;\n\n constructor(\n private _traceProcessor: TraceProcessor,\n params: TraceSpanParams,\n ) {\n this.id = TracingSpan.nextId++;\n this.methodName = params.methodName;\n this.resourceId = _traceProcessor.getResourceId(params.instance);\n this.startTs = performance.now();\n this._showInBrowserTimeline = params.showInBrowserTimeline;\n\n if (params.parentCtx) {\n this._ctx = params.parentCtx.derive({\n attributes: {\n [TRACE_SPAN_ATTRIBUTE]: this.id,\n },\n });\n const parentId = params.parentCtx.getAttribute(TRACE_SPAN_ATTRIBUTE);\n if (typeof parentId === 'number') {\n this.parentId = parentId;\n }\n }\n }\n\n get ctx(): Context | null {\n return this._ctx;\n }\n\n markSuccess() {\n this.endTs = performance.now();\n this._traceProcessor._flushSpan(this);\n\n if (this._showInBrowserTimeline) {\n this._markInBrowserTimeline();\n }\n }\n\n markError(err: unknown) {\n this.endTs = performance.now();\n this.error = serializeError(err);\n this._traceProcessor._flushSpan(this);\n\n if (this._showInBrowserTimeline) {\n this._markInBrowserTimeline();\n }\n }\n\n serialize(): Span {\n return {\n id: this.id,\n resourceId: this.resourceId ?? undefined,\n methodName: this.methodName,\n parentId: this.parentId ?? undefined,\n startTs: this.startTs.toFixed(3),\n endTs: this.endTs?.toFixed(3) ?? undefined,\n error: this.error ?? undefined,\n };\n }\n\n private _markInBrowserTimeline() {\n const resource = this._traceProcessor.resources.get(this.resourceId!);\n const name = resource\n ? `${resource.sanitizedClassName}#${resource.data.instanceId}.${this.methodName}`\n : this.methodName;\n performance.measure(name, { start: this.startTs, end: this.endTs! });\n }\n}\n\n// TODO(burdon): Log cause.\nconst serializeError = (err: unknown): SerializedError => {\n if (err instanceof Error) {\n return {\n name: err.name,\n message: err.message,\n };\n }\n\n return {\n message: String(err),\n };\n};\n\n// TODO(burdon): Rename singleton and move out of package.\nexport const TRACE_PROCESSOR: TraceProcessor = ((globalThis as any).TRACE_PROCESSOR ??= new TraceProcessor());\n\nconst sanitizeValue = (value: any, depth: number, traceProcessor: TraceProcessor): any => {\n switch (typeof value) {\n case 'string':\n case 'number':\n case 'boolean':\n case 'undefined':\n return value;\n case 'object':\n case 'function':\n if (value === null) {\n return value;\n }\n\n {\n const resourceEntry = traceProcessor.resourceInstanceIndex.get(value);\n if (resourceEntry) {\n return `${resourceEntry.sanitizedClassName}#${resourceEntry.data.instanceId}`;\n }\n }\n\n if (typeof value.toJSON === 'function') {\n // TODO(dmaretskyi): This has potential to cause infinite recursion.\n return sanitizeValue(value.toJSON(), depth, traceProcessor);\n }\n\n if (depth > 0) {\n if (isSetLike(value)) {\n return Object.fromEntries(\n Array.from(value.entries()).map((value) => sanitizeValue(value, depth - 1, traceProcessor)),\n );\n } else if (isMapLike(value)) {\n return Object.fromEntries(\n Array.from(value.entries()).map(([key, value]) => [key, sanitizeValue(value, depth - 1, traceProcessor)]),\n );\n } else if (Array.isArray(value)) {\n return value.map((item: any) => sanitizeValue(item, depth - 1, traceProcessor));\n } else if (typeof value === 'object') {\n const res: any = {};\n for (const key of Object.keys(value)) {\n res[key] = sanitizeValue(value[key], depth - 1, traceProcessor);\n }\n return res;\n }\n }\n\n // TODO(dmaretskyi): Expose trait.\n if (typeof value.truncate === 'function') {\n return value.truncate();\n }\n\n return value.toString();\n }\n};\n\nconst areEqualShallow = (a: any, b: any) => {\n for (const key in a) {\n if (!(key in b) || a[key] !== b[key]) {\n return false;\n }\n }\n for (const key in b) {\n if (!(key in a) || a[key] !== b[key]) {\n return false;\n }\n }\n return true;\n};\n\nexport const sanitizeClassName = (className: string) => {\n const SANITIZE_REGEX = /[^_](\\d+)$/;\n const m = className.match(SANITIZE_REGEX);\n if (!m) {\n return className;\n } else {\n return className.slice(0, -m[1].length);\n }\n};\n\nconst isSetLike = (value: any): value is Set<any> =>\n value instanceof Set ||\n (typeof value === 'object' && value !== null && Object.getPrototypeOf(value).constructor.name === 'ComplexSet');\n\nconst isMapLike = (value: any): value is Map<any, any> =>\n value instanceof Map ||\n (typeof value === 'object' && value !== null && Object.getPrototypeOf(value).constructor.name === 'ComplexMap');\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { Stream } from '@dxos/codec-protobuf';\nimport { type LogEntry } from '@dxos/protocols/proto/dxos/client/services';\nimport { type StreamTraceEvent, type TracingService } from '@dxos/protocols/proto/dxos/tracing';\n\nimport { type TraceProcessor, type TraceSubscription } from './trace-processor';\n\nexport class TraceSender implements TracingService {\n constructor(private _traceProcessor: TraceProcessor) {}\n\n streamTrace(request: void): Stream<StreamTraceEvent> {\n return new Stream(({ ctx, next }) => {\n const flushEvents = (resources: Set<number> | null, spans: Set<number> | null, logs: LogEntry[] | null) => {\n const event: StreamTraceEvent = {\n resourceAdded: [],\n resourceRemoved: [],\n spanAdded: [],\n logAdded: [],\n };\n\n if (resources) {\n for (const id of resources) {\n const entry = this._traceProcessor.resources.get(id);\n if (entry) {\n event.resourceAdded!.push({ resource: entry.data });\n } else {\n event.resourceRemoved!.push({ id });\n }\n }\n } else {\n for (const entry of this._traceProcessor.resources.values()) {\n event.resourceAdded!.push({ resource: entry.data });\n }\n }\n\n if (spans) {\n for (const id of spans) {\n const span = this._traceProcessor.spans.get(id);\n if (span) {\n event.spanAdded!.push({ span });\n }\n }\n } else {\n for (const span of this._traceProcessor.spans.values()) {\n event.spanAdded!.push({ span });\n }\n }\n\n if (logs) {\n for (const log of logs) {\n event.logAdded!.push({ log });\n }\n } else {\n for (const log of this._traceProcessor.logs) {\n event.logAdded!.push({ log });\n }\n }\n\n if (event.resourceAdded!.length > 0 || event.resourceRemoved!.length > 0 || event.spanAdded!.length > 0) {\n next(event);\n }\n };\n\n const flush = () => {\n flushEvents(subscription.dirtyResources, subscription.dirtySpans, subscription.newLogs);\n subscription.dirtyResources.clear();\n subscription.dirtySpans.clear();\n subscription.newLogs.length = 0;\n };\n\n const subscription: TraceSubscription = {\n flush,\n dirtyResources: new Set(),\n dirtySpans: new Set(),\n newLogs: [],\n };\n this._traceProcessor.subscriptions.add(subscription);\n ctx.onDispose(() => {\n this._traceProcessor.subscriptions.delete(subscription);\n });\n\n flushEvents(null, null, null);\n });\n }\n}\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { type Metric } from '@dxos/protocols/proto/dxos/tracing';\n\nexport abstract class BaseCounter {\n /**\n * @internal\n */\n _instance: any;\n\n name?: string;\n\n /**\n * @internal\n */\n _assign(instance: any, name: string) {\n this._instance = instance;\n this.name = name;\n }\n\n abstract getData(): Metric;\n\n _tick(time: number): void {}\n}\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { type Metric } from '@dxos/protocols/proto/dxos/tracing';\n\nimport { BaseCounter } from './base';\n\nexport class UnaryCounter extends BaseCounter {\n value = 0;\n units?: string;\n\n constructor({ units }: { units?: string } = {}) {\n super();\n this.units = units;\n }\n\n inc(by = 1) {\n this.value += by;\n }\n\n getData(): Metric {\n return {\n name: this.name!,\n counter: {\n value: this.value,\n units: this.units,\n },\n };\n }\n}\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { type Metric } from '@dxos/protocols/proto/dxos/tracing';\n\nimport { BaseCounter } from './base';\n\nconst MAX_BUCKETS = 60;\n\nexport class TimeSeriesCounter extends BaseCounter {\n private _currentValue = 0;\n private _totalValue = 0;\n private _buckets: number[] = [];\n units?: string;\n\n constructor({ units }: { units?: string } = {}) {\n super();\n this.units = units;\n }\n\n inc(by = 1) {\n this._currentValue += by;\n this._totalValue += by;\n }\n\n override _tick(time: number): void {\n this._buckets.push(this._currentValue);\n if (this._buckets.length > MAX_BUCKETS) {\n this._buckets.shift();\n }\n this._currentValue = 0;\n }\n\n override getData(): Metric {\n return {\n name: this.name!,\n timeSeries: {\n tracks: [\n {\n name: this.name!,\n units: this.units,\n points: this._buckets.map((value, index) => ({\n value,\n })),\n total: this._totalValue,\n },\n ],\n },\n };\n }\n}\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { type Metric } from '@dxos/protocols/proto/dxos/tracing';\n\nimport { BaseCounter } from './base';\n\nconst MAX_BUCKETS = 60;\n\nexport class TimeUsageCounter extends BaseCounter {\n private _currentValue = 0;\n private _totalValue = 0;\n private _buckets: number[] = [];\n\n private _lastTickTime = performance.now();\n\n record(time: number) {\n this._currentValue += time;\n this._totalValue += time;\n }\n\n beginRecording(): { end: () => void } {\n const start = performance.now();\n return {\n end: () => {\n const end = performance.now();\n this.record(end - start);\n },\n };\n }\n\n override _tick(time: number): void {\n const delta = time - this._lastTickTime;\n this._lastTickTime = time;\n\n const percentage = (this._currentValue / delta) * 100;\n this._buckets.push(percentage);\n if (this._buckets.length > MAX_BUCKETS) {\n this._buckets.shift();\n }\n this._currentValue = 0;\n }\n\n override getData(): Metric {\n return {\n name: this.name!,\n timeSeries: {\n tracks: [\n {\n name: this.name!,\n units: '%',\n points: this._buckets.map((value, index) => ({\n value,\n })),\n total: this._totalValue,\n },\n ],\n },\n };\n }\n}\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { type Metric } from '@dxos/protocols/proto/dxos/tracing';\n\nimport { BaseCounter } from './base';\n\nexport class MapCounter extends BaseCounter {\n values = new Map<string, number>();\n units?: string;\n\n constructor({ units }: { units?: string } = {}) {\n super();\n this.units = units;\n }\n\n inc(key: string, by = 1) {\n const prev = this.values.get(key) ?? 0;\n this.values.set(key, prev + by);\n }\n\n getData(): Metric {\n return {\n name: this.name!,\n multiCounter: {\n records: Array.from(this.values.entries()).map(([key, value]) => ({\n key,\n value,\n })),\n units: this.units,\n },\n };\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["Context", "symbolTracingContext", "Symbol", "getTracingContext", "target", "infoProperties", "metricsProperties", "TRACE_SPAN_ATTRIBUTE", "unrefTimeout", "LogLevel", "getContextFromEntry", "log", "getPrototypeSpecificInstanceId", "Stream", "TraceSender", "constructor", "_traceProcessor", "streamTrace", "request", "Stream", "ctx", "next", "flushEvents", "resources", "spans", "logs", "event", "resourceAdded", "resourceRemoved", "spanAdded", "logAdded", "id", "entry", "get", "push", "resource", "data", "values", "span", "log", "length", "flush", "subscription", "dirtyResources", "dirtySpans", "newLogs", "clear", "Set", "subscriptions", "add", "onDispose", "delete", "ResourceEntry", "constructor", "data", "instance", "annotation", "sanitizedClassName", "sanitizeClassName", "className", "getMetric", "name", "metrics", "find", "metric", "MAX_RESOURCE_RECORDS", "MAX_SPAN_RECORDS", "MAX_LOG_RECORDS", "REFRESH_INTERVAL", "MAX_INFO_OBJECT_DEPTH", "TraceProcessor", "subscriptions", "Set", "resources", "Map", "resourceInstanceIndex", "WeakMap", "resourceIdList", "spans", "spanIdList", "logs", "_logProcessor", "config", "entry", "level", "LogLevel", "ERROR", "WARN", "TRACE", "scope", "meta", "S", "resource", "get", "context", "getContextFromEntry", "key", "Object", "keys", "sanitizeValue", "entryToPush", "message", "timestamp", "Date", "file", "F", "line", "L", "resourceId", "id", "_pushLog", "log", "addProcessor", "bind", "refreshInterval", "setInterval", "refresh", "unrefTimeout", "createTraceResource", "params", "size", "tracingContext", "getTracingContext", "getPrototypeOf", "metricsProperties", "_assign", "instanceId", "getPrototypeSpecificInstanceId", "info", "getResourceInfo", "links", "getResourceMetrics", "WeakRef", "set", "push", "length", "_clearResources", "_markResourceDirty", "createTraceSender", "TraceSender", "traceSpan", "span", "TracingSpan", "_flushSpan", "addLink", "parent", "child", "opts", "getDiagnostics", "fromEntries", "Array", "from", "entries", "map", "values", "filter", "INFO", "res", "options", "infoProperties", "value", "enum", "depth", "undefined", "err", "_opts", "getData", "getResourceId", "findResourcesByClassName", "findResourcesByAnnotation", "deref", "time", "performance", "now", "_tick", "_changed", "oldInfo", "areEqualShallow", "oldMetrics", "subscription", "flush", "runtimeSpan", "serialize", "_clearSpans", "_markSpanDirty", "dirtyResources", "add", "dirtySpans", "shift", "delete", "newLogs", "nextId", "_traceProcessor", "parentId", "endTs", "error", "_ctx", "methodName", "startTs", "_showInBrowserTimeline", "showInBrowserTimeline", "parentCtx", "derive", "attributes", "TRACE_SPAN_ATTRIBUTE", "getAttribute", "ctx", "markSuccess", "_markInBrowserTimeline", "markError", "serializeError", "toFixed", "measure", "start", "end", "Error", "String", "TRACE_PROCESSOR", "globalThis", "traceProcessor", "resourceEntry", "toJSON", "isSetLike", "isMapLike", "isArray", "item", "truncate", "toString", "a", "b", "SANITIZE_REGEX", "m", "match", "slice", "resource", "options", "constructor", "klass", "rest", "TRACE_PROCESSOR", "createTraceResource", "annotation", "instance", "Object", "defineProperty", "value", "name", "info", "opts", "target", "propertyKey", "descriptor", "getTracingContext", "infoProperties", "mark", "performance", "span", "showInBrowserTimeline", "method", "args", "parentCtx", "Context", "traceSpan", "methodName", "callArgs", "ctx", "slice", "apply", "err", "markError", "markSuccess", "metricsCounter", "metricsProperties", "addLink", "parent", "child", "trace", "BaseCounter", "_assign", "instance", "name", "_instance", "_tick", "time", "UnaryCounter", "BaseCounter", "constructor", "units", "value", "inc", "by", "getData", "name", "counter", "MAX_BUCKETS", "TimeSeriesCounter", "BaseCounter", "constructor", "units", "_currentValue", "_totalValue", "_buckets", "inc", "by", "_tick", "time", "push", "length", "shift", "getData", "name", "timeSeries", "tracks", "points", "map", "value", "index", "total", "MAX_BUCKETS", "TimeUsageCounter", "BaseCounter", "_currentValue", "_totalValue", "_buckets", "_lastTickTime", "performance", "now", "record", "time", "beginRecording", "start", "end", "_tick", "delta", "percentage", "push", "length", "shift", "getData", "name", "timeSeries", "tracks", "units", "points", "map", "value", "index", "total", "MapCounter", "BaseCounter", "constructor", "units", "values", "Map", "inc", "key", "by", "prev", "get", "set", "getData", "name", "multiCounter", "records", "Array", "from", "entries", "map", "value"]
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":51824,"imports":[{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true},{"path":"packages/common/tracing/src/symbols.ts","kind":"import-statement","original":"./symbols"},{"path":"packages/common/tracing/src/trace-sender.ts","kind":"import-statement","original":"./trace-sender"}],"format":"esm"},"packages/common/tracing/src/api.ts":{"bytes":9411,"imports":[{"path":"@dxos/context","kind":"import-statement","external":true},{"path":"packages/common/tracing/src/symbols.ts","kind":"import-statement","original":"./symbols"},{"path":"packages/common/tracing/src/trace-processor.ts","kind":"import-statement","original":"./trace-processor"}],"format":"esm"},"packages/common/tracing/src/metrics/base.ts":{"bytes":1450,"imports":[],"format":"esm"},"packages/common/tracing/src/metrics/unary-counter.ts":{"bytes":2128,"imports":[{"path":"packages/common/tracing/src/metrics/base.ts","kind":"import-statement","original":"./base"}],"format":"esm"},"packages/common/tracing/src/metrics/time-series-counter.ts":{"bytes":4268,"imports":[{"path":"packages/common/tracing/src/metrics/base.ts","kind":"import-statement","original":"./base"}],"format":"esm"},"packages/common/tracing/src/metrics/time-usage-counter.ts":{"bytes":5249,"imports":[{"path":"packages/common/tracing/src/metrics/base.ts","kind":"import-statement","original":"./base"}],"format":"esm"},"packages/common/tracing/src/metrics/map-counter.ts":{"bytes":2977,"imports":[{"path":"packages/common/tracing/src/metrics/base.ts","kind":"import-statement","original":"./base"}],"format":"esm"},"packages/common/tracing/src/metrics/index.ts":{"bytes":892,"imports":[{"path":"packages/common/tracing/src/metrics/base.ts","kind":"import-statement","original":"./base"},{"path":"packages/common/tracing/src/metrics/unary-counter.ts","kind":"import-statement","original":"./unary-counter"},{"path":"packages/common/tracing/src/metrics/time-series-counter.ts","kind":"import-statement","original":"./time-series-counter"},{"path":"packages/common/tracing/src/metrics/time-usage-counter.ts","kind":"import-statement","original":"./time-usage-counter"},{"path":"packages/common/tracing/src/metrics/map-counter.ts","kind":"import-statement","original":"./map-counter"}],"format":"esm"},"packages/common/tracing/src/index.ts":{"bytes":831,"imports":[{"path":"packages/common/tracing/src/api.ts","kind":"import-statement","original":"./api"},{"path":"packages/common/tracing/src/symbols.ts","kind":"import-statement","original":"./symbols"},{"path":"packages/common/tracing/src/trace-processor.ts","kind":"import-statement","original":"./trace-processor"},{"path":"packages/common/tracing/src/trace-sender.ts","kind":"import-statement","original":"./trace-sender"},{"path":"packages/common/tracing/src/metrics/index.ts","kind":"import-statement","original":"./metrics"}],"format":"esm"}},"outputs":{"packages/common/tracing/dist/lib/browser/index.mjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":44718},"packages/common/tracing/dist/lib/browser/index.mjs":{"imports":[{"path":"@dxos/context","kind":"import-statement","external":true},{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true},{"path":"@dxos/codec-protobuf","kind":"import-statement","external":true}],"exports":["BaseCounter","MapCounter","ResourceEntry","TRACE_PROCESSOR","TRACE_SPAN_ATTRIBUTE","TimeSeriesCounter","TimeUsageCounter","TraceProcessor","TraceSender","TracingSpan","UnaryCounter","getTracingContext","sanitizeClassName","symbolTracingContext","trace"],"entryPoint":"packages/common/tracing/src/index.ts","inputs":{"packages/common/tracing/src/api.ts":{"bytesInOutput":1631},"packages/common/tracing/src/symbols.ts":{"bytesInOutput":245},"packages/common/tracing/src/trace-processor.ts":{"bytesInOutput":11951},"packages/common/tracing/src/trace-sender.ts":{"bytesInOutput":2555},"packages/common/tracing/src/index.ts":{"bytesInOutput":0},"packages/common/tracing/src/metrics/base.ts":{"bytesInOutput":159},"packages/common/tracing/src/metrics/index.ts":{"bytesInOutput":0},"packages/common/tracing/src/metrics/unary-counter.ts":{"bytesInOutput":324},"packages/common/tracing/src/metrics/time-series-counter.ts":{"bytesInOutput":812},"packages/common/tracing/src/metrics/time-usage-counter.ts":{"bytesInOutput":1136},"packages/common/tracing/src/metrics/map-counter.ts":{"bytesInOutput":509}},"bytes":20192}}}
@@ -153,13 +153,13 @@ var REFRESH_INTERVAL = 1e3;
153
153
  var MAX_INFO_OBJECT_DEPTH = 8;
154
154
  var TraceProcessor = class {
155
155
  constructor() {
156
+ this.subscriptions = /* @__PURE__ */ new Set();
156
157
  this.resources = /* @__PURE__ */ new Map();
157
158
  this.resourceInstanceIndex = /* @__PURE__ */ new WeakMap();
158
159
  this.resourceIdList = [];
159
160
  this.spans = /* @__PURE__ */ new Map();
160
161
  this.spanIdList = [];
161
162
  this.logs = [];
162
- this.subscriptions = /* @__PURE__ */ new Set();
163
163
  this._logProcessor = (config, entry) => {
164
164
  switch (entry.level) {
165
165
  case import_log.LogLevel.ERROR:
@@ -193,14 +193,18 @@ var TraceProcessor = class {
193
193
  };
194
194
  import_log.log.addProcessor(this._logProcessor.bind(this), void 0, {
195
195
  F: __dxlog_file,
196
- L: 81,
196
+ L: 87,
197
197
  S: this,
198
198
  C: (f, a) => f(...a)
199
199
  });
200
200
  const refreshInterval = setInterval(this.refresh.bind(this), REFRESH_INTERVAL);
201
201
  (0, import_async.unrefTimeout)(refreshInterval);
202
202
  }
203
- traceResourceConstructor(params) {
203
+ /**
204
+ * @internal
205
+ */
206
+ // TODO(burdon): Comment.
207
+ createTraceResource(params) {
204
208
  const id = this.resources.size;
205
209
  const tracingContext = getTracingContext(Object.getPrototypeOf(params.instance));
206
210
  for (const key of Object.keys(tracingContext.metricsProperties)) {
@@ -222,6 +226,33 @@ var TraceProcessor = class {
222
226
  }
223
227
  this._markResourceDirty(id);
224
228
  }
229
+ createTraceSender() {
230
+ return new TraceSender(this);
231
+ }
232
+ traceSpan(params) {
233
+ const span2 = new TracingSpan(this, params);
234
+ this._flushSpan(span2);
235
+ return span2;
236
+ }
237
+ // TODO(burdon): Not implemented.
238
+ addLink(parent, child, opts) {
239
+ }
240
+ //
241
+ // Getters
242
+ //
243
+ // TODO(burdon): Define type.
244
+ // TODO(burdon): Reconcile with system service.
245
+ getDiagnostics() {
246
+ this.refresh();
247
+ return {
248
+ resources: Object.fromEntries(Array.from(this.resources.entries()).map(([id, entry]) => [
249
+ `${entry.sanitizedClassName}#${entry.data.instanceId}`,
250
+ entry.data
251
+ ])),
252
+ spans: Array.from(this.spans.values()),
253
+ logs: this.logs.filter((log2) => log2.level >= import_log.LogLevel.INFO)
254
+ };
255
+ }
225
256
  getResourceInfo(instance) {
226
257
  const res = {};
227
258
  const tracingContext = getTracingContext(Object.getPrototypeOf(instance));
@@ -247,19 +278,19 @@ var TraceProcessor = class {
247
278
  }
248
279
  return res;
249
280
  }
250
- traceSpan(params) {
251
- const span2 = new TracingSpan(this, params);
252
- this._flushSpan(span2);
253
- return span2;
254
- }
255
- addLink(parent, child, opts) {
256
- }
257
281
  getResourceId(instance) {
258
282
  const entry = this.resourceInstanceIndex.get(instance);
259
283
  return entry ? entry.data.id : null;
260
284
  }
261
- createTraceSender() {
262
- return new TraceSender(this);
285
+ findResourcesByClassName(className) {
286
+ return [
287
+ ...this.resources.values()
288
+ ].filter((res) => res.data.className === className || res.sanitizedClassName === className);
289
+ }
290
+ findResourcesByAnnotation(annotation) {
291
+ return [
292
+ ...this.resources.values()
293
+ ].filter((res) => res.annotation === annotation);
263
294
  }
264
295
  refresh() {
265
296
  for (const resource2 of this.resources.values()) {
@@ -285,27 +316,9 @@ var TraceProcessor = class {
285
316
  subscription.flush();
286
317
  }
287
318
  }
288
- findResourcesByClassName(className) {
289
- return [
290
- ...this.resources.values()
291
- ].filter((r) => r.data.className === className || r.sanitizedClassName === className);
292
- }
293
- findByAnnotation(annotation) {
294
- return [
295
- ...this.resources.values()
296
- ].filter((r) => r.annotation === annotation);
297
- }
298
- getDiagnostics() {
299
- this.refresh();
300
- return {
301
- resources: Object.fromEntries(Array.from(this.resources.entries()).map(([id, entry]) => [
302
- `${entry.sanitizedClassName}#${entry.data.instanceId}`,
303
- entry.data
304
- ])),
305
- spans: Array.from(this.spans.values()),
306
- logs: this.logs.filter((log2) => log2.level >= import_log.LogLevel.INFO)
307
- };
308
- }
319
+ //
320
+ // Implementation
321
+ //
309
322
  /**
310
323
  * @internal
311
324
  */
@@ -435,7 +448,6 @@ var sanitizeValue = (value, depth, traceProcessor) => {
435
448
  case "boolean":
436
449
  case "undefined":
437
450
  return value;
438
- break;
439
451
  case "object":
440
452
  case "function":
441
453
  if (value === null) {
@@ -502,7 +514,7 @@ var resource = (options) => (constructor) => {
502
514
  const klass = /* @__PURE__ */ (() => class extends constructor {
503
515
  constructor(...rest) {
504
516
  super(...rest);
505
- TRACE_PROCESSOR.traceResourceConstructor({
517
+ TRACE_PROCESSOR.createTraceResource({
506
518
  constructor,
507
519
  annotation: options?.annotation,
508
520
  instance: this
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/api.ts", "../../../src/symbols.ts", "../../../src/trace-processor.ts", "../../../src/trace-sender.ts", "../../../src/metrics/base.ts", "../../../src/metrics/unary-counter.ts", "../../../src/metrics/time-series-counter.ts", "../../../src/metrics/time-usage-counter.ts", "../../../src/metrics/map-counter.ts"],
4
- "sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nimport { Context } from '@dxos/context';\n\nimport { getTracingContext } from './symbols';\nimport { TRACE_PROCESSOR } from './trace-processor';\n\n/**\n * Annotates a class as a tracked resource.\n */\nconst resource =\n (options?: { annotation?: symbol }) =>\n <T extends { new (...args: any[]): {} }>(constructor: T) => {\n // Wrapping class declaration into an IIFE so it doesn't capture the `klass` class name.\n const klass = (() =>\n class extends constructor {\n constructor(...rest: any[]) {\n super(...rest);\n TRACE_PROCESSOR.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 (options?: { annotation?: symbol }) =>\n <T extends { new (...args: any[]): {} }>(constructor: T) => {\n // Wrapping class declaration into an IIFE so it doesn't capture the `klass` class name.\n const klass = (() =>\n class extends constructor {\n constructor(...rest: any[]) {\n super(...rest);\n TRACE_PROCESSOR.createTraceResource({ constructor, annotation: options?.annotation, instance: this });\n }\n })();\n Object.defineProperty(klass, 'name', { value: constructor.name });\n return klass;\n };\n\nexport type InfoOptions = {\n /**\n * Value is of enum type and should be converted to string.\n *\n * Example:\n *\n * ```ts\n * @trace.info({ enum: SpaceState })\n * get state(): SpaceState { ... }\n * ```\n */\n enum?: Record<string, any>;\n\n /**\n * Max depth of the object to be included in the resource info section.\n *\n * null means no limit (a limit of 8 nested objects is still imposed).\n *\n * Default: 0 - objects will be stringified with toString.\n */\n depth?: number | null;\n};\n\n/**\n * Marks a property or a method to be included in the resource info section.\n */\nconst info =\n (opts: InfoOptions = {}) =>\n (target: any, propertyKey: string, descriptor?: PropertyDescriptor) => {\n getTracingContext(target).infoProperties[propertyKey] = { options: opts };\n };\n\nconst mark = (name: string) => {\n performance.mark(name);\n};\n\nexport type SpanOptions = {\n showInBrowserTimeline?: boolean;\n};\n\nconst span =\n ({ showInBrowserTimeline = false }: SpanOptions = {}) =>\n (target: any, propertyKey: string, descriptor: TypedPropertyDescriptor<(...args: any) => any>) => {\n const method = descriptor.value!;\n\n descriptor.value = async function (this: any, ...args: any) {\n const parentCtx = args[0] instanceof Context ? args[0] : null;\n const span = TRACE_PROCESSOR.traceSpan({\n parentCtx,\n methodName: propertyKey,\n instance: this,\n showInBrowserTimeline,\n });\n\n const callArgs = span.ctx ? [span.ctx, ...args.slice(1)] : args;\n try {\n return await method.apply(this, callArgs);\n } catch (err) {\n span.markError(err);\n throw err;\n } finally {\n span.markSuccess();\n }\n };\n };\n\n/**\n * Attaches metrics counter to the resource.\n */\nconst metricsCounter = () => (target: any, propertyKey: string, descriptor?: PropertyDescriptor) => {\n getTracingContext(target).metricsProperties[propertyKey] = {};\n};\n\nexport type AddLinkOptions = {};\n\nconst addLink = (parent: any, child: any, opts: AddLinkOptions = {}) => {\n TRACE_PROCESSOR.addLink(parent, child, opts);\n};\n\nexport const trace = {\n resource,\n info,\n mark,\n span,\n metricsCounter,\n\n addLink,\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { type InfoOptions } from './api';\n\nexport const symbolTracingContext = Symbol('dxos.tracing.context');\n\nexport type TracingContext = {\n infoProperties: Record<\n string,\n {\n options: InfoOptions;\n }\n >;\n metricsProperties: Record<string, {}>;\n};\n\nexport const getTracingContext = (target: any): TracingContext => {\n return ((target[symbolTracingContext] as TracingContext | undefined) ??= {\n infoProperties: {},\n metricsProperties: {},\n });\n};\n\nexport const TRACE_SPAN_ATTRIBUTE = 'dxos.trace-span';\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { unrefTimeout } from '@dxos/async';\nimport { type Context } from '@dxos/context';\nimport { LogLevel, type LogProcessor, getContextFromEntry, log } from '@dxos/log';\nimport { type LogEntry } from '@dxos/protocols/proto/dxos/client/services';\nimport { type Error as SerializedError } from '@dxos/protocols/proto/dxos/error';\nimport { type Metric, type Resource, type Span } from '@dxos/protocols/proto/dxos/tracing';\nimport { getPrototypeSpecificInstanceId } from '@dxos/util';\n\nimport type { AddLinkOptions } from './api';\nimport { type BaseCounter } from './metrics';\nimport { TRACE_SPAN_ATTRIBUTE, getTracingContext } from './symbols';\nimport { TraceSender } from './trace-sender';\n\nexport type Diagnostics = {\n resources: Record<string, Resource>;\n spans: Span[];\n logs: LogEntry[];\n};\n\nexport type TraceResourceConstructorParams = {\n constructor: { new (...args: any[]): {} };\n instance: any;\n annotation?: symbol;\n};\n\nexport type TraceSpanParams = {\n instance: any;\n methodName: string;\n parentCtx: Context | null;\n showInBrowserTimeline: boolean;\n};\n\nexport class ResourceEntry {\n /**\n * Sometimes bundlers mangle class names: WebFile -> WebFile2.\n *\n * We use a heuristic to remove the suffix.\n */\n public readonly sanitizedClassName: string;\n\n constructor(\n public readonly data: Resource,\n public readonly instance: WeakRef<any>,\n public readonly annotation?: symbol,\n ) {\n this.sanitizedClassName = sanitizeClassName(data.className);\n }\n\n getMetric(name: string): Metric | undefined {\n return this.data.metrics?.find((metric) => metric.name === name);\n }\n}\n\nexport type TraceSubscription = {\n flush: () => void;\n\n dirtyResources: Set<number>;\n dirtySpans: Set<number>;\n newLogs: LogEntry[];\n};\n\nconst MAX_RESOURCE_RECORDS = 2_000;\nconst MAX_SPAN_RECORDS = 1_000;\nconst MAX_LOG_RECORDS = 1_000;\n\nconst REFRESH_INTERVAL = 1_000;\n\nconst MAX_INFO_OBJECT_DEPTH = 8;\n\nexport class TraceProcessor {\n readonly subscriptions: Set<TraceSubscription> = new Set();\n\n readonly resources = new Map<number, ResourceEntry>();\n readonly resourceInstanceIndex = new WeakMap<any, ResourceEntry>();\n readonly resourceIdList: number[] = [];\n\n readonly spans = new Map<number, Span>();\n readonly spanIdList: number[] = [];\n\n readonly logs: LogEntry[] = [];\n\n constructor() {\n log.addProcessor(this._logProcessor.bind(this));\n\n const refreshInterval = setInterval(this.refresh.bind(this), REFRESH_INTERVAL);\n unrefTimeout(refreshInterval);\n }\n\n /**\n * @internal\n */\n // TODO(burdon): Comment.\n createTraceResource(params: TraceResourceConstructorParams) {\n const id = this.resources.size;\n\n // Init metrics counters.\n const tracingContext = getTracingContext(Object.getPrototypeOf(params.instance));\n for (const key of Object.keys(tracingContext.metricsProperties)) {\n (params.instance[key] as BaseCounter)._assign(params.instance, key);\n }\n\n const entry = new ResourceEntry(\n {\n id,\n className: params.constructor.name,\n instanceId: getPrototypeSpecificInstanceId(params.instance),\n info: this.getResourceInfo(params.instance),\n links: [],\n metrics: this.getResourceMetrics(params.instance),\n },\n new WeakRef(params.instance),\n params.annotation,\n );\n\n this.resources.set(id, entry);\n this.resourceInstanceIndex.set(params.instance, entry);\n this.resourceIdList.push(id);\n if (this.resourceIdList.length > MAX_RESOURCE_RECORDS) {\n this._clearResources();\n }\n\n this._markResourceDirty(id);\n }\n\n createTraceSender() {\n return new TraceSender(this);\n }\n\n traceSpan(params: TraceSpanParams): TracingSpan {\n const span = new TracingSpan(this, params);\n this._flushSpan(span);\n return span;\n }\n\n // TODO(burdon): Not implemented.\n addLink(parent: any, child: any, opts: AddLinkOptions) {}\n\n //\n // Getters\n //\n\n // TODO(burdon): Define type.\n // TODO(burdon): Reconcile with system service.\n getDiagnostics(): Diagnostics {\n this.refresh();\n\n return {\n resources: Object.fromEntries(\n Array.from(this.resources.entries()).map(([id, entry]) => [\n `${entry.sanitizedClassName}#${entry.data.instanceId}`,\n entry.data,\n ]),\n ),\n spans: Array.from(this.spans.values()),\n logs: this.logs.filter((log) => log.level >= LogLevel.INFO),\n };\n }\n\n getResourceInfo(instance: any): Record<string, any> {\n const res: Record<string, any> = {};\n const tracingContext = getTracingContext(Object.getPrototypeOf(instance));\n for (const [key, { options }] of Object.entries(tracingContext.infoProperties)) {\n try {\n const value = typeof instance[key] === 'function' ? instance[key]() : instance[key];\n if (options.enum) {\n res[key] = options.enum[value];\n } else {\n res[key] = sanitizeValue(\n value,\n options.depth === undefined ? 1 : options.depth ?? MAX_INFO_OBJECT_DEPTH,\n this,\n );\n }\n } catch (err: any) {\n res[key] = err.message;\n }\n }\n\n return res;\n }\n\n getResourceMetrics(instance: any): Metric[] {\n const res: Metric[] = [];\n const tracingContext = getTracingContext(Object.getPrototypeOf(instance));\n for (const [key, _opts] of Object.entries(tracingContext.metricsProperties)) {\n res.push(instance[key].getData());\n }\n\n return res;\n }\n\n getResourceId(instance: any): number | null {\n const entry = this.resourceInstanceIndex.get(instance);\n return entry ? entry.data.id : null;\n }\n\n findResourcesByClassName(className: string): ResourceEntry[] {\n return [...this.resources.values()].filter(\n (res) => res.data.className === className || res.sanitizedClassName === className,\n );\n }\n\n findResourcesByAnnotation(annotation: symbol): ResourceEntry[] {\n return [...this.resources.values()].filter((res) => res.annotation === annotation);\n }\n\n refresh() {\n for (const resource of this.resources.values()) {\n const instance = resource.instance.deref();\n if (!instance) {\n continue;\n }\n\n const tracingContext = getTracingContext(Object.getPrototypeOf(instance));\n const time = performance.now();\n for (const key of Object.keys(tracingContext.metricsProperties)) {\n (instance[key] as BaseCounter)._tick?.(time);\n }\n\n let _changed = false;\n\n const oldInfo = resource.data.info;\n resource.data.info = this.getResourceInfo(instance);\n _changed ||= !areEqualShallow(oldInfo, resource.data.info);\n\n const oldMetrics = resource.data.metrics;\n resource.data.metrics = this.getResourceMetrics(instance);\n _changed ||= !areEqualShallow(oldMetrics, resource.data.metrics);\n\n // TODO(dmaretskyi): Test if works and enable.\n // if (changed) {\n this._markResourceDirty(resource.data.id);\n // }\n }\n\n for (const subscription of this.subscriptions) {\n subscription.flush();\n }\n }\n\n //\n // Implementation\n //\n\n /**\n * @internal\n */\n _flushSpan(runtimeSpan: TracingSpan) {\n const span = runtimeSpan.serialize();\n this.spans.set(span.id, span);\n this.spanIdList.push(span.id);\n if (this.spanIdList.length > MAX_SPAN_RECORDS) {\n this._clearSpans();\n }\n this._markSpanDirty(span.id);\n }\n\n private _markResourceDirty(id: number) {\n for (const subscription of this.subscriptions) {\n subscription.dirtyResources.add(id);\n }\n }\n\n private _markSpanDirty(id: number) {\n for (const subscription of this.subscriptions) {\n subscription.dirtySpans.add(id);\n }\n }\n\n private _clearResources() {\n // TODO(dmaretskyi): Use FinalizationRegistry to delete finalized resources first.\n while (this.resourceIdList.length > MAX_RESOURCE_RECORDS) {\n const id = this.resourceIdList.shift()!;\n this.resources.delete(id);\n }\n }\n\n private _clearSpans() {\n while (this.spanIdList.length > MAX_SPAN_RECORDS) {\n const id = this.spanIdList.shift()!;\n this.spans.delete(id);\n }\n }\n\n private _pushLog(log: LogEntry) {\n this.logs.push(log);\n if (this.logs.length > MAX_LOG_RECORDS) {\n this.logs.shift();\n }\n\n for (const subscription of this.subscriptions) {\n subscription.newLogs.push(log);\n }\n }\n\n private _logProcessor: LogProcessor = (config, entry) => {\n switch (entry.level) {\n case LogLevel.ERROR:\n case LogLevel.WARN:\n case LogLevel.TRACE: {\n const scope = entry.meta?.S;\n const resource = this.resourceInstanceIndex.get(scope);\n if (!resource) {\n return;\n }\n\n const context = getContextFromEntry(entry) ?? {};\n for (const key of Object.keys(context)) {\n context[key] = sanitizeValue(context[key], 0, this);\n }\n\n const entryToPush: LogEntry = {\n level: entry.level,\n message: entry.message,\n context,\n timestamp: new Date(),\n meta: {\n file: entry.meta?.F ?? '',\n line: entry.meta?.L ?? 0,\n resourceId: resource.data.id,\n },\n };\n this._pushLog(entryToPush);\n break;\n }\n default:\n }\n };\n}\n\n// TODO(burdon): Comment.\nexport class TracingSpan {\n static nextId = 0;\n\n readonly id: number;\n readonly parentId: number | null = null;\n readonly methodName: string;\n readonly resourceId: number | null = null;\n startTs: number;\n endTs: number | null = null;\n error: SerializedError | null = null;\n\n private _showInBrowserTimeline: boolean;\n private readonly _ctx: Context | null = null;\n\n constructor(\n private _traceProcessor: TraceProcessor,\n params: TraceSpanParams,\n ) {\n this.id = TracingSpan.nextId++;\n this.methodName = params.methodName;\n this.resourceId = _traceProcessor.getResourceId(params.instance);\n this.startTs = performance.now();\n this._showInBrowserTimeline = params.showInBrowserTimeline;\n\n if (params.parentCtx) {\n this._ctx = params.parentCtx.derive({\n attributes: {\n [TRACE_SPAN_ATTRIBUTE]: this.id,\n },\n });\n const parentId = params.parentCtx.getAttribute(TRACE_SPAN_ATTRIBUTE);\n if (typeof parentId === 'number') {\n this.parentId = parentId;\n }\n }\n }\n\n get ctx(): Context | null {\n return this._ctx;\n }\n\n markSuccess() {\n this.endTs = performance.now();\n this._traceProcessor._flushSpan(this);\n\n if (this._showInBrowserTimeline) {\n this._markInBrowserTimeline();\n }\n }\n\n markError(err: unknown) {\n this.endTs = performance.now();\n this.error = serializeError(err);\n this._traceProcessor._flushSpan(this);\n\n if (this._showInBrowserTimeline) {\n this._markInBrowserTimeline();\n }\n }\n\n serialize(): Span {\n return {\n id: this.id,\n resourceId: this.resourceId ?? undefined,\n methodName: this.methodName,\n parentId: this.parentId ?? undefined,\n startTs: this.startTs.toFixed(3),\n endTs: this.endTs?.toFixed(3) ?? undefined,\n error: this.error ?? undefined,\n };\n }\n\n private _markInBrowserTimeline() {\n const resource = this._traceProcessor.resources.get(this.resourceId!);\n const name = resource\n ? `${resource.sanitizedClassName}#${resource.data.instanceId}.${this.methodName}`\n : this.methodName;\n performance.measure(name, { start: this.startTs, end: this.endTs! });\n }\n}\n\n// TODO(burdon): Log cause.\nconst serializeError = (err: unknown): SerializedError => {\n if (err instanceof Error) {\n return {\n name: err.name,\n message: err.message,\n };\n }\n\n return {\n message: String(err),\n };\n};\n\n// TODO(burdon): Rename singleton and move out of package.\nexport const TRACE_PROCESSOR: TraceProcessor = ((globalThis as any).TRACE_PROCESSOR ??= new TraceProcessor());\n\nconst sanitizeValue = (value: any, depth: number, traceProcessor: TraceProcessor): any => {\n switch (typeof value) {\n case 'string':\n case 'number':\n case 'boolean':\n case 'undefined':\n return value;\n case 'object':\n case 'function':\n if (value === null) {\n return value;\n }\n\n {\n const resourceEntry = traceProcessor.resourceInstanceIndex.get(value);\n if (resourceEntry) {\n return `${resourceEntry.sanitizedClassName}#${resourceEntry.data.instanceId}`;\n }\n }\n\n if (typeof value.toJSON === 'function') {\n // TODO(dmaretskyi): This has potential to cause infinite recursion.\n return sanitizeValue(value.toJSON(), depth, traceProcessor);\n }\n\n if (depth > 0) {\n if (isSetLike(value)) {\n return Object.fromEntries(\n Array.from(value.entries()).map((value) => sanitizeValue(value, depth - 1, traceProcessor)),\n );\n } else if (isMapLike(value)) {\n return Object.fromEntries(\n Array.from(value.entries()).map(([key, value]) => [key, sanitizeValue(value, depth - 1, traceProcessor)]),\n );\n } else if (Array.isArray(value)) {\n return value.map((item: any) => sanitizeValue(item, depth - 1, traceProcessor));\n } else if (typeof value === 'object') {\n const res: any = {};\n for (const key of Object.keys(value)) {\n res[key] = sanitizeValue(value[key], depth - 1, traceProcessor);\n }\n return res;\n }\n }\n\n // TODO(dmaretskyi): Expose trait.\n if (typeof value.truncate === 'function') {\n return value.truncate();\n }\n\n return value.toString();\n }\n};\n\nconst areEqualShallow = (a: any, b: any) => {\n for (const key in a) {\n if (!(key in b) || a[key] !== b[key]) {\n return false;\n }\n }\n for (const key in b) {\n if (!(key in a) || a[key] !== b[key]) {\n return false;\n }\n }\n return true;\n};\n\nexport const sanitizeClassName = (className: string) => {\n const SANITIZE_REGEX = /[^_](\\d+)$/;\n const m = className.match(SANITIZE_REGEX);\n if (!m) {\n return className;\n } else {\n return className.slice(0, -m[1].length);\n }\n};\n\nconst isSetLike = (value: any): value is Set<any> =>\n value instanceof Set ||\n (typeof value === 'object' && value !== null && Object.getPrototypeOf(value).constructor.name === 'ComplexSet');\n\nconst isMapLike = (value: any): value is Map<any, any> =>\n value instanceof Map ||\n (typeof value === 'object' && value !== null && Object.getPrototypeOf(value).constructor.name === 'ComplexMap');\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { Stream } from '@dxos/codec-protobuf';\nimport { type LogEntry } from '@dxos/protocols/proto/dxos/client/services';\nimport { type StreamTraceEvent, type TracingService } from '@dxos/protocols/proto/dxos/tracing';\n\nimport { type TraceProcessor, type TraceSubscription } from './trace-processor';\n\nexport class TraceSender implements TracingService {\n constructor(private _traceProcessor: TraceProcessor) {}\n\n streamTrace(request: void): Stream<StreamTraceEvent> {\n return new Stream(({ ctx, next }) => {\n const flushEvents = (resources: Set<number> | null, spans: Set<number> | null, logs: LogEntry[] | null) => {\n const event: StreamTraceEvent = {\n resourceAdded: [],\n resourceRemoved: [],\n spanAdded: [],\n logAdded: [],\n };\n\n if (resources) {\n for (const id of resources) {\n const entry = this._traceProcessor.resources.get(id);\n if (entry) {\n event.resourceAdded!.push({ resource: entry.data });\n } else {\n event.resourceRemoved!.push({ id });\n }\n }\n } else {\n for (const entry of this._traceProcessor.resources.values()) {\n event.resourceAdded!.push({ resource: entry.data });\n }\n }\n\n if (spans) {\n for (const id of spans) {\n const span = this._traceProcessor.spans.get(id);\n if (span) {\n event.spanAdded!.push({ span });\n }\n }\n } else {\n for (const span of this._traceProcessor.spans.values()) {\n event.spanAdded!.push({ span });\n }\n }\n\n if (logs) {\n for (const log of logs) {\n event.logAdded!.push({ log });\n }\n } else {\n for (const log of this._traceProcessor.logs) {\n event.logAdded!.push({ log });\n }\n }\n\n if (event.resourceAdded!.length > 0 || event.resourceRemoved!.length > 0 || event.spanAdded!.length > 0) {\n next(event);\n }\n };\n\n const flush = () => {\n flushEvents(subscription.dirtyResources, subscription.dirtySpans, subscription.newLogs);\n subscription.dirtyResources.clear();\n subscription.dirtySpans.clear();\n subscription.newLogs.length = 0;\n };\n\n const subscription: TraceSubscription = {\n flush,\n dirtyResources: new Set(),\n dirtySpans: new Set(),\n newLogs: [],\n };\n this._traceProcessor.subscriptions.add(subscription);\n ctx.onDispose(() => {\n this._traceProcessor.subscriptions.delete(subscription);\n });\n\n flushEvents(null, null, null);\n });\n }\n}\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { type Metric } from '@dxos/protocols/proto/dxos/tracing';\n\nexport abstract class BaseCounter {\n /**\n * @internal\n */\n _instance: any;\n\n name?: string;\n\n /**\n * @internal\n */\n _assign(instance: any, name: string) {\n this._instance = instance;\n this.name = name;\n }\n\n abstract getData(): Metric;\n\n _tick(time: number): void {}\n}\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { type Metric } from '@dxos/protocols/proto/dxos/tracing';\n\nimport { BaseCounter } from './base';\n\nexport class UnaryCounter extends BaseCounter {\n value = 0;\n units?: string;\n\n constructor({ units }: { units?: string } = {}) {\n super();\n this.units = units;\n }\n\n inc(by = 1) {\n this.value += by;\n }\n\n getData(): Metric {\n return {\n name: this.name!,\n counter: {\n value: this.value,\n units: this.units,\n },\n };\n }\n}\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { type Metric } from '@dxos/protocols/proto/dxos/tracing';\n\nimport { BaseCounter } from './base';\n\nconst MAX_BUCKETS = 60;\n\nexport class TimeSeriesCounter extends BaseCounter {\n private _currentValue = 0;\n private _totalValue = 0;\n private _buckets: number[] = [];\n units?: string;\n\n constructor({ units }: { units?: string } = {}) {\n super();\n this.units = units;\n }\n\n inc(by = 1) {\n this._currentValue += by;\n this._totalValue += by;\n }\n\n override _tick(time: number): void {\n this._buckets.push(this._currentValue);\n if (this._buckets.length > MAX_BUCKETS) {\n this._buckets.shift();\n }\n this._currentValue = 0;\n }\n\n override getData(): Metric {\n return {\n name: this.name!,\n timeSeries: {\n tracks: [\n {\n name: this.name!,\n units: this.units,\n points: this._buckets.map((value, index) => ({\n value,\n })),\n total: this._totalValue,\n },\n ],\n },\n };\n }\n}\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { type Metric } from '@dxos/protocols/proto/dxos/tracing';\n\nimport { BaseCounter } from './base';\n\nconst MAX_BUCKETS = 60;\n\nexport class TimeUsageCounter extends BaseCounter {\n private _currentValue = 0;\n private _totalValue = 0;\n private _buckets: number[] = [];\n\n private _lastTickTime = performance.now();\n\n record(time: number) {\n this._currentValue += time;\n this._totalValue += time;\n }\n\n beginRecording(): { end: () => void } {\n const start = performance.now();\n return {\n end: () => {\n const end = performance.now();\n this.record(end - start);\n },\n };\n }\n\n override _tick(time: number): void {\n const delta = time - this._lastTickTime;\n this._lastTickTime = time;\n\n const percentage = (this._currentValue / delta) * 100;\n this._buckets.push(percentage);\n if (this._buckets.length > MAX_BUCKETS) {\n this._buckets.shift();\n }\n this._currentValue = 0;\n }\n\n override getData(): Metric {\n return {\n name: this.name!,\n timeSeries: {\n tracks: [\n {\n name: this.name!,\n units: '%',\n points: this._buckets.map((value, index) => ({\n value,\n })),\n total: this._totalValue,\n },\n ],\n },\n };\n }\n}\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { type Metric } from '@dxos/protocols/proto/dxos/tracing';\n\nimport { BaseCounter } from './base';\n\nexport class MapCounter extends BaseCounter {\n values = new Map<string, number>();\n units?: string;\n\n constructor({ units }: { units?: string } = {}) {\n super();\n this.units = units;\n }\n\n inc(key: string, by = 1) {\n const prev = this.values.get(key) ?? 0;\n this.values.set(key, prev + by);\n }\n\n getData(): Metric {\n return {\n name: this.name!,\n multiCounter: {\n records: Array.from(this.values.entries()).map(([key, value]) => ({\n key,\n value,\n })),\n units: this.units,\n },\n };\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["symbolTracingContext", "Symbol", "getTracingContext", "target", "infoProperties", "metricsProperties", "TRACE_SPAN_ATTRIBUTE", "TraceSender", "constructor", "_traceProcessor", "streamTrace", "request", "Stream", "ctx", "next", "flushEvents", "resources", "spans", "logs", "event", "resourceAdded", "resourceRemoved", "spanAdded", "logAdded", "id", "entry", "get", "push", "resource", "data", "values", "span", "log", "length", "flush", "subscription", "dirtyResources", "dirtySpans", "newLogs", "clear", "Set", "subscriptions", "add", "onDispose", "delete", "ResourceEntry", "instance", "annotation", "sanitizedClassName", "sanitizeClassName", "className", "getMetric", "name", "metrics", "find", "metric", "MAX_RESOURCE_RECORDS", "MAX_SPAN_RECORDS", "MAX_LOG_RECORDS", "REFRESH_INTERVAL", "MAX_INFO_OBJECT_DEPTH", "TraceProcessor", "Map", "resourceInstanceIndex", "WeakMap", "resourceIdList", "spanIdList", "_logProcessor", "config", "level", "LogLevel", "ERROR", "WARN", "TRACE", "scope", "meta", "S", "context", "getContextFromEntry", "key", "Object", "keys", "sanitizeValue", "entryToPush", "message", "timestamp", "Date", "file", "F", "line", "L", "resourceId", "_pushLog", "addProcessor", "bind", "refreshInterval", "setInterval", "refresh", "unrefTimeout", "createTraceResource", "params", "size", "tracingContext", "getPrototypeOf", "_assign", "instanceId", "getPrototypeSpecificInstanceId", "info", "getResourceInfo", "links", "getResourceMetrics", "WeakRef", "set", "_clearResources", "_markResourceDirty", "createTraceSender", "traceSpan", "TracingSpan", "_flushSpan", "addLink", "parent", "child", "opts", "getDiagnostics", "fromEntries", "Array", "from", "entries", "map", "filter", "INFO", "res", "options", "value", "enum", "depth", "undefined", "err", "_opts", "getData", "getResourceId", "findResourcesByClassName", "findResourcesByAnnotation", "deref", "time", "performance", "now", "_tick", "_changed", "oldInfo", "areEqualShallow", "oldMetrics", "runtimeSpan", "serialize", "_clearSpans", "_markSpanDirty", "shift", "nextId", "parentId", "endTs", "error", "_ctx", "methodName", "startTs", "_showInBrowserTimeline", "showInBrowserTimeline", "parentCtx", "derive", "attributes", "getAttribute", "markSuccess", "_markInBrowserTimeline", "markError", "serializeError", "toFixed", "measure", "start", "end", "Error", "String", "TRACE_PROCESSOR", "globalThis", "traceProcessor", "resourceEntry", "toJSON", "isSetLike", "isMapLike", "isArray", "item", "truncate", "toString", "a", "b", "SANITIZE_REGEX", "m", "match", "slice", "klass", "rest", "defineProperty", "propertyKey", "descriptor", "mark", "method", "args", "Context", "callArgs", "apply", "metricsCounter", "trace", "BaseCounter", "_instance", "UnaryCounter", "units", "inc", "by", "counter", "MAX_BUCKETS", "TimeSeriesCounter", "_currentValue", "_totalValue", "_buckets", "timeSeries", "tracks", "points", "index", "total", "TimeUsageCounter", "_lastTickTime", "record", "beginRecording", "delta", "percentage", "MapCounter", "prev", "multiCounter", "records"]
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":51824,"imports":[{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true},{"path":"packages/common/tracing/src/symbols.ts","kind":"import-statement","original":"./symbols"},{"path":"packages/common/tracing/src/trace-sender.ts","kind":"import-statement","original":"./trace-sender"}],"format":"esm"},"packages/common/tracing/src/api.ts":{"bytes":9411,"imports":[{"path":"@dxos/context","kind":"import-statement","external":true},{"path":"packages/common/tracing/src/symbols.ts","kind":"import-statement","original":"./symbols"},{"path":"packages/common/tracing/src/trace-processor.ts","kind":"import-statement","original":"./trace-processor"}],"format":"esm"},"packages/common/tracing/src/metrics/base.ts":{"bytes":1450,"imports":[],"format":"esm"},"packages/common/tracing/src/metrics/unary-counter.ts":{"bytes":2128,"imports":[{"path":"packages/common/tracing/src/metrics/base.ts","kind":"import-statement","original":"./base"}],"format":"esm"},"packages/common/tracing/src/metrics/time-series-counter.ts":{"bytes":4268,"imports":[{"path":"packages/common/tracing/src/metrics/base.ts","kind":"import-statement","original":"./base"}],"format":"esm"},"packages/common/tracing/src/metrics/time-usage-counter.ts":{"bytes":5249,"imports":[{"path":"packages/common/tracing/src/metrics/base.ts","kind":"import-statement","original":"./base"}],"format":"esm"},"packages/common/tracing/src/metrics/map-counter.ts":{"bytes":2977,"imports":[{"path":"packages/common/tracing/src/metrics/base.ts","kind":"import-statement","original":"./base"}],"format":"esm"},"packages/common/tracing/src/metrics/index.ts":{"bytes":892,"imports":[{"path":"packages/common/tracing/src/metrics/base.ts","kind":"import-statement","original":"./base"},{"path":"packages/common/tracing/src/metrics/unary-counter.ts","kind":"import-statement","original":"./unary-counter"},{"path":"packages/common/tracing/src/metrics/time-series-counter.ts","kind":"import-statement","original":"./time-series-counter"},{"path":"packages/common/tracing/src/metrics/time-usage-counter.ts","kind":"import-statement","original":"./time-usage-counter"},{"path":"packages/common/tracing/src/metrics/map-counter.ts","kind":"import-statement","original":"./map-counter"}],"format":"esm"},"packages/common/tracing/src/index.ts":{"bytes":831,"imports":[{"path":"packages/common/tracing/src/api.ts","kind":"import-statement","original":"./api"},{"path":"packages/common/tracing/src/symbols.ts","kind":"import-statement","original":"./symbols"},{"path":"packages/common/tracing/src/trace-processor.ts","kind":"import-statement","original":"./trace-processor"},{"path":"packages/common/tracing/src/trace-sender.ts","kind":"import-statement","original":"./trace-sender"},{"path":"packages/common/tracing/src/metrics/index.ts","kind":"import-statement","original":"./metrics"}],"format":"esm"}},"outputs":{"packages/common/tracing/dist/lib/node/index.cjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":44718},"packages/common/tracing/dist/lib/node/index.cjs":{"imports":[{"path":"@dxos/context","kind":"import-statement","external":true},{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true},{"path":"@dxos/codec-protobuf","kind":"import-statement","external":true}],"exports":["BaseCounter","MapCounter","ResourceEntry","TRACE_PROCESSOR","TRACE_SPAN_ATTRIBUTE","TimeSeriesCounter","TimeUsageCounter","TraceProcessor","TraceSender","TracingSpan","UnaryCounter","getTracingContext","sanitizeClassName","symbolTracingContext","trace"],"entryPoint":"packages/common/tracing/src/index.ts","inputs":{"packages/common/tracing/src/api.ts":{"bytesInOutput":1631},"packages/common/tracing/src/symbols.ts":{"bytesInOutput":245},"packages/common/tracing/src/trace-processor.ts":{"bytesInOutput":11951},"packages/common/tracing/src/trace-sender.ts":{"bytesInOutput":2555},"packages/common/tracing/src/index.ts":{"bytesInOutput":0},"packages/common/tracing/src/metrics/base.ts":{"bytesInOutput":159},"packages/common/tracing/src/metrics/index.ts":{"bytesInOutput":0},"packages/common/tracing/src/metrics/unary-counter.ts":{"bytesInOutput":324},"packages/common/tracing/src/metrics/time-series-counter.ts":{"bytesInOutput":812},"packages/common/tracing/src/metrics/time-usage-counter.ts":{"bytesInOutput":1136},"packages/common/tracing/src/metrics/map-counter.ts":{"bytesInOutput":509}},"bytes":20192}}}
@@ -4,6 +4,11 @@ import { type Error as SerializedError } from '@dxos/protocols/proto/dxos/error'
4
4
  import { type Metric, type Resource, type Span } from '@dxos/protocols/proto/dxos/tracing';
5
5
  import type { AddLinkOptions } from './api';
6
6
  import { TraceSender } from './trace-sender';
7
+ export type Diagnostics = {
8
+ resources: Record<string, Resource>;
9
+ spans: Span[];
10
+ logs: LogEntry[];
11
+ };
7
12
  export type TraceResourceConstructorParams = {
8
13
  constructor: {
9
14
  new (...args: any[]): {};
@@ -37,31 +42,24 @@ export type TraceSubscription = {
37
42
  newLogs: LogEntry[];
38
43
  };
39
44
  export declare class TraceProcessor {
40
- resources: Map<number, ResourceEntry>;
41
- resourceInstanceIndex: WeakMap<any, ResourceEntry>;
42
- resourceIdList: number[];
43
- spans: Map<number, Span>;
44
- spanIdList: number[];
45
- logs: LogEntry[];
46
- subscriptions: Set<TraceSubscription>;
45
+ readonly subscriptions: Set<TraceSubscription>;
46
+ readonly resources: Map<number, ResourceEntry>;
47
+ readonly resourceInstanceIndex: WeakMap<any, ResourceEntry>;
48
+ readonly resourceIdList: number[];
49
+ readonly spans: Map<number, Span>;
50
+ readonly spanIdList: number[];
51
+ readonly logs: LogEntry[];
47
52
  constructor();
48
- traceResourceConstructor(params: TraceResourceConstructorParams): void;
49
- getResourceInfo(instance: any): Record<string, any>;
50
- getResourceMetrics(instance: any): Metric[];
53
+ createTraceSender(): TraceSender;
51
54
  traceSpan(params: TraceSpanParams): TracingSpan;
52
55
  addLink(parent: any, child: any, opts: AddLinkOptions): void;
56
+ getDiagnostics(): Diagnostics;
57
+ getResourceInfo(instance: any): Record<string, any>;
58
+ getResourceMetrics(instance: any): Metric[];
53
59
  getResourceId(instance: any): number | null;
54
- createTraceSender(): TraceSender;
55
- refresh(): void;
56
60
  findResourcesByClassName(className: string): ResourceEntry[];
57
- findByAnnotation(annotation: symbol): ResourceEntry[];
58
- getDiagnostics(): {
59
- resources: {
60
- [k: string]: Resource;
61
- };
62
- spans: Span[];
63
- logs: LogEntry[];
64
- };
61
+ findResourcesByAnnotation(annotation: symbol): ResourceEntry[];
62
+ refresh(): void;
65
63
  private _markResourceDirty;
66
64
  private _markSpanDirty;
67
65
  private _clearResources;
@@ -1 +1 @@
1
- {"version":3,"file":"trace-processor.d.ts","sourceRoot":"","sources":["../../../src/trace-processor.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"trace-processor.d.ts","sourceRoot":"","sources":["../../../src/trace-processor.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dxos/tracing",
3
- "version": "0.5.0",
3
+ "version": "0.5.1-main.0ba1ecb",
4
4
  "description": "Async utilities.",
5
5
  "homepage": "https://dxos.org",
6
6
  "bugs": "https://github.com/dxos/dxos/issues",
@@ -16,18 +16,18 @@
16
16
  "src"
17
17
  ],
18
18
  "dependencies": {
19
- "@dxos/async": "0.5.0",
20
- "@dxos/context": "0.5.0",
21
- "@dxos/codec-protobuf": "0.5.0",
22
- "@dxos/debug": "0.5.0",
23
- "@dxos/invariant": "0.5.0",
24
- "@dxos/log": "0.5.0",
25
- "@dxos/node-std": "0.5.0",
26
- "@dxos/protocols": "0.5.0",
27
- "@dxos/util": "0.5.0"
19
+ "@dxos/async": "0.5.1-main.0ba1ecb",
20
+ "@dxos/codec-protobuf": "0.5.1-main.0ba1ecb",
21
+ "@dxos/context": "0.5.1-main.0ba1ecb",
22
+ "@dxos/debug": "0.5.1-main.0ba1ecb",
23
+ "@dxos/invariant": "0.5.1-main.0ba1ecb",
24
+ "@dxos/log": "0.5.1-main.0ba1ecb",
25
+ "@dxos/node-std": "0.5.1-main.0ba1ecb",
26
+ "@dxos/protocols": "0.5.1-main.0ba1ecb",
27
+ "@dxos/util": "0.5.1-main.0ba1ecb"
28
28
  },
29
29
  "devDependencies": {
30
- "@dxos/test": "0.5.0"
30
+ "@dxos/test": "0.5.1-main.0ba1ecb"
31
31
  },
32
32
  "publishConfig": {
33
33
  "access": "public"
package/src/api.ts CHANGED
@@ -18,7 +18,7 @@ const resource =
18
18
  class extends constructor {
19
19
  constructor(...rest: any[]) {
20
20
  super(...rest);
21
- TRACE_PROCESSOR.traceResourceConstructor({ constructor, annotation: options?.annotation, instance: this });
21
+ TRACE_PROCESSOR.createTraceResource({ constructor, annotation: options?.annotation, instance: this });
22
22
  }
23
23
  })();
24
24
  Object.defineProperty(klass, 'name', { value: constructor.name });
@@ -15,6 +15,12 @@ import { type BaseCounter } from './metrics';
15
15
  import { TRACE_SPAN_ATTRIBUTE, getTracingContext } from './symbols';
16
16
  import { TraceSender } from './trace-sender';
17
17
 
18
+ export type Diagnostics = {
19
+ resources: Record<string, Resource>;
20
+ spans: Span[];
21
+ logs: LogEntry[];
22
+ };
23
+
18
24
  export type TraceResourceConstructorParams = {
19
25
  constructor: { new (...args: any[]): {} };
20
26
  instance: any;
@@ -66,16 +72,16 @@ const REFRESH_INTERVAL = 1_000;
66
72
  const MAX_INFO_OBJECT_DEPTH = 8;
67
73
 
68
74
  export class TraceProcessor {
69
- resources = new Map<number, ResourceEntry>();
70
- resourceInstanceIndex = new WeakMap<any, ResourceEntry>();
71
- resourceIdList: number[] = [];
75
+ readonly subscriptions: Set<TraceSubscription> = new Set();
72
76
 
73
- spans = new Map<number, Span>();
74
- spanIdList: number[] = [];
77
+ readonly resources = new Map<number, ResourceEntry>();
78
+ readonly resourceInstanceIndex = new WeakMap<any, ResourceEntry>();
79
+ readonly resourceIdList: number[] = [];
75
80
 
76
- logs: LogEntry[] = [];
81
+ readonly spans = new Map<number, Span>();
82
+ readonly spanIdList: number[] = [];
77
83
 
78
- subscriptions: Set<TraceSubscription> = new Set();
84
+ readonly logs: LogEntry[] = [];
79
85
 
80
86
  constructor() {
81
87
  log.addProcessor(this._logProcessor.bind(this));
@@ -84,10 +90,14 @@ export class TraceProcessor {
84
90
  unrefTimeout(refreshInterval);
85
91
  }
86
92
 
87
- traceResourceConstructor(params: TraceResourceConstructorParams) {
93
+ /**
94
+ * @internal
95
+ */
96
+ // TODO(burdon): Comment.
97
+ createTraceResource(params: TraceResourceConstructorParams) {
88
98
  const id = this.resources.size;
89
99
 
90
- // init metrics counters.
100
+ // Init metrics counters.
91
101
  const tracingContext = getTracingContext(Object.getPrototypeOf(params.instance));
92
102
  for (const key of Object.keys(tracingContext.metricsProperties)) {
93
103
  (params.instance[key] as BaseCounter)._assign(params.instance, key);
@@ -112,17 +122,50 @@ export class TraceProcessor {
112
122
  if (this.resourceIdList.length > MAX_RESOURCE_RECORDS) {
113
123
  this._clearResources();
114
124
  }
125
+
115
126
  this._markResourceDirty(id);
116
127
  }
117
128
 
129
+ createTraceSender() {
130
+ return new TraceSender(this);
131
+ }
132
+
133
+ traceSpan(params: TraceSpanParams): TracingSpan {
134
+ const span = new TracingSpan(this, params);
135
+ this._flushSpan(span);
136
+ return span;
137
+ }
138
+
139
+ // TODO(burdon): Not implemented.
140
+ addLink(parent: any, child: any, opts: AddLinkOptions) {}
141
+
142
+ //
143
+ // Getters
144
+ //
145
+
146
+ // TODO(burdon): Define type.
147
+ // TODO(burdon): Reconcile with system service.
148
+ getDiagnostics(): Diagnostics {
149
+ this.refresh();
150
+
151
+ return {
152
+ resources: Object.fromEntries(
153
+ Array.from(this.resources.entries()).map(([id, entry]) => [
154
+ `${entry.sanitizedClassName}#${entry.data.instanceId}`,
155
+ entry.data,
156
+ ]),
157
+ ),
158
+ spans: Array.from(this.spans.values()),
159
+ logs: this.logs.filter((log) => log.level >= LogLevel.INFO),
160
+ };
161
+ }
162
+
118
163
  getResourceInfo(instance: any): Record<string, any> {
119
164
  const res: Record<string, any> = {};
120
165
  const tracingContext = getTracingContext(Object.getPrototypeOf(instance));
121
-
122
166
  for (const [key, { options }] of Object.entries(tracingContext.infoProperties)) {
123
167
  try {
124
168
  const value = typeof instance[key] === 'function' ? instance[key]() : instance[key];
125
-
126
169
  if (options.enum) {
127
170
  res[key] = options.enum[value];
128
171
  } else {
@@ -143,7 +186,6 @@ export class TraceProcessor {
143
186
  getResourceMetrics(instance: any): Metric[] {
144
187
  const res: Metric[] = [];
145
188
  const tracingContext = getTracingContext(Object.getPrototypeOf(instance));
146
-
147
189
  for (const [key, _opts] of Object.entries(tracingContext.metricsProperties)) {
148
190
  res.push(instance[key].getData());
149
191
  }
@@ -151,21 +193,19 @@ export class TraceProcessor {
151
193
  return res;
152
194
  }
153
195
 
154
- traceSpan(params: TraceSpanParams): TracingSpan {
155
- const span = new TracingSpan(this, params);
156
- this._flushSpan(span);
157
- return span;
158
- }
159
-
160
- addLink(parent: any, child: any, opts: AddLinkOptions) {}
161
-
162
196
  getResourceId(instance: any): number | null {
163
197
  const entry = this.resourceInstanceIndex.get(instance);
164
198
  return entry ? entry.data.id : null;
165
199
  }
166
200
 
167
- createTraceSender() {
168
- return new TraceSender(this);
201
+ findResourcesByClassName(className: string): ResourceEntry[] {
202
+ return [...this.resources.values()].filter(
203
+ (res) => res.data.className === className || res.sanitizedClassName === className,
204
+ );
205
+ }
206
+
207
+ findResourcesByAnnotation(annotation: symbol): ResourceEntry[] {
208
+ return [...this.resources.values()].filter((res) => res.annotation === annotation);
169
209
  }
170
210
 
171
211
  refresh() {
@@ -202,30 +242,9 @@ export class TraceProcessor {
202
242
  }
203
243
  }
204
244
 
205
- findResourcesByClassName(className: string): ResourceEntry[] {
206
- return [...this.resources.values()].filter(
207
- (r) => r.data.className === className || r.sanitizedClassName === className,
208
- );
209
- }
210
-
211
- findByAnnotation(annotation: symbol): ResourceEntry[] {
212
- return [...this.resources.values()].filter((r) => r.annotation === annotation);
213
- }
214
-
215
- getDiagnostics() {
216
- this.refresh();
217
-
218
- return {
219
- resources: Object.fromEntries(
220
- Array.from(this.resources.entries()).map(([id, entry]) => [
221
- `${entry.sanitizedClassName}#${entry.data.instanceId}`,
222
- entry.data,
223
- ]),
224
- ),
225
- spans: Array.from(this.spans.values()),
226
- logs: this.logs.filter((log) => log.level >= LogLevel.INFO),
227
- };
228
- }
245
+ //
246
+ // Implementation
247
+ //
229
248
 
230
249
  /**
231
250
  * @internal
@@ -290,7 +309,6 @@ export class TraceProcessor {
290
309
  }
291
310
 
292
311
  const context = getContextFromEntry(entry) ?? {};
293
-
294
312
  for (const key of Object.keys(context)) {
295
313
  context[key] = sanitizeValue(context[key], 0, this);
296
314
  }
@@ -314,6 +332,7 @@ export class TraceProcessor {
314
332
  };
315
333
  }
316
334
 
335
+ // TODO(burdon): Comment.
317
336
  export class TracingSpan {
318
337
  static nextId = 0;
319
338
 
@@ -395,6 +414,7 @@ export class TracingSpan {
395
414
  }
396
415
  }
397
416
 
417
+ // TODO(burdon): Log cause.
398
418
  const serializeError = (err: unknown): SerializedError => {
399
419
  if (err instanceof Error) {
400
420
  return {
@@ -408,6 +428,7 @@ const serializeError = (err: unknown): SerializedError => {
408
428
  };
409
429
  };
410
430
 
431
+ // TODO(burdon): Rename singleton and move out of package.
411
432
  export const TRACE_PROCESSOR: TraceProcessor = ((globalThis as any).TRACE_PROCESSOR ??= new TraceProcessor());
412
433
 
413
434
  const sanitizeValue = (value: any, depth: number, traceProcessor: TraceProcessor): any => {
@@ -417,7 +438,6 @@ const sanitizeValue = (value: any, depth: number, traceProcessor: TraceProcessor
417
438
  case 'boolean':
418
439
  case 'undefined':
419
440
  return value;
420
- break;
421
441
  case 'object':
422
442
  case 'function':
423
443
  if (value === null) {
@@ -68,6 +68,6 @@ describe('tracing', () => {
68
68
 
69
69
  test('findByAnnotation', async () => {
70
70
  const store = new FeedStore();
71
- expect(TRACE_PROCESSOR.findByAnnotation(FeedStoreResource)[0].instance.deref()).to.eq(store);
71
+ expect(TRACE_PROCESSOR.findResourcesByAnnotation(FeedStoreResource)[0].instance.deref()).to.eq(store);
72
72
  });
73
73
  });