@dxos/tracing 0.3.11-next.0fb359e → 0.3.11-next.e28df4f
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/lib/browser/index.mjs +58 -11
- package/dist/lib/browser/index.mjs.map +3 -3
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/node/index.cjs +58 -11
- package/dist/lib/node/index.cjs.map +3 -3
- package/dist/lib/node/meta.json +1 -1
- package/dist/types/src/api.d.ts +22 -1
- package/dist/types/src/api.d.ts.map +1 -1
- package/dist/types/src/symbols.d.ts +4 -1
- package/dist/types/src/symbols.d.ts.map +1 -1
- package/dist/types/src/trace-processor.d.ts +7 -0
- package/dist/types/src/trace-processor.d.ts.map +1 -1
- package/package.json +10 -10
- package/src/api.ts +28 -3
- package/src/symbols.ts +8 -1
- package/src/trace-processor.ts +71 -5
|
@@ -121,6 +121,7 @@ var MAX_RESOURCE_RECORDS = 2e3;
|
|
|
121
121
|
var MAX_SPAN_RECORDS = 1e3;
|
|
122
122
|
var MAX_LOG_RECORDS = 1e3;
|
|
123
123
|
var REFRESH_INTERVAL = 1e3;
|
|
124
|
+
var MAX_INFO_OBJECT_DEPTH = 8;
|
|
124
125
|
var TraceProcessor = class {
|
|
125
126
|
constructor() {
|
|
126
127
|
this.resources = /* @__PURE__ */ new Map();
|
|
@@ -142,7 +143,7 @@ var TraceProcessor = class {
|
|
|
142
143
|
}
|
|
143
144
|
const context = getContextFromEntry(entry) ?? {};
|
|
144
145
|
for (const key of Object.keys(context)) {
|
|
145
|
-
context[key] = sanitizeValue(context[key]);
|
|
146
|
+
context[key] = sanitizeValue(context[key], 0, this);
|
|
146
147
|
}
|
|
147
148
|
const entryToPush = {
|
|
148
149
|
level: entry.level,
|
|
@@ -163,7 +164,7 @@ var TraceProcessor = class {
|
|
|
163
164
|
};
|
|
164
165
|
log.addProcessor(this._logProcessor.bind(this), void 0, {
|
|
165
166
|
F: __dxlog_file,
|
|
166
|
-
L:
|
|
167
|
+
L: 76,
|
|
167
168
|
S: this,
|
|
168
169
|
C: (f, a) => f(...a)
|
|
169
170
|
});
|
|
@@ -195,9 +196,14 @@ var TraceProcessor = class {
|
|
|
195
196
|
getResourceInfo(instance) {
|
|
196
197
|
const res = {};
|
|
197
198
|
const tracingContext = getTracingContext(Object.getPrototypeOf(instance));
|
|
198
|
-
for (const [key,
|
|
199
|
+
for (const [key, { options }] of Object.entries(tracingContext.infoProperties)) {
|
|
199
200
|
try {
|
|
200
|
-
|
|
201
|
+
const value = typeof instance[key] === "function" ? instance[key]() : instance[key];
|
|
202
|
+
if (options.enum) {
|
|
203
|
+
res[key] = options.enum[value];
|
|
204
|
+
} else {
|
|
205
|
+
res[key] = sanitizeValue(value, options.depth === void 0 ? 1 : options.depth ?? MAX_INFO_OBJECT_DEPTH, this);
|
|
206
|
+
}
|
|
201
207
|
} catch (err) {
|
|
202
208
|
res[key] = err.message;
|
|
203
209
|
}
|
|
@@ -259,6 +265,17 @@ var TraceProcessor = class {
|
|
|
259
265
|
}
|
|
260
266
|
return res;
|
|
261
267
|
}
|
|
268
|
+
getDiagnostics() {
|
|
269
|
+
this.refresh();
|
|
270
|
+
return {
|
|
271
|
+
resources: Object.fromEntries(Array.from(this.resources.entries()).map(([id, entry]) => [
|
|
272
|
+
`${entry.sanitizedClassName}#${entry.data.instanceId}`,
|
|
273
|
+
entry.data
|
|
274
|
+
])),
|
|
275
|
+
spans: Array.from(this.spans.values()),
|
|
276
|
+
logs: this.logs.filter((log2) => log2.level >= LogLevel.INFO)
|
|
277
|
+
};
|
|
278
|
+
}
|
|
262
279
|
/**
|
|
263
280
|
* @internal
|
|
264
281
|
*/
|
|
@@ -293,13 +310,13 @@ var TraceProcessor = class {
|
|
|
293
310
|
this.spans.delete(id);
|
|
294
311
|
}
|
|
295
312
|
}
|
|
296
|
-
_pushLog(
|
|
297
|
-
this.logs.push(
|
|
313
|
+
_pushLog(log2) {
|
|
314
|
+
this.logs.push(log2);
|
|
298
315
|
if (this.logs.length > MAX_LOG_RECORDS) {
|
|
299
316
|
this.logs.shift();
|
|
300
317
|
}
|
|
301
318
|
for (const subscription of this.subscriptions) {
|
|
302
|
-
subscription.newLogs.push(
|
|
319
|
+
subscription.newLogs.push(log2);
|
|
303
320
|
}
|
|
304
321
|
}
|
|
305
322
|
};
|
|
@@ -381,7 +398,7 @@ var serializeError = (err) => {
|
|
|
381
398
|
};
|
|
382
399
|
};
|
|
383
400
|
var TRACE_PROCESSOR = globalThis.TRACE_PROCESSOR ??= new TraceProcessor();
|
|
384
|
-
var sanitizeValue = (value) => {
|
|
401
|
+
var sanitizeValue = (value, depth, traceProcessor) => {
|
|
385
402
|
switch (typeof value) {
|
|
386
403
|
case "string":
|
|
387
404
|
case "number":
|
|
@@ -393,7 +410,33 @@ var sanitizeValue = (value) => {
|
|
|
393
410
|
case "function":
|
|
394
411
|
if (value === null) {
|
|
395
412
|
return value;
|
|
396
|
-
|
|
413
|
+
}
|
|
414
|
+
{
|
|
415
|
+
const resourceEntry = traceProcessor.resourceInstanceIndex.get(value);
|
|
416
|
+
if (resourceEntry) {
|
|
417
|
+
return `${resourceEntry.sanitizedClassName}#${resourceEntry.data.instanceId}`;
|
|
418
|
+
}
|
|
419
|
+
}
|
|
420
|
+
if (typeof value.toJSON === "function") {
|
|
421
|
+
return sanitizeValue(value.toJSON(), depth, traceProcessor);
|
|
422
|
+
}
|
|
423
|
+
if (depth > 0) {
|
|
424
|
+
if (isSetLike(value)) {
|
|
425
|
+
return Object.fromEntries(Array.from(value.entries()).map((value2) => sanitizeValue(value2, depth - 1, traceProcessor)));
|
|
426
|
+
} else if (isMapLike(value)) {
|
|
427
|
+
return Object.fromEntries(Array.from(value.entries()).map(([key, value2]) => [
|
|
428
|
+
key,
|
|
429
|
+
sanitizeValue(value2, depth - 1, traceProcessor)
|
|
430
|
+
]));
|
|
431
|
+
} else if (Array.isArray(value)) {
|
|
432
|
+
return value.map((item) => sanitizeValue(item, depth - 1, traceProcessor));
|
|
433
|
+
} else if (typeof value === "object") {
|
|
434
|
+
const res = {};
|
|
435
|
+
for (const key of Object.keys(value)) {
|
|
436
|
+
res[key] = sanitizeValue(value[key], depth - 1, traceProcessor);
|
|
437
|
+
}
|
|
438
|
+
return res;
|
|
439
|
+
}
|
|
397
440
|
}
|
|
398
441
|
if (typeof value.truncate === "function") {
|
|
399
442
|
return value.truncate();
|
|
@@ -423,6 +466,8 @@ var sanitizeClassName = (className) => {
|
|
|
423
466
|
return className.slice(0, -m[1].length);
|
|
424
467
|
}
|
|
425
468
|
};
|
|
469
|
+
var isSetLike = (value) => value instanceof Set || typeof value === "object" && value !== null && Object.getPrototypeOf(value).constructor.name === "ComplexSet";
|
|
470
|
+
var isMapLike = (value) => value instanceof Map || typeof value === "object" && value !== null && Object.getPrototypeOf(value).constructor.name === "ComplexMap";
|
|
426
471
|
|
|
427
472
|
// packages/common/tracing/src/api.ts
|
|
428
473
|
var resource = () => (constructor) => {
|
|
@@ -440,8 +485,10 @@ var resource = () => (constructor) => {
|
|
|
440
485
|
});
|
|
441
486
|
return klass;
|
|
442
487
|
};
|
|
443
|
-
var info = () => (target, propertyKey, descriptor) => {
|
|
444
|
-
getTracingContext(target).infoProperties[propertyKey] = {
|
|
488
|
+
var info = (opts = {}) => (target, propertyKey, descriptor) => {
|
|
489
|
+
getTracingContext(target).infoProperties[propertyKey] = {
|
|
490
|
+
options: opts
|
|
491
|
+
};
|
|
445
492
|
};
|
|
446
493
|
var mark = (name) => {
|
|
447
494
|
performance.mark(name);
|
|
@@ -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 () =>\n <T extends { new (...args: any[]): {} }>(constructor: T) => {\n // Wrapping class declaration into an IIFE so it doesn't capture the `klass` class name.\n const klass = (() =>\n class extends constructor {\n constructor(...rest: any[]) {\n super(...rest);\n TRACE_PROCESSOR.traceResourceConstructor({ constructor, instance: this });\n }\n })();\n Object.defineProperty(klass, 'name', { value: constructor.name });\n return klass;\n };\n\n/**\n * Marks a property or a method to be included in the resource info section.\n */\nconst info = () => (target: any, propertyKey: string, descriptor?: PropertyDescriptor) => {\n getTracingContext(target).infoProperties[propertyKey] = {};\n};\n\nconst 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\nexport const symbolTracingContext = Symbol('dxos.tracing.context');\n\nexport type TracingContext = {\n infoProperties: Record<string, {}>;\n metricsProperties: Record<string, {}>;\n};\n\nexport const getTracingContext = (target: any): TracingContext => {\n return ((target[symbolTracingContext] as TracingContext | undefined) ??= {\n infoProperties: {},\n metricsProperties: {},\n });\n};\n\nexport const TRACE_SPAN_ATTRIBUTE = 'dxos.trace-span';\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { unrefTimeout } from '@dxos/async';\nimport { type Context } from '@dxos/context';\nimport { LogLevel, type LogProcessor, getContextFromEntry, log } from '@dxos/log';\nimport { type LogEntry } from '@dxos/protocols/proto/dxos/client/services';\nimport { type Error as SerializedError } from '@dxos/protocols/proto/dxos/error';\nimport { type Metric, type Resource, type Span } from '@dxos/protocols/proto/dxos/tracing';\nimport { getPrototypeSpecificInstanceId } from '@dxos/util';\n\nimport type { AddLinkOptions } from './api';\nimport { type BaseCounter } from './metrics';\nimport { TRACE_SPAN_ATTRIBUTE, getTracingContext } from './symbols';\nimport { TraceSender } from './trace-sender';\n\nexport type TraceResourceConstructorParams = {\n constructor: { new (...args: any[]): {} };\n instance: any;\n};\n\nexport type TraceSpanParams = {\n instance: any;\n methodName: string;\n parentCtx: Context | null;\n showInBrowserTimeline: boolean;\n};\n\nexport class ResourceEntry {\n /**\n * Sometimes bundlers mangle class names: WebFile -> WebFile2.\n *\n * We use a heuristic to remove the suffix.\n */\n public readonly sanitizedClassName: string;\n\n constructor(public data: Resource, public instance: WeakRef<any>) {\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\nexport class TraceProcessor {\n resources = new Map<number, ResourceEntry>();\n resourceInstanceIndex = new WeakMap<any, ResourceEntry>();\n resourceIdList: number[] = [];\n\n spans = new Map<number, Span>();\n spanIdList: number[] = [];\n\n logs: LogEntry[] = [];\n\n subscriptions: Set<TraceSubscription> = new Set();\n\n constructor() {\n log.addProcessor(this._logProcessor.bind(this));\n\n const refreshInterval = setInterval(this.refresh.bind(this), REFRESH_INTERVAL);\n unrefTimeout(refreshInterval);\n }\n\n traceResourceConstructor(params: TraceResourceConstructorParams) {\n const id = this.resources.size;\n\n // init metrics counters.\n const tracingContext = getTracingContext(Object.getPrototypeOf(params.instance));\n for (const key of Object.keys(tracingContext.metricsProperties)) {\n (params.instance[key] as BaseCounter)._assign(params.instance, key);\n }\n\n const entry = new ResourceEntry(\n {\n id,\n className: params.constructor.name,\n instanceId: getPrototypeSpecificInstanceId(params.instance),\n info: this.getResourceInfo(params.instance),\n links: [],\n metrics: this.getResourceMetrics(params.instance),\n },\n new WeakRef(params.instance),\n );\n\n this.resources.set(id, entry);\n this.resourceInstanceIndex.set(params.instance, entry);\n this.resourceIdList.push(id);\n if (this.resourceIdList.length > MAX_RESOURCE_RECORDS) {\n this._clearResources();\n }\n this._markResourceDirty(id);\n }\n\n getResourceInfo(instance: any): Record<string, any> {\n const res: Record<string, any> = {};\n const tracingContext = getTracingContext(Object.getPrototypeOf(instance));\n\n for (const [key, _opts] of Object.entries(tracingContext.infoProperties)) {\n try {\n res[key] = sanitizeValue(typeof instance[key] === 'function' ? instance[key]() : instance[key]);\n } catch (err: any) {\n res[key] = err.message;\n }\n }\n\n return res;\n }\n\n getResourceMetrics(instance: any): Metric[] {\n const res: Metric[] = [];\n const tracingContext = getTracingContext(Object.getPrototypeOf(instance));\n\n for (const [key, _opts] of Object.entries(tracingContext.metricsProperties)) {\n res.push(instance[key].getData());\n }\n\n return res;\n }\n\n traceSpan(params: TraceSpanParams): TracingSpan {\n const span = new TracingSpan(this, params);\n this._flushSpan(span);\n return span;\n }\n\n addLink(parent: any, child: any, opts: AddLinkOptions) {}\n\n getResourceId(instance: any): number | null {\n const entry = this.resourceInstanceIndex.get(instance);\n return entry ? entry.data.id : null;\n }\n\n createTraceSender() {\n return new TraceSender(this);\n }\n\n refresh() {\n for (const resource of this.resources.values()) {\n const instance = resource.instance.deref();\n if (!instance) {\n continue;\n }\n\n const tracingContext = getTracingContext(Object.getPrototypeOf(instance));\n const time = performance.now();\n for (const key of Object.keys(tracingContext.metricsProperties)) {\n (instance[key] as BaseCounter)._tick?.(time);\n }\n\n let _changed = false;\n\n const oldInfo = resource.data.info;\n resource.data.info = this.getResourceInfo(instance);\n _changed ||= !areEqualShallow(oldInfo, resource.data.info);\n\n const oldMetrics = resource.data.metrics;\n resource.data.metrics = this.getResourceMetrics(instance);\n _changed ||= !areEqualShallow(oldMetrics, resource.data.metrics);\n\n // TODO(dmaretskyi): Test if works and enable.\n // if (changed) {\n this._markResourceDirty(resource.data.id);\n // }\n }\n\n for (const subscription of this.subscriptions) {\n subscription.flush();\n }\n }\n\n findResourcesByClassName(className: string): ResourceEntry[] {\n const res: ResourceEntry[] = [];\n for (const entry of this.resources.values()) {\n if (entry.data.className === className || entry.sanitizedClassName === className) {\n res.push(entry);\n }\n }\n return res;\n }\n\n /**\n * @internal\n */\n _flushSpan(runtimeSpan: TracingSpan) {\n const span = runtimeSpan.serialize();\n this.spans.set(span.id, span);\n this.spanIdList.push(span.id);\n if (this.spanIdList.length > MAX_SPAN_RECORDS) {\n this._clearSpans();\n }\n this._markSpanDirty(span.id);\n }\n\n private _markResourceDirty(id: number) {\n for (const subscription of this.subscriptions) {\n subscription.dirtyResources.add(id);\n }\n }\n\n private _markSpanDirty(id: number) {\n for (const subscription of this.subscriptions) {\n subscription.dirtySpans.add(id);\n }\n }\n\n private _clearResources() {\n // TODO(dmaretskyi): Use FinalizationRegistry to delete finalized resources first.\n while (this.resourceIdList.length > MAX_RESOURCE_RECORDS) {\n const id = this.resourceIdList.shift()!;\n this.resources.delete(id);\n }\n }\n\n private _clearSpans() {\n while (this.spanIdList.length > MAX_SPAN_RECORDS) {\n const id = this.spanIdList.shift()!;\n this.spans.delete(id);\n }\n }\n\n private _pushLog(log: LogEntry) {\n this.logs.push(log);\n if (this.logs.length > MAX_LOG_RECORDS) {\n this.logs.shift();\n }\n\n for (const subscription of this.subscriptions) {\n subscription.newLogs.push(log);\n }\n }\n\n private _logProcessor: LogProcessor = (config, entry) => {\n switch (entry.level) {\n case LogLevel.ERROR:\n case LogLevel.WARN:\n case LogLevel.TRACE: {\n const scope = entry.meta?.S;\n const resource = this.resourceInstanceIndex.get(scope);\n if (!resource) {\n return;\n }\n\n const context = getContextFromEntry(entry) ?? {};\n\n for (const key of Object.keys(context)) {\n context[key] = sanitizeValue(context[key]);\n }\n\n const entryToPush: LogEntry = {\n level: entry.level,\n message: entry.message,\n context,\n timestamp: new Date(),\n meta: {\n file: entry.meta?.F ?? '',\n line: entry.meta?.L ?? 0,\n resourceId: resource.data.id,\n },\n };\n this._pushLog(entryToPush);\n break;\n }\n default:\n }\n };\n}\n\nexport class TracingSpan {\n static nextId = 0;\n\n readonly id: number;\n readonly parentId: number | null = null;\n readonly methodName: string;\n readonly resourceId: number | null = null;\n startTs: number;\n endTs: number | null = null;\n error: SerializedError | null = null;\n\n private _showInBrowserTimeline: boolean;\n private readonly _ctx: Context | null = null;\n\n constructor(private _traceProcessor: TraceProcessor, params: TraceSpanParams) {\n this.id = TracingSpan.nextId++;\n this.methodName = params.methodName;\n this.resourceId = _traceProcessor.getResourceId(params.instance);\n this.startTs = performance.now();\n 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) => {\n switch (typeof value) {\n case 'string':\n case 'number':\n case 'boolean':\n case 'undefined':\n return value;\n break;\n case 'object':\n case 'function':\n if (value === null) {\n return value;\n break;\n }\n\n // TODO(dmaretskyi): Expose trait.\n if (typeof value.truncate === 'function') {\n return value.truncate();\n }\n\n return value.toString();\n }\n};\n\nconst areEqualShallow = (a: any, b: any) => {\n for (const key in a) {\n if (!(key in b) || a[key] !== b[key]) {\n return false;\n }\n }\n for (const key in b) {\n if (!(key in a) || a[key] !== b[key]) {\n return false;\n }\n }\n return true;\n};\n\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", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { Stream } from '@dxos/codec-protobuf';\nimport { type LogEntry } from '@dxos/protocols/proto/dxos/client/services';\nimport { type StreamTraceEvent, type TracingService } from '@dxos/protocols/proto/dxos/tracing';\n\nimport { type TraceProcessor, type TraceSubscription } from './trace-processor';\n\nexport class TraceSender implements TracingService {\n constructor(private _traceProcessor: TraceProcessor) {}\n\n streamTrace(request: void): Stream<StreamTraceEvent> {\n return new Stream(({ ctx, next }) => {\n const flushEvents = (resources: Set<number> | null, spans: Set<number> | null, logs: LogEntry[] | null) => {\n const event: StreamTraceEvent = {\n resourceAdded: [],\n resourceRemoved: [],\n spanAdded: [],\n logAdded: [],\n };\n\n if (resources) {\n for (const id of resources) {\n const entry = this._traceProcessor.resources.get(id);\n if (entry) {\n event.resourceAdded!.push({ resource: entry.data });\n } else {\n event.resourceRemoved!.push({ id });\n }\n }\n } else {\n for (const entry of this._traceProcessor.resources.values()) {\n event.resourceAdded!.push({ resource: entry.data });\n }\n }\n\n if (spans) {\n for (const id of spans) {\n const span = this._traceProcessor.spans.get(id);\n if (span) {\n event.spanAdded!.push({ span });\n }\n }\n } else {\n for (const span of this._traceProcessor.spans.values()) {\n event.spanAdded!.push({ span });\n }\n }\n\n if (logs) {\n for (const log of logs) {\n event.logAdded!.push({ log });\n }\n } else {\n for (const log of this._traceProcessor.logs) {\n event.logAdded!.push({ log });\n }\n }\n\n if (event.resourceAdded!.length > 0 || event.resourceRemoved!.length > 0 || event.spanAdded!.length > 0) {\n next(event);\n }\n };\n\n const flush = () => {\n flushEvents(subscription.dirtyResources, subscription.dirtySpans, subscription.newLogs);\n subscription.dirtyResources.clear();\n subscription.dirtySpans.clear();\n subscription.newLogs.length = 0;\n };\n\n const subscription: TraceSubscription = {\n flush,\n dirtyResources: new Set(),\n dirtySpans: new Set(),\n newLogs: [],\n };\n this._traceProcessor.subscriptions.add(subscription);\n ctx.onDispose(() => {\n this._traceProcessor.subscriptions.delete(subscription);\n });\n\n flushEvents(null, null, null);\n });\n }\n}\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { type Metric } from '@dxos/protocols/proto/dxos/tracing';\n\nexport abstract class BaseCounter {\n /**\n * @internal\n */\n _instance: any;\n\n name?: string;\n\n /**\n * @internal\n */\n _assign(instance: any, name: string) {\n this._instance = instance;\n this.name = name;\n }\n\n abstract getData(): Metric;\n\n _tick(time: number): void {}\n}\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { type Metric } from '@dxos/protocols/proto/dxos/tracing';\n\nimport { BaseCounter } from './base';\n\nexport class UnaryCounter extends BaseCounter {\n value = 0;\n units?: string;\n\n constructor({ units }: { units?: string } = {}) {\n super();\n this.units = units;\n }\n\n inc(by = 1) {\n this.value += by;\n }\n\n getData(): Metric {\n return {\n name: this.name!,\n counter: {\n value: this.value,\n units: this.units,\n },\n };\n }\n}\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { type Metric } from '@dxos/protocols/proto/dxos/tracing';\n\nimport { BaseCounter } from './base';\n\nconst MAX_BUCKETS = 60;\n\nexport class TimeSeriesCounter extends BaseCounter {\n private _currentValue = 0;\n private _totalValue = 0;\n private _buckets: number[] = [];\n units?: string;\n\n constructor({ units }: { units?: string } = {}) {\n super();\n this.units = units;\n }\n\n inc(by = 1) {\n this._currentValue += by;\n this._totalValue += by;\n }\n\n override _tick(time: number): void {\n this._buckets.push(this._currentValue);\n if (this._buckets.length > MAX_BUCKETS) {\n this._buckets.shift();\n }\n this._currentValue = 0;\n }\n\n override getData(): Metric {\n return {\n name: this.name!,\n timeSeries: {\n tracks: [\n {\n name: this.name!,\n units: this.units,\n points: this._buckets.map((value, index) => ({\n value,\n })),\n total: this._totalValue,\n },\n ],\n },\n };\n }\n}\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { type Metric } from '@dxos/protocols/proto/dxos/tracing';\n\nimport { BaseCounter } from './base';\n\nconst MAX_BUCKETS = 60;\n\nexport class TimeUsageCounter extends BaseCounter {\n private _currentValue = 0;\n private _totalValue = 0;\n private _buckets: number[] = [];\n\n private _lastTickTime = performance.now();\n\n record(time: number) {\n this._currentValue += time;\n this._totalValue += time;\n }\n\n beginRecording(): { end: () => void } {\n const start = performance.now();\n return {\n end: () => {\n const end = performance.now();\n this.record(end - start);\n },\n };\n }\n\n override _tick(time: number): void {\n const delta = time - this._lastTickTime;\n this._lastTickTime = time;\n\n const percentage = (this._currentValue / delta) * 100;\n this._buckets.push(percentage);\n if (this._buckets.length > MAX_BUCKETS) {\n this._buckets.shift();\n }\n this._currentValue = 0;\n }\n\n override getData(): Metric {\n return {\n name: this.name!,\n timeSeries: {\n tracks: [\n {\n name: this.name!,\n units: '%',\n points: this._buckets.map((value, index) => ({\n value,\n })),\n total: this._totalValue,\n },\n ],\n },\n };\n }\n}\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { type Metric } from '@dxos/protocols/proto/dxos/tracing';\n\nimport { BaseCounter } from './base';\n\nexport class MapCounter extends BaseCounter {\n values = new Map<string, number>();\n units?: string;\n\n constructor({ units }: { units?: string } = {}) {\n super();\n this.units = units;\n }\n\n inc(key: string, by = 1) {\n const prev = this.values.get(key) ?? 0;\n this.values.set(key, prev + by);\n }\n\n getData(): Metric {\n return {\n name: this.name!,\n multiCounter: {\n records: Array.from(this.values.entries()).map(([key, value]) => ({\n key,\n value,\n })),\n units: this.units,\n },\n };\n }\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["Context", "symbolTracingContext", "Symbol", "getTracingContext", "target", "infoProperties", "metricsProperties", "TRACE_SPAN_ATTRIBUTE", "unrefTimeout", "LogLevel", "getContextFromEntry", "log", "getPrototypeSpecificInstanceId", "Stream", "TraceSender", "constructor", "_traceProcessor", "streamTrace", "request", "Stream", "ctx", "next", "flushEvents", "resources", "spans", "logs", "event", "resourceAdded", "resourceRemoved", "spanAdded", "logAdded", "id", "entry", "get", "push", "resource", "data", "values", "span", "log", "length", "flush", "subscription", "dirtyResources", "dirtySpans", "newLogs", "clear", "Set", "subscriptions", "add", "onDispose", "delete", "ResourceEntry", "constructor", "data", "instance", "sanitizedClassName", "sanitizeClassName", "className", "getMetric", "name", "metrics", "find", "metric", "MAX_RESOURCE_RECORDS", "MAX_SPAN_RECORDS", "MAX_LOG_RECORDS", "REFRESH_INTERVAL", "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", "
|
|
4
|
+
"sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nimport { Context } from '@dxos/context';\n\nimport { getTracingContext } from './symbols';\nimport { TRACE_PROCESSOR } from './trace-processor';\n\n/**\n * Annotates a class as a tracked resource.\n */\nconst resource =\n () =>\n <T extends { new (...args: any[]): {} }>(constructor: T) => {\n // Wrapping class declaration into an IIFE so it doesn't capture the `klass` class name.\n const klass = (() =>\n class extends constructor {\n constructor(...rest: any[]) {\n super(...rest);\n TRACE_PROCESSOR.traceResourceConstructor({ constructor, instance: this });\n }\n })();\n Object.defineProperty(klass, 'name', { value: constructor.name });\n return klass;\n };\n\nexport type InfoOptions = {\n /**\n * Value is of enum type and should be converted to string.\n *\n * Example:\n *\n * ```ts\n * @trace.info({ enum: SpaceState })\n * get state(): SpaceState { ... }\n * ```\n */\n enum?: Record<string, any>;\n\n /**\n * Max depth of the object to be included in the resource info section.\n *\n * null means no limit (a limit of 8 nested objects is still imposed).\n *\n * Default: 0 - objects will be stringified with toString.\n */\n depth?: number | null;\n};\n\n/**\n * Marks a property or a method to be included in the resource info section.\n */\nconst info =\n (opts: InfoOptions = {}) =>\n (target: any, propertyKey: string, descriptor?: PropertyDescriptor) => {\n getTracingContext(target).infoProperties[propertyKey] = { options: opts };\n };\n\nconst mark = (name: string) => {\n performance.mark(name);\n};\n\nexport type SpanOptions = {\n showInBrowserTimeline?: boolean;\n};\n\nconst span =\n ({ showInBrowserTimeline = false }: SpanOptions = {}) =>\n (target: any, propertyKey: string, descriptor: TypedPropertyDescriptor<(...args: any) => any>) => {\n const method = descriptor.value!;\n\n descriptor.value = async function (this: any, ...args: any) {\n const parentCtx = args[0] instanceof Context ? args[0] : null;\n const span = TRACE_PROCESSOR.traceSpan({\n parentCtx,\n methodName: propertyKey,\n instance: this,\n showInBrowserTimeline,\n });\n\n const callArgs = span.ctx ? [span.ctx, ...args.slice(1)] : args;\n try {\n return await method.apply(this, callArgs);\n } catch (err) {\n span.markError(err);\n throw err;\n } finally {\n span.markSuccess();\n }\n };\n };\n\n/**\n * Attaches metrics counter to the resource.\n */\nconst metricsCounter = () => (target: any, propertyKey: string, descriptor?: PropertyDescriptor) => {\n getTracingContext(target).metricsProperties[propertyKey] = {};\n};\n\nexport type AddLinkOptions = {};\n\nconst addLink = (parent: any, child: any, opts: AddLinkOptions = {}) => {\n TRACE_PROCESSOR.addLink(parent, child, opts);\n};\n\nexport const trace = {\n resource,\n info,\n mark,\n span,\n metricsCounter,\n\n addLink,\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { type InfoOptions } from './api';\n\nexport const symbolTracingContext = Symbol('dxos.tracing.context');\n\nexport type TracingContext = {\n infoProperties: Record<\n string,\n {\n options: InfoOptions;\n }\n >;\n metricsProperties: Record<string, {}>;\n};\n\nexport const getTracingContext = (target: any): TracingContext => {\n return ((target[symbolTracingContext] as TracingContext | undefined) ??= {\n infoProperties: {},\n metricsProperties: {},\n });\n};\n\nexport const TRACE_SPAN_ATTRIBUTE = 'dxos.trace-span';\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { unrefTimeout } from '@dxos/async';\nimport { type Context } from '@dxos/context';\nimport { LogLevel, type LogProcessor, getContextFromEntry, log } from '@dxos/log';\nimport { type LogEntry } from '@dxos/protocols/proto/dxos/client/services';\nimport { type Error as SerializedError } from '@dxos/protocols/proto/dxos/error';\nimport { type Metric, type Resource, type Span } from '@dxos/protocols/proto/dxos/tracing';\nimport { getPrototypeSpecificInstanceId } from '@dxos/util';\n\nimport type { AddLinkOptions } from './api';\nimport { type BaseCounter } from './metrics';\nimport { TRACE_SPAN_ATTRIBUTE, getTracingContext } from './symbols';\nimport { TraceSender } from './trace-sender';\n\nexport type TraceResourceConstructorParams = {\n constructor: { new (...args: any[]): {} };\n instance: any;\n};\n\nexport type TraceSpanParams = {\n instance: any;\n methodName: string;\n parentCtx: Context | null;\n showInBrowserTimeline: boolean;\n};\n\nexport class ResourceEntry {\n /**\n * Sometimes bundlers mangle class names: WebFile -> WebFile2.\n *\n * We use a heuristic to remove the suffix.\n */\n public readonly sanitizedClassName: string;\n\n constructor(public data: Resource, public instance: WeakRef<any>) {\n this.sanitizedClassName = sanitizeClassName(data.className);\n }\n\n getMetric(name: string): Metric | undefined {\n return this.data.metrics?.find((metric) => metric.name === name);\n }\n}\n\nexport type TraceSubscription = {\n flush: () => void;\n\n dirtyResources: Set<number>;\n dirtySpans: Set<number>;\n newLogs: LogEntry[];\n};\n\nconst MAX_RESOURCE_RECORDS = 2_000;\nconst MAX_SPAN_RECORDS = 1_000;\nconst MAX_LOG_RECORDS = 1_000;\n\nconst REFRESH_INTERVAL = 1_000;\n\nconst MAX_INFO_OBJECT_DEPTH = 8;\n\nexport class TraceProcessor {\n resources = new Map<number, ResourceEntry>();\n resourceInstanceIndex = new WeakMap<any, ResourceEntry>();\n resourceIdList: number[] = [];\n\n spans = new Map<number, Span>();\n spanIdList: number[] = [];\n\n logs: LogEntry[] = [];\n\n subscriptions: Set<TraceSubscription> = new Set();\n\n constructor() {\n log.addProcessor(this._logProcessor.bind(this));\n\n const refreshInterval = setInterval(this.refresh.bind(this), REFRESH_INTERVAL);\n unrefTimeout(refreshInterval);\n }\n\n traceResourceConstructor(params: TraceResourceConstructorParams) {\n const id = this.resources.size;\n\n // init metrics counters.\n const tracingContext = getTracingContext(Object.getPrototypeOf(params.instance));\n for (const key of Object.keys(tracingContext.metricsProperties)) {\n (params.instance[key] as BaseCounter)._assign(params.instance, key);\n }\n\n const entry = new ResourceEntry(\n {\n id,\n className: params.constructor.name,\n instanceId: getPrototypeSpecificInstanceId(params.instance),\n info: this.getResourceInfo(params.instance),\n links: [],\n metrics: this.getResourceMetrics(params.instance),\n },\n new WeakRef(params.instance),\n );\n\n this.resources.set(id, entry);\n this.resourceInstanceIndex.set(params.instance, entry);\n this.resourceIdList.push(id);\n if (this.resourceIdList.length > MAX_RESOURCE_RECORDS) {\n this._clearResources();\n }\n this._markResourceDirty(id);\n }\n\n getResourceInfo(instance: any): Record<string, any> {\n const res: Record<string, any> = {};\n const tracingContext = getTracingContext(Object.getPrototypeOf(instance));\n\n for (const [key, { options }] of Object.entries(tracingContext.infoProperties)) {\n try {\n const value = typeof instance[key] === 'function' ? instance[key]() : instance[key];\n\n if (options.enum) {\n res[key] = options.enum[value];\n } else {\n res[key] = sanitizeValue(\n value,\n options.depth === undefined ? 1 : options.depth ?? MAX_INFO_OBJECT_DEPTH,\n this,\n );\n }\n } catch (err: any) {\n res[key] = err.message;\n }\n }\n\n return res;\n }\n\n getResourceMetrics(instance: any): Metric[] {\n const res: Metric[] = [];\n const tracingContext = getTracingContext(Object.getPrototypeOf(instance));\n\n for (const [key, _opts] of Object.entries(tracingContext.metricsProperties)) {\n res.push(instance[key].getData());\n }\n\n return res;\n }\n\n traceSpan(params: TraceSpanParams): TracingSpan {\n const span = new TracingSpan(this, params);\n this._flushSpan(span);\n return span;\n }\n\n addLink(parent: any, child: any, opts: AddLinkOptions) {}\n\n getResourceId(instance: any): number | null {\n const entry = this.resourceInstanceIndex.get(instance);\n return entry ? entry.data.id : null;\n }\n\n createTraceSender() {\n return new TraceSender(this);\n }\n\n refresh() {\n for (const resource of this.resources.values()) {\n const instance = resource.instance.deref();\n if (!instance) {\n continue;\n }\n\n const tracingContext = getTracingContext(Object.getPrototypeOf(instance));\n const time = performance.now();\n for (const key of Object.keys(tracingContext.metricsProperties)) {\n (instance[key] as BaseCounter)._tick?.(time);\n }\n\n let _changed = false;\n\n const oldInfo = resource.data.info;\n resource.data.info = this.getResourceInfo(instance);\n _changed ||= !areEqualShallow(oldInfo, resource.data.info);\n\n const oldMetrics = resource.data.metrics;\n resource.data.metrics = this.getResourceMetrics(instance);\n _changed ||= !areEqualShallow(oldMetrics, resource.data.metrics);\n\n // TODO(dmaretskyi): Test if works and enable.\n // if (changed) {\n this._markResourceDirty(resource.data.id);\n // }\n }\n\n for (const subscription of this.subscriptions) {\n subscription.flush();\n }\n }\n\n findResourcesByClassName(className: string): ResourceEntry[] {\n const res: ResourceEntry[] = [];\n for (const entry of this.resources.values()) {\n if (entry.data.className === className || entry.sanitizedClassName === className) {\n res.push(entry);\n }\n }\n return res;\n }\n\n getDiagnostics() {\n this.refresh();\n\n return {\n resources: Object.fromEntries(\n Array.from(this.resources.entries()).map(([id, entry]) => [\n `${entry.sanitizedClassName}#${entry.data.instanceId}`,\n entry.data,\n ]),\n ),\n spans: Array.from(this.spans.values()),\n logs: this.logs.filter((log) => log.level >= LogLevel.INFO),\n };\n }\n\n /**\n * @internal\n */\n _flushSpan(runtimeSpan: TracingSpan) {\n const span = runtimeSpan.serialize();\n this.spans.set(span.id, span);\n this.spanIdList.push(span.id);\n if (this.spanIdList.length > MAX_SPAN_RECORDS) {\n this._clearSpans();\n }\n this._markSpanDirty(span.id);\n }\n\n private _markResourceDirty(id: number) {\n for (const subscription of this.subscriptions) {\n subscription.dirtyResources.add(id);\n }\n }\n\n private _markSpanDirty(id: number) {\n for (const subscription of this.subscriptions) {\n subscription.dirtySpans.add(id);\n }\n }\n\n private _clearResources() {\n // TODO(dmaretskyi): Use FinalizationRegistry to delete finalized resources first.\n while (this.resourceIdList.length > MAX_RESOURCE_RECORDS) {\n const id = this.resourceIdList.shift()!;\n this.resources.delete(id);\n }\n }\n\n private _clearSpans() {\n while (this.spanIdList.length > MAX_SPAN_RECORDS) {\n const id = this.spanIdList.shift()!;\n this.spans.delete(id);\n }\n }\n\n private _pushLog(log: LogEntry) {\n this.logs.push(log);\n if (this.logs.length > MAX_LOG_RECORDS) {\n this.logs.shift();\n }\n\n for (const subscription of this.subscriptions) {\n subscription.newLogs.push(log);\n }\n }\n\n private _logProcessor: LogProcessor = (config, entry) => {\n switch (entry.level) {\n case LogLevel.ERROR:\n case LogLevel.WARN:\n case LogLevel.TRACE: {\n const scope = entry.meta?.S;\n const resource = this.resourceInstanceIndex.get(scope);\n if (!resource) {\n return;\n }\n\n const context = getContextFromEntry(entry) ?? {};\n\n for (const key of Object.keys(context)) {\n context[key] = sanitizeValue(context[key], 0, this);\n }\n\n const entryToPush: LogEntry = {\n level: entry.level,\n message: entry.message,\n context,\n timestamp: new Date(),\n meta: {\n file: entry.meta?.F ?? '',\n line: entry.meta?.L ?? 0,\n resourceId: resource.data.id,\n },\n };\n this._pushLog(entryToPush);\n break;\n }\n default:\n }\n };\n}\n\nexport class TracingSpan {\n static nextId = 0;\n\n readonly id: number;\n readonly parentId: number | null = null;\n readonly methodName: string;\n readonly resourceId: number | null = null;\n startTs: number;\n endTs: number | null = null;\n error: SerializedError | null = null;\n\n private _showInBrowserTimeline: boolean;\n private readonly _ctx: Context | null = null;\n\n constructor(private _traceProcessor: TraceProcessor, params: TraceSpanParams) {\n this.id = TracingSpan.nextId++;\n this.methodName = params.methodName;\n this.resourceId = _traceProcessor.getResourceId(params.instance);\n this.startTs = performance.now();\n this._showInBrowserTimeline = params.showInBrowserTimeline;\n\n if (params.parentCtx) {\n this._ctx = params.parentCtx.derive({\n attributes: {\n [TRACE_SPAN_ATTRIBUTE]: this.id,\n },\n });\n const parentId = params.parentCtx.getAttribute(TRACE_SPAN_ATTRIBUTE);\n if (typeof parentId === 'number') {\n this.parentId = parentId;\n }\n }\n }\n\n get ctx(): Context | null {\n return this._ctx;\n }\n\n markSuccess() {\n this.endTs = performance.now();\n this._traceProcessor._flushSpan(this);\n\n if (this._showInBrowserTimeline) {\n this._markInBrowserTimeline();\n }\n }\n\n markError(err: unknown) {\n this.endTs = performance.now();\n this.error = serializeError(err);\n this._traceProcessor._flushSpan(this);\n\n if (this._showInBrowserTimeline) {\n this._markInBrowserTimeline();\n }\n }\n\n serialize(): Span {\n return {\n id: this.id,\n resourceId: this.resourceId ?? undefined,\n methodName: this.methodName,\n parentId: this.parentId ?? undefined,\n startTs: this.startTs.toFixed(3),\n endTs: this.endTs?.toFixed(3) ?? undefined,\n error: this.error ?? undefined,\n };\n }\n\n private _markInBrowserTimeline() {\n const resource = this._traceProcessor.resources.get(this.resourceId!);\n const name = resource\n ? `${resource.sanitizedClassName}#${resource.data.instanceId}.${this.methodName}`\n : this.methodName;\n performance.measure(name, { start: this.startTs, end: this.endTs! });\n }\n}\n\nconst serializeError = (err: unknown): SerializedError => {\n if (err instanceof Error) {\n return {\n name: err.name,\n message: err.message,\n };\n }\n\n return {\n message: String(err),\n };\n};\n\nexport const TRACE_PROCESSOR: TraceProcessor = ((globalThis as any).TRACE_PROCESSOR ??= new TraceProcessor());\n\nconst sanitizeValue = (value: any, depth: number, traceProcessor: TraceProcessor): any => {\n switch (typeof value) {\n case 'string':\n case 'number':\n case 'boolean':\n case 'undefined':\n return value;\n break;\n case 'object':\n case 'function':\n if (value === null) {\n return value;\n }\n\n {\n const resourceEntry = traceProcessor.resourceInstanceIndex.get(value);\n if (resourceEntry) {\n return `${resourceEntry.sanitizedClassName}#${resourceEntry.data.instanceId}`;\n }\n }\n\n if (typeof value.toJSON === 'function') {\n // TODO(dmaretskyi): This has potential to cause infinite recursion.\n return sanitizeValue(value.toJSON(), depth, traceProcessor);\n }\n\n if (depth > 0) {\n if (isSetLike(value)) {\n return Object.fromEntries(\n Array.from(value.entries()).map((value) => sanitizeValue(value, depth - 1, traceProcessor)),\n );\n } else if (isMapLike(value)) {\n return Object.fromEntries(\n Array.from(value.entries()).map(([key, value]) => [key, sanitizeValue(value, depth - 1, traceProcessor)]),\n );\n } else if (Array.isArray(value)) {\n return value.map((item: any) => sanitizeValue(item, depth - 1, traceProcessor));\n } else if (typeof value === 'object') {\n const res: any = {};\n for (const key of Object.keys(value)) {\n res[key] = sanitizeValue(value[key], depth - 1, traceProcessor);\n }\n return res;\n }\n }\n\n // TODO(dmaretskyi): Expose trait.\n if (typeof value.truncate === 'function') {\n return value.truncate();\n }\n\n return value.toString();\n }\n};\n\nconst areEqualShallow = (a: any, b: any) => {\n for (const key in a) {\n if (!(key in b) || a[key] !== b[key]) {\n return false;\n }\n }\n for (const key in b) {\n if (!(key in a) || a[key] !== b[key]) {\n return false;\n }\n }\n return true;\n};\n\nexport const sanitizeClassName = (className: string) => {\n const SANITIZE_REGEX = /[^_](\\d+)$/;\n const m = className.match(SANITIZE_REGEX);\n if (!m) {\n return className;\n } else {\n return className.slice(0, -m[1].length);\n }\n};\n\nconst isSetLike = (value: any): value is Set<any> =>\n value instanceof Set ||\n (typeof value === 'object' && value !== null && Object.getPrototypeOf(value).constructor.name === 'ComplexSet');\n\nconst isMapLike = (value: any): value is Map<any, any> =>\n value instanceof Map ||\n (typeof value === 'object' && value !== null && Object.getPrototypeOf(value).constructor.name === 'ComplexMap');\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { Stream } from '@dxos/codec-protobuf';\nimport { type LogEntry } from '@dxos/protocols/proto/dxos/client/services';\nimport { type StreamTraceEvent, type TracingService } from '@dxos/protocols/proto/dxos/tracing';\n\nimport { type TraceProcessor, type TraceSubscription } from './trace-processor';\n\nexport class TraceSender implements TracingService {\n constructor(private _traceProcessor: TraceProcessor) {}\n\n streamTrace(request: void): Stream<StreamTraceEvent> {\n return new Stream(({ ctx, next }) => {\n const flushEvents = (resources: Set<number> | null, spans: Set<number> | null, logs: LogEntry[] | null) => {\n const event: StreamTraceEvent = {\n resourceAdded: [],\n resourceRemoved: [],\n spanAdded: [],\n logAdded: [],\n };\n\n if (resources) {\n for (const id of resources) {\n const entry = this._traceProcessor.resources.get(id);\n if (entry) {\n event.resourceAdded!.push({ resource: entry.data });\n } else {\n event.resourceRemoved!.push({ id });\n }\n }\n } else {\n for (const entry of this._traceProcessor.resources.values()) {\n event.resourceAdded!.push({ resource: entry.data });\n }\n }\n\n if (spans) {\n for (const id of spans) {\n const span = this._traceProcessor.spans.get(id);\n if (span) {\n event.spanAdded!.push({ span });\n }\n }\n } else {\n for (const span of this._traceProcessor.spans.values()) {\n event.spanAdded!.push({ span });\n }\n }\n\n if (logs) {\n for (const log of logs) {\n event.logAdded!.push({ log });\n }\n } else {\n for (const log of this._traceProcessor.logs) {\n event.logAdded!.push({ log });\n }\n }\n\n if (event.resourceAdded!.length > 0 || event.resourceRemoved!.length > 0 || event.spanAdded!.length > 0) {\n next(event);\n }\n };\n\n const flush = () => {\n flushEvents(subscription.dirtyResources, subscription.dirtySpans, subscription.newLogs);\n subscription.dirtyResources.clear();\n subscription.dirtySpans.clear();\n subscription.newLogs.length = 0;\n };\n\n const subscription: TraceSubscription = {\n flush,\n dirtyResources: new Set(),\n dirtySpans: new Set(),\n newLogs: [],\n };\n this._traceProcessor.subscriptions.add(subscription);\n ctx.onDispose(() => {\n this._traceProcessor.subscriptions.delete(subscription);\n });\n\n flushEvents(null, null, null);\n });\n }\n}\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { type Metric } from '@dxos/protocols/proto/dxos/tracing';\n\nexport abstract class BaseCounter {\n /**\n * @internal\n */\n _instance: any;\n\n name?: string;\n\n /**\n * @internal\n */\n _assign(instance: any, name: string) {\n this._instance = instance;\n this.name = name;\n }\n\n abstract getData(): Metric;\n\n _tick(time: number): void {}\n}\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { type Metric } from '@dxos/protocols/proto/dxos/tracing';\n\nimport { BaseCounter } from './base';\n\nexport class UnaryCounter extends BaseCounter {\n value = 0;\n units?: string;\n\n constructor({ units }: { units?: string } = {}) {\n super();\n this.units = units;\n }\n\n inc(by = 1) {\n this.value += by;\n }\n\n getData(): Metric {\n return {\n name: this.name!,\n counter: {\n value: this.value,\n units: this.units,\n },\n };\n }\n}\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { type Metric } from '@dxos/protocols/proto/dxos/tracing';\n\nimport { BaseCounter } from './base';\n\nconst MAX_BUCKETS = 60;\n\nexport class TimeSeriesCounter extends BaseCounter {\n private _currentValue = 0;\n private _totalValue = 0;\n private _buckets: number[] = [];\n units?: string;\n\n constructor({ units }: { units?: string } = {}) {\n super();\n this.units = units;\n }\n\n inc(by = 1) {\n this._currentValue += by;\n this._totalValue += by;\n }\n\n override _tick(time: number): void {\n this._buckets.push(this._currentValue);\n if (this._buckets.length > MAX_BUCKETS) {\n this._buckets.shift();\n }\n this._currentValue = 0;\n }\n\n override getData(): Metric {\n return {\n name: this.name!,\n timeSeries: {\n tracks: [\n {\n name: this.name!,\n units: this.units,\n points: this._buckets.map((value, index) => ({\n value,\n })),\n total: this._totalValue,\n },\n ],\n },\n };\n }\n}\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { type Metric } from '@dxos/protocols/proto/dxos/tracing';\n\nimport { BaseCounter } from './base';\n\nconst MAX_BUCKETS = 60;\n\nexport class TimeUsageCounter extends BaseCounter {\n private _currentValue = 0;\n private _totalValue = 0;\n private _buckets: number[] = [];\n\n private _lastTickTime = performance.now();\n\n record(time: number) {\n this._currentValue += time;\n this._totalValue += time;\n }\n\n beginRecording(): { end: () => void } {\n const start = performance.now();\n return {\n end: () => {\n const end = performance.now();\n this.record(end - start);\n },\n };\n }\n\n override _tick(time: number): void {\n const delta = time - this._lastTickTime;\n this._lastTickTime = time;\n\n const percentage = (this._currentValue / delta) * 100;\n this._buckets.push(percentage);\n if (this._buckets.length > MAX_BUCKETS) {\n this._buckets.shift();\n }\n this._currentValue = 0;\n }\n\n override getData(): Metric {\n return {\n name: this.name!,\n timeSeries: {\n tracks: [\n {\n name: this.name!,\n units: '%',\n points: this._buckets.map((value, index) => ({\n value,\n })),\n total: this._totalValue,\n },\n ],\n },\n };\n }\n}\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { type Metric } from '@dxos/protocols/proto/dxos/tracing';\n\nimport { BaseCounter } from './base';\n\nexport class MapCounter extends BaseCounter {\n values = new Map<string, number>();\n units?: string;\n\n constructor({ units }: { units?: string } = {}) {\n super();\n this.units = units;\n }\n\n inc(key: string, by = 1) {\n const prev = this.values.get(key) ?? 0;\n this.values.set(key, prev + by);\n }\n\n getData(): Metric {\n return {\n name: this.name!,\n multiCounter: {\n records: Array.from(this.values.entries()).map(([key, value]) => ({\n key,\n value,\n })),\n units: this.units,\n },\n };\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["Context", "symbolTracingContext", "Symbol", "getTracingContext", "target", "infoProperties", "metricsProperties", "TRACE_SPAN_ATTRIBUTE", "unrefTimeout", "LogLevel", "getContextFromEntry", "log", "getPrototypeSpecificInstanceId", "Stream", "TraceSender", "constructor", "_traceProcessor", "streamTrace", "request", "Stream", "ctx", "next", "flushEvents", "resources", "spans", "logs", "event", "resourceAdded", "resourceRemoved", "spanAdded", "logAdded", "id", "entry", "get", "push", "resource", "data", "values", "span", "log", "length", "flush", "subscription", "dirtyResources", "dirtySpans", "newLogs", "clear", "Set", "subscriptions", "add", "onDispose", "delete", "ResourceEntry", "constructor", "data", "instance", "sanitizedClassName", "sanitizeClassName", "className", "getMetric", "name", "metrics", "find", "metric", "MAX_RESOURCE_RECORDS", "MAX_SPAN_RECORDS", "MAX_LOG_RECORDS", "REFRESH_INTERVAL", "MAX_INFO_OBJECT_DEPTH", "TraceProcessor", "resources", "Map", "resourceInstanceIndex", "WeakMap", "resourceIdList", "spans", "spanIdList", "logs", "subscriptions", "Set", "_logProcessor", "config", "entry", "level", "LogLevel", "ERROR", "WARN", "TRACE", "scope", "meta", "S", "resource", "get", "context", "getContextFromEntry", "key", "Object", "keys", "sanitizeValue", "entryToPush", "message", "timestamp", "Date", "file", "F", "line", "L", "resourceId", "id", "_pushLog", "log", "addProcessor", "bind", "refreshInterval", "setInterval", "refresh", "unrefTimeout", "traceResourceConstructor", "params", "size", "tracingContext", "getTracingContext", "getPrototypeOf", "metricsProperties", "_assign", "instanceId", "getPrototypeSpecificInstanceId", "info", "getResourceInfo", "links", "getResourceMetrics", "WeakRef", "set", "push", "length", "_clearResources", "_markResourceDirty", "res", "options", "entries", "infoProperties", "value", "enum", "depth", "undefined", "err", "_opts", "getData", "traceSpan", "span", "TracingSpan", "_flushSpan", "addLink", "parent", "child", "opts", "getResourceId", "createTraceSender", "TraceSender", "values", "deref", "time", "performance", "now", "_tick", "_changed", "oldInfo", "areEqualShallow", "oldMetrics", "subscription", "flush", "findResourcesByClassName", "getDiagnostics", "fromEntries", "Array", "from", "map", "filter", "INFO", "runtimeSpan", "serialize", "_clearSpans", "_markSpanDirty", "dirtyResources", "add", "dirtySpans", "shift", "delete", "newLogs", "nextId", "_traceProcessor", "parentId", "endTs", "error", "_ctx", "methodName", "startTs", "_showInBrowserTimeline", "showInBrowserTimeline", "parentCtx", "derive", "attributes", "TRACE_SPAN_ATTRIBUTE", "getAttribute", "ctx", "markSuccess", "_markInBrowserTimeline", "markError", "serializeError", "toFixed", "measure", "start", "end", "Error", "String", "TRACE_PROCESSOR", "globalThis", "traceProcessor", "resourceEntry", "toJSON", "isSetLike", "isMapLike", "isArray", "item", "truncate", "toString", "a", "b", "SANITIZE_REGEX", "m", "match", "slice", "resource", "constructor", "klass", "rest", "TRACE_PROCESSOR", "traceResourceConstructor", "instance", "Object", "defineProperty", "value", "name", "info", "opts", "target", "propertyKey", "descriptor", "getTracingContext", "infoProperties", "options", "mark", "performance", "span", "showInBrowserTimeline", "method", "args", "parentCtx", "Context", "traceSpan", "methodName", "callArgs", "ctx", "slice", "apply", "err", "markError", "markSuccess", "metricsCounter", "metricsProperties", "addLink", "parent", "child", "trace", "BaseCounter", "_assign", "instance", "name", "_instance", "_tick", "time", "UnaryCounter", "BaseCounter", "constructor", "units", "value", "inc", "by", "getData", "name", "counter", "MAX_BUCKETS", "TimeSeriesCounter", "BaseCounter", "constructor", "units", "_currentValue", "_totalValue", "_buckets", "inc", "by", "_tick", "time", "push", "length", "shift", "getData", "name", "timeSeries", "tracks", "points", "map", "value", "index", "total", "MAX_BUCKETS", "TimeUsageCounter", "BaseCounter", "_currentValue", "_totalValue", "_buckets", "_lastTickTime", "performance", "now", "record", "time", "beginRecording", "start", "end", "_tick", "delta", "percentage", "push", "length", "shift", "getData", "name", "timeSeries", "tracks", "units", "points", "map", "value", "index", "total", "MapCounter", "BaseCounter", "constructor", "units", "values", "Map", "inc", "key", "by", "prev", "get", "set", "getData", "name", "multiCounter", "records", "Array", "from", "entries", "map", "value"]
|
|
7
7
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"inputs":{"packages/common/tracing/src/symbols.ts":{"bytes":
|
|
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":49944,"imports":[{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true},{"path":"packages/common/tracing/src/symbols.ts","kind":"import-statement","original":"./symbols"},{"path":"packages/common/tracing/src/trace-sender.ts","kind":"import-statement","original":"./trace-sender"}],"format":"esm"},"packages/common/tracing/src/api.ts":{"bytes":9224,"imports":[{"path":"@dxos/context","kind":"import-statement","external":true},{"path":"packages/common/tracing/src/symbols.ts","kind":"import-statement","original":"./symbols"},{"path":"packages/common/tracing/src/trace-processor.ts","kind":"import-statement","original":"./trace-processor"}],"format":"esm"},"packages/common/tracing/src/metrics/base.ts":{"bytes":1450,"imports":[],"format":"esm"},"packages/common/tracing/src/metrics/unary-counter.ts":{"bytes":2128,"imports":[{"path":"packages/common/tracing/src/metrics/base.ts","kind":"import-statement","original":"./base"}],"format":"esm"},"packages/common/tracing/src/metrics/time-series-counter.ts":{"bytes":4268,"imports":[{"path":"packages/common/tracing/src/metrics/base.ts","kind":"import-statement","original":"./base"}],"format":"esm"},"packages/common/tracing/src/metrics/time-usage-counter.ts":{"bytes":5249,"imports":[{"path":"packages/common/tracing/src/metrics/base.ts","kind":"import-statement","original":"./base"}],"format":"esm"},"packages/common/tracing/src/metrics/map-counter.ts":{"bytes":2977,"imports":[{"path":"packages/common/tracing/src/metrics/base.ts","kind":"import-statement","original":"./base"}],"format":"esm"},"packages/common/tracing/src/metrics/index.ts":{"bytes":892,"imports":[{"path":"packages/common/tracing/src/metrics/base.ts","kind":"import-statement","original":"./base"},{"path":"packages/common/tracing/src/metrics/unary-counter.ts","kind":"import-statement","original":"./unary-counter"},{"path":"packages/common/tracing/src/metrics/time-series-counter.ts","kind":"import-statement","original":"./time-series-counter"},{"path":"packages/common/tracing/src/metrics/time-usage-counter.ts","kind":"import-statement","original":"./time-usage-counter"},{"path":"packages/common/tracing/src/metrics/map-counter.ts","kind":"import-statement","original":"./map-counter"}],"format":"esm"},"packages/common/tracing/src/index.ts":{"bytes":831,"imports":[{"path":"packages/common/tracing/src/api.ts","kind":"import-statement","original":"./api"},{"path":"packages/common/tracing/src/symbols.ts","kind":"import-statement","original":"./symbols"},{"path":"packages/common/tracing/src/trace-processor.ts","kind":"import-statement","original":"./trace-processor"},{"path":"packages/common/tracing/src/trace-sender.ts","kind":"import-statement","original":"./trace-sender"},{"path":"packages/common/tracing/src/metrics/index.ts","kind":"import-statement","original":"./metrics"}],"format":"esm"}},"outputs":{"packages/common/tracing/dist/lib/browser/index.mjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":43784},"packages/common/tracing/dist/lib/browser/index.mjs":{"imports":[{"path":"@dxos/context","kind":"import-statement","external":true},{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true},{"path":"@dxos/codec-protobuf","kind":"import-statement","external":true}],"exports":["BaseCounter","MapCounter","ResourceEntry","TRACE_PROCESSOR","TRACE_SPAN_ATTRIBUTE","TimeSeriesCounter","TimeUsageCounter","TraceProcessor","TraceSender","TracingSpan","UnaryCounter","getTracingContext","sanitizeClassName","symbolTracingContext","trace"],"entryPoint":"packages/common/tracing/src/index.ts","inputs":{"packages/common/tracing/src/api.ts":{"bytesInOutput":1588},"packages/common/tracing/src/symbols.ts":{"bytesInOutput":245},"packages/common/tracing/src/trace-processor.ts":{"bytesInOutput":11607},"packages/common/tracing/src/trace-sender.ts":{"bytesInOutput":2555},"packages/common/tracing/src/index.ts":{"bytesInOutput":0},"packages/common/tracing/src/metrics/base.ts":{"bytesInOutput":159},"packages/common/tracing/src/metrics/index.ts":{"bytesInOutput":0},"packages/common/tracing/src/metrics/unary-counter.ts":{"bytesInOutput":324},"packages/common/tracing/src/metrics/time-series-counter.ts":{"bytesInOutput":812},"packages/common/tracing/src/metrics/time-usage-counter.ts":{"bytesInOutput":1136},"packages/common/tracing/src/metrics/map-counter.ts":{"bytesInOutput":509}},"bytes":19805}}}
|
package/dist/lib/node/index.cjs
CHANGED
|
@@ -149,6 +149,7 @@ var MAX_RESOURCE_RECORDS = 2e3;
|
|
|
149
149
|
var MAX_SPAN_RECORDS = 1e3;
|
|
150
150
|
var MAX_LOG_RECORDS = 1e3;
|
|
151
151
|
var REFRESH_INTERVAL = 1e3;
|
|
152
|
+
var MAX_INFO_OBJECT_DEPTH = 8;
|
|
152
153
|
var TraceProcessor = class {
|
|
153
154
|
constructor() {
|
|
154
155
|
this.resources = /* @__PURE__ */ new Map();
|
|
@@ -170,7 +171,7 @@ var TraceProcessor = class {
|
|
|
170
171
|
}
|
|
171
172
|
const context = (0, import_log.getContextFromEntry)(entry) ?? {};
|
|
172
173
|
for (const key of Object.keys(context)) {
|
|
173
|
-
context[key] = sanitizeValue(context[key]);
|
|
174
|
+
context[key] = sanitizeValue(context[key], 0, this);
|
|
174
175
|
}
|
|
175
176
|
const entryToPush = {
|
|
176
177
|
level: entry.level,
|
|
@@ -191,7 +192,7 @@ var TraceProcessor = class {
|
|
|
191
192
|
};
|
|
192
193
|
import_log.log.addProcessor(this._logProcessor.bind(this), void 0, {
|
|
193
194
|
F: __dxlog_file,
|
|
194
|
-
L:
|
|
195
|
+
L: 76,
|
|
195
196
|
S: this,
|
|
196
197
|
C: (f, a) => f(...a)
|
|
197
198
|
});
|
|
@@ -223,9 +224,14 @@ var TraceProcessor = class {
|
|
|
223
224
|
getResourceInfo(instance) {
|
|
224
225
|
const res = {};
|
|
225
226
|
const tracingContext = getTracingContext(Object.getPrototypeOf(instance));
|
|
226
|
-
for (const [key,
|
|
227
|
+
for (const [key, { options }] of Object.entries(tracingContext.infoProperties)) {
|
|
227
228
|
try {
|
|
228
|
-
|
|
229
|
+
const value = typeof instance[key] === "function" ? instance[key]() : instance[key];
|
|
230
|
+
if (options.enum) {
|
|
231
|
+
res[key] = options.enum[value];
|
|
232
|
+
} else {
|
|
233
|
+
res[key] = sanitizeValue(value, options.depth === void 0 ? 1 : options.depth ?? MAX_INFO_OBJECT_DEPTH, this);
|
|
234
|
+
}
|
|
229
235
|
} catch (err) {
|
|
230
236
|
res[key] = err.message;
|
|
231
237
|
}
|
|
@@ -287,6 +293,17 @@ var TraceProcessor = class {
|
|
|
287
293
|
}
|
|
288
294
|
return res;
|
|
289
295
|
}
|
|
296
|
+
getDiagnostics() {
|
|
297
|
+
this.refresh();
|
|
298
|
+
return {
|
|
299
|
+
resources: Object.fromEntries(Array.from(this.resources.entries()).map(([id, entry]) => [
|
|
300
|
+
`${entry.sanitizedClassName}#${entry.data.instanceId}`,
|
|
301
|
+
entry.data
|
|
302
|
+
])),
|
|
303
|
+
spans: Array.from(this.spans.values()),
|
|
304
|
+
logs: this.logs.filter((log2) => log2.level >= import_log.LogLevel.INFO)
|
|
305
|
+
};
|
|
306
|
+
}
|
|
290
307
|
/**
|
|
291
308
|
* @internal
|
|
292
309
|
*/
|
|
@@ -321,13 +338,13 @@ var TraceProcessor = class {
|
|
|
321
338
|
this.spans.delete(id);
|
|
322
339
|
}
|
|
323
340
|
}
|
|
324
|
-
_pushLog(
|
|
325
|
-
this.logs.push(
|
|
341
|
+
_pushLog(log2) {
|
|
342
|
+
this.logs.push(log2);
|
|
326
343
|
if (this.logs.length > MAX_LOG_RECORDS) {
|
|
327
344
|
this.logs.shift();
|
|
328
345
|
}
|
|
329
346
|
for (const subscription of this.subscriptions) {
|
|
330
|
-
subscription.newLogs.push(
|
|
347
|
+
subscription.newLogs.push(log2);
|
|
331
348
|
}
|
|
332
349
|
}
|
|
333
350
|
};
|
|
@@ -409,7 +426,7 @@ var serializeError = (err) => {
|
|
|
409
426
|
};
|
|
410
427
|
};
|
|
411
428
|
var TRACE_PROCESSOR = globalThis.TRACE_PROCESSOR ??= new TraceProcessor();
|
|
412
|
-
var sanitizeValue = (value) => {
|
|
429
|
+
var sanitizeValue = (value, depth, traceProcessor) => {
|
|
413
430
|
switch (typeof value) {
|
|
414
431
|
case "string":
|
|
415
432
|
case "number":
|
|
@@ -421,7 +438,33 @@ var sanitizeValue = (value) => {
|
|
|
421
438
|
case "function":
|
|
422
439
|
if (value === null) {
|
|
423
440
|
return value;
|
|
424
|
-
|
|
441
|
+
}
|
|
442
|
+
{
|
|
443
|
+
const resourceEntry = traceProcessor.resourceInstanceIndex.get(value);
|
|
444
|
+
if (resourceEntry) {
|
|
445
|
+
return `${resourceEntry.sanitizedClassName}#${resourceEntry.data.instanceId}`;
|
|
446
|
+
}
|
|
447
|
+
}
|
|
448
|
+
if (typeof value.toJSON === "function") {
|
|
449
|
+
return sanitizeValue(value.toJSON(), depth, traceProcessor);
|
|
450
|
+
}
|
|
451
|
+
if (depth > 0) {
|
|
452
|
+
if (isSetLike(value)) {
|
|
453
|
+
return Object.fromEntries(Array.from(value.entries()).map((value2) => sanitizeValue(value2, depth - 1, traceProcessor)));
|
|
454
|
+
} else if (isMapLike(value)) {
|
|
455
|
+
return Object.fromEntries(Array.from(value.entries()).map(([key, value2]) => [
|
|
456
|
+
key,
|
|
457
|
+
sanitizeValue(value2, depth - 1, traceProcessor)
|
|
458
|
+
]));
|
|
459
|
+
} else if (Array.isArray(value)) {
|
|
460
|
+
return value.map((item) => sanitizeValue(item, depth - 1, traceProcessor));
|
|
461
|
+
} else if (typeof value === "object") {
|
|
462
|
+
const res = {};
|
|
463
|
+
for (const key of Object.keys(value)) {
|
|
464
|
+
res[key] = sanitizeValue(value[key], depth - 1, traceProcessor);
|
|
465
|
+
}
|
|
466
|
+
return res;
|
|
467
|
+
}
|
|
425
468
|
}
|
|
426
469
|
if (typeof value.truncate === "function") {
|
|
427
470
|
return value.truncate();
|
|
@@ -451,6 +494,8 @@ var sanitizeClassName = (className) => {
|
|
|
451
494
|
return className.slice(0, -m[1].length);
|
|
452
495
|
}
|
|
453
496
|
};
|
|
497
|
+
var isSetLike = (value) => value instanceof Set || typeof value === "object" && value !== null && Object.getPrototypeOf(value).constructor.name === "ComplexSet";
|
|
498
|
+
var isMapLike = (value) => value instanceof Map || typeof value === "object" && value !== null && Object.getPrototypeOf(value).constructor.name === "ComplexMap";
|
|
454
499
|
var resource = () => (constructor) => {
|
|
455
500
|
const klass = /* @__PURE__ */ (() => class extends constructor {
|
|
456
501
|
constructor(...rest) {
|
|
@@ -466,8 +511,10 @@ var resource = () => (constructor) => {
|
|
|
466
511
|
});
|
|
467
512
|
return klass;
|
|
468
513
|
};
|
|
469
|
-
var info = () => (target, propertyKey, descriptor) => {
|
|
470
|
-
getTracingContext(target).infoProperties[propertyKey] = {
|
|
514
|
+
var info = (opts = {}) => (target, propertyKey, descriptor) => {
|
|
515
|
+
getTracingContext(target).infoProperties[propertyKey] = {
|
|
516
|
+
options: opts
|
|
517
|
+
};
|
|
471
518
|
};
|
|
472
519
|
var mark = (name) => {
|
|
473
520
|
performance.mark(name);
|
|
@@ -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 () =>\n <T extends { new (...args: any[]): {} }>(constructor: T) => {\n // Wrapping class declaration into an IIFE so it doesn't capture the `klass` class name.\n const klass = (() =>\n class extends constructor {\n constructor(...rest: any[]) {\n super(...rest);\n TRACE_PROCESSOR.traceResourceConstructor({ constructor, instance: this });\n }\n })();\n Object.defineProperty(klass, 'name', { value: constructor.name });\n return klass;\n };\n\n/**\n * Marks a property or a method to be included in the resource info section.\n */\nconst info = () => (target: any, propertyKey: string, descriptor?: PropertyDescriptor) => {\n getTracingContext(target).infoProperties[propertyKey] = {};\n};\n\nconst 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\nexport const symbolTracingContext = Symbol('dxos.tracing.context');\n\nexport type TracingContext = {\n infoProperties: Record<string, {}>;\n metricsProperties: Record<string, {}>;\n};\n\nexport const getTracingContext = (target: any): TracingContext => {\n return ((target[symbolTracingContext] as TracingContext | undefined) ??= {\n infoProperties: {},\n metricsProperties: {},\n });\n};\n\nexport const TRACE_SPAN_ATTRIBUTE = 'dxos.trace-span';\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { unrefTimeout } from '@dxos/async';\nimport { type Context } from '@dxos/context';\nimport { LogLevel, type LogProcessor, getContextFromEntry, log } from '@dxos/log';\nimport { type LogEntry } from '@dxos/protocols/proto/dxos/client/services';\nimport { type Error as SerializedError } from '@dxos/protocols/proto/dxos/error';\nimport { type Metric, type Resource, type Span } from '@dxos/protocols/proto/dxos/tracing';\nimport { getPrototypeSpecificInstanceId } from '@dxos/util';\n\nimport type { AddLinkOptions } from './api';\nimport { type BaseCounter } from './metrics';\nimport { TRACE_SPAN_ATTRIBUTE, getTracingContext } from './symbols';\nimport { TraceSender } from './trace-sender';\n\nexport type TraceResourceConstructorParams = {\n constructor: { new (...args: any[]): {} };\n instance: any;\n};\n\nexport type TraceSpanParams = {\n instance: any;\n methodName: string;\n parentCtx: Context | null;\n showInBrowserTimeline: boolean;\n};\n\nexport class ResourceEntry {\n /**\n * Sometimes bundlers mangle class names: WebFile -> WebFile2.\n *\n * We use a heuristic to remove the suffix.\n */\n public readonly sanitizedClassName: string;\n\n constructor(public data: Resource, public instance: WeakRef<any>) {\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\nexport class TraceProcessor {\n resources = new Map<number, ResourceEntry>();\n resourceInstanceIndex = new WeakMap<any, ResourceEntry>();\n resourceIdList: number[] = [];\n\n spans = new Map<number, Span>();\n spanIdList: number[] = [];\n\n logs: LogEntry[] = [];\n\n subscriptions: Set<TraceSubscription> = new Set();\n\n constructor() {\n log.addProcessor(this._logProcessor.bind(this));\n\n const refreshInterval = setInterval(this.refresh.bind(this), REFRESH_INTERVAL);\n unrefTimeout(refreshInterval);\n }\n\n traceResourceConstructor(params: TraceResourceConstructorParams) {\n const id = this.resources.size;\n\n // init metrics counters.\n const tracingContext = getTracingContext(Object.getPrototypeOf(params.instance));\n for (const key of Object.keys(tracingContext.metricsProperties)) {\n (params.instance[key] as BaseCounter)._assign(params.instance, key);\n }\n\n const entry = new ResourceEntry(\n {\n id,\n className: params.constructor.name,\n instanceId: getPrototypeSpecificInstanceId(params.instance),\n info: this.getResourceInfo(params.instance),\n links: [],\n metrics: this.getResourceMetrics(params.instance),\n },\n new WeakRef(params.instance),\n );\n\n this.resources.set(id, entry);\n this.resourceInstanceIndex.set(params.instance, entry);\n this.resourceIdList.push(id);\n if (this.resourceIdList.length > MAX_RESOURCE_RECORDS) {\n this._clearResources();\n }\n this._markResourceDirty(id);\n }\n\n getResourceInfo(instance: any): Record<string, any> {\n const res: Record<string, any> = {};\n const tracingContext = getTracingContext(Object.getPrototypeOf(instance));\n\n for (const [key, _opts] of Object.entries(tracingContext.infoProperties)) {\n try {\n res[key] = sanitizeValue(typeof instance[key] === 'function' ? instance[key]() : instance[key]);\n } catch (err: any) {\n res[key] = err.message;\n }\n }\n\n return res;\n }\n\n getResourceMetrics(instance: any): Metric[] {\n const res: Metric[] = [];\n const tracingContext = getTracingContext(Object.getPrototypeOf(instance));\n\n for (const [key, _opts] of Object.entries(tracingContext.metricsProperties)) {\n res.push(instance[key].getData());\n }\n\n return res;\n }\n\n traceSpan(params: TraceSpanParams): TracingSpan {\n const span = new TracingSpan(this, params);\n this._flushSpan(span);\n return span;\n }\n\n addLink(parent: any, child: any, opts: AddLinkOptions) {}\n\n getResourceId(instance: any): number | null {\n const entry = this.resourceInstanceIndex.get(instance);\n return entry ? entry.data.id : null;\n }\n\n createTraceSender() {\n return new TraceSender(this);\n }\n\n refresh() {\n for (const resource of this.resources.values()) {\n const instance = resource.instance.deref();\n if (!instance) {\n continue;\n }\n\n const tracingContext = getTracingContext(Object.getPrototypeOf(instance));\n const time = performance.now();\n for (const key of Object.keys(tracingContext.metricsProperties)) {\n (instance[key] as BaseCounter)._tick?.(time);\n }\n\n let _changed = false;\n\n const oldInfo = resource.data.info;\n resource.data.info = this.getResourceInfo(instance);\n _changed ||= !areEqualShallow(oldInfo, resource.data.info);\n\n const oldMetrics = resource.data.metrics;\n resource.data.metrics = this.getResourceMetrics(instance);\n _changed ||= !areEqualShallow(oldMetrics, resource.data.metrics);\n\n // TODO(dmaretskyi): Test if works and enable.\n // if (changed) {\n this._markResourceDirty(resource.data.id);\n // }\n }\n\n for (const subscription of this.subscriptions) {\n subscription.flush();\n }\n }\n\n findResourcesByClassName(className: string): ResourceEntry[] {\n const res: ResourceEntry[] = [];\n for (const entry of this.resources.values()) {\n if (entry.data.className === className || entry.sanitizedClassName === className) {\n res.push(entry);\n }\n }\n return res;\n }\n\n /**\n * @internal\n */\n _flushSpan(runtimeSpan: TracingSpan) {\n const span = runtimeSpan.serialize();\n this.spans.set(span.id, span);\n this.spanIdList.push(span.id);\n if (this.spanIdList.length > MAX_SPAN_RECORDS) {\n this._clearSpans();\n }\n this._markSpanDirty(span.id);\n }\n\n private _markResourceDirty(id: number) {\n for (const subscription of this.subscriptions) {\n subscription.dirtyResources.add(id);\n }\n }\n\n private _markSpanDirty(id: number) {\n for (const subscription of this.subscriptions) {\n subscription.dirtySpans.add(id);\n }\n }\n\n private _clearResources() {\n // TODO(dmaretskyi): Use FinalizationRegistry to delete finalized resources first.\n while (this.resourceIdList.length > MAX_RESOURCE_RECORDS) {\n const id = this.resourceIdList.shift()!;\n this.resources.delete(id);\n }\n }\n\n private _clearSpans() {\n while (this.spanIdList.length > MAX_SPAN_RECORDS) {\n const id = this.spanIdList.shift()!;\n this.spans.delete(id);\n }\n }\n\n private _pushLog(log: LogEntry) {\n this.logs.push(log);\n if (this.logs.length > MAX_LOG_RECORDS) {\n this.logs.shift();\n }\n\n for (const subscription of this.subscriptions) {\n subscription.newLogs.push(log);\n }\n }\n\n private _logProcessor: LogProcessor = (config, entry) => {\n switch (entry.level) {\n case LogLevel.ERROR:\n case LogLevel.WARN:\n case LogLevel.TRACE: {\n const scope = entry.meta?.S;\n const resource = this.resourceInstanceIndex.get(scope);\n if (!resource) {\n return;\n }\n\n const context = getContextFromEntry(entry) ?? {};\n\n for (const key of Object.keys(context)) {\n context[key] = sanitizeValue(context[key]);\n }\n\n const entryToPush: LogEntry = {\n level: entry.level,\n message: entry.message,\n context,\n timestamp: new Date(),\n meta: {\n file: entry.meta?.F ?? '',\n line: entry.meta?.L ?? 0,\n resourceId: resource.data.id,\n },\n };\n this._pushLog(entryToPush);\n break;\n }\n default:\n }\n };\n}\n\nexport class TracingSpan {\n static nextId = 0;\n\n readonly id: number;\n readonly parentId: number | null = null;\n readonly methodName: string;\n readonly resourceId: number | null = null;\n startTs: number;\n endTs: number | null = null;\n error: SerializedError | null = null;\n\n private _showInBrowserTimeline: boolean;\n private readonly _ctx: Context | null = null;\n\n constructor(private _traceProcessor: TraceProcessor, params: TraceSpanParams) {\n this.id = TracingSpan.nextId++;\n this.methodName = params.methodName;\n this.resourceId = _traceProcessor.getResourceId(params.instance);\n this.startTs = performance.now();\n 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) => {\n switch (typeof value) {\n case 'string':\n case 'number':\n case 'boolean':\n case 'undefined':\n return value;\n break;\n case 'object':\n case 'function':\n if (value === null) {\n return value;\n break;\n }\n\n // TODO(dmaretskyi): Expose trait.\n if (typeof value.truncate === 'function') {\n return value.truncate();\n }\n\n return value.toString();\n }\n};\n\nconst areEqualShallow = (a: any, b: any) => {\n for (const key in a) {\n if (!(key in b) || a[key] !== b[key]) {\n return false;\n }\n }\n for (const key in b) {\n if (!(key in a) || a[key] !== b[key]) {\n return false;\n }\n }\n return true;\n};\n\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", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { Stream } from '@dxos/codec-protobuf';\nimport { type LogEntry } from '@dxos/protocols/proto/dxos/client/services';\nimport { type StreamTraceEvent, type TracingService } from '@dxos/protocols/proto/dxos/tracing';\n\nimport { type TraceProcessor, type TraceSubscription } from './trace-processor';\n\nexport class TraceSender implements TracingService {\n constructor(private _traceProcessor: TraceProcessor) {}\n\n streamTrace(request: void): Stream<StreamTraceEvent> {\n return new Stream(({ ctx, next }) => {\n const flushEvents = (resources: Set<number> | null, spans: Set<number> | null, logs: LogEntry[] | null) => {\n const event: StreamTraceEvent = {\n resourceAdded: [],\n resourceRemoved: [],\n spanAdded: [],\n logAdded: [],\n };\n\n if (resources) {\n for (const id of resources) {\n const entry = this._traceProcessor.resources.get(id);\n if (entry) {\n event.resourceAdded!.push({ resource: entry.data });\n } else {\n event.resourceRemoved!.push({ id });\n }\n }\n } else {\n for (const entry of this._traceProcessor.resources.values()) {\n event.resourceAdded!.push({ resource: entry.data });\n }\n }\n\n if (spans) {\n for (const id of spans) {\n const span = this._traceProcessor.spans.get(id);\n if (span) {\n event.spanAdded!.push({ span });\n }\n }\n } else {\n for (const span of this._traceProcessor.spans.values()) {\n event.spanAdded!.push({ span });\n }\n }\n\n if (logs) {\n for (const log of logs) {\n event.logAdded!.push({ log });\n }\n } else {\n for (const log of this._traceProcessor.logs) {\n event.logAdded!.push({ log });\n }\n }\n\n if (event.resourceAdded!.length > 0 || event.resourceRemoved!.length > 0 || event.spanAdded!.length > 0) {\n next(event);\n }\n };\n\n const flush = () => {\n flushEvents(subscription.dirtyResources, subscription.dirtySpans, subscription.newLogs);\n subscription.dirtyResources.clear();\n subscription.dirtySpans.clear();\n subscription.newLogs.length = 0;\n };\n\n const subscription: TraceSubscription = {\n flush,\n dirtyResources: new Set(),\n dirtySpans: new Set(),\n newLogs: [],\n };\n this._traceProcessor.subscriptions.add(subscription);\n ctx.onDispose(() => {\n this._traceProcessor.subscriptions.delete(subscription);\n });\n\n flushEvents(null, null, null);\n });\n }\n}\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { type Metric } from '@dxos/protocols/proto/dxos/tracing';\n\nexport abstract class BaseCounter {\n /**\n * @internal\n */\n _instance: any;\n\n name?: string;\n\n /**\n * @internal\n */\n _assign(instance: any, name: string) {\n this._instance = instance;\n this.name = name;\n }\n\n abstract getData(): Metric;\n\n _tick(time: number): void {}\n}\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { type Metric } from '@dxos/protocols/proto/dxos/tracing';\n\nimport { BaseCounter } from './base';\n\nexport class UnaryCounter extends BaseCounter {\n value = 0;\n units?: string;\n\n constructor({ units }: { units?: string } = {}) {\n super();\n this.units = units;\n }\n\n inc(by = 1) {\n this.value += by;\n }\n\n getData(): Metric {\n return {\n name: this.name!,\n counter: {\n value: this.value,\n units: this.units,\n },\n };\n }\n}\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { type Metric } from '@dxos/protocols/proto/dxos/tracing';\n\nimport { BaseCounter } from './base';\n\nconst MAX_BUCKETS = 60;\n\nexport class TimeSeriesCounter extends BaseCounter {\n private _currentValue = 0;\n private _totalValue = 0;\n private _buckets: number[] = [];\n units?: string;\n\n constructor({ units }: { units?: string } = {}) {\n super();\n this.units = units;\n }\n\n inc(by = 1) {\n this._currentValue += by;\n this._totalValue += by;\n }\n\n override _tick(time: number): void {\n this._buckets.push(this._currentValue);\n if (this._buckets.length > MAX_BUCKETS) {\n this._buckets.shift();\n }\n this._currentValue = 0;\n }\n\n override getData(): Metric {\n return {\n name: this.name!,\n timeSeries: {\n tracks: [\n {\n name: this.name!,\n units: this.units,\n points: this._buckets.map((value, index) => ({\n value,\n })),\n total: this._totalValue,\n },\n ],\n },\n };\n }\n}\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { type Metric } from '@dxos/protocols/proto/dxos/tracing';\n\nimport { BaseCounter } from './base';\n\nconst MAX_BUCKETS = 60;\n\nexport class TimeUsageCounter extends BaseCounter {\n private _currentValue = 0;\n private _totalValue = 0;\n private _buckets: number[] = [];\n\n private _lastTickTime = performance.now();\n\n record(time: number) {\n this._currentValue += time;\n this._totalValue += time;\n }\n\n beginRecording(): { end: () => void } {\n const start = performance.now();\n return {\n end: () => {\n const end = performance.now();\n this.record(end - start);\n },\n };\n }\n\n override _tick(time: number): void {\n const delta = time - this._lastTickTime;\n this._lastTickTime = time;\n\n const percentage = (this._currentValue / delta) * 100;\n this._buckets.push(percentage);\n if (this._buckets.length > MAX_BUCKETS) {\n this._buckets.shift();\n }\n this._currentValue = 0;\n }\n\n override getData(): Metric {\n return {\n name: this.name!,\n timeSeries: {\n tracks: [\n {\n name: this.name!,\n units: '%',\n points: this._buckets.map((value, index) => ({\n value,\n })),\n total: this._totalValue,\n },\n ],\n },\n };\n }\n}\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { type Metric } from '@dxos/protocols/proto/dxos/tracing';\n\nimport { BaseCounter } from './base';\n\nexport class MapCounter extends BaseCounter {\n values = new Map<string, number>();\n units?: string;\n\n constructor({ units }: { units?: string } = {}) {\n super();\n this.units = units;\n }\n\n inc(key: string, by = 1) {\n const prev = this.values.get(key) ?? 0;\n this.values.set(key, prev + by);\n }\n\n getData(): Metric {\n return {\n name: this.name!,\n multiCounter: {\n records: Array.from(this.values.entries()).map(([key, value]) => ({\n key,\n value,\n })),\n units: this.units,\n },\n };\n }\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["symbolTracingContext", "Symbol", "getTracingContext", "target", "infoProperties", "metricsProperties", "TRACE_SPAN_ATTRIBUTE", "TraceSender", "constructor", "_traceProcessor", "streamTrace", "request", "Stream", "ctx", "next", "flushEvents", "resources", "spans", "logs", "event", "resourceAdded", "resourceRemoved", "spanAdded", "logAdded", "id", "entry", "get", "push", "resource", "data", "values", "span", "log", "length", "flush", "subscription", "dirtyResources", "dirtySpans", "newLogs", "clear", "Set", "subscriptions", "add", "onDispose", "delete", "ResourceEntry", "instance", "sanitizedClassName", "sanitizeClassName", "className", "getMetric", "name", "metrics", "find", "metric", "MAX_RESOURCE_RECORDS", "MAX_SPAN_RECORDS", "MAX_LOG_RECORDS", "REFRESH_INTERVAL", "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", "
|
|
4
|
+
"sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nimport { Context } from '@dxos/context';\n\nimport { getTracingContext } from './symbols';\nimport { TRACE_PROCESSOR } from './trace-processor';\n\n/**\n * Annotates a class as a tracked resource.\n */\nconst resource =\n () =>\n <T extends { new (...args: any[]): {} }>(constructor: T) => {\n // Wrapping class declaration into an IIFE so it doesn't capture the `klass` class name.\n const klass = (() =>\n class extends constructor {\n constructor(...rest: any[]) {\n super(...rest);\n TRACE_PROCESSOR.traceResourceConstructor({ constructor, instance: this });\n }\n })();\n Object.defineProperty(klass, 'name', { value: constructor.name });\n return klass;\n };\n\nexport type InfoOptions = {\n /**\n * Value is of enum type and should be converted to string.\n *\n * Example:\n *\n * ```ts\n * @trace.info({ enum: SpaceState })\n * get state(): SpaceState { ... }\n * ```\n */\n enum?: Record<string, any>;\n\n /**\n * Max depth of the object to be included in the resource info section.\n *\n * null means no limit (a limit of 8 nested objects is still imposed).\n *\n * Default: 0 - objects will be stringified with toString.\n */\n depth?: number | null;\n};\n\n/**\n * Marks a property or a method to be included in the resource info section.\n */\nconst info =\n (opts: InfoOptions = {}) =>\n (target: any, propertyKey: string, descriptor?: PropertyDescriptor) => {\n getTracingContext(target).infoProperties[propertyKey] = { options: opts };\n };\n\nconst mark = (name: string) => {\n performance.mark(name);\n};\n\nexport type SpanOptions = {\n showInBrowserTimeline?: boolean;\n};\n\nconst span =\n ({ showInBrowserTimeline = false }: SpanOptions = {}) =>\n (target: any, propertyKey: string, descriptor: TypedPropertyDescriptor<(...args: any) => any>) => {\n const method = descriptor.value!;\n\n descriptor.value = async function (this: any, ...args: any) {\n const parentCtx = args[0] instanceof Context ? args[0] : null;\n const span = TRACE_PROCESSOR.traceSpan({\n parentCtx,\n methodName: propertyKey,\n instance: this,\n showInBrowserTimeline,\n });\n\n const callArgs = span.ctx ? [span.ctx, ...args.slice(1)] : args;\n try {\n return await method.apply(this, callArgs);\n } catch (err) {\n span.markError(err);\n throw err;\n } finally {\n span.markSuccess();\n }\n };\n };\n\n/**\n * Attaches metrics counter to the resource.\n */\nconst metricsCounter = () => (target: any, propertyKey: string, descriptor?: PropertyDescriptor) => {\n getTracingContext(target).metricsProperties[propertyKey] = {};\n};\n\nexport type AddLinkOptions = {};\n\nconst addLink = (parent: any, child: any, opts: AddLinkOptions = {}) => {\n TRACE_PROCESSOR.addLink(parent, child, opts);\n};\n\nexport const trace = {\n resource,\n info,\n mark,\n span,\n metricsCounter,\n\n addLink,\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { type InfoOptions } from './api';\n\nexport const symbolTracingContext = Symbol('dxos.tracing.context');\n\nexport type TracingContext = {\n infoProperties: Record<\n string,\n {\n options: InfoOptions;\n }\n >;\n metricsProperties: Record<string, {}>;\n};\n\nexport const getTracingContext = (target: any): TracingContext => {\n return ((target[symbolTracingContext] as TracingContext | undefined) ??= {\n infoProperties: {},\n metricsProperties: {},\n });\n};\n\nexport const TRACE_SPAN_ATTRIBUTE = 'dxos.trace-span';\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { unrefTimeout } from '@dxos/async';\nimport { type Context } from '@dxos/context';\nimport { LogLevel, type LogProcessor, getContextFromEntry, log } from '@dxos/log';\nimport { type LogEntry } from '@dxos/protocols/proto/dxos/client/services';\nimport { type Error as SerializedError } from '@dxos/protocols/proto/dxos/error';\nimport { type Metric, type Resource, type Span } from '@dxos/protocols/proto/dxos/tracing';\nimport { getPrototypeSpecificInstanceId } from '@dxos/util';\n\nimport type { AddLinkOptions } from './api';\nimport { type BaseCounter } from './metrics';\nimport { TRACE_SPAN_ATTRIBUTE, getTracingContext } from './symbols';\nimport { TraceSender } from './trace-sender';\n\nexport type TraceResourceConstructorParams = {\n constructor: { new (...args: any[]): {} };\n instance: any;\n};\n\nexport type TraceSpanParams = {\n instance: any;\n methodName: string;\n parentCtx: Context | null;\n showInBrowserTimeline: boolean;\n};\n\nexport class ResourceEntry {\n /**\n * Sometimes bundlers mangle class names: WebFile -> WebFile2.\n *\n * We use a heuristic to remove the suffix.\n */\n public readonly sanitizedClassName: string;\n\n constructor(public data: Resource, public instance: WeakRef<any>) {\n this.sanitizedClassName = sanitizeClassName(data.className);\n }\n\n getMetric(name: string): Metric | undefined {\n return this.data.metrics?.find((metric) => metric.name === name);\n }\n}\n\nexport type TraceSubscription = {\n flush: () => void;\n\n dirtyResources: Set<number>;\n dirtySpans: Set<number>;\n newLogs: LogEntry[];\n};\n\nconst MAX_RESOURCE_RECORDS = 2_000;\nconst MAX_SPAN_RECORDS = 1_000;\nconst MAX_LOG_RECORDS = 1_000;\n\nconst REFRESH_INTERVAL = 1_000;\n\nconst MAX_INFO_OBJECT_DEPTH = 8;\n\nexport class TraceProcessor {\n resources = new Map<number, ResourceEntry>();\n resourceInstanceIndex = new WeakMap<any, ResourceEntry>();\n resourceIdList: number[] = [];\n\n spans = new Map<number, Span>();\n spanIdList: number[] = [];\n\n logs: LogEntry[] = [];\n\n subscriptions: Set<TraceSubscription> = new Set();\n\n constructor() {\n log.addProcessor(this._logProcessor.bind(this));\n\n const refreshInterval = setInterval(this.refresh.bind(this), REFRESH_INTERVAL);\n unrefTimeout(refreshInterval);\n }\n\n traceResourceConstructor(params: TraceResourceConstructorParams) {\n const id = this.resources.size;\n\n // init metrics counters.\n const tracingContext = getTracingContext(Object.getPrototypeOf(params.instance));\n for (const key of Object.keys(tracingContext.metricsProperties)) {\n (params.instance[key] as BaseCounter)._assign(params.instance, key);\n }\n\n const entry = new ResourceEntry(\n {\n id,\n className: params.constructor.name,\n instanceId: getPrototypeSpecificInstanceId(params.instance),\n info: this.getResourceInfo(params.instance),\n links: [],\n metrics: this.getResourceMetrics(params.instance),\n },\n new WeakRef(params.instance),\n );\n\n this.resources.set(id, entry);\n this.resourceInstanceIndex.set(params.instance, entry);\n this.resourceIdList.push(id);\n if (this.resourceIdList.length > MAX_RESOURCE_RECORDS) {\n this._clearResources();\n }\n this._markResourceDirty(id);\n }\n\n getResourceInfo(instance: any): Record<string, any> {\n const res: Record<string, any> = {};\n const tracingContext = getTracingContext(Object.getPrototypeOf(instance));\n\n for (const [key, { options }] of Object.entries(tracingContext.infoProperties)) {\n try {\n const value = typeof instance[key] === 'function' ? instance[key]() : instance[key];\n\n if (options.enum) {\n res[key] = options.enum[value];\n } else {\n res[key] = sanitizeValue(\n value,\n options.depth === undefined ? 1 : options.depth ?? MAX_INFO_OBJECT_DEPTH,\n this,\n );\n }\n } catch (err: any) {\n res[key] = err.message;\n }\n }\n\n return res;\n }\n\n getResourceMetrics(instance: any): Metric[] {\n const res: Metric[] = [];\n const tracingContext = getTracingContext(Object.getPrototypeOf(instance));\n\n for (const [key, _opts] of Object.entries(tracingContext.metricsProperties)) {\n res.push(instance[key].getData());\n }\n\n return res;\n }\n\n traceSpan(params: TraceSpanParams): TracingSpan {\n const span = new TracingSpan(this, params);\n this._flushSpan(span);\n return span;\n }\n\n addLink(parent: any, child: any, opts: AddLinkOptions) {}\n\n getResourceId(instance: any): number | null {\n const entry = this.resourceInstanceIndex.get(instance);\n return entry ? entry.data.id : null;\n }\n\n createTraceSender() {\n return new TraceSender(this);\n }\n\n refresh() {\n for (const resource of this.resources.values()) {\n const instance = resource.instance.deref();\n if (!instance) {\n continue;\n }\n\n const tracingContext = getTracingContext(Object.getPrototypeOf(instance));\n const time = performance.now();\n for (const key of Object.keys(tracingContext.metricsProperties)) {\n (instance[key] as BaseCounter)._tick?.(time);\n }\n\n let _changed = false;\n\n const oldInfo = resource.data.info;\n resource.data.info = this.getResourceInfo(instance);\n _changed ||= !areEqualShallow(oldInfo, resource.data.info);\n\n const oldMetrics = resource.data.metrics;\n resource.data.metrics = this.getResourceMetrics(instance);\n _changed ||= !areEqualShallow(oldMetrics, resource.data.metrics);\n\n // TODO(dmaretskyi): Test if works and enable.\n // if (changed) {\n this._markResourceDirty(resource.data.id);\n // }\n }\n\n for (const subscription of this.subscriptions) {\n subscription.flush();\n }\n }\n\n findResourcesByClassName(className: string): ResourceEntry[] {\n const res: ResourceEntry[] = [];\n for (const entry of this.resources.values()) {\n if (entry.data.className === className || entry.sanitizedClassName === className) {\n res.push(entry);\n }\n }\n return res;\n }\n\n getDiagnostics() {\n this.refresh();\n\n return {\n resources: Object.fromEntries(\n Array.from(this.resources.entries()).map(([id, entry]) => [\n `${entry.sanitizedClassName}#${entry.data.instanceId}`,\n entry.data,\n ]),\n ),\n spans: Array.from(this.spans.values()),\n logs: this.logs.filter((log) => log.level >= LogLevel.INFO),\n };\n }\n\n /**\n * @internal\n */\n _flushSpan(runtimeSpan: TracingSpan) {\n const span = runtimeSpan.serialize();\n this.spans.set(span.id, span);\n this.spanIdList.push(span.id);\n if (this.spanIdList.length > MAX_SPAN_RECORDS) {\n this._clearSpans();\n }\n this._markSpanDirty(span.id);\n }\n\n private _markResourceDirty(id: number) {\n for (const subscription of this.subscriptions) {\n subscription.dirtyResources.add(id);\n }\n }\n\n private _markSpanDirty(id: number) {\n for (const subscription of this.subscriptions) {\n subscription.dirtySpans.add(id);\n }\n }\n\n private _clearResources() {\n // TODO(dmaretskyi): Use FinalizationRegistry to delete finalized resources first.\n while (this.resourceIdList.length > MAX_RESOURCE_RECORDS) {\n const id = this.resourceIdList.shift()!;\n this.resources.delete(id);\n }\n }\n\n private _clearSpans() {\n while (this.spanIdList.length > MAX_SPAN_RECORDS) {\n const id = this.spanIdList.shift()!;\n this.spans.delete(id);\n }\n }\n\n private _pushLog(log: LogEntry) {\n this.logs.push(log);\n if (this.logs.length > MAX_LOG_RECORDS) {\n this.logs.shift();\n }\n\n for (const subscription of this.subscriptions) {\n subscription.newLogs.push(log);\n }\n }\n\n private _logProcessor: LogProcessor = (config, entry) => {\n switch (entry.level) {\n case LogLevel.ERROR:\n case LogLevel.WARN:\n case LogLevel.TRACE: {\n const scope = entry.meta?.S;\n const resource = this.resourceInstanceIndex.get(scope);\n if (!resource) {\n return;\n }\n\n const context = getContextFromEntry(entry) ?? {};\n\n for (const key of Object.keys(context)) {\n context[key] = sanitizeValue(context[key], 0, this);\n }\n\n const entryToPush: LogEntry = {\n level: entry.level,\n message: entry.message,\n context,\n timestamp: new Date(),\n meta: {\n file: entry.meta?.F ?? '',\n line: entry.meta?.L ?? 0,\n resourceId: resource.data.id,\n },\n };\n this._pushLog(entryToPush);\n break;\n }\n default:\n }\n };\n}\n\nexport class TracingSpan {\n static nextId = 0;\n\n readonly id: number;\n readonly parentId: number | null = null;\n readonly methodName: string;\n readonly resourceId: number | null = null;\n startTs: number;\n endTs: number | null = null;\n error: SerializedError | null = null;\n\n private _showInBrowserTimeline: boolean;\n private readonly _ctx: Context | null = null;\n\n constructor(private _traceProcessor: TraceProcessor, params: TraceSpanParams) {\n this.id = TracingSpan.nextId++;\n this.methodName = params.methodName;\n this.resourceId = _traceProcessor.getResourceId(params.instance);\n this.startTs = performance.now();\n this._showInBrowserTimeline = params.showInBrowserTimeline;\n\n if (params.parentCtx) {\n this._ctx = params.parentCtx.derive({\n attributes: {\n [TRACE_SPAN_ATTRIBUTE]: this.id,\n },\n });\n const parentId = params.parentCtx.getAttribute(TRACE_SPAN_ATTRIBUTE);\n if (typeof parentId === 'number') {\n this.parentId = parentId;\n }\n }\n }\n\n get ctx(): Context | null {\n return this._ctx;\n }\n\n markSuccess() {\n this.endTs = performance.now();\n this._traceProcessor._flushSpan(this);\n\n if (this._showInBrowserTimeline) {\n this._markInBrowserTimeline();\n }\n }\n\n markError(err: unknown) {\n this.endTs = performance.now();\n this.error = serializeError(err);\n this._traceProcessor._flushSpan(this);\n\n if (this._showInBrowserTimeline) {\n this._markInBrowserTimeline();\n }\n }\n\n serialize(): Span {\n return {\n id: this.id,\n resourceId: this.resourceId ?? undefined,\n methodName: this.methodName,\n parentId: this.parentId ?? undefined,\n startTs: this.startTs.toFixed(3),\n endTs: this.endTs?.toFixed(3) ?? undefined,\n error: this.error ?? undefined,\n };\n }\n\n private _markInBrowserTimeline() {\n const resource = this._traceProcessor.resources.get(this.resourceId!);\n const name = resource\n ? `${resource.sanitizedClassName}#${resource.data.instanceId}.${this.methodName}`\n : this.methodName;\n performance.measure(name, { start: this.startTs, end: this.endTs! });\n }\n}\n\nconst serializeError = (err: unknown): SerializedError => {\n if (err instanceof Error) {\n return {\n name: err.name,\n message: err.message,\n };\n }\n\n return {\n message: String(err),\n };\n};\n\nexport const TRACE_PROCESSOR: TraceProcessor = ((globalThis as any).TRACE_PROCESSOR ??= new TraceProcessor());\n\nconst sanitizeValue = (value: any, depth: number, traceProcessor: TraceProcessor): any => {\n switch (typeof value) {\n case 'string':\n case 'number':\n case 'boolean':\n case 'undefined':\n return value;\n break;\n case 'object':\n case 'function':\n if (value === null) {\n return value;\n }\n\n {\n const resourceEntry = traceProcessor.resourceInstanceIndex.get(value);\n if (resourceEntry) {\n return `${resourceEntry.sanitizedClassName}#${resourceEntry.data.instanceId}`;\n }\n }\n\n if (typeof value.toJSON === 'function') {\n // TODO(dmaretskyi): This has potential to cause infinite recursion.\n return sanitizeValue(value.toJSON(), depth, traceProcessor);\n }\n\n if (depth > 0) {\n if (isSetLike(value)) {\n return Object.fromEntries(\n Array.from(value.entries()).map((value) => sanitizeValue(value, depth - 1, traceProcessor)),\n );\n } else if (isMapLike(value)) {\n return Object.fromEntries(\n Array.from(value.entries()).map(([key, value]) => [key, sanitizeValue(value, depth - 1, traceProcessor)]),\n );\n } else if (Array.isArray(value)) {\n return value.map((item: any) => sanitizeValue(item, depth - 1, traceProcessor));\n } else if (typeof value === 'object') {\n const res: any = {};\n for (const key of Object.keys(value)) {\n res[key] = sanitizeValue(value[key], depth - 1, traceProcessor);\n }\n return res;\n }\n }\n\n // TODO(dmaretskyi): Expose trait.\n if (typeof value.truncate === 'function') {\n return value.truncate();\n }\n\n return value.toString();\n }\n};\n\nconst areEqualShallow = (a: any, b: any) => {\n for (const key in a) {\n if (!(key in b) || a[key] !== b[key]) {\n return false;\n }\n }\n for (const key in b) {\n if (!(key in a) || a[key] !== b[key]) {\n return false;\n }\n }\n return true;\n};\n\nexport const sanitizeClassName = (className: string) => {\n const SANITIZE_REGEX = /[^_](\\d+)$/;\n const m = className.match(SANITIZE_REGEX);\n if (!m) {\n return className;\n } else {\n return className.slice(0, -m[1].length);\n }\n};\n\nconst isSetLike = (value: any): value is Set<any> =>\n value instanceof Set ||\n (typeof value === 'object' && value !== null && Object.getPrototypeOf(value).constructor.name === 'ComplexSet');\n\nconst isMapLike = (value: any): value is Map<any, any> =>\n value instanceof Map ||\n (typeof value === 'object' && value !== null && Object.getPrototypeOf(value).constructor.name === 'ComplexMap');\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { Stream } from '@dxos/codec-protobuf';\nimport { type LogEntry } from '@dxos/protocols/proto/dxos/client/services';\nimport { type StreamTraceEvent, type TracingService } from '@dxos/protocols/proto/dxos/tracing';\n\nimport { type TraceProcessor, type TraceSubscription } from './trace-processor';\n\nexport class TraceSender implements TracingService {\n constructor(private _traceProcessor: TraceProcessor) {}\n\n streamTrace(request: void): Stream<StreamTraceEvent> {\n return new Stream(({ ctx, next }) => {\n const flushEvents = (resources: Set<number> | null, spans: Set<number> | null, logs: LogEntry[] | null) => {\n const event: StreamTraceEvent = {\n resourceAdded: [],\n resourceRemoved: [],\n spanAdded: [],\n logAdded: [],\n };\n\n if (resources) {\n for (const id of resources) {\n const entry = this._traceProcessor.resources.get(id);\n if (entry) {\n event.resourceAdded!.push({ resource: entry.data });\n } else {\n event.resourceRemoved!.push({ id });\n }\n }\n } else {\n for (const entry of this._traceProcessor.resources.values()) {\n event.resourceAdded!.push({ resource: entry.data });\n }\n }\n\n if (spans) {\n for (const id of spans) {\n const span = this._traceProcessor.spans.get(id);\n if (span) {\n event.spanAdded!.push({ span });\n }\n }\n } else {\n for (const span of this._traceProcessor.spans.values()) {\n event.spanAdded!.push({ span });\n }\n }\n\n if (logs) {\n for (const log of logs) {\n event.logAdded!.push({ log });\n }\n } else {\n for (const log of this._traceProcessor.logs) {\n event.logAdded!.push({ log });\n }\n }\n\n if (event.resourceAdded!.length > 0 || event.resourceRemoved!.length > 0 || event.spanAdded!.length > 0) {\n next(event);\n }\n };\n\n const flush = () => {\n flushEvents(subscription.dirtyResources, subscription.dirtySpans, subscription.newLogs);\n subscription.dirtyResources.clear();\n subscription.dirtySpans.clear();\n subscription.newLogs.length = 0;\n };\n\n const subscription: TraceSubscription = {\n flush,\n dirtyResources: new Set(),\n dirtySpans: new Set(),\n newLogs: [],\n };\n this._traceProcessor.subscriptions.add(subscription);\n ctx.onDispose(() => {\n this._traceProcessor.subscriptions.delete(subscription);\n });\n\n flushEvents(null, null, null);\n });\n }\n}\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { type Metric } from '@dxos/protocols/proto/dxos/tracing';\n\nexport abstract class BaseCounter {\n /**\n * @internal\n */\n _instance: any;\n\n name?: string;\n\n /**\n * @internal\n */\n _assign(instance: any, name: string) {\n this._instance = instance;\n this.name = name;\n }\n\n abstract getData(): Metric;\n\n _tick(time: number): void {}\n}\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { type Metric } from '@dxos/protocols/proto/dxos/tracing';\n\nimport { BaseCounter } from './base';\n\nexport class UnaryCounter extends BaseCounter {\n value = 0;\n units?: string;\n\n constructor({ units }: { units?: string } = {}) {\n super();\n this.units = units;\n }\n\n inc(by = 1) {\n this.value += by;\n }\n\n getData(): Metric {\n return {\n name: this.name!,\n counter: {\n value: this.value,\n units: this.units,\n },\n };\n }\n}\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { type Metric } from '@dxos/protocols/proto/dxos/tracing';\n\nimport { BaseCounter } from './base';\n\nconst MAX_BUCKETS = 60;\n\nexport class TimeSeriesCounter extends BaseCounter {\n private _currentValue = 0;\n private _totalValue = 0;\n private _buckets: number[] = [];\n units?: string;\n\n constructor({ units }: { units?: string } = {}) {\n super();\n this.units = units;\n }\n\n inc(by = 1) {\n this._currentValue += by;\n this._totalValue += by;\n }\n\n override _tick(time: number): void {\n this._buckets.push(this._currentValue);\n if (this._buckets.length > MAX_BUCKETS) {\n this._buckets.shift();\n }\n this._currentValue = 0;\n }\n\n override getData(): Metric {\n return {\n name: this.name!,\n timeSeries: {\n tracks: [\n {\n name: this.name!,\n units: this.units,\n points: this._buckets.map((value, index) => ({\n value,\n })),\n total: this._totalValue,\n },\n ],\n },\n };\n }\n}\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { type Metric } from '@dxos/protocols/proto/dxos/tracing';\n\nimport { BaseCounter } from './base';\n\nconst MAX_BUCKETS = 60;\n\nexport class TimeUsageCounter extends BaseCounter {\n private _currentValue = 0;\n private _totalValue = 0;\n private _buckets: number[] = [];\n\n private _lastTickTime = performance.now();\n\n record(time: number) {\n this._currentValue += time;\n this._totalValue += time;\n }\n\n beginRecording(): { end: () => void } {\n const start = performance.now();\n return {\n end: () => {\n const end = performance.now();\n this.record(end - start);\n },\n };\n }\n\n override _tick(time: number): void {\n const delta = time - this._lastTickTime;\n this._lastTickTime = time;\n\n const percentage = (this._currentValue / delta) * 100;\n this._buckets.push(percentage);\n if (this._buckets.length > MAX_BUCKETS) {\n this._buckets.shift();\n }\n this._currentValue = 0;\n }\n\n override getData(): Metric {\n return {\n name: this.name!,\n timeSeries: {\n tracks: [\n {\n name: this.name!,\n units: '%',\n points: this._buckets.map((value, index) => ({\n value,\n })),\n total: this._totalValue,\n },\n ],\n },\n };\n }\n}\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { type Metric } from '@dxos/protocols/proto/dxos/tracing';\n\nimport { BaseCounter } from './base';\n\nexport class MapCounter extends BaseCounter {\n values = new Map<string, number>();\n units?: string;\n\n constructor({ units }: { units?: string } = {}) {\n super();\n this.units = units;\n }\n\n inc(key: string, by = 1) {\n const prev = this.values.get(key) ?? 0;\n this.values.set(key, prev + by);\n }\n\n getData(): Metric {\n return {\n name: this.name!,\n multiCounter: {\n records: Array.from(this.values.entries()).map(([key, value]) => ({\n key,\n value,\n })),\n units: this.units,\n },\n };\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["symbolTracingContext", "Symbol", "getTracingContext", "target", "infoProperties", "metricsProperties", "TRACE_SPAN_ATTRIBUTE", "TraceSender", "constructor", "_traceProcessor", "streamTrace", "request", "Stream", "ctx", "next", "flushEvents", "resources", "spans", "logs", "event", "resourceAdded", "resourceRemoved", "spanAdded", "logAdded", "id", "entry", "get", "push", "resource", "data", "values", "span", "log", "length", "flush", "subscription", "dirtyResources", "dirtySpans", "newLogs", "clear", "Set", "subscriptions", "add", "onDispose", "delete", "ResourceEntry", "instance", "sanitizedClassName", "sanitizeClassName", "className", "getMetric", "name", "metrics", "find", "metric", "MAX_RESOURCE_RECORDS", "MAX_SPAN_RECORDS", "MAX_LOG_RECORDS", "REFRESH_INTERVAL", "MAX_INFO_OBJECT_DEPTH", "TraceProcessor", "Map", "resourceInstanceIndex", "WeakMap", "resourceIdList", "spanIdList", "_logProcessor", "config", "level", "LogLevel", "ERROR", "WARN", "TRACE", "scope", "meta", "S", "context", "getContextFromEntry", "key", "Object", "keys", "sanitizeValue", "entryToPush", "message", "timestamp", "Date", "file", "F", "line", "L", "resourceId", "_pushLog", "addProcessor", "bind", "refreshInterval", "setInterval", "refresh", "unrefTimeout", "traceResourceConstructor", "params", "size", "tracingContext", "getPrototypeOf", "_assign", "instanceId", "getPrototypeSpecificInstanceId", "info", "getResourceInfo", "links", "getResourceMetrics", "WeakRef", "set", "_clearResources", "_markResourceDirty", "res", "options", "entries", "value", "enum", "depth", "undefined", "err", "_opts", "getData", "traceSpan", "TracingSpan", "_flushSpan", "addLink", "parent", "child", "opts", "getResourceId", "createTraceSender", "deref", "time", "performance", "now", "_tick", "_changed", "oldInfo", "areEqualShallow", "oldMetrics", "findResourcesByClassName", "getDiagnostics", "fromEntries", "Array", "from", "map", "filter", "INFO", "runtimeSpan", "serialize", "_clearSpans", "_markSpanDirty", "shift", "nextId", "parentId", "endTs", "error", "_ctx", "methodName", "startTs", "_showInBrowserTimeline", "showInBrowserTimeline", "parentCtx", "derive", "attributes", "getAttribute", "markSuccess", "_markInBrowserTimeline", "markError", "serializeError", "toFixed", "measure", "start", "end", "Error", "String", "TRACE_PROCESSOR", "globalThis", "traceProcessor", "resourceEntry", "toJSON", "isSetLike", "isMapLike", "isArray", "item", "truncate", "toString", "a", "b", "SANITIZE_REGEX", "m", "match", "slice", "klass", "rest", "defineProperty", "propertyKey", "descriptor", "mark", "method", "args", "Context", "callArgs", "apply", "metricsCounter", "trace", "BaseCounter", "_instance", "UnaryCounter", "units", "inc", "by", "counter", "MAX_BUCKETS", "TimeSeriesCounter", "_currentValue", "_totalValue", "_buckets", "timeSeries", "tracks", "points", "index", "total", "TimeUsageCounter", "_lastTickTime", "record", "beginRecording", "delta", "percentage", "MapCounter", "prev", "multiCounter", "records"]
|
|
7
7
|
}
|
package/dist/lib/node/meta.json
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"inputs":{"packages/common/tracing/src/symbols.ts":{"bytes":
|
|
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":49944,"imports":[{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true},{"path":"packages/common/tracing/src/symbols.ts","kind":"import-statement","original":"./symbols"},{"path":"packages/common/tracing/src/trace-sender.ts","kind":"import-statement","original":"./trace-sender"}],"format":"esm"},"packages/common/tracing/src/api.ts":{"bytes":9224,"imports":[{"path":"@dxos/context","kind":"import-statement","external":true},{"path":"packages/common/tracing/src/symbols.ts","kind":"import-statement","original":"./symbols"},{"path":"packages/common/tracing/src/trace-processor.ts","kind":"import-statement","original":"./trace-processor"}],"format":"esm"},"packages/common/tracing/src/metrics/base.ts":{"bytes":1450,"imports":[],"format":"esm"},"packages/common/tracing/src/metrics/unary-counter.ts":{"bytes":2128,"imports":[{"path":"packages/common/tracing/src/metrics/base.ts","kind":"import-statement","original":"./base"}],"format":"esm"},"packages/common/tracing/src/metrics/time-series-counter.ts":{"bytes":4268,"imports":[{"path":"packages/common/tracing/src/metrics/base.ts","kind":"import-statement","original":"./base"}],"format":"esm"},"packages/common/tracing/src/metrics/time-usage-counter.ts":{"bytes":5249,"imports":[{"path":"packages/common/tracing/src/metrics/base.ts","kind":"import-statement","original":"./base"}],"format":"esm"},"packages/common/tracing/src/metrics/map-counter.ts":{"bytes":2977,"imports":[{"path":"packages/common/tracing/src/metrics/base.ts","kind":"import-statement","original":"./base"}],"format":"esm"},"packages/common/tracing/src/metrics/index.ts":{"bytes":892,"imports":[{"path":"packages/common/tracing/src/metrics/base.ts","kind":"import-statement","original":"./base"},{"path":"packages/common/tracing/src/metrics/unary-counter.ts","kind":"import-statement","original":"./unary-counter"},{"path":"packages/common/tracing/src/metrics/time-series-counter.ts","kind":"import-statement","original":"./time-series-counter"},{"path":"packages/common/tracing/src/metrics/time-usage-counter.ts","kind":"import-statement","original":"./time-usage-counter"},{"path":"packages/common/tracing/src/metrics/map-counter.ts","kind":"import-statement","original":"./map-counter"}],"format":"esm"},"packages/common/tracing/src/index.ts":{"bytes":831,"imports":[{"path":"packages/common/tracing/src/api.ts","kind":"import-statement","original":"./api"},{"path":"packages/common/tracing/src/symbols.ts","kind":"import-statement","original":"./symbols"},{"path":"packages/common/tracing/src/trace-processor.ts","kind":"import-statement","original":"./trace-processor"},{"path":"packages/common/tracing/src/trace-sender.ts","kind":"import-statement","original":"./trace-sender"},{"path":"packages/common/tracing/src/metrics/index.ts","kind":"import-statement","original":"./metrics"}],"format":"esm"}},"outputs":{"packages/common/tracing/dist/lib/node/index.cjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":43784},"packages/common/tracing/dist/lib/node/index.cjs":{"imports":[{"path":"@dxos/context","kind":"import-statement","external":true},{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true},{"path":"@dxos/codec-protobuf","kind":"import-statement","external":true}],"exports":["BaseCounter","MapCounter","ResourceEntry","TRACE_PROCESSOR","TRACE_SPAN_ATTRIBUTE","TimeSeriesCounter","TimeUsageCounter","TraceProcessor","TraceSender","TracingSpan","UnaryCounter","getTracingContext","sanitizeClassName","symbolTracingContext","trace"],"entryPoint":"packages/common/tracing/src/index.ts","inputs":{"packages/common/tracing/src/api.ts":{"bytesInOutput":1588},"packages/common/tracing/src/symbols.ts":{"bytesInOutput":245},"packages/common/tracing/src/trace-processor.ts":{"bytesInOutput":11607},"packages/common/tracing/src/trace-sender.ts":{"bytesInOutput":2555},"packages/common/tracing/src/index.ts":{"bytesInOutput":0},"packages/common/tracing/src/metrics/base.ts":{"bytesInOutput":159},"packages/common/tracing/src/metrics/index.ts":{"bytesInOutput":0},"packages/common/tracing/src/metrics/unary-counter.ts":{"bytesInOutput":324},"packages/common/tracing/src/metrics/time-series-counter.ts":{"bytesInOutput":812},"packages/common/tracing/src/metrics/time-usage-counter.ts":{"bytesInOutput":1136},"packages/common/tracing/src/metrics/map-counter.ts":{"bytesInOutput":509}},"bytes":19805}}}
|
package/dist/types/src/api.d.ts
CHANGED
|
@@ -1,3 +1,24 @@
|
|
|
1
|
+
export type InfoOptions = {
|
|
2
|
+
/**
|
|
3
|
+
* Value is of enum type and should be converted to string.
|
|
4
|
+
*
|
|
5
|
+
* Example:
|
|
6
|
+
*
|
|
7
|
+
* ```ts
|
|
8
|
+
* @trace.info({ enum: SpaceState })
|
|
9
|
+
* get state(): SpaceState { ... }
|
|
10
|
+
* ```
|
|
11
|
+
*/
|
|
12
|
+
enum?: Record<string, any>;
|
|
13
|
+
/**
|
|
14
|
+
* Max depth of the object to be included in the resource info section.
|
|
15
|
+
*
|
|
16
|
+
* null means no limit (a limit of 8 nested objects is still imposed).
|
|
17
|
+
*
|
|
18
|
+
* Default: 0 - objects will be stringified with toString.
|
|
19
|
+
*/
|
|
20
|
+
depth?: number | null;
|
|
21
|
+
};
|
|
1
22
|
export type SpanOptions = {
|
|
2
23
|
showInBrowserTimeline?: boolean;
|
|
3
24
|
};
|
|
@@ -6,7 +27,7 @@ export declare const trace: {
|
|
|
6
27
|
resource: () => <T extends new (...args: any[]) => {}>(constructor: T) => {
|
|
7
28
|
new (...rest: any[]): {};
|
|
8
29
|
} & T;
|
|
9
|
-
info: () => (target: any, propertyKey: string, descriptor?: PropertyDescriptor) => void;
|
|
30
|
+
info: (opts?: InfoOptions) => (target: any, propertyKey: string, descriptor?: PropertyDescriptor) => void;
|
|
10
31
|
mark: (name: string) => void;
|
|
11
32
|
span: ({ showInBrowserTimeline }?: SpanOptions) => (target: any, propertyKey: string, descriptor: TypedPropertyDescriptor<(...args: any) => any>) => void;
|
|
12
33
|
metricsCounter: () => (target: any, propertyKey: string, descriptor?: PropertyDescriptor) => void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../../src/api.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../../src/api.ts"],"names":[],"mappings":"AA2BA,MAAM,MAAM,WAAW,GAAG;IACxB;;;;;;;;;OASG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAE3B;;;;;;OAMG;IACH,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACvB,CAAC;AAeF,MAAM,MAAM,WAAW,GAAG;IACxB,qBAAqB,CAAC,EAAE,OAAO,CAAC;CACjC,CAAC;AAmCF,MAAM,MAAM,cAAc,GAAG,EAAE,CAAC;AAMhC,eAAO,MAAM,KAAK;6CA5FW,GAAG,EAAE,KAAG,EAAE;sBAIV,GAAG,EAAE;;kBAoCzB,WAAW,cACT,GAAG,eAAe,MAAM,eAAe,kBAAkB;iBAIhD,MAAM;uCASY,WAAW,cACtC,GAAG,eAAe,MAAM,gDAAgD,GAAG,KAAK,GAAG;mCA2BxD,GAAG,eAAe,MAAM,eAAe,kBAAkB;sBAMtE,GAAG,SAAS,GAAG,SAAQ,cAAc;CAY7D,CAAC"}
|
|
@@ -1,6 +1,9 @@
|
|
|
1
|
+
import { type InfoOptions } from './api';
|
|
1
2
|
export declare const symbolTracingContext: unique symbol;
|
|
2
3
|
export type TracingContext = {
|
|
3
|
-
infoProperties: Record<string, {
|
|
4
|
+
infoProperties: Record<string, {
|
|
5
|
+
options: InfoOptions;
|
|
6
|
+
}>;
|
|
4
7
|
metricsProperties: Record<string, {}>;
|
|
5
8
|
};
|
|
6
9
|
export declare const getTracingContext: (target: any) => TracingContext;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"symbols.d.ts","sourceRoot":"","sources":["../../../src/symbols.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,oBAAoB,eAAiC,CAAC;AAEnE,MAAM,MAAM,cAAc,GAAG;IAC3B,cAAc,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"symbols.d.ts","sourceRoot":"","sources":["../../../src/symbols.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,OAAO,CAAC;AAEzC,eAAO,MAAM,oBAAoB,eAAiC,CAAC;AAEnE,MAAM,MAAM,cAAc,GAAG;IAC3B,cAAc,EAAE,MAAM,CACpB,MAAM,EACN;QACE,OAAO,EAAE,WAAW,CAAC;KACtB,CACF,CAAC;IACF,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;CACvC,CAAC;AAEF,eAAO,MAAM,iBAAiB,WAAY,GAAG,KAAG,cAK/C,CAAC;AAEF,eAAO,MAAM,oBAAoB,oBAAoB,CAAC"}
|
|
@@ -52,6 +52,13 @@ export declare class TraceProcessor {
|
|
|
52
52
|
createTraceSender(): TraceSender;
|
|
53
53
|
refresh(): void;
|
|
54
54
|
findResourcesByClassName(className: string): ResourceEntry[];
|
|
55
|
+
getDiagnostics(): {
|
|
56
|
+
resources: {
|
|
57
|
+
[k: string]: Resource;
|
|
58
|
+
};
|
|
59
|
+
spans: Span[];
|
|
60
|
+
logs: LogEntry[];
|
|
61
|
+
};
|
|
55
62
|
private _markResourceDirty;
|
|
56
63
|
private _markSpanDirty;
|
|
57
64
|
private _clearResources;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"trace-processor.d.ts","sourceRoot":"","sources":["../../../src/trace-processor.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,KAAK,OAAO,EAAE,MAAM,eAAe,CAAC;AAE7C,OAAO,EAAE,KAAK,QAAQ,EAAE,MAAM,4CAA4C,CAAC;AAC3E,OAAO,EAAE,KAAK,KAAK,IAAI,eAAe,EAAE,MAAM,kCAAkC,CAAC;AACjF,OAAO,EAAE,KAAK,MAAM,EAAE,KAAK,QAAQ,EAAE,KAAK,IAAI,EAAE,MAAM,oCAAoC,CAAC;AAG3F,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,OAAO,CAAC;AAG5C,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAE7C,MAAM,MAAM,8BAA8B,GAAG;IAC3C,WAAW,EAAE;QAAE,KAAK,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,CAAA;KAAE,CAAC;IAC1C,QAAQ,EAAE,GAAG,CAAC;CACf,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG;IAC5B,QAAQ,EAAE,GAAG,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,OAAO,GAAG,IAAI,CAAC;IAC1B,qBAAqB,EAAE,OAAO,CAAC;CAChC,CAAC;AAEF,qBAAa,aAAa;IAQL,IAAI,EAAE,QAAQ;IAAS,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC;IAPhE;;;;OAIG;IACH,SAAgB,kBAAkB,EAAE,MAAM,CAAC;gBAExB,IAAI,EAAE,QAAQ,EAAS,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC;IAIhE,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;CAG5C;AAED,MAAM,MAAM,iBAAiB,GAAG;IAC9B,KAAK,EAAE,MAAM,IAAI,CAAC;IAElB,cAAc,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAC5B,UAAU,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACxB,OAAO,EAAE,QAAQ,EAAE,CAAC;CACrB,CAAC;
|
|
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.3.11-next.
|
|
3
|
+
"version": "0.3.11-next.e28df4f",
|
|
4
4
|
"description": "Async utilities.",
|
|
5
5
|
"homepage": "https://dxos.org",
|
|
6
6
|
"bugs": "https://github.com/dxos/dxos/issues",
|
|
@@ -16,15 +16,15 @@
|
|
|
16
16
|
"src"
|
|
17
17
|
],
|
|
18
18
|
"dependencies": {
|
|
19
|
-
"@dxos/async": "0.3.11-next.
|
|
20
|
-
"@dxos/codec-protobuf": "0.3.11-next.
|
|
21
|
-
"@dxos/
|
|
22
|
-
"@dxos/
|
|
23
|
-
"@dxos/
|
|
24
|
-
"@dxos/
|
|
25
|
-
"@dxos/node-std": "0.3.11-next.
|
|
26
|
-
"@dxos/
|
|
27
|
-
"@dxos/
|
|
19
|
+
"@dxos/async": "0.3.11-next.e28df4f",
|
|
20
|
+
"@dxos/codec-protobuf": "0.3.11-next.e28df4f",
|
|
21
|
+
"@dxos/debug": "0.3.11-next.e28df4f",
|
|
22
|
+
"@dxos/context": "0.3.11-next.e28df4f",
|
|
23
|
+
"@dxos/invariant": "0.3.11-next.e28df4f",
|
|
24
|
+
"@dxos/log": "0.3.11-next.e28df4f",
|
|
25
|
+
"@dxos/node-std": "0.3.11-next.e28df4f",
|
|
26
|
+
"@dxos/util": "0.3.11-next.e28df4f",
|
|
27
|
+
"@dxos/protocols": "0.3.11-next.e28df4f"
|
|
28
28
|
},
|
|
29
29
|
"devDependencies": {},
|
|
30
30
|
"publishConfig": {
|
package/src/api.ts
CHANGED
|
@@ -25,12 +25,37 @@ const resource =
|
|
|
25
25
|
return klass;
|
|
26
26
|
};
|
|
27
27
|
|
|
28
|
+
export type InfoOptions = {
|
|
29
|
+
/**
|
|
30
|
+
* Value is of enum type and should be converted to string.
|
|
31
|
+
*
|
|
32
|
+
* Example:
|
|
33
|
+
*
|
|
34
|
+
* ```ts
|
|
35
|
+
* @trace.info({ enum: SpaceState })
|
|
36
|
+
* get state(): SpaceState { ... }
|
|
37
|
+
* ```
|
|
38
|
+
*/
|
|
39
|
+
enum?: Record<string, any>;
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Max depth of the object to be included in the resource info section.
|
|
43
|
+
*
|
|
44
|
+
* null means no limit (a limit of 8 nested objects is still imposed).
|
|
45
|
+
*
|
|
46
|
+
* Default: 0 - objects will be stringified with toString.
|
|
47
|
+
*/
|
|
48
|
+
depth?: number | null;
|
|
49
|
+
};
|
|
50
|
+
|
|
28
51
|
/**
|
|
29
52
|
* Marks a property or a method to be included in the resource info section.
|
|
30
53
|
*/
|
|
31
|
-
const info =
|
|
32
|
-
|
|
33
|
-
|
|
54
|
+
const info =
|
|
55
|
+
(opts: InfoOptions = {}) =>
|
|
56
|
+
(target: any, propertyKey: string, descriptor?: PropertyDescriptor) => {
|
|
57
|
+
getTracingContext(target).infoProperties[propertyKey] = { options: opts };
|
|
58
|
+
};
|
|
34
59
|
|
|
35
60
|
const mark = (name: string) => {
|
|
36
61
|
performance.mark(name);
|
package/src/symbols.ts
CHANGED
|
@@ -2,10 +2,17 @@
|
|
|
2
2
|
// Copyright 2023 DXOS.org
|
|
3
3
|
//
|
|
4
4
|
|
|
5
|
+
import { type InfoOptions } from './api';
|
|
6
|
+
|
|
5
7
|
export const symbolTracingContext = Symbol('dxos.tracing.context');
|
|
6
8
|
|
|
7
9
|
export type TracingContext = {
|
|
8
|
-
infoProperties: Record<
|
|
10
|
+
infoProperties: Record<
|
|
11
|
+
string,
|
|
12
|
+
{
|
|
13
|
+
options: InfoOptions;
|
|
14
|
+
}
|
|
15
|
+
>;
|
|
9
16
|
metricsProperties: Record<string, {}>;
|
|
10
17
|
};
|
|
11
18
|
|
package/src/trace-processor.ts
CHANGED
|
@@ -58,6 +58,8 @@ const MAX_LOG_RECORDS = 1_000;
|
|
|
58
58
|
|
|
59
59
|
const REFRESH_INTERVAL = 1_000;
|
|
60
60
|
|
|
61
|
+
const MAX_INFO_OBJECT_DEPTH = 8;
|
|
62
|
+
|
|
61
63
|
export class TraceProcessor {
|
|
62
64
|
resources = new Map<number, ResourceEntry>();
|
|
63
65
|
resourceInstanceIndex = new WeakMap<any, ResourceEntry>();
|
|
@@ -111,9 +113,19 @@ export class TraceProcessor {
|
|
|
111
113
|
const res: Record<string, any> = {};
|
|
112
114
|
const tracingContext = getTracingContext(Object.getPrototypeOf(instance));
|
|
113
115
|
|
|
114
|
-
for (const [key,
|
|
116
|
+
for (const [key, { options }] of Object.entries(tracingContext.infoProperties)) {
|
|
115
117
|
try {
|
|
116
|
-
|
|
118
|
+
const value = typeof instance[key] === 'function' ? instance[key]() : instance[key];
|
|
119
|
+
|
|
120
|
+
if (options.enum) {
|
|
121
|
+
res[key] = options.enum[value];
|
|
122
|
+
} else {
|
|
123
|
+
res[key] = sanitizeValue(
|
|
124
|
+
value,
|
|
125
|
+
options.depth === undefined ? 1 : options.depth ?? MAX_INFO_OBJECT_DEPTH,
|
|
126
|
+
this,
|
|
127
|
+
);
|
|
128
|
+
}
|
|
117
129
|
} catch (err: any) {
|
|
118
130
|
res[key] = err.message;
|
|
119
131
|
}
|
|
@@ -194,6 +206,21 @@ export class TraceProcessor {
|
|
|
194
206
|
return res;
|
|
195
207
|
}
|
|
196
208
|
|
|
209
|
+
getDiagnostics() {
|
|
210
|
+
this.refresh();
|
|
211
|
+
|
|
212
|
+
return {
|
|
213
|
+
resources: Object.fromEntries(
|
|
214
|
+
Array.from(this.resources.entries()).map(([id, entry]) => [
|
|
215
|
+
`${entry.sanitizedClassName}#${entry.data.instanceId}`,
|
|
216
|
+
entry.data,
|
|
217
|
+
]),
|
|
218
|
+
),
|
|
219
|
+
spans: Array.from(this.spans.values()),
|
|
220
|
+
logs: this.logs.filter((log) => log.level >= LogLevel.INFO),
|
|
221
|
+
};
|
|
222
|
+
}
|
|
223
|
+
|
|
197
224
|
/**
|
|
198
225
|
* @internal
|
|
199
226
|
*/
|
|
@@ -259,7 +286,7 @@ export class TraceProcessor {
|
|
|
259
286
|
const context = getContextFromEntry(entry) ?? {};
|
|
260
287
|
|
|
261
288
|
for (const key of Object.keys(context)) {
|
|
262
|
-
context[key] = sanitizeValue(context[key]);
|
|
289
|
+
context[key] = sanitizeValue(context[key], 0, this);
|
|
263
290
|
}
|
|
264
291
|
|
|
265
292
|
const entryToPush: LogEntry = {
|
|
@@ -374,7 +401,7 @@ const serializeError = (err: unknown): SerializedError => {
|
|
|
374
401
|
|
|
375
402
|
export const TRACE_PROCESSOR: TraceProcessor = ((globalThis as any).TRACE_PROCESSOR ??= new TraceProcessor());
|
|
376
403
|
|
|
377
|
-
const sanitizeValue = (value: any) => {
|
|
404
|
+
const sanitizeValue = (value: any, depth: number, traceProcessor: TraceProcessor): any => {
|
|
378
405
|
switch (typeof value) {
|
|
379
406
|
case 'string':
|
|
380
407
|
case 'number':
|
|
@@ -386,7 +413,38 @@ const sanitizeValue = (value: any) => {
|
|
|
386
413
|
case 'function':
|
|
387
414
|
if (value === null) {
|
|
388
415
|
return value;
|
|
389
|
-
|
|
416
|
+
}
|
|
417
|
+
|
|
418
|
+
{
|
|
419
|
+
const resourceEntry = traceProcessor.resourceInstanceIndex.get(value);
|
|
420
|
+
if (resourceEntry) {
|
|
421
|
+
return `${resourceEntry.sanitizedClassName}#${resourceEntry.data.instanceId}`;
|
|
422
|
+
}
|
|
423
|
+
}
|
|
424
|
+
|
|
425
|
+
if (typeof value.toJSON === 'function') {
|
|
426
|
+
// TODO(dmaretskyi): This has potential to cause infinite recursion.
|
|
427
|
+
return sanitizeValue(value.toJSON(), depth, traceProcessor);
|
|
428
|
+
}
|
|
429
|
+
|
|
430
|
+
if (depth > 0) {
|
|
431
|
+
if (isSetLike(value)) {
|
|
432
|
+
return Object.fromEntries(
|
|
433
|
+
Array.from(value.entries()).map((value) => sanitizeValue(value, depth - 1, traceProcessor)),
|
|
434
|
+
);
|
|
435
|
+
} else if (isMapLike(value)) {
|
|
436
|
+
return Object.fromEntries(
|
|
437
|
+
Array.from(value.entries()).map(([key, value]) => [key, sanitizeValue(value, depth - 1, traceProcessor)]),
|
|
438
|
+
);
|
|
439
|
+
} else if (Array.isArray(value)) {
|
|
440
|
+
return value.map((item: any) => sanitizeValue(item, depth - 1, traceProcessor));
|
|
441
|
+
} else if (typeof value === 'object') {
|
|
442
|
+
const res: any = {};
|
|
443
|
+
for (const key of Object.keys(value)) {
|
|
444
|
+
res[key] = sanitizeValue(value[key], depth - 1, traceProcessor);
|
|
445
|
+
}
|
|
446
|
+
return res;
|
|
447
|
+
}
|
|
390
448
|
}
|
|
391
449
|
|
|
392
450
|
// TODO(dmaretskyi): Expose trait.
|
|
@@ -421,3 +479,11 @@ export const sanitizeClassName = (className: string) => {
|
|
|
421
479
|
return className.slice(0, -m[1].length);
|
|
422
480
|
}
|
|
423
481
|
};
|
|
482
|
+
|
|
483
|
+
const isSetLike = (value: any): value is Set<any> =>
|
|
484
|
+
value instanceof Set ||
|
|
485
|
+
(typeof value === 'object' && value !== null && Object.getPrototypeOf(value).constructor.name === 'ComplexSet');
|
|
486
|
+
|
|
487
|
+
const isMapLike = (value: any): value is Map<any, any> =>
|
|
488
|
+
value instanceof Map ||
|
|
489
|
+
(typeof value === 'object' && value !== null && Object.getPrototypeOf(value).constructor.name === 'ComplexMap');
|