@dxos/tracing 0.5.0 → 0.5.1-main.0ec204c
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 +47 -35
- package/dist/lib/browser/index.mjs.map +3 -3
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/node/index.cjs +47 -35
- package/dist/lib/node/index.cjs.map +3 -3
- package/dist/lib/node/meta.json +1 -1
- package/dist/types/src/trace-processor.d.ts +18 -20
- package/dist/types/src/trace-processor.d.ts.map +1 -1
- package/package.json +11 -11
- package/src/api.ts +1 -1
- package/src/trace-processor.ts +68 -48
- package/src/tracing.test.ts +1 -1
|
@@ -125,13 +125,13 @@ var REFRESH_INTERVAL = 1e3;
|
|
|
125
125
|
var MAX_INFO_OBJECT_DEPTH = 8;
|
|
126
126
|
var TraceProcessor = class {
|
|
127
127
|
constructor() {
|
|
128
|
+
this.subscriptions = /* @__PURE__ */ new Set();
|
|
128
129
|
this.resources = /* @__PURE__ */ new Map();
|
|
129
130
|
this.resourceInstanceIndex = /* @__PURE__ */ new WeakMap();
|
|
130
131
|
this.resourceIdList = [];
|
|
131
132
|
this.spans = /* @__PURE__ */ new Map();
|
|
132
133
|
this.spanIdList = [];
|
|
133
134
|
this.logs = [];
|
|
134
|
-
this.subscriptions = /* @__PURE__ */ new Set();
|
|
135
135
|
this._logProcessor = (config, entry) => {
|
|
136
136
|
switch (entry.level) {
|
|
137
137
|
case LogLevel.ERROR:
|
|
@@ -165,14 +165,18 @@ var TraceProcessor = class {
|
|
|
165
165
|
};
|
|
166
166
|
log.addProcessor(this._logProcessor.bind(this), void 0, {
|
|
167
167
|
F: __dxlog_file,
|
|
168
|
-
L:
|
|
168
|
+
L: 87,
|
|
169
169
|
S: this,
|
|
170
170
|
C: (f, a) => f(...a)
|
|
171
171
|
});
|
|
172
172
|
const refreshInterval = setInterval(this.refresh.bind(this), REFRESH_INTERVAL);
|
|
173
173
|
unrefTimeout(refreshInterval);
|
|
174
174
|
}
|
|
175
|
-
|
|
175
|
+
/**
|
|
176
|
+
* @internal
|
|
177
|
+
*/
|
|
178
|
+
// TODO(burdon): Comment.
|
|
179
|
+
createTraceResource(params) {
|
|
176
180
|
const id = this.resources.size;
|
|
177
181
|
const tracingContext = getTracingContext(Object.getPrototypeOf(params.instance));
|
|
178
182
|
for (const key of Object.keys(tracingContext.metricsProperties)) {
|
|
@@ -194,6 +198,33 @@ var TraceProcessor = class {
|
|
|
194
198
|
}
|
|
195
199
|
this._markResourceDirty(id);
|
|
196
200
|
}
|
|
201
|
+
createTraceSender() {
|
|
202
|
+
return new TraceSender(this);
|
|
203
|
+
}
|
|
204
|
+
traceSpan(params) {
|
|
205
|
+
const span2 = new TracingSpan(this, params);
|
|
206
|
+
this._flushSpan(span2);
|
|
207
|
+
return span2;
|
|
208
|
+
}
|
|
209
|
+
// TODO(burdon): Not implemented.
|
|
210
|
+
addLink(parent, child, opts) {
|
|
211
|
+
}
|
|
212
|
+
//
|
|
213
|
+
// Getters
|
|
214
|
+
//
|
|
215
|
+
// TODO(burdon): Define type.
|
|
216
|
+
// TODO(burdon): Reconcile with system service.
|
|
217
|
+
getDiagnostics() {
|
|
218
|
+
this.refresh();
|
|
219
|
+
return {
|
|
220
|
+
resources: Object.fromEntries(Array.from(this.resources.entries()).map(([id, entry]) => [
|
|
221
|
+
`${entry.sanitizedClassName}#${entry.data.instanceId}`,
|
|
222
|
+
entry.data
|
|
223
|
+
])),
|
|
224
|
+
spans: Array.from(this.spans.values()),
|
|
225
|
+
logs: this.logs.filter((log2) => log2.level >= LogLevel.INFO)
|
|
226
|
+
};
|
|
227
|
+
}
|
|
197
228
|
getResourceInfo(instance) {
|
|
198
229
|
const res = {};
|
|
199
230
|
const tracingContext = getTracingContext(Object.getPrototypeOf(instance));
|
|
@@ -219,19 +250,19 @@ var TraceProcessor = class {
|
|
|
219
250
|
}
|
|
220
251
|
return res;
|
|
221
252
|
}
|
|
222
|
-
traceSpan(params) {
|
|
223
|
-
const span2 = new TracingSpan(this, params);
|
|
224
|
-
this._flushSpan(span2);
|
|
225
|
-
return span2;
|
|
226
|
-
}
|
|
227
|
-
addLink(parent, child, opts) {
|
|
228
|
-
}
|
|
229
253
|
getResourceId(instance) {
|
|
230
254
|
const entry = this.resourceInstanceIndex.get(instance);
|
|
231
255
|
return entry ? entry.data.id : null;
|
|
232
256
|
}
|
|
233
|
-
|
|
234
|
-
return
|
|
257
|
+
findResourcesByClassName(className) {
|
|
258
|
+
return [
|
|
259
|
+
...this.resources.values()
|
|
260
|
+
].filter((res) => res.data.className === className || res.sanitizedClassName === className);
|
|
261
|
+
}
|
|
262
|
+
findResourcesByAnnotation(annotation) {
|
|
263
|
+
return [
|
|
264
|
+
...this.resources.values()
|
|
265
|
+
].filter((res) => res.annotation === annotation);
|
|
235
266
|
}
|
|
236
267
|
refresh() {
|
|
237
268
|
for (const resource2 of this.resources.values()) {
|
|
@@ -257,27 +288,9 @@ var TraceProcessor = class {
|
|
|
257
288
|
subscription.flush();
|
|
258
289
|
}
|
|
259
290
|
}
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
].filter((r) => r.data.className === className || r.sanitizedClassName === className);
|
|
264
|
-
}
|
|
265
|
-
findByAnnotation(annotation) {
|
|
266
|
-
return [
|
|
267
|
-
...this.resources.values()
|
|
268
|
-
].filter((r) => r.annotation === annotation);
|
|
269
|
-
}
|
|
270
|
-
getDiagnostics() {
|
|
271
|
-
this.refresh();
|
|
272
|
-
return {
|
|
273
|
-
resources: Object.fromEntries(Array.from(this.resources.entries()).map(([id, entry]) => [
|
|
274
|
-
`${entry.sanitizedClassName}#${entry.data.instanceId}`,
|
|
275
|
-
entry.data
|
|
276
|
-
])),
|
|
277
|
-
spans: Array.from(this.spans.values()),
|
|
278
|
-
logs: this.logs.filter((log2) => log2.level >= LogLevel.INFO)
|
|
279
|
-
};
|
|
280
|
-
}
|
|
291
|
+
//
|
|
292
|
+
// Implementation
|
|
293
|
+
//
|
|
281
294
|
/**
|
|
282
295
|
* @internal
|
|
283
296
|
*/
|
|
@@ -407,7 +420,6 @@ var sanitizeValue = (value, depth, traceProcessor) => {
|
|
|
407
420
|
case "boolean":
|
|
408
421
|
case "undefined":
|
|
409
422
|
return value;
|
|
410
|
-
break;
|
|
411
423
|
case "object":
|
|
412
424
|
case "function":
|
|
413
425
|
if (value === null) {
|
|
@@ -476,7 +488,7 @@ var resource = (options) => (constructor) => {
|
|
|
476
488
|
const klass = /* @__PURE__ */ (() => class extends constructor {
|
|
477
489
|
constructor(...rest) {
|
|
478
490
|
super(...rest);
|
|
479
|
-
TRACE_PROCESSOR.
|
|
491
|
+
TRACE_PROCESSOR.createTraceResource({
|
|
480
492
|
constructor,
|
|
481
493
|
annotation: options?.annotation,
|
|
482
494
|
instance: this
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/api.ts", "../../../src/symbols.ts", "../../../src/trace-processor.ts", "../../../src/trace-sender.ts", "../../../src/metrics/base.ts", "../../../src/metrics/unary-counter.ts", "../../../src/metrics/time-series-counter.ts", "../../../src/metrics/time-usage-counter.ts", "../../../src/metrics/map-counter.ts"],
|
|
4
|
-
"sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nimport { Context } from '@dxos/context';\n\nimport { getTracingContext } from './symbols';\nimport { TRACE_PROCESSOR } from './trace-processor';\n\n/**\n * Annotates a class as a tracked resource.\n */\nconst resource =\n (options?: { annotation?: symbol }) =>\n <T extends { new (...args: any[]): {} }>(constructor: T) => {\n // Wrapping class declaration into an IIFE so it doesn't capture the `klass` class name.\n const klass = (() =>\n class extends constructor {\n constructor(...rest: any[]) {\n super(...rest);\n TRACE_PROCESSOR.traceResourceConstructor({ constructor, annotation: options?.annotation, instance: this });\n }\n })();\n Object.defineProperty(klass, 'name', { value: constructor.name });\n return klass;\n };\n\nexport type InfoOptions = {\n /**\n * Value is of enum type and should be converted to string.\n *\n * Example:\n *\n * ```ts\n * @trace.info({ enum: SpaceState })\n * get state(): SpaceState { ... }\n * ```\n */\n enum?: Record<string, any>;\n\n /**\n * Max depth of the object to be included in the resource info section.\n *\n * null means no limit (a limit of 8 nested objects is still imposed).\n *\n * Default: 0 - objects will be stringified with toString.\n */\n depth?: number | null;\n};\n\n/**\n * Marks a property or a method to be included in the resource info section.\n */\nconst info =\n (opts: InfoOptions = {}) =>\n (target: any, propertyKey: string, descriptor?: PropertyDescriptor) => {\n getTracingContext(target).infoProperties[propertyKey] = { options: opts };\n };\n\nconst mark = (name: string) => {\n performance.mark(name);\n};\n\nexport type SpanOptions = {\n showInBrowserTimeline?: boolean;\n};\n\nconst span =\n ({ showInBrowserTimeline = false }: SpanOptions = {}) =>\n (target: any, propertyKey: string, descriptor: TypedPropertyDescriptor<(...args: any) => any>) => {\n const method = descriptor.value!;\n\n descriptor.value = async function (this: any, ...args: any) {\n const parentCtx = args[0] instanceof Context ? args[0] : null;\n const span = TRACE_PROCESSOR.traceSpan({\n parentCtx,\n methodName: propertyKey,\n instance: this,\n showInBrowserTimeline,\n });\n\n const callArgs = span.ctx ? [span.ctx, ...args.slice(1)] : args;\n try {\n return await method.apply(this, callArgs);\n } catch (err) {\n span.markError(err);\n throw err;\n } finally {\n span.markSuccess();\n }\n };\n };\n\n/**\n * Attaches metrics counter to the resource.\n */\nconst metricsCounter = () => (target: any, propertyKey: string, descriptor?: PropertyDescriptor) => {\n getTracingContext(target).metricsProperties[propertyKey] = {};\n};\n\nexport type AddLinkOptions = {};\n\nconst addLink = (parent: any, child: any, opts: AddLinkOptions = {}) => {\n TRACE_PROCESSOR.addLink(parent, child, opts);\n};\n\nexport const trace = {\n resource,\n info,\n mark,\n span,\n metricsCounter,\n\n addLink,\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { type InfoOptions } from './api';\n\nexport const symbolTracingContext = Symbol('dxos.tracing.context');\n\nexport type TracingContext = {\n infoProperties: Record<\n string,\n {\n options: InfoOptions;\n }\n >;\n metricsProperties: Record<string, {}>;\n};\n\nexport const getTracingContext = (target: any): TracingContext => {\n return ((target[symbolTracingContext] as TracingContext | undefined) ??= {\n infoProperties: {},\n metricsProperties: {},\n });\n};\n\nexport const TRACE_SPAN_ATTRIBUTE = 'dxos.trace-span';\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { unrefTimeout } from '@dxos/async';\nimport { type Context } from '@dxos/context';\nimport { LogLevel, type LogProcessor, getContextFromEntry, log } from '@dxos/log';\nimport { type LogEntry } from '@dxos/protocols/proto/dxos/client/services';\nimport { type Error as SerializedError } from '@dxos/protocols/proto/dxos/error';\nimport { type Metric, type Resource, type Span } from '@dxos/protocols/proto/dxos/tracing';\nimport { getPrototypeSpecificInstanceId } from '@dxos/util';\n\nimport type { AddLinkOptions } from './api';\nimport { type BaseCounter } from './metrics';\nimport { TRACE_SPAN_ATTRIBUTE, getTracingContext } from './symbols';\nimport { TraceSender } from './trace-sender';\n\nexport type TraceResourceConstructorParams = {\n constructor: { new (...args: any[]): {} };\n instance: any;\n annotation?: symbol;\n};\n\nexport type TraceSpanParams = {\n instance: any;\n methodName: string;\n parentCtx: Context | null;\n showInBrowserTimeline: boolean;\n};\n\nexport class ResourceEntry {\n /**\n * Sometimes bundlers mangle class names: WebFile -> WebFile2.\n *\n * We use a heuristic to remove the suffix.\n */\n public readonly sanitizedClassName: string;\n\n constructor(\n public readonly data: Resource,\n public readonly instance: WeakRef<any>,\n public readonly annotation?: symbol,\n ) {\n this.sanitizedClassName = sanitizeClassName(data.className);\n }\n\n getMetric(name: string): Metric | undefined {\n return this.data.metrics?.find((metric) => metric.name === name);\n }\n}\n\nexport type TraceSubscription = {\n flush: () => void;\n\n dirtyResources: Set<number>;\n dirtySpans: Set<number>;\n newLogs: LogEntry[];\n};\n\nconst MAX_RESOURCE_RECORDS = 2_000;\nconst MAX_SPAN_RECORDS = 1_000;\nconst MAX_LOG_RECORDS = 1_000;\n\nconst REFRESH_INTERVAL = 1_000;\n\nconst MAX_INFO_OBJECT_DEPTH = 8;\n\nexport class TraceProcessor {\n resources = new Map<number, ResourceEntry>();\n resourceInstanceIndex = new WeakMap<any, ResourceEntry>();\n resourceIdList: number[] = [];\n\n spans = new Map<number, Span>();\n spanIdList: number[] = [];\n\n logs: LogEntry[] = [];\n\n subscriptions: Set<TraceSubscription> = new Set();\n\n constructor() {\n log.addProcessor(this._logProcessor.bind(this));\n\n const refreshInterval = setInterval(this.refresh.bind(this), REFRESH_INTERVAL);\n unrefTimeout(refreshInterval);\n }\n\n traceResourceConstructor(params: TraceResourceConstructorParams) {\n const id = this.resources.size;\n\n // init metrics counters.\n const tracingContext = getTracingContext(Object.getPrototypeOf(params.instance));\n for (const key of Object.keys(tracingContext.metricsProperties)) {\n (params.instance[key] as BaseCounter)._assign(params.instance, key);\n }\n\n const entry = new ResourceEntry(\n {\n id,\n className: params.constructor.name,\n instanceId: getPrototypeSpecificInstanceId(params.instance),\n info: this.getResourceInfo(params.instance),\n links: [],\n metrics: this.getResourceMetrics(params.instance),\n },\n new WeakRef(params.instance),\n params.annotation,\n );\n\n this.resources.set(id, entry);\n this.resourceInstanceIndex.set(params.instance, entry);\n this.resourceIdList.push(id);\n if (this.resourceIdList.length > MAX_RESOURCE_RECORDS) {\n this._clearResources();\n }\n this._markResourceDirty(id);\n }\n\n getResourceInfo(instance: any): Record<string, any> {\n const res: Record<string, any> = {};\n const tracingContext = getTracingContext(Object.getPrototypeOf(instance));\n\n for (const [key, { options }] of Object.entries(tracingContext.infoProperties)) {\n try {\n const value = typeof instance[key] === 'function' ? instance[key]() : instance[key];\n\n if (options.enum) {\n res[key] = options.enum[value];\n } else {\n res[key] = sanitizeValue(\n value,\n options.depth === undefined ? 1 : options.depth ?? MAX_INFO_OBJECT_DEPTH,\n this,\n );\n }\n } catch (err: any) {\n res[key] = err.message;\n }\n }\n\n return res;\n }\n\n getResourceMetrics(instance: any): Metric[] {\n const res: Metric[] = [];\n const tracingContext = getTracingContext(Object.getPrototypeOf(instance));\n\n for (const [key, _opts] of Object.entries(tracingContext.metricsProperties)) {\n res.push(instance[key].getData());\n }\n\n return res;\n }\n\n traceSpan(params: TraceSpanParams): TracingSpan {\n const span = new TracingSpan(this, params);\n this._flushSpan(span);\n return span;\n }\n\n addLink(parent: any, child: any, opts: AddLinkOptions) {}\n\n getResourceId(instance: any): number | null {\n const entry = this.resourceInstanceIndex.get(instance);\n return entry ? entry.data.id : null;\n }\n\n createTraceSender() {\n return new TraceSender(this);\n }\n\n refresh() {\n for (const resource of this.resources.values()) {\n const instance = resource.instance.deref();\n if (!instance) {\n continue;\n }\n\n const tracingContext = getTracingContext(Object.getPrototypeOf(instance));\n const time = performance.now();\n for (const key of Object.keys(tracingContext.metricsProperties)) {\n (instance[key] as BaseCounter)._tick?.(time);\n }\n\n let _changed = false;\n\n const oldInfo = resource.data.info;\n resource.data.info = this.getResourceInfo(instance);\n _changed ||= !areEqualShallow(oldInfo, resource.data.info);\n\n const oldMetrics = resource.data.metrics;\n resource.data.metrics = this.getResourceMetrics(instance);\n _changed ||= !areEqualShallow(oldMetrics, resource.data.metrics);\n\n // TODO(dmaretskyi): Test if works and enable.\n // if (changed) {\n this._markResourceDirty(resource.data.id);\n // }\n }\n\n for (const subscription of this.subscriptions) {\n subscription.flush();\n }\n }\n\n findResourcesByClassName(className: string): ResourceEntry[] {\n return [...this.resources.values()].filter(\n (r) => r.data.className === className || r.sanitizedClassName === className,\n );\n }\n\n findByAnnotation(annotation: symbol): ResourceEntry[] {\n return [...this.resources.values()].filter((r) => r.annotation === annotation);\n }\n\n getDiagnostics() {\n this.refresh();\n\n return {\n resources: Object.fromEntries(\n Array.from(this.resources.entries()).map(([id, entry]) => [\n `${entry.sanitizedClassName}#${entry.data.instanceId}`,\n entry.data,\n ]),\n ),\n spans: Array.from(this.spans.values()),\n logs: this.logs.filter((log) => log.level >= LogLevel.INFO),\n };\n }\n\n /**\n * @internal\n */\n _flushSpan(runtimeSpan: TracingSpan) {\n const span = runtimeSpan.serialize();\n this.spans.set(span.id, span);\n this.spanIdList.push(span.id);\n if (this.spanIdList.length > MAX_SPAN_RECORDS) {\n this._clearSpans();\n }\n this._markSpanDirty(span.id);\n }\n\n private _markResourceDirty(id: number) {\n for (const subscription of this.subscriptions) {\n subscription.dirtyResources.add(id);\n }\n }\n\n private _markSpanDirty(id: number) {\n for (const subscription of this.subscriptions) {\n subscription.dirtySpans.add(id);\n }\n }\n\n private _clearResources() {\n // TODO(dmaretskyi): Use FinalizationRegistry to delete finalized resources first.\n while (this.resourceIdList.length > MAX_RESOURCE_RECORDS) {\n const id = this.resourceIdList.shift()!;\n this.resources.delete(id);\n }\n }\n\n private _clearSpans() {\n while (this.spanIdList.length > MAX_SPAN_RECORDS) {\n const id = this.spanIdList.shift()!;\n this.spans.delete(id);\n }\n }\n\n private _pushLog(log: LogEntry) {\n this.logs.push(log);\n if (this.logs.length > MAX_LOG_RECORDS) {\n this.logs.shift();\n }\n\n for (const subscription of this.subscriptions) {\n subscription.newLogs.push(log);\n }\n }\n\n private _logProcessor: LogProcessor = (config, entry) => {\n switch (entry.level) {\n case LogLevel.ERROR:\n case LogLevel.WARN:\n case LogLevel.TRACE: {\n const scope = entry.meta?.S;\n const resource = this.resourceInstanceIndex.get(scope);\n if (!resource) {\n return;\n }\n\n const context = getContextFromEntry(entry) ?? {};\n\n for (const key of Object.keys(context)) {\n context[key] = sanitizeValue(context[key], 0, this);\n }\n\n const entryToPush: LogEntry = {\n level: entry.level,\n message: entry.message,\n context,\n timestamp: new Date(),\n meta: {\n file: entry.meta?.F ?? '',\n line: entry.meta?.L ?? 0,\n resourceId: resource.data.id,\n },\n };\n this._pushLog(entryToPush);\n break;\n }\n default:\n }\n };\n}\n\nexport class TracingSpan {\n static nextId = 0;\n\n readonly id: number;\n readonly parentId: number | null = null;\n readonly methodName: string;\n readonly resourceId: number | null = null;\n startTs: number;\n endTs: number | null = null;\n error: SerializedError | null = null;\n\n private _showInBrowserTimeline: boolean;\n private readonly _ctx: Context | null = null;\n\n constructor(\n private _traceProcessor: TraceProcessor,\n params: TraceSpanParams,\n ) {\n this.id = TracingSpan.nextId++;\n this.methodName = params.methodName;\n this.resourceId = _traceProcessor.getResourceId(params.instance);\n this.startTs = performance.now();\n this._showInBrowserTimeline = params.showInBrowserTimeline;\n\n if (params.parentCtx) {\n this._ctx = params.parentCtx.derive({\n attributes: {\n [TRACE_SPAN_ATTRIBUTE]: this.id,\n },\n });\n const parentId = params.parentCtx.getAttribute(TRACE_SPAN_ATTRIBUTE);\n if (typeof parentId === 'number') {\n this.parentId = parentId;\n }\n }\n }\n\n get ctx(): Context | null {\n return this._ctx;\n }\n\n markSuccess() {\n this.endTs = performance.now();\n this._traceProcessor._flushSpan(this);\n\n if (this._showInBrowserTimeline) {\n this._markInBrowserTimeline();\n }\n }\n\n markError(err: unknown) {\n this.endTs = performance.now();\n this.error = serializeError(err);\n this._traceProcessor._flushSpan(this);\n\n if (this._showInBrowserTimeline) {\n this._markInBrowserTimeline();\n }\n }\n\n serialize(): Span {\n return {\n id: this.id,\n resourceId: this.resourceId ?? undefined,\n methodName: this.methodName,\n parentId: this.parentId ?? undefined,\n startTs: this.startTs.toFixed(3),\n endTs: this.endTs?.toFixed(3) ?? undefined,\n error: this.error ?? undefined,\n };\n }\n\n private _markInBrowserTimeline() {\n const resource = this._traceProcessor.resources.get(this.resourceId!);\n const name = resource\n ? `${resource.sanitizedClassName}#${resource.data.instanceId}.${this.methodName}`\n : this.methodName;\n performance.measure(name, { start: this.startTs, end: this.endTs! });\n }\n}\n\nconst serializeError = (err: unknown): SerializedError => {\n if (err instanceof Error) {\n return {\n name: err.name,\n message: err.message,\n };\n }\n\n return {\n message: String(err),\n };\n};\n\nexport const TRACE_PROCESSOR: TraceProcessor = ((globalThis as any).TRACE_PROCESSOR ??= new TraceProcessor());\n\nconst sanitizeValue = (value: any, depth: number, traceProcessor: TraceProcessor): any => {\n switch (typeof value) {\n case 'string':\n case 'number':\n case 'boolean':\n case 'undefined':\n return value;\n break;\n case 'object':\n case 'function':\n if (value === null) {\n return value;\n }\n\n {\n const resourceEntry = traceProcessor.resourceInstanceIndex.get(value);\n if (resourceEntry) {\n return `${resourceEntry.sanitizedClassName}#${resourceEntry.data.instanceId}`;\n }\n }\n\n if (typeof value.toJSON === 'function') {\n // TODO(dmaretskyi): This has potential to cause infinite recursion.\n return sanitizeValue(value.toJSON(), depth, traceProcessor);\n }\n\n if (depth > 0) {\n if (isSetLike(value)) {\n return Object.fromEntries(\n Array.from(value.entries()).map((value) => sanitizeValue(value, depth - 1, traceProcessor)),\n );\n } else if (isMapLike(value)) {\n return Object.fromEntries(\n Array.from(value.entries()).map(([key, value]) => [key, sanitizeValue(value, depth - 1, traceProcessor)]),\n );\n } else if (Array.isArray(value)) {\n return value.map((item: any) => sanitizeValue(item, depth - 1, traceProcessor));\n } else if (typeof value === 'object') {\n const res: any = {};\n for (const key of Object.keys(value)) {\n res[key] = sanitizeValue(value[key], depth - 1, traceProcessor);\n }\n return res;\n }\n }\n\n // TODO(dmaretskyi): Expose trait.\n if (typeof value.truncate === 'function') {\n return value.truncate();\n }\n\n return value.toString();\n }\n};\n\nconst areEqualShallow = (a: any, b: any) => {\n for (const key in a) {\n if (!(key in b) || a[key] !== b[key]) {\n return false;\n }\n }\n for (const key in b) {\n if (!(key in a) || a[key] !== b[key]) {\n return false;\n }\n }\n return true;\n};\n\nexport const sanitizeClassName = (className: string) => {\n const SANITIZE_REGEX = /[^_](\\d+)$/;\n const m = className.match(SANITIZE_REGEX);\n if (!m) {\n return className;\n } else {\n return className.slice(0, -m[1].length);\n }\n};\n\nconst isSetLike = (value: any): value is Set<any> =>\n value instanceof Set ||\n (typeof value === 'object' && value !== null && Object.getPrototypeOf(value).constructor.name === 'ComplexSet');\n\nconst isMapLike = (value: any): value is Map<any, any> =>\n value instanceof Map ||\n (typeof value === 'object' && value !== null && Object.getPrototypeOf(value).constructor.name === 'ComplexMap');\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { Stream } from '@dxos/codec-protobuf';\nimport { type LogEntry } from '@dxos/protocols/proto/dxos/client/services';\nimport { type StreamTraceEvent, type TracingService } from '@dxos/protocols/proto/dxos/tracing';\n\nimport { type TraceProcessor, type TraceSubscription } from './trace-processor';\n\nexport class TraceSender implements TracingService {\n constructor(private _traceProcessor: TraceProcessor) {}\n\n streamTrace(request: void): Stream<StreamTraceEvent> {\n return new Stream(({ ctx, next }) => {\n const flushEvents = (resources: Set<number> | null, spans: Set<number> | null, logs: LogEntry[] | null) => {\n const event: StreamTraceEvent = {\n resourceAdded: [],\n resourceRemoved: [],\n spanAdded: [],\n logAdded: [],\n };\n\n if (resources) {\n for (const id of resources) {\n const entry = this._traceProcessor.resources.get(id);\n if (entry) {\n event.resourceAdded!.push({ resource: entry.data });\n } else {\n event.resourceRemoved!.push({ id });\n }\n }\n } else {\n for (const entry of this._traceProcessor.resources.values()) {\n event.resourceAdded!.push({ resource: entry.data });\n }\n }\n\n if (spans) {\n for (const id of spans) {\n const span = this._traceProcessor.spans.get(id);\n if (span) {\n event.spanAdded!.push({ span });\n }\n }\n } else {\n for (const span of this._traceProcessor.spans.values()) {\n event.spanAdded!.push({ span });\n }\n }\n\n if (logs) {\n for (const log of logs) {\n event.logAdded!.push({ log });\n }\n } else {\n for (const log of this._traceProcessor.logs) {\n event.logAdded!.push({ log });\n }\n }\n\n if (event.resourceAdded!.length > 0 || event.resourceRemoved!.length > 0 || event.spanAdded!.length > 0) {\n next(event);\n }\n };\n\n const flush = () => {\n flushEvents(subscription.dirtyResources, subscription.dirtySpans, subscription.newLogs);\n subscription.dirtyResources.clear();\n subscription.dirtySpans.clear();\n subscription.newLogs.length = 0;\n };\n\n const subscription: TraceSubscription = {\n flush,\n dirtyResources: new Set(),\n dirtySpans: new Set(),\n newLogs: [],\n };\n this._traceProcessor.subscriptions.add(subscription);\n ctx.onDispose(() => {\n this._traceProcessor.subscriptions.delete(subscription);\n });\n\n flushEvents(null, null, null);\n });\n }\n}\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { type Metric } from '@dxos/protocols/proto/dxos/tracing';\n\nexport abstract class BaseCounter {\n /**\n * @internal\n */\n _instance: any;\n\n name?: string;\n\n /**\n * @internal\n */\n _assign(instance: any, name: string) {\n this._instance = instance;\n this.name = name;\n }\n\n abstract getData(): Metric;\n\n _tick(time: number): void {}\n}\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { type Metric } from '@dxos/protocols/proto/dxos/tracing';\n\nimport { BaseCounter } from './base';\n\nexport class UnaryCounter extends BaseCounter {\n value = 0;\n units?: string;\n\n constructor({ units }: { units?: string } = {}) {\n super();\n this.units = units;\n }\n\n inc(by = 1) {\n this.value += by;\n }\n\n getData(): Metric {\n return {\n name: this.name!,\n counter: {\n value: this.value,\n units: this.units,\n },\n };\n }\n}\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { type Metric } from '@dxos/protocols/proto/dxos/tracing';\n\nimport { BaseCounter } from './base';\n\nconst MAX_BUCKETS = 60;\n\nexport class TimeSeriesCounter extends BaseCounter {\n private _currentValue = 0;\n private _totalValue = 0;\n private _buckets: number[] = [];\n units?: string;\n\n constructor({ units }: { units?: string } = {}) {\n super();\n this.units = units;\n }\n\n inc(by = 1) {\n this._currentValue += by;\n this._totalValue += by;\n }\n\n override _tick(time: number): void {\n this._buckets.push(this._currentValue);\n if (this._buckets.length > MAX_BUCKETS) {\n this._buckets.shift();\n }\n this._currentValue = 0;\n }\n\n override getData(): Metric {\n return {\n name: this.name!,\n timeSeries: {\n tracks: [\n {\n name: this.name!,\n units: this.units,\n points: this._buckets.map((value, index) => ({\n value,\n })),\n total: this._totalValue,\n },\n ],\n },\n };\n }\n}\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { type Metric } from '@dxos/protocols/proto/dxos/tracing';\n\nimport { BaseCounter } from './base';\n\nconst MAX_BUCKETS = 60;\n\nexport class TimeUsageCounter extends BaseCounter {\n private _currentValue = 0;\n private _totalValue = 0;\n private _buckets: number[] = [];\n\n private _lastTickTime = performance.now();\n\n record(time: number) {\n this._currentValue += time;\n this._totalValue += time;\n }\n\n beginRecording(): { end: () => void } {\n const start = performance.now();\n return {\n end: () => {\n const end = performance.now();\n this.record(end - start);\n },\n };\n }\n\n override _tick(time: number): void {\n const delta = time - this._lastTickTime;\n this._lastTickTime = time;\n\n const percentage = (this._currentValue / delta) * 100;\n this._buckets.push(percentage);\n if (this._buckets.length > MAX_BUCKETS) {\n this._buckets.shift();\n }\n this._currentValue = 0;\n }\n\n override getData(): Metric {\n return {\n name: this.name!,\n timeSeries: {\n tracks: [\n {\n name: this.name!,\n units: '%',\n points: this._buckets.map((value, index) => ({\n value,\n })),\n total: this._totalValue,\n },\n ],\n },\n };\n }\n}\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { type Metric } from '@dxos/protocols/proto/dxos/tracing';\n\nimport { BaseCounter } from './base';\n\nexport class MapCounter extends BaseCounter {\n values = new Map<string, number>();\n units?: string;\n\n constructor({ units }: { units?: string } = {}) {\n super();\n this.units = units;\n }\n\n inc(key: string, by = 1) {\n const prev = this.values.get(key) ?? 0;\n this.values.set(key, prev + by);\n }\n\n getData(): Metric {\n return {\n name: this.name!,\n multiCounter: {\n records: Array.from(this.values.entries()).map(([key, value]) => ({\n key,\n value,\n })),\n units: this.units,\n },\n };\n }\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["Context", "symbolTracingContext", "Symbol", "getTracingContext", "target", "infoProperties", "metricsProperties", "TRACE_SPAN_ATTRIBUTE", "unrefTimeout", "LogLevel", "getContextFromEntry", "log", "getPrototypeSpecificInstanceId", "Stream", "TraceSender", "constructor", "_traceProcessor", "streamTrace", "request", "Stream", "ctx", "next", "flushEvents", "resources", "spans", "logs", "event", "resourceAdded", "resourceRemoved", "spanAdded", "logAdded", "id", "entry", "get", "push", "resource", "data", "values", "span", "log", "length", "flush", "subscription", "dirtyResources", "dirtySpans", "newLogs", "clear", "Set", "subscriptions", "add", "onDispose", "delete", "ResourceEntry", "constructor", "data", "instance", "annotation", "sanitizedClassName", "sanitizeClassName", "className", "getMetric", "name", "metrics", "find", "metric", "MAX_RESOURCE_RECORDS", "MAX_SPAN_RECORDS", "MAX_LOG_RECORDS", "REFRESH_INTERVAL", "MAX_INFO_OBJECT_DEPTH", "TraceProcessor", "resources", "Map", "resourceInstanceIndex", "WeakMap", "resourceIdList", "spans", "spanIdList", "logs", "
|
|
4
|
+
"sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nimport { Context } from '@dxos/context';\n\nimport { getTracingContext } from './symbols';\nimport { TRACE_PROCESSOR } from './trace-processor';\n\n/**\n * Annotates a class as a tracked resource.\n */\nconst resource =\n (options?: { annotation?: symbol }) =>\n <T extends { new (...args: any[]): {} }>(constructor: T) => {\n // Wrapping class declaration into an IIFE so it doesn't capture the `klass` class name.\n const klass = (() =>\n class extends constructor {\n constructor(...rest: any[]) {\n super(...rest);\n TRACE_PROCESSOR.createTraceResource({ constructor, annotation: options?.annotation, instance: this });\n }\n })();\n Object.defineProperty(klass, 'name', { value: constructor.name });\n return klass;\n };\n\nexport type InfoOptions = {\n /**\n * Value is of enum type and should be converted to string.\n *\n * Example:\n *\n * ```ts\n * @trace.info({ enum: SpaceState })\n * get state(): SpaceState { ... }\n * ```\n */\n enum?: Record<string, any>;\n\n /**\n * Max depth of the object to be included in the resource info section.\n *\n * null means no limit (a limit of 8 nested objects is still imposed).\n *\n * Default: 0 - objects will be stringified with toString.\n */\n depth?: number | null;\n};\n\n/**\n * Marks a property or a method to be included in the resource info section.\n */\nconst info =\n (opts: InfoOptions = {}) =>\n (target: any, propertyKey: string, descriptor?: PropertyDescriptor) => {\n getTracingContext(target).infoProperties[propertyKey] = { options: opts };\n };\n\nconst mark = (name: string) => {\n performance.mark(name);\n};\n\nexport type SpanOptions = {\n showInBrowserTimeline?: boolean;\n};\n\nconst span =\n ({ showInBrowserTimeline = false }: SpanOptions = {}) =>\n (target: any, propertyKey: string, descriptor: TypedPropertyDescriptor<(...args: any) => any>) => {\n const method = descriptor.value!;\n\n descriptor.value = async function (this: any, ...args: any) {\n const parentCtx = args[0] instanceof Context ? args[0] : null;\n const span = TRACE_PROCESSOR.traceSpan({\n parentCtx,\n methodName: propertyKey,\n instance: this,\n showInBrowserTimeline,\n });\n\n const callArgs = span.ctx ? [span.ctx, ...args.slice(1)] : args;\n try {\n return await method.apply(this, callArgs);\n } catch (err) {\n span.markError(err);\n throw err;\n } finally {\n span.markSuccess();\n }\n };\n };\n\n/**\n * Attaches metrics counter to the resource.\n */\nconst metricsCounter = () => (target: any, propertyKey: string, descriptor?: PropertyDescriptor) => {\n getTracingContext(target).metricsProperties[propertyKey] = {};\n};\n\nexport type AddLinkOptions = {};\n\nconst addLink = (parent: any, child: any, opts: AddLinkOptions = {}) => {\n TRACE_PROCESSOR.addLink(parent, child, opts);\n};\n\nexport const trace = {\n resource,\n info,\n mark,\n span,\n metricsCounter,\n\n addLink,\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { type InfoOptions } from './api';\n\nexport const symbolTracingContext = Symbol('dxos.tracing.context');\n\nexport type TracingContext = {\n infoProperties: Record<\n string,\n {\n options: InfoOptions;\n }\n >;\n metricsProperties: Record<string, {}>;\n};\n\nexport const getTracingContext = (target: any): TracingContext => {\n return ((target[symbolTracingContext] as TracingContext | undefined) ??= {\n infoProperties: {},\n metricsProperties: {},\n });\n};\n\nexport const TRACE_SPAN_ATTRIBUTE = 'dxos.trace-span';\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { unrefTimeout } from '@dxos/async';\nimport { type Context } from '@dxos/context';\nimport { LogLevel, type LogProcessor, getContextFromEntry, log } from '@dxos/log';\nimport { type LogEntry } from '@dxos/protocols/proto/dxos/client/services';\nimport { type Error as SerializedError } from '@dxos/protocols/proto/dxos/error';\nimport { type Metric, type Resource, type Span } from '@dxos/protocols/proto/dxos/tracing';\nimport { getPrototypeSpecificInstanceId } from '@dxos/util';\n\nimport type { AddLinkOptions } from './api';\nimport { type BaseCounter } from './metrics';\nimport { TRACE_SPAN_ATTRIBUTE, getTracingContext } from './symbols';\nimport { TraceSender } from './trace-sender';\n\nexport type Diagnostics = {\n resources: Record<string, Resource>;\n spans: Span[];\n logs: LogEntry[];\n};\n\nexport type TraceResourceConstructorParams = {\n constructor: { new (...args: any[]): {} };\n instance: any;\n annotation?: symbol;\n};\n\nexport type TraceSpanParams = {\n instance: any;\n methodName: string;\n parentCtx: Context | null;\n showInBrowserTimeline: boolean;\n};\n\nexport class ResourceEntry {\n /**\n * Sometimes bundlers mangle class names: WebFile -> WebFile2.\n *\n * We use a heuristic to remove the suffix.\n */\n public readonly sanitizedClassName: string;\n\n constructor(\n public readonly data: Resource,\n public readonly instance: WeakRef<any>,\n public readonly annotation?: symbol,\n ) {\n this.sanitizedClassName = sanitizeClassName(data.className);\n }\n\n getMetric(name: string): Metric | undefined {\n return this.data.metrics?.find((metric) => metric.name === name);\n }\n}\n\nexport type TraceSubscription = {\n flush: () => void;\n\n dirtyResources: Set<number>;\n dirtySpans: Set<number>;\n newLogs: LogEntry[];\n};\n\nconst MAX_RESOURCE_RECORDS = 2_000;\nconst MAX_SPAN_RECORDS = 1_000;\nconst MAX_LOG_RECORDS = 1_000;\n\nconst REFRESH_INTERVAL = 1_000;\n\nconst MAX_INFO_OBJECT_DEPTH = 8;\n\nexport class TraceProcessor {\n readonly subscriptions: Set<TraceSubscription> = new Set();\n\n readonly resources = new Map<number, ResourceEntry>();\n readonly resourceInstanceIndex = new WeakMap<any, ResourceEntry>();\n readonly resourceIdList: number[] = [];\n\n readonly spans = new Map<number, Span>();\n readonly spanIdList: number[] = [];\n\n readonly logs: LogEntry[] = [];\n\n constructor() {\n log.addProcessor(this._logProcessor.bind(this));\n\n const refreshInterval = setInterval(this.refresh.bind(this), REFRESH_INTERVAL);\n unrefTimeout(refreshInterval);\n }\n\n /**\n * @internal\n */\n // TODO(burdon): Comment.\n createTraceResource(params: TraceResourceConstructorParams) {\n const id = this.resources.size;\n\n // Init metrics counters.\n const tracingContext = getTracingContext(Object.getPrototypeOf(params.instance));\n for (const key of Object.keys(tracingContext.metricsProperties)) {\n (params.instance[key] as BaseCounter)._assign(params.instance, key);\n }\n\n const entry = new ResourceEntry(\n {\n id,\n className: params.constructor.name,\n instanceId: getPrototypeSpecificInstanceId(params.instance),\n info: this.getResourceInfo(params.instance),\n links: [],\n metrics: this.getResourceMetrics(params.instance),\n },\n new WeakRef(params.instance),\n params.annotation,\n );\n\n this.resources.set(id, entry);\n this.resourceInstanceIndex.set(params.instance, entry);\n this.resourceIdList.push(id);\n if (this.resourceIdList.length > MAX_RESOURCE_RECORDS) {\n this._clearResources();\n }\n\n this._markResourceDirty(id);\n }\n\n createTraceSender() {\n return new TraceSender(this);\n }\n\n traceSpan(params: TraceSpanParams): TracingSpan {\n const span = new TracingSpan(this, params);\n this._flushSpan(span);\n return span;\n }\n\n // TODO(burdon): Not implemented.\n addLink(parent: any, child: any, opts: AddLinkOptions) {}\n\n //\n // Getters\n //\n\n // TODO(burdon): Define type.\n // TODO(burdon): Reconcile with system service.\n getDiagnostics(): Diagnostics {\n this.refresh();\n\n return {\n resources: Object.fromEntries(\n Array.from(this.resources.entries()).map(([id, entry]) => [\n `${entry.sanitizedClassName}#${entry.data.instanceId}`,\n entry.data,\n ]),\n ),\n spans: Array.from(this.spans.values()),\n logs: this.logs.filter((log) => log.level >= LogLevel.INFO),\n };\n }\n\n getResourceInfo(instance: any): Record<string, any> {\n const res: Record<string, any> = {};\n const tracingContext = getTracingContext(Object.getPrototypeOf(instance));\n for (const [key, { options }] of Object.entries(tracingContext.infoProperties)) {\n try {\n const value = typeof instance[key] === 'function' ? instance[key]() : instance[key];\n if (options.enum) {\n res[key] = options.enum[value];\n } else {\n res[key] = sanitizeValue(\n value,\n options.depth === undefined ? 1 : options.depth ?? MAX_INFO_OBJECT_DEPTH,\n this,\n );\n }\n } catch (err: any) {\n res[key] = err.message;\n }\n }\n\n return res;\n }\n\n getResourceMetrics(instance: any): Metric[] {\n const res: Metric[] = [];\n const tracingContext = getTracingContext(Object.getPrototypeOf(instance));\n for (const [key, _opts] of Object.entries(tracingContext.metricsProperties)) {\n res.push(instance[key].getData());\n }\n\n return res;\n }\n\n getResourceId(instance: any): number | null {\n const entry = this.resourceInstanceIndex.get(instance);\n return entry ? entry.data.id : null;\n }\n\n findResourcesByClassName(className: string): ResourceEntry[] {\n return [...this.resources.values()].filter(\n (res) => res.data.className === className || res.sanitizedClassName === className,\n );\n }\n\n findResourcesByAnnotation(annotation: symbol): ResourceEntry[] {\n return [...this.resources.values()].filter((res) => res.annotation === annotation);\n }\n\n refresh() {\n for (const resource of this.resources.values()) {\n const instance = resource.instance.deref();\n if (!instance) {\n continue;\n }\n\n const tracingContext = getTracingContext(Object.getPrototypeOf(instance));\n const time = performance.now();\n for (const key of Object.keys(tracingContext.metricsProperties)) {\n (instance[key] as BaseCounter)._tick?.(time);\n }\n\n let _changed = false;\n\n const oldInfo = resource.data.info;\n resource.data.info = this.getResourceInfo(instance);\n _changed ||= !areEqualShallow(oldInfo, resource.data.info);\n\n const oldMetrics = resource.data.metrics;\n resource.data.metrics = this.getResourceMetrics(instance);\n _changed ||= !areEqualShallow(oldMetrics, resource.data.metrics);\n\n // TODO(dmaretskyi): Test if works and enable.\n // if (changed) {\n this._markResourceDirty(resource.data.id);\n // }\n }\n\n for (const subscription of this.subscriptions) {\n subscription.flush();\n }\n }\n\n //\n // Implementation\n //\n\n /**\n * @internal\n */\n _flushSpan(runtimeSpan: TracingSpan) {\n const span = runtimeSpan.serialize();\n this.spans.set(span.id, span);\n this.spanIdList.push(span.id);\n if (this.spanIdList.length > MAX_SPAN_RECORDS) {\n this._clearSpans();\n }\n this._markSpanDirty(span.id);\n }\n\n private _markResourceDirty(id: number) {\n for (const subscription of this.subscriptions) {\n subscription.dirtyResources.add(id);\n }\n }\n\n private _markSpanDirty(id: number) {\n for (const subscription of this.subscriptions) {\n subscription.dirtySpans.add(id);\n }\n }\n\n private _clearResources() {\n // TODO(dmaretskyi): Use FinalizationRegistry to delete finalized resources first.\n while (this.resourceIdList.length > MAX_RESOURCE_RECORDS) {\n const id = this.resourceIdList.shift()!;\n this.resources.delete(id);\n }\n }\n\n private _clearSpans() {\n while (this.spanIdList.length > MAX_SPAN_RECORDS) {\n const id = this.spanIdList.shift()!;\n this.spans.delete(id);\n }\n }\n\n private _pushLog(log: LogEntry) {\n this.logs.push(log);\n if (this.logs.length > MAX_LOG_RECORDS) {\n this.logs.shift();\n }\n\n for (const subscription of this.subscriptions) {\n subscription.newLogs.push(log);\n }\n }\n\n private _logProcessor: LogProcessor = (config, entry) => {\n switch (entry.level) {\n case LogLevel.ERROR:\n case LogLevel.WARN:\n case LogLevel.TRACE: {\n const scope = entry.meta?.S;\n const resource = this.resourceInstanceIndex.get(scope);\n if (!resource) {\n return;\n }\n\n const context = getContextFromEntry(entry) ?? {};\n for (const key of Object.keys(context)) {\n context[key] = sanitizeValue(context[key], 0, this);\n }\n\n const entryToPush: LogEntry = {\n level: entry.level,\n message: entry.message,\n context,\n timestamp: new Date(),\n meta: {\n file: entry.meta?.F ?? '',\n line: entry.meta?.L ?? 0,\n resourceId: resource.data.id,\n },\n };\n this._pushLog(entryToPush);\n break;\n }\n default:\n }\n };\n}\n\n// TODO(burdon): Comment.\nexport class TracingSpan {\n static nextId = 0;\n\n readonly id: number;\n readonly parentId: number | null = null;\n readonly methodName: string;\n readonly resourceId: number | null = null;\n startTs: number;\n endTs: number | null = null;\n error: SerializedError | null = null;\n\n private _showInBrowserTimeline: boolean;\n private readonly _ctx: Context | null = null;\n\n constructor(\n private _traceProcessor: TraceProcessor,\n params: TraceSpanParams,\n ) {\n this.id = TracingSpan.nextId++;\n this.methodName = params.methodName;\n this.resourceId = _traceProcessor.getResourceId(params.instance);\n this.startTs = performance.now();\n this._showInBrowserTimeline = params.showInBrowserTimeline;\n\n if (params.parentCtx) {\n this._ctx = params.parentCtx.derive({\n attributes: {\n [TRACE_SPAN_ATTRIBUTE]: this.id,\n },\n });\n const parentId = params.parentCtx.getAttribute(TRACE_SPAN_ATTRIBUTE);\n if (typeof parentId === 'number') {\n this.parentId = parentId;\n }\n }\n }\n\n get ctx(): Context | null {\n return this._ctx;\n }\n\n markSuccess() {\n this.endTs = performance.now();\n this._traceProcessor._flushSpan(this);\n\n if (this._showInBrowserTimeline) {\n this._markInBrowserTimeline();\n }\n }\n\n markError(err: unknown) {\n this.endTs = performance.now();\n this.error = serializeError(err);\n this._traceProcessor._flushSpan(this);\n\n if (this._showInBrowserTimeline) {\n this._markInBrowserTimeline();\n }\n }\n\n serialize(): Span {\n return {\n id: this.id,\n resourceId: this.resourceId ?? undefined,\n methodName: this.methodName,\n parentId: this.parentId ?? undefined,\n startTs: this.startTs.toFixed(3),\n endTs: this.endTs?.toFixed(3) ?? undefined,\n error: this.error ?? undefined,\n };\n }\n\n private _markInBrowserTimeline() {\n const resource = this._traceProcessor.resources.get(this.resourceId!);\n const name = resource\n ? `${resource.sanitizedClassName}#${resource.data.instanceId}.${this.methodName}`\n : this.methodName;\n performance.measure(name, { start: this.startTs, end: this.endTs! });\n }\n}\n\n// TODO(burdon): Log cause.\nconst serializeError = (err: unknown): SerializedError => {\n if (err instanceof Error) {\n return {\n name: err.name,\n message: err.message,\n };\n }\n\n return {\n message: String(err),\n };\n};\n\n// TODO(burdon): Rename singleton and move out of package.\nexport const TRACE_PROCESSOR: TraceProcessor = ((globalThis as any).TRACE_PROCESSOR ??= new TraceProcessor());\n\nconst sanitizeValue = (value: any, depth: number, traceProcessor: TraceProcessor): any => {\n switch (typeof value) {\n case 'string':\n case 'number':\n case 'boolean':\n case 'undefined':\n return value;\n case 'object':\n case 'function':\n if (value === null) {\n return value;\n }\n\n {\n const resourceEntry = traceProcessor.resourceInstanceIndex.get(value);\n if (resourceEntry) {\n return `${resourceEntry.sanitizedClassName}#${resourceEntry.data.instanceId}`;\n }\n }\n\n if (typeof value.toJSON === 'function') {\n // TODO(dmaretskyi): This has potential to cause infinite recursion.\n return sanitizeValue(value.toJSON(), depth, traceProcessor);\n }\n\n if (depth > 0) {\n if (isSetLike(value)) {\n return Object.fromEntries(\n Array.from(value.entries()).map((value) => sanitizeValue(value, depth - 1, traceProcessor)),\n );\n } else if (isMapLike(value)) {\n return Object.fromEntries(\n Array.from(value.entries()).map(([key, value]) => [key, sanitizeValue(value, depth - 1, traceProcessor)]),\n );\n } else if (Array.isArray(value)) {\n return value.map((item: any) => sanitizeValue(item, depth - 1, traceProcessor));\n } else if (typeof value === 'object') {\n const res: any = {};\n for (const key of Object.keys(value)) {\n res[key] = sanitizeValue(value[key], depth - 1, traceProcessor);\n }\n return res;\n }\n }\n\n // TODO(dmaretskyi): Expose trait.\n if (typeof value.truncate === 'function') {\n return value.truncate();\n }\n\n return value.toString();\n }\n};\n\nconst areEqualShallow = (a: any, b: any) => {\n for (const key in a) {\n if (!(key in b) || a[key] !== b[key]) {\n return false;\n }\n }\n for (const key in b) {\n if (!(key in a) || a[key] !== b[key]) {\n return false;\n }\n }\n return true;\n};\n\nexport const sanitizeClassName = (className: string) => {\n const SANITIZE_REGEX = /[^_](\\d+)$/;\n const m = className.match(SANITIZE_REGEX);\n if (!m) {\n return className;\n } else {\n return className.slice(0, -m[1].length);\n }\n};\n\nconst isSetLike = (value: any): value is Set<any> =>\n value instanceof Set ||\n (typeof value === 'object' && value !== null && Object.getPrototypeOf(value).constructor.name === 'ComplexSet');\n\nconst isMapLike = (value: any): value is Map<any, any> =>\n value instanceof Map ||\n (typeof value === 'object' && value !== null && Object.getPrototypeOf(value).constructor.name === 'ComplexMap');\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { Stream } from '@dxos/codec-protobuf';\nimport { type LogEntry } from '@dxos/protocols/proto/dxos/client/services';\nimport { type StreamTraceEvent, type TracingService } from '@dxos/protocols/proto/dxos/tracing';\n\nimport { type TraceProcessor, type TraceSubscription } from './trace-processor';\n\nexport class TraceSender implements TracingService {\n constructor(private _traceProcessor: TraceProcessor) {}\n\n streamTrace(request: void): Stream<StreamTraceEvent> {\n return new Stream(({ ctx, next }) => {\n const flushEvents = (resources: Set<number> | null, spans: Set<number> | null, logs: LogEntry[] | null) => {\n const event: StreamTraceEvent = {\n resourceAdded: [],\n resourceRemoved: [],\n spanAdded: [],\n logAdded: [],\n };\n\n if (resources) {\n for (const id of resources) {\n const entry = this._traceProcessor.resources.get(id);\n if (entry) {\n event.resourceAdded!.push({ resource: entry.data });\n } else {\n event.resourceRemoved!.push({ id });\n }\n }\n } else {\n for (const entry of this._traceProcessor.resources.values()) {\n event.resourceAdded!.push({ resource: entry.data });\n }\n }\n\n if (spans) {\n for (const id of spans) {\n const span = this._traceProcessor.spans.get(id);\n if (span) {\n event.spanAdded!.push({ span });\n }\n }\n } else {\n for (const span of this._traceProcessor.spans.values()) {\n event.spanAdded!.push({ span });\n }\n }\n\n if (logs) {\n for (const log of logs) {\n event.logAdded!.push({ log });\n }\n } else {\n for (const log of this._traceProcessor.logs) {\n event.logAdded!.push({ log });\n }\n }\n\n if (event.resourceAdded!.length > 0 || event.resourceRemoved!.length > 0 || event.spanAdded!.length > 0) {\n next(event);\n }\n };\n\n const flush = () => {\n flushEvents(subscription.dirtyResources, subscription.dirtySpans, subscription.newLogs);\n subscription.dirtyResources.clear();\n subscription.dirtySpans.clear();\n subscription.newLogs.length = 0;\n };\n\n const subscription: TraceSubscription = {\n flush,\n dirtyResources: new Set(),\n dirtySpans: new Set(),\n newLogs: [],\n };\n this._traceProcessor.subscriptions.add(subscription);\n ctx.onDispose(() => {\n this._traceProcessor.subscriptions.delete(subscription);\n });\n\n flushEvents(null, null, null);\n });\n }\n}\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { type Metric } from '@dxos/protocols/proto/dxos/tracing';\n\nexport abstract class BaseCounter {\n /**\n * @internal\n */\n _instance: any;\n\n name?: string;\n\n /**\n * @internal\n */\n _assign(instance: any, name: string) {\n this._instance = instance;\n this.name = name;\n }\n\n abstract getData(): Metric;\n\n _tick(time: number): void {}\n}\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { type Metric } from '@dxos/protocols/proto/dxos/tracing';\n\nimport { BaseCounter } from './base';\n\nexport class UnaryCounter extends BaseCounter {\n value = 0;\n units?: string;\n\n constructor({ units }: { units?: string } = {}) {\n super();\n this.units = units;\n }\n\n inc(by = 1) {\n this.value += by;\n }\n\n getData(): Metric {\n return {\n name: this.name!,\n counter: {\n value: this.value,\n units: this.units,\n },\n };\n }\n}\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { type Metric } from '@dxos/protocols/proto/dxos/tracing';\n\nimport { BaseCounter } from './base';\n\nconst MAX_BUCKETS = 60;\n\nexport class TimeSeriesCounter extends BaseCounter {\n private _currentValue = 0;\n private _totalValue = 0;\n private _buckets: number[] = [];\n units?: string;\n\n constructor({ units }: { units?: string } = {}) {\n super();\n this.units = units;\n }\n\n inc(by = 1) {\n this._currentValue += by;\n this._totalValue += by;\n }\n\n override _tick(time: number): void {\n this._buckets.push(this._currentValue);\n if (this._buckets.length > MAX_BUCKETS) {\n this._buckets.shift();\n }\n this._currentValue = 0;\n }\n\n override getData(): Metric {\n return {\n name: this.name!,\n timeSeries: {\n tracks: [\n {\n name: this.name!,\n units: this.units,\n points: this._buckets.map((value, index) => ({\n value,\n })),\n total: this._totalValue,\n },\n ],\n },\n };\n }\n}\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { type Metric } from '@dxos/protocols/proto/dxos/tracing';\n\nimport { BaseCounter } from './base';\n\nconst MAX_BUCKETS = 60;\n\nexport class TimeUsageCounter extends BaseCounter {\n private _currentValue = 0;\n private _totalValue = 0;\n private _buckets: number[] = [];\n\n private _lastTickTime = performance.now();\n\n record(time: number) {\n this._currentValue += time;\n this._totalValue += time;\n }\n\n beginRecording(): { end: () => void } {\n const start = performance.now();\n return {\n end: () => {\n const end = performance.now();\n this.record(end - start);\n },\n };\n }\n\n override _tick(time: number): void {\n const delta = time - this._lastTickTime;\n this._lastTickTime = time;\n\n const percentage = (this._currentValue / delta) * 100;\n this._buckets.push(percentage);\n if (this._buckets.length > MAX_BUCKETS) {\n this._buckets.shift();\n }\n this._currentValue = 0;\n }\n\n override getData(): Metric {\n return {\n name: this.name!,\n timeSeries: {\n tracks: [\n {\n name: this.name!,\n units: '%',\n points: this._buckets.map((value, index) => ({\n value,\n })),\n total: this._totalValue,\n },\n ],\n },\n };\n }\n}\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { type Metric } from '@dxos/protocols/proto/dxos/tracing';\n\nimport { BaseCounter } from './base';\n\nexport class MapCounter extends BaseCounter {\n values = new Map<string, number>();\n units?: string;\n\n constructor({ units }: { units?: string } = {}) {\n super();\n this.units = units;\n }\n\n inc(key: string, by = 1) {\n const prev = this.values.get(key) ?? 0;\n this.values.set(key, prev + by);\n }\n\n getData(): Metric {\n return {\n name: this.name!,\n multiCounter: {\n records: Array.from(this.values.entries()).map(([key, value]) => ({\n key,\n value,\n })),\n units: this.units,\n },\n };\n }\n}\n"],
|
|
5
|
+
"mappings": ";AAIA,SAASA,eAAe;;;ACEjB,IAAMC,uBAAuBC,OAAO,sBAAA;AAYpC,IAAMC,oBAAoB,CAACC,WAAAA;AAChC,SAASA,OAAOH,oBAAAA,MAAyD;IACvEI,gBAAgB,CAAC;IACjBC,mBAAmB,CAAC;EACtB;AACF;AAEO,IAAMC,uBAAuB;;;ACrBpC,SAASC,oBAAoB;AAE7B,SAASC,UAA6BC,qBAAqBC,WAAW;AAItE,SAASC,sCAAsC;;;ACN/C,SAASC,cAAc;AAMhB,IAAMC,cAAN,MAAMA;EACXC,YAAoBC,iBAAiC;SAAjCA,kBAAAA;EAAkC;EAEtDC,YAAYC,SAAyC;AACnD,WAAO,IAAIC,OAAO,CAAC,EAAEC,KAAKC,KAAI,MAAE;AAC9B,YAAMC,cAAc,CAACC,WAA+BC,OAA2BC,SAAAA;AAC7E,cAAMC,QAA0B;UAC9BC,eAAe,CAAA;UACfC,iBAAiB,CAAA;UACjBC,WAAW,CAAA;UACXC,UAAU,CAAA;QACZ;AAEA,YAAIP,WAAW;AACb,qBAAWQ,MAAMR,WAAW;AAC1B,kBAAMS,QAAQ,KAAKhB,gBAAgBO,UAAUU,IAAIF,EAAAA;AACjD,gBAAIC,OAAO;AACTN,oBAAMC,cAAeO,KAAK;gBAAEC,UAAUH,MAAMI;cAAK,CAAA;YACnD,OAAO;AACLV,oBAAME,gBAAiBM,KAAK;gBAAEH;cAAG,CAAA;YACnC;UACF;QACF,OAAO;AACL,qBAAWC,SAAS,KAAKhB,gBAAgBO,UAAUc,OAAM,GAAI;AAC3DX,kBAAMC,cAAeO,KAAK;cAAEC,UAAUH,MAAMI;YAAK,CAAA;UACnD;QACF;AAEA,YAAIZ,OAAO;AACT,qBAAWO,MAAMP,OAAO;AACtB,kBAAMc,QAAO,KAAKtB,gBAAgBQ,MAAMS,IAAIF,EAAAA;AAC5C,gBAAIO,OAAM;AACRZ,oBAAMG,UAAWK,KAAK;gBAAEI,MAAAA;cAAK,CAAA;YAC/B;UACF;QACF,OAAO;AACL,qBAAWA,SAAQ,KAAKtB,gBAAgBQ,MAAMa,OAAM,GAAI;AACtDX,kBAAMG,UAAWK,KAAK;cAAEI,MAAAA;YAAK,CAAA;UAC/B;QACF;AAEA,YAAIb,MAAM;AACR,qBAAWc,QAAOd,MAAM;AACtBC,kBAAMI,SAAUI,KAAK;cAAEK,KAAAA;YAAI,CAAA;UAC7B;QACF,OAAO;AACL,qBAAWA,QAAO,KAAKvB,gBAAgBS,MAAM;AAC3CC,kBAAMI,SAAUI,KAAK;cAAEK,KAAAA;YAAI,CAAA;UAC7B;QACF;AAEA,YAAIb,MAAMC,cAAea,SAAS,KAAKd,MAAME,gBAAiBY,SAAS,KAAKd,MAAMG,UAAWW,SAAS,GAAG;AACvGnB,eAAKK,KAAAA;QACP;MACF;AAEA,YAAMe,QAAQ,MAAA;AACZnB,oBAAYoB,aAAaC,gBAAgBD,aAAaE,YAAYF,aAAaG,OAAO;AACtFH,qBAAaC,eAAeG,MAAK;AACjCJ,qBAAaE,WAAWE,MAAK;AAC7BJ,qBAAaG,QAAQL,SAAS;MAChC;AAEA,YAAME,eAAkC;QACtCD;QACAE,gBAAgB,oBAAII,IAAAA;QACpBH,YAAY,oBAAIG,IAAAA;QAChBF,SAAS,CAAA;MACX;AACA,WAAK7B,gBAAgBgC,cAAcC,IAAIP,YAAAA;AACvCtB,UAAI8B,UAAU,MAAA;AACZ,aAAKlC,gBAAgBgC,cAAcG,OAAOT,YAAAA;MAC5C,CAAA;AAEApB,kBAAY,MAAM,MAAM,IAAA;IAC1B,CAAA;EACF;AACF;;;;ADnDO,IAAM8B,gBAAN,MAAMA;EAQXC,YACkBC,MACAC,UACAC,YAChB;SAHgBF,OAAAA;SACAC,WAAAA;SACAC,aAAAA;AAEhB,SAAKC,qBAAqBC,kBAAkBJ,KAAKK,SAAS;EAC5D;EAEAC,UAAUC,MAAkC;AAC1C,WAAO,KAAKP,KAAKQ,SAASC,KAAK,CAACC,WAAWA,OAAOH,SAASA,IAAAA;EAC7D;AACF;AAUA,IAAMI,uBAAuB;AAC7B,IAAMC,mBAAmB;AACzB,IAAMC,kBAAkB;AAExB,IAAMC,mBAAmB;AAEzB,IAAMC,wBAAwB;AAEvB,IAAMC,iBAAN,MAAMA;EAYXjB,cAAc;AAXLkB,yBAAwC,oBAAIC,IAAAA;AAE5CC,qBAAY,oBAAIC,IAAAA;AAChBC,iCAAwB,oBAAIC,QAAAA;AAC5BC,0BAA2B,CAAA;AAE3BC,iBAAQ,oBAAIJ,IAAAA;AACZK,sBAAuB,CAAA;AAEvBC,gBAAmB,CAAA;AAwNpBC,yBAA8B,CAACC,QAAQC,UAAAA;AAC7C,cAAQA,MAAMC,OAAK;QACjB,KAAKC,SAASC;QACd,KAAKD,SAASE;QACd,KAAKF,SAASG,OAAO;AACnB,gBAAMC,QAAQN,MAAMO,MAAMC;AAC1B,gBAAMC,YAAW,KAAKjB,sBAAsBkB,IAAIJ,KAAAA;AAChD,cAAI,CAACG,WAAU;AACb;UACF;AAEA,gBAAME,UAAUC,oBAAoBZ,KAAAA,KAAU,CAAC;AAC/C,qBAAWa,OAAOC,OAAOC,KAAKJ,OAAAA,GAAU;AACtCA,oBAAQE,GAAAA,IAAOG,cAAcL,QAAQE,GAAAA,GAAM,GAAG,IAAI;UACpD;AAEA,gBAAMI,cAAwB;YAC5BhB,OAAOD,MAAMC;YACbiB,SAASlB,MAAMkB;YACfP;YACAQ,WAAW,oBAAIC,KAAAA;YACfb,MAAM;cACJc,MAAMrB,MAAMO,MAAMe,KAAK;cACvBC,MAAMvB,MAAMO,MAAMiB,KAAK;cACvBC,YAAYhB,UAAStC,KAAKuD;YAC5B;UACF;AACA,eAAKC,SAASV,WAAAA;AACd;QACF;QACA;MACF;IACF;AArPEW,QAAIC,aAAa,KAAK/B,cAAcgC,KAAK,IAAI,GAAA,QAAA;;;;;;AAE7C,UAAMC,kBAAkBC,YAAY,KAAKC,QAAQH,KAAK,IAAI,GAAG7C,gBAAAA;AAC7DiD,iBAAaH,eAAAA;EACf;;;;;EAMAI,oBAAoBC,QAAwC;AAC1D,UAAMV,KAAK,KAAKpC,UAAU+C;AAG1B,UAAMC,iBAAiBC,kBAAkBzB,OAAO0B,eAAeJ,OAAOhE,QAAQ,CAAA;AAC9E,eAAWyC,OAAOC,OAAOC,KAAKuB,eAAeG,iBAAiB,GAAG;AAC9DL,aAAOhE,SAASyC,GAAAA,EAAqB6B,QAAQN,OAAOhE,UAAUyC,GAAAA;IACjE;AAEA,UAAMb,QAAQ,IAAI/B,cAChB;MACEyD;MACAlD,WAAW4D,OAAOlE,YAAYQ;MAC9BiE,YAAYC,+BAA+BR,OAAOhE,QAAQ;MAC1DyE,MAAM,KAAKC,gBAAgBV,OAAOhE,QAAQ;MAC1C2E,OAAO,CAAA;MACPpE,SAAS,KAAKqE,mBAAmBZ,OAAOhE,QAAQ;IAClD,GACA,IAAI6E,QAAQb,OAAOhE,QAAQ,GAC3BgE,OAAO/D,UAAU;AAGnB,SAAKiB,UAAU4D,IAAIxB,IAAI1B,KAAAA;AACvB,SAAKR,sBAAsB0D,IAAId,OAAOhE,UAAU4B,KAAAA;AAChD,SAAKN,eAAeyD,KAAKzB,EAAAA;AACzB,QAAI,KAAKhC,eAAe0D,SAAStE,sBAAsB;AACrD,WAAKuE,gBAAe;IACtB;AAEA,SAAKC,mBAAmB5B,EAAAA;EAC1B;EAEA6B,oBAAoB;AAClB,WAAO,IAAIC,YAAY,IAAI;EAC7B;EAEAC,UAAUrB,QAAsC;AAC9C,UAAMsB,QAAO,IAAIC,YAAY,MAAMvB,MAAAA;AACnC,SAAKwB,WAAWF,KAAAA;AAChB,WAAOA;EACT;;EAGAG,QAAQC,QAAaC,OAAYC,MAAsB;EAAC;;;;;;EAQxDC,iBAA8B;AAC5B,SAAKhC,QAAO;AAEZ,WAAO;MACL3C,WAAWwB,OAAOoD,YAChBC,MAAMC,KAAK,KAAK9E,UAAU+E,QAAO,CAAA,EAAIC,IAAI,CAAC,CAAC5C,IAAI1B,KAAAA,MAAW;QACxD,GAAGA,MAAM1B,kBAAkB,IAAI0B,MAAM7B,KAAKwE,UAAU;QACpD3C,MAAM7B;OACP,CAAA;MAEHwB,OAAOwE,MAAMC,KAAK,KAAKzE,MAAM4E,OAAM,CAAA;MACnC1E,MAAM,KAAKA,KAAK2E,OAAO,CAAC5C,SAAQA,KAAI3B,SAASC,SAASuE,IAAI;IAC5D;EACF;EAEA3B,gBAAgB1E,UAAoC;AAClD,UAAMsG,MAA2B,CAAC;AAClC,UAAMpC,iBAAiBC,kBAAkBzB,OAAO0B,eAAepE,QAAAA,CAAAA;AAC/D,eAAW,CAACyC,KAAK,EAAE8D,QAAO,CAAE,KAAK7D,OAAOuD,QAAQ/B,eAAesC,cAAc,GAAG;AAC9E,UAAI;AACF,cAAMC,QAAQ,OAAOzG,SAASyC,GAAAA,MAAS,aAAazC,SAASyC,GAAAA,EAAI,IAAKzC,SAASyC,GAAAA;AAC/E,YAAI8D,QAAQG,MAAM;AAChBJ,cAAI7D,GAAAA,IAAO8D,QAAQG,KAAKD,KAAAA;QAC1B,OAAO;AACLH,cAAI7D,GAAAA,IAAOG,cACT6D,OACAF,QAAQI,UAAUC,SAAY,IAAIL,QAAQI,SAAS7F,uBACnD,IAAI;QAER;MACF,SAAS+F,KAAU;AACjBP,YAAI7D,GAAAA,IAAOoE,IAAI/D;MACjB;IACF;AAEA,WAAOwD;EACT;EAEA1B,mBAAmB5E,UAAyB;AAC1C,UAAMsG,MAAgB,CAAA;AACtB,UAAMpC,iBAAiBC,kBAAkBzB,OAAO0B,eAAepE,QAAAA,CAAAA;AAC/D,eAAW,CAACyC,KAAKqE,KAAAA,KAAUpE,OAAOuD,QAAQ/B,eAAeG,iBAAiB,GAAG;AAC3EiC,UAAIvB,KAAK/E,SAASyC,GAAAA,EAAKsE,QAAO,CAAA;IAChC;AAEA,WAAOT;EACT;EAEAU,cAAchH,UAA8B;AAC1C,UAAM4B,QAAQ,KAAKR,sBAAsBkB,IAAItC,QAAAA;AAC7C,WAAO4B,QAAQA,MAAM7B,KAAKuD,KAAK;EACjC;EAEA2D,yBAAyB7G,WAAoC;AAC3D,WAAO;SAAI,KAAKc,UAAUiF,OAAM;MAAIC,OAClC,CAACE,QAAQA,IAAIvG,KAAKK,cAAcA,aAAakG,IAAIpG,uBAAuBE,SAAAA;EAE5E;EAEA8G,0BAA0BjH,YAAqC;AAC7D,WAAO;SAAI,KAAKiB,UAAUiF,OAAM;MAAIC,OAAO,CAACE,QAAQA,IAAIrG,eAAeA,UAAAA;EACzE;EAEA4D,UAAU;AACR,eAAWxB,aAAY,KAAKnB,UAAUiF,OAAM,GAAI;AAC9C,YAAMnG,WAAWqC,UAASrC,SAASmH,MAAK;AACxC,UAAI,CAACnH,UAAU;AACb;MACF;AAEA,YAAMkE,iBAAiBC,kBAAkBzB,OAAO0B,eAAepE,QAAAA,CAAAA;AAC/D,YAAMoH,OAAOC,YAAYC,IAAG;AAC5B,iBAAW7E,OAAOC,OAAOC,KAAKuB,eAAeG,iBAAiB,GAAG;AAC9DrE,iBAASyC,GAAAA,EAAqB8E,QAAQH,IAAAA;MACzC;AAEA,UAAII,WAAW;AAEf,YAAMC,UAAUpF,UAAStC,KAAK0E;AAC9BpC,MAAAA,UAAStC,KAAK0E,OAAO,KAAKC,gBAAgB1E,QAAAA;AAC1CwH,mBAAa,CAACE,gBAAgBD,SAASpF,UAAStC,KAAK0E,IAAI;AAEzD,YAAMkD,aAAatF,UAAStC,KAAKQ;AACjC8B,MAAAA,UAAStC,KAAKQ,UAAU,KAAKqE,mBAAmB5E,QAAAA;AAChDwH,mBAAa,CAACE,gBAAgBC,YAAYtF,UAAStC,KAAKQ,OAAO;AAI/D,WAAK2E,mBAAmB7C,UAAStC,KAAKuD,EAAE;IAE1C;AAEA,eAAWsE,gBAAgB,KAAK5G,eAAe;AAC7C4G,mBAAaC,MAAK;IACpB;EACF;;;;;;;EASArC,WAAWsC,aAA0B;AACnC,UAAMxC,QAAOwC,YAAYC,UAAS;AAClC,SAAKxG,MAAMuD,IAAIQ,MAAKhC,IAAIgC,KAAAA;AACxB,SAAK9D,WAAWuD,KAAKO,MAAKhC,EAAE;AAC5B,QAAI,KAAK9B,WAAWwD,SAASrE,kBAAkB;AAC7C,WAAKqH,YAAW;IAClB;AACA,SAAKC,eAAe3C,MAAKhC,EAAE;EAC7B;EAEQ4B,mBAAmB5B,IAAY;AACrC,eAAWsE,gBAAgB,KAAK5G,eAAe;AAC7C4G,mBAAaM,eAAeC,IAAI7E,EAAAA;IAClC;EACF;EAEQ2E,eAAe3E,IAAY;AACjC,eAAWsE,gBAAgB,KAAK5G,eAAe;AAC7C4G,mBAAaQ,WAAWD,IAAI7E,EAAAA;IAC9B;EACF;EAEQ2B,kBAAkB;AAExB,WAAO,KAAK3D,eAAe0D,SAAStE,sBAAsB;AACxD,YAAM4C,KAAK,KAAKhC,eAAe+G,MAAK;AACpC,WAAKnH,UAAUoH,OAAOhF,EAAAA;IACxB;EACF;EAEQ0E,cAAc;AACpB,WAAO,KAAKxG,WAAWwD,SAASrE,kBAAkB;AAChD,YAAM2C,KAAK,KAAK9B,WAAW6G,MAAK;AAChC,WAAK9G,MAAM+G,OAAOhF,EAAAA;IACpB;EACF;EAEQC,SAASC,MAAe;AAC9B,SAAK/B,KAAKsD,KAAKvB,IAAAA;AACf,QAAI,KAAK/B,KAAKuD,SAASpE,iBAAiB;AACtC,WAAKa,KAAK4G,MAAK;IACjB;AAEA,eAAWT,gBAAgB,KAAK5G,eAAe;AAC7C4G,mBAAaW,QAAQxD,KAAKvB,IAAAA;IAC5B;EACF;AAmCF;AAGO,IAAM+B,cAAN,MAAMA,aAAAA;EACX;SAAOiD,SAAS;;EAahB1I,YACU2I,iBACRzE,QACA;SAFQyE,kBAAAA;SAXDC,WAA0B;SAE1BrF,aAA4B;SAErCsF,QAAuB;SACvBC,QAAgC;SAGfC,OAAuB;AAMtC,SAAKvF,KAAKiC,aAAYiD;AACtB,SAAKM,aAAa9E,OAAO8E;AACzB,SAAKzF,aAAaoF,gBAAgBzB,cAAchD,OAAOhE,QAAQ;AAC/D,SAAK+I,UAAU1B,YAAYC,IAAG;AAC9B,SAAK0B,yBAAyBhF,OAAOiF;AAErC,QAAIjF,OAAOkF,WAAW;AACpB,WAAKL,OAAO7E,OAAOkF,UAAUC,OAAO;QAClCC,YAAY;UACV,CAACC,oBAAAA,GAAuB,KAAK/F;QAC/B;MACF,CAAA;AACA,YAAMoF,WAAW1E,OAAOkF,UAAUI,aAAaD,oBAAAA;AAC/C,UAAI,OAAOX,aAAa,UAAU;AAChC,aAAKA,WAAWA;MAClB;IACF;EACF;EAEA,IAAIa,MAAsB;AACxB,WAAO,KAAKV;EACd;EAEAW,cAAc;AACZ,SAAKb,QAAQtB,YAAYC,IAAG;AAC5B,SAAKmB,gBAAgBjD,WAAW,IAAI;AAEpC,QAAI,KAAKwD,wBAAwB;AAC/B,WAAKS,uBAAsB;IAC7B;EACF;EAEAC,UAAU7C,KAAc;AACtB,SAAK8B,QAAQtB,YAAYC,IAAG;AAC5B,SAAKsB,QAAQe,eAAe9C,GAAAA;AAC5B,SAAK4B,gBAAgBjD,WAAW,IAAI;AAEpC,QAAI,KAAKwD,wBAAwB;AAC/B,WAAKS,uBAAsB;IAC7B;EACF;EAEA1B,YAAkB;AAChB,WAAO;MACLzE,IAAI,KAAKA;MACTD,YAAY,KAAKA,cAAcuD;MAC/BkC,YAAY,KAAKA;MACjBJ,UAAU,KAAKA,YAAY9B;MAC3BmC,SAAS,KAAKA,QAAQa,QAAQ,CAAA;MAC9BjB,OAAO,KAAKA,OAAOiB,QAAQ,CAAA,KAAMhD;MACjCgC,OAAO,KAAKA,SAAShC;IACvB;EACF;EAEQ6C,yBAAyB;AAC/B,UAAMpH,YAAW,KAAKoG,gBAAgBvH,UAAUoB,IAAI,KAAKe,UAAU;AACnE,UAAM/C,OAAO+B,YACT,GAAGA,UAASnC,kBAAkB,IAAImC,UAAStC,KAAKwE,UAAU,IAAI,KAAKuE,UAAU,KAC7E,KAAKA;AACTzB,gBAAYwC,QAAQvJ,MAAM;MAAEwJ,OAAO,KAAKf;MAASgB,KAAK,KAAKpB;IAAO,CAAA;EACpE;AACF;AAGA,IAAMgB,iBAAiB,CAAC9C,QAAAA;AACtB,MAAIA,eAAemD,OAAO;AACxB,WAAO;MACL1J,MAAMuG,IAAIvG;MACVwC,SAAS+D,IAAI/D;IACf;EACF;AAEA,SAAO;IACLA,SAASmH,OAAOpD,GAAAA;EAClB;AACF;AAGO,IAAMqD,kBAAoCC,WAAmBD,oBAAoB,IAAInJ,eAAAA;AAE5F,IAAM6B,gBAAgB,CAAC6D,OAAYE,OAAeyD,mBAAAA;AAChD,UAAQ,OAAO3D,OAAAA;IACb,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;AACH,aAAOA;IACT,KAAK;IACL,KAAK;AACH,UAAIA,UAAU,MAAM;AAClB,eAAOA;MACT;AAEA;AACE,cAAM4D,gBAAgBD,eAAehJ,sBAAsBkB,IAAImE,KAAAA;AAC/D,YAAI4D,eAAe;AACjB,iBAAO,GAAGA,cAAcnK,kBAAkB,IAAImK,cAActK,KAAKwE,UAAU;QAC7E;MACF;AAEA,UAAI,OAAOkC,MAAM6D,WAAW,YAAY;AAEtC,eAAO1H,cAAc6D,MAAM6D,OAAM,GAAI3D,OAAOyD,cAAAA;MAC9C;AAEA,UAAIzD,QAAQ,GAAG;AACb,YAAI4D,UAAU9D,KAAAA,GAAQ;AACpB,iBAAO/D,OAAOoD,YACZC,MAAMC,KAAKS,MAAMR,QAAO,CAAA,EAAIC,IAAI,CAACO,WAAU7D,cAAc6D,QAAOE,QAAQ,GAAGyD,cAAAA,CAAAA,CAAAA;QAE/E,WAAWI,UAAU/D,KAAAA,GAAQ;AAC3B,iBAAO/D,OAAOoD,YACZC,MAAMC,KAAKS,MAAMR,QAAO,CAAA,EAAIC,IAAI,CAAC,CAACzD,KAAKgE,MAAAA,MAAW;YAAChE;YAAKG,cAAc6D,QAAOE,QAAQ,GAAGyD,cAAAA;WAAgB,CAAA;QAE5G,WAAWrE,MAAM0E,QAAQhE,KAAAA,GAAQ;AAC/B,iBAAOA,MAAMP,IAAI,CAACwE,SAAc9H,cAAc8H,MAAM/D,QAAQ,GAAGyD,cAAAA,CAAAA;QACjE,WAAW,OAAO3D,UAAU,UAAU;AACpC,gBAAMH,MAAW,CAAC;AAClB,qBAAW7D,OAAOC,OAAOC,KAAK8D,KAAAA,GAAQ;AACpCH,gBAAI7D,GAAAA,IAAOG,cAAc6D,MAAMhE,GAAAA,GAAMkE,QAAQ,GAAGyD,cAAAA;UAClD;AACA,iBAAO9D;QACT;MACF;AAGA,UAAI,OAAOG,MAAMkE,aAAa,YAAY;AACxC,eAAOlE,MAAMkE,SAAQ;MACvB;AAEA,aAAOlE,MAAMmE,SAAQ;EACzB;AACF;AAEA,IAAMlD,kBAAkB,CAACmD,GAAQC,MAAAA;AAC/B,aAAWrI,OAAOoI,GAAG;AACnB,QAAI,EAAEpI,OAAOqI,MAAMD,EAAEpI,GAAAA,MAASqI,EAAErI,GAAAA,GAAM;AACpC,aAAO;IACT;EACF;AACA,aAAWA,OAAOqI,GAAG;AACnB,QAAI,EAAErI,OAAOoI,MAAMA,EAAEpI,GAAAA,MAASqI,EAAErI,GAAAA,GAAM;AACpC,aAAO;IACT;EACF;AACA,SAAO;AACT;AAEO,IAAMtC,oBAAoB,CAACC,cAAAA;AAChC,QAAM2K,iBAAiB;AACvB,QAAMC,IAAI5K,UAAU6K,MAAMF,cAAAA;AAC1B,MAAI,CAACC,GAAG;AACN,WAAO5K;EACT,OAAO;AACL,WAAOA,UAAU8K,MAAM,GAAG,CAACF,EAAE,CAAA,EAAGhG,MAAM;EACxC;AACF;AAEA,IAAMuF,YAAY,CAAC9D,UACjBA,iBAAiBxF,OAChB,OAAOwF,UAAU,YAAYA,UAAU,QAAQ/D,OAAO0B,eAAeqC,KAAAA,EAAO3G,YAAYQ,SAAS;AAEpG,IAAMkK,YAAY,CAAC/D,UACjBA,iBAAiBtF,OAChB,OAAOsF,UAAU,YAAYA,UAAU,QAAQ/D,OAAO0B,eAAeqC,KAAAA,EAAO3G,YAAYQ,SAAS;;;AFzfpG,IAAM6K,WACJ,CAACC,YACD,CAAyCC,gBAAAA;AAEvC,QAAMC,QAAS,uBACb,cAAcD,YAAAA;IACZA,eAAeE,MAAa;AAC1B,YAAK,GAAIA,IAAAA;AACTC,sBAAgBC,oBAAoB;QAAEJ;QAAaK,YAAYN,SAASM;QAAYC,UAAU;MAAK,CAAA;IACrG;EACF,GAAA;AACFC,SAAOC,eAAeP,OAAO,QAAQ;IAAEQ,OAAOT,YAAYU;EAAK,CAAA;AAC/D,SAAOT;AACT;AA4BF,IAAMU,OACJ,CAACC,OAAoB,CAAC,MACtB,CAACC,QAAaC,aAAqBC,eAAAA;AACjCC,oBAAkBH,MAAAA,EAAQI,eAAeH,WAAAA,IAAe;IAAEf,SAASa;EAAK;AAC1E;AAEF,IAAMM,OAAO,CAACR,SAAAA;AACZS,cAAYD,KAAKR,IAAAA;AACnB;AAMA,IAAMU,OACJ,CAAC,EAAEC,wBAAwB,MAAK,IAAkB,CAAC,MACnD,CAACR,QAAaC,aAAqBC,eAAAA;AACjC,QAAMO,SAASP,WAAWN;AAE1BM,aAAWN,QAAQ,kBAA8Bc,MAAS;AACxD,UAAMC,YAAYD,KAAK,CAAA,aAAcE,UAAUF,KAAK,CAAA,IAAK;AACzD,UAAMH,QAAOjB,gBAAgBuB,UAAU;MACrCF;MACAG,YAAYb;MACZR,UAAU;MACVe;IACF,CAAA;AAEA,UAAMO,WAAWR,MAAKS,MAAM;MAACT,MAAKS;SAAQN,KAAKO,MAAM,CAAA;QAAMP;AAC3D,QAAI;AACF,aAAO,MAAMD,OAAOS,MAAM,MAAMH,QAAAA;IAClC,SAASI,KAAK;AACZZ,MAAAA,MAAKa,UAAUD,GAAAA;AACf,YAAMA;IACR,UAAA;AACEZ,MAAAA,MAAKc,YAAW;IAClB;EACF;AACF;AAKF,IAAMC,iBAAiB,MAAM,CAACtB,QAAaC,aAAqBC,eAAAA;AAC9DC,oBAAkBH,MAAAA,EAAQuB,kBAAkBtB,WAAAA,IAAe,CAAC;AAC9D;AAIA,IAAMuB,UAAU,CAACC,QAAaC,OAAY3B,OAAuB,CAAC,MAAC;AACjET,kBAAgBkC,QAAQC,QAAQC,OAAO3B,IAAAA;AACzC;AAEO,IAAM4B,QAAQ;EACnB1C;EACAa;EACAO;EACAE;EACAe;EAEAE;AACF;;;AI5GO,IAAeI,cAAf,MAAeA;;;;EAWpBC,QAAQC,UAAeC,MAAc;AACnC,SAAKC,YAAYF;AACjB,SAAKC,OAAOA;EACd;EAIAE,MAAMC,MAAoB;EAAC;AAC7B;;;ACjBO,IAAMC,eAAN,cAA2BC,YAAAA;EAIhCC,YAAY,EAAEC,MAAK,IAAyB,CAAC,GAAG;AAC9C,UAAK;AAJPC,iBAAQ;AAKN,SAAKD,QAAQA;EACf;EAEAE,IAAIC,KAAK,GAAG;AACV,SAAKF,SAASE;EAChB;EAEAC,UAAkB;AAChB,WAAO;MACLC,MAAM,KAAKA;MACXC,SAAS;QACPL,OAAO,KAAKA;QACZD,OAAO,KAAKA;MACd;IACF;EACF;AACF;;;ACtBA,IAAMO,cAAc;AAEb,IAAMC,oBAAN,cAAgCC,YAAAA;EAMrCC,YAAY,EAAEC,MAAK,IAAyB,CAAC,GAAG;AAC9C,UAAK;AANCC,yBAAgB;AAChBC,uBAAc;AACdC,oBAAqB,CAAA;AAK3B,SAAKH,QAAQA;EACf;EAEAI,IAAIC,KAAK,GAAG;AACV,SAAKJ,iBAAiBI;AACtB,SAAKH,eAAeG;EACtB;EAESC,MAAMC,MAAoB;AACjC,SAAKJ,SAASK,KAAK,KAAKP,aAAa;AACrC,QAAI,KAAKE,SAASM,SAASb,aAAa;AACtC,WAAKO,SAASO,MAAK;IACrB;AACA,SAAKT,gBAAgB;EACvB;EAESU,UAAkB;AACzB,WAAO;MACLC,MAAM,KAAKA;MACXC,YAAY;QACVC,QAAQ;UACN;YACEF,MAAM,KAAKA;YACXZ,OAAO,KAAKA;YACZe,QAAQ,KAAKZ,SAASa,IAAI,CAACC,OAAOC,WAAW;cAC3CD;YACF,EAAA;YACAE,OAAO,KAAKjB;UACd;;MAEJ;IACF;EACF;AACF;;;AC3CA,IAAMkB,eAAc;AAEb,IAAMC,mBAAN,cAA+BC,YAAAA;EAA/B;;AACGC,yBAAgB;AAChBC,uBAAc;AACdC,oBAAqB,CAAA;AAErBC,yBAAgBC,YAAYC,IAAG;;EAEvCC,OAAOC,MAAc;AACnB,SAAKP,iBAAiBO;AACtB,SAAKN,eAAeM;EACtB;EAEAC,iBAAsC;AACpC,UAAMC,QAAQL,YAAYC,IAAG;AAC7B,WAAO;MACLK,KAAK,MAAA;AACH,cAAMA,MAAMN,YAAYC,IAAG;AAC3B,aAAKC,OAAOI,MAAMD,KAAAA;MACpB;IACF;EACF;EAESE,MAAMJ,MAAoB;AACjC,UAAMK,QAAQL,OAAO,KAAKJ;AAC1B,SAAKA,gBAAgBI;AAErB,UAAMM,aAAc,KAAKb,gBAAgBY,QAAS;AAClD,SAAKV,SAASY,KAAKD,UAAAA;AACnB,QAAI,KAAKX,SAASa,SAASlB,cAAa;AACtC,WAAKK,SAASc,MAAK;IACrB;AACA,SAAKhB,gBAAgB;EACvB;EAESiB,UAAkB;AACzB,WAAO;MACLC,MAAM,KAAKA;MACXC,YAAY;QACVC,QAAQ;UACN;YACEF,MAAM,KAAKA;YACXG,OAAO;YACPC,QAAQ,KAAKpB,SAASqB,IAAI,CAACC,OAAOC,WAAW;cAC3CD;YACF,EAAA;YACAE,OAAO,KAAKzB;UACd;;MAEJ;IACF;EACF;AACF;;;ACrDO,IAAM0B,aAAN,cAAyBC,YAAAA;EAI9BC,YAAY,EAAEC,MAAK,IAAyB,CAAC,GAAG;AAC9C,UAAK;AAJPC,kBAAS,oBAAIC,IAAAA;AAKX,SAAKF,QAAQA;EACf;EAEAG,IAAIC,KAAaC,KAAK,GAAG;AACvB,UAAMC,OAAO,KAAKL,OAAOM,IAAIH,GAAAA,KAAQ;AACrC,SAAKH,OAAOO,IAAIJ,KAAKE,OAAOD,EAAAA;EAC9B;EAEAI,UAAkB;AAChB,WAAO;MACLC,MAAM,KAAKA;MACXC,cAAc;QACZC,SAASC,MAAMC,KAAK,KAAKb,OAAOc,QAAO,CAAA,EAAIC,IAAI,CAAC,CAACZ,KAAKa,KAAAA,OAAY;UAChEb;UACAa;QACF,EAAA;QACAjB,OAAO,KAAKA;MACd;IACF;EACF;AACF;",
|
|
6
|
+
"names": ["Context", "symbolTracingContext", "Symbol", "getTracingContext", "target", "infoProperties", "metricsProperties", "TRACE_SPAN_ATTRIBUTE", "unrefTimeout", "LogLevel", "getContextFromEntry", "log", "getPrototypeSpecificInstanceId", "Stream", "TraceSender", "constructor", "_traceProcessor", "streamTrace", "request", "Stream", "ctx", "next", "flushEvents", "resources", "spans", "logs", "event", "resourceAdded", "resourceRemoved", "spanAdded", "logAdded", "id", "entry", "get", "push", "resource", "data", "values", "span", "log", "length", "flush", "subscription", "dirtyResources", "dirtySpans", "newLogs", "clear", "Set", "subscriptions", "add", "onDispose", "delete", "ResourceEntry", "constructor", "data", "instance", "annotation", "sanitizedClassName", "sanitizeClassName", "className", "getMetric", "name", "metrics", "find", "metric", "MAX_RESOURCE_RECORDS", "MAX_SPAN_RECORDS", "MAX_LOG_RECORDS", "REFRESH_INTERVAL", "MAX_INFO_OBJECT_DEPTH", "TraceProcessor", "subscriptions", "Set", "resources", "Map", "resourceInstanceIndex", "WeakMap", "resourceIdList", "spans", "spanIdList", "logs", "_logProcessor", "config", "entry", "level", "LogLevel", "ERROR", "WARN", "TRACE", "scope", "meta", "S", "resource", "get", "context", "getContextFromEntry", "key", "Object", "keys", "sanitizeValue", "entryToPush", "message", "timestamp", "Date", "file", "F", "line", "L", "resourceId", "id", "_pushLog", "log", "addProcessor", "bind", "refreshInterval", "setInterval", "refresh", "unrefTimeout", "createTraceResource", "params", "size", "tracingContext", "getTracingContext", "getPrototypeOf", "metricsProperties", "_assign", "instanceId", "getPrototypeSpecificInstanceId", "info", "getResourceInfo", "links", "getResourceMetrics", "WeakRef", "set", "push", "length", "_clearResources", "_markResourceDirty", "createTraceSender", "TraceSender", "traceSpan", "span", "TracingSpan", "_flushSpan", "addLink", "parent", "child", "opts", "getDiagnostics", "fromEntries", "Array", "from", "entries", "map", "values", "filter", "INFO", "res", "options", "infoProperties", "value", "enum", "depth", "undefined", "err", "_opts", "getData", "getResourceId", "findResourcesByClassName", "findResourcesByAnnotation", "deref", "time", "performance", "now", "_tick", "_changed", "oldInfo", "areEqualShallow", "oldMetrics", "subscription", "flush", "runtimeSpan", "serialize", "_clearSpans", "_markSpanDirty", "dirtyResources", "add", "dirtySpans", "shift", "delete", "newLogs", "nextId", "_traceProcessor", "parentId", "endTs", "error", "_ctx", "methodName", "startTs", "_showInBrowserTimeline", "showInBrowserTimeline", "parentCtx", "derive", "attributes", "TRACE_SPAN_ATTRIBUTE", "getAttribute", "ctx", "markSuccess", "_markInBrowserTimeline", "markError", "serializeError", "toFixed", "measure", "start", "end", "Error", "String", "TRACE_PROCESSOR", "globalThis", "traceProcessor", "resourceEntry", "toJSON", "isSetLike", "isMapLike", "isArray", "item", "truncate", "toString", "a", "b", "SANITIZE_REGEX", "m", "match", "slice", "resource", "options", "constructor", "klass", "rest", "TRACE_PROCESSOR", "createTraceResource", "annotation", "instance", "Object", "defineProperty", "value", "name", "info", "opts", "target", "propertyKey", "descriptor", "getTracingContext", "infoProperties", "mark", "performance", "span", "showInBrowserTimeline", "method", "args", "parentCtx", "Context", "traceSpan", "methodName", "callArgs", "ctx", "slice", "apply", "err", "markError", "markSuccess", "metricsCounter", "metricsProperties", "addLink", "parent", "child", "trace", "BaseCounter", "_assign", "instance", "name", "_instance", "_tick", "time", "UnaryCounter", "BaseCounter", "constructor", "units", "value", "inc", "by", "getData", "name", "counter", "MAX_BUCKETS", "TimeSeriesCounter", "BaseCounter", "constructor", "units", "_currentValue", "_totalValue", "_buckets", "inc", "by", "_tick", "time", "push", "length", "shift", "getData", "name", "timeSeries", "tracks", "points", "map", "value", "index", "total", "MAX_BUCKETS", "TimeUsageCounter", "BaseCounter", "_currentValue", "_totalValue", "_buckets", "_lastTickTime", "performance", "now", "record", "time", "beginRecording", "start", "end", "_tick", "delta", "percentage", "push", "length", "shift", "getData", "name", "timeSeries", "tracks", "units", "points", "map", "value", "index", "total", "MapCounter", "BaseCounter", "constructor", "units", "values", "Map", "inc", "key", "by", "prev", "get", "set", "getData", "name", "multiCounter", "records", "Array", "from", "entries", "map", "value"]
|
|
7
7
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"inputs":{"packages/common/tracing/src/symbols.ts":{"bytes":1811,"imports":[],"format":"esm"},"packages/common/tracing/src/trace-sender.ts":{"bytes":10386,"imports":[{"path":"@dxos/codec-protobuf","kind":"import-statement","external":true}],"format":"esm"},"packages/common/tracing/src/trace-processor.ts":{"bytes":
|
|
1
|
+
{"inputs":{"packages/common/tracing/src/symbols.ts":{"bytes":1811,"imports":[],"format":"esm"},"packages/common/tracing/src/trace-sender.ts":{"bytes":10386,"imports":[{"path":"@dxos/codec-protobuf","kind":"import-statement","external":true}],"format":"esm"},"packages/common/tracing/src/trace-processor.ts":{"bytes":51824,"imports":[{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true},{"path":"packages/common/tracing/src/symbols.ts","kind":"import-statement","original":"./symbols"},{"path":"packages/common/tracing/src/trace-sender.ts","kind":"import-statement","original":"./trace-sender"}],"format":"esm"},"packages/common/tracing/src/api.ts":{"bytes":9411,"imports":[{"path":"@dxos/context","kind":"import-statement","external":true},{"path":"packages/common/tracing/src/symbols.ts","kind":"import-statement","original":"./symbols"},{"path":"packages/common/tracing/src/trace-processor.ts","kind":"import-statement","original":"./trace-processor"}],"format":"esm"},"packages/common/tracing/src/metrics/base.ts":{"bytes":1450,"imports":[],"format":"esm"},"packages/common/tracing/src/metrics/unary-counter.ts":{"bytes":2128,"imports":[{"path":"packages/common/tracing/src/metrics/base.ts","kind":"import-statement","original":"./base"}],"format":"esm"},"packages/common/tracing/src/metrics/time-series-counter.ts":{"bytes":4268,"imports":[{"path":"packages/common/tracing/src/metrics/base.ts","kind":"import-statement","original":"./base"}],"format":"esm"},"packages/common/tracing/src/metrics/time-usage-counter.ts":{"bytes":5249,"imports":[{"path":"packages/common/tracing/src/metrics/base.ts","kind":"import-statement","original":"./base"}],"format":"esm"},"packages/common/tracing/src/metrics/map-counter.ts":{"bytes":2977,"imports":[{"path":"packages/common/tracing/src/metrics/base.ts","kind":"import-statement","original":"./base"}],"format":"esm"},"packages/common/tracing/src/metrics/index.ts":{"bytes":892,"imports":[{"path":"packages/common/tracing/src/metrics/base.ts","kind":"import-statement","original":"./base"},{"path":"packages/common/tracing/src/metrics/unary-counter.ts","kind":"import-statement","original":"./unary-counter"},{"path":"packages/common/tracing/src/metrics/time-series-counter.ts","kind":"import-statement","original":"./time-series-counter"},{"path":"packages/common/tracing/src/metrics/time-usage-counter.ts","kind":"import-statement","original":"./time-usage-counter"},{"path":"packages/common/tracing/src/metrics/map-counter.ts","kind":"import-statement","original":"./map-counter"}],"format":"esm"},"packages/common/tracing/src/index.ts":{"bytes":831,"imports":[{"path":"packages/common/tracing/src/api.ts","kind":"import-statement","original":"./api"},{"path":"packages/common/tracing/src/symbols.ts","kind":"import-statement","original":"./symbols"},{"path":"packages/common/tracing/src/trace-processor.ts","kind":"import-statement","original":"./trace-processor"},{"path":"packages/common/tracing/src/trace-sender.ts","kind":"import-statement","original":"./trace-sender"},{"path":"packages/common/tracing/src/metrics/index.ts","kind":"import-statement","original":"./metrics"}],"format":"esm"}},"outputs":{"packages/common/tracing/dist/lib/browser/index.mjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":44718},"packages/common/tracing/dist/lib/browser/index.mjs":{"imports":[{"path":"@dxos/context","kind":"import-statement","external":true},{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true},{"path":"@dxos/codec-protobuf","kind":"import-statement","external":true}],"exports":["BaseCounter","MapCounter","ResourceEntry","TRACE_PROCESSOR","TRACE_SPAN_ATTRIBUTE","TimeSeriesCounter","TimeUsageCounter","TraceProcessor","TraceSender","TracingSpan","UnaryCounter","getTracingContext","sanitizeClassName","symbolTracingContext","trace"],"entryPoint":"packages/common/tracing/src/index.ts","inputs":{"packages/common/tracing/src/api.ts":{"bytesInOutput":1631},"packages/common/tracing/src/symbols.ts":{"bytesInOutput":245},"packages/common/tracing/src/trace-processor.ts":{"bytesInOutput":11951},"packages/common/tracing/src/trace-sender.ts":{"bytesInOutput":2555},"packages/common/tracing/src/index.ts":{"bytesInOutput":0},"packages/common/tracing/src/metrics/base.ts":{"bytesInOutput":159},"packages/common/tracing/src/metrics/index.ts":{"bytesInOutput":0},"packages/common/tracing/src/metrics/unary-counter.ts":{"bytesInOutput":324},"packages/common/tracing/src/metrics/time-series-counter.ts":{"bytesInOutput":812},"packages/common/tracing/src/metrics/time-usage-counter.ts":{"bytesInOutput":1136},"packages/common/tracing/src/metrics/map-counter.ts":{"bytesInOutput":509}},"bytes":20192}}}
|
package/dist/lib/node/index.cjs
CHANGED
|
@@ -153,13 +153,13 @@ var REFRESH_INTERVAL = 1e3;
|
|
|
153
153
|
var MAX_INFO_OBJECT_DEPTH = 8;
|
|
154
154
|
var TraceProcessor = class {
|
|
155
155
|
constructor() {
|
|
156
|
+
this.subscriptions = /* @__PURE__ */ new Set();
|
|
156
157
|
this.resources = /* @__PURE__ */ new Map();
|
|
157
158
|
this.resourceInstanceIndex = /* @__PURE__ */ new WeakMap();
|
|
158
159
|
this.resourceIdList = [];
|
|
159
160
|
this.spans = /* @__PURE__ */ new Map();
|
|
160
161
|
this.spanIdList = [];
|
|
161
162
|
this.logs = [];
|
|
162
|
-
this.subscriptions = /* @__PURE__ */ new Set();
|
|
163
163
|
this._logProcessor = (config, entry) => {
|
|
164
164
|
switch (entry.level) {
|
|
165
165
|
case import_log.LogLevel.ERROR:
|
|
@@ -193,14 +193,18 @@ var TraceProcessor = class {
|
|
|
193
193
|
};
|
|
194
194
|
import_log.log.addProcessor(this._logProcessor.bind(this), void 0, {
|
|
195
195
|
F: __dxlog_file,
|
|
196
|
-
L:
|
|
196
|
+
L: 87,
|
|
197
197
|
S: this,
|
|
198
198
|
C: (f, a) => f(...a)
|
|
199
199
|
});
|
|
200
200
|
const refreshInterval = setInterval(this.refresh.bind(this), REFRESH_INTERVAL);
|
|
201
201
|
(0, import_async.unrefTimeout)(refreshInterval);
|
|
202
202
|
}
|
|
203
|
-
|
|
203
|
+
/**
|
|
204
|
+
* @internal
|
|
205
|
+
*/
|
|
206
|
+
// TODO(burdon): Comment.
|
|
207
|
+
createTraceResource(params) {
|
|
204
208
|
const id = this.resources.size;
|
|
205
209
|
const tracingContext = getTracingContext(Object.getPrototypeOf(params.instance));
|
|
206
210
|
for (const key of Object.keys(tracingContext.metricsProperties)) {
|
|
@@ -222,6 +226,33 @@ var TraceProcessor = class {
|
|
|
222
226
|
}
|
|
223
227
|
this._markResourceDirty(id);
|
|
224
228
|
}
|
|
229
|
+
createTraceSender() {
|
|
230
|
+
return new TraceSender(this);
|
|
231
|
+
}
|
|
232
|
+
traceSpan(params) {
|
|
233
|
+
const span2 = new TracingSpan(this, params);
|
|
234
|
+
this._flushSpan(span2);
|
|
235
|
+
return span2;
|
|
236
|
+
}
|
|
237
|
+
// TODO(burdon): Not implemented.
|
|
238
|
+
addLink(parent, child, opts) {
|
|
239
|
+
}
|
|
240
|
+
//
|
|
241
|
+
// Getters
|
|
242
|
+
//
|
|
243
|
+
// TODO(burdon): Define type.
|
|
244
|
+
// TODO(burdon): Reconcile with system service.
|
|
245
|
+
getDiagnostics() {
|
|
246
|
+
this.refresh();
|
|
247
|
+
return {
|
|
248
|
+
resources: Object.fromEntries(Array.from(this.resources.entries()).map(([id, entry]) => [
|
|
249
|
+
`${entry.sanitizedClassName}#${entry.data.instanceId}`,
|
|
250
|
+
entry.data
|
|
251
|
+
])),
|
|
252
|
+
spans: Array.from(this.spans.values()),
|
|
253
|
+
logs: this.logs.filter((log2) => log2.level >= import_log.LogLevel.INFO)
|
|
254
|
+
};
|
|
255
|
+
}
|
|
225
256
|
getResourceInfo(instance) {
|
|
226
257
|
const res = {};
|
|
227
258
|
const tracingContext = getTracingContext(Object.getPrototypeOf(instance));
|
|
@@ -247,19 +278,19 @@ var TraceProcessor = class {
|
|
|
247
278
|
}
|
|
248
279
|
return res;
|
|
249
280
|
}
|
|
250
|
-
traceSpan(params) {
|
|
251
|
-
const span2 = new TracingSpan(this, params);
|
|
252
|
-
this._flushSpan(span2);
|
|
253
|
-
return span2;
|
|
254
|
-
}
|
|
255
|
-
addLink(parent, child, opts) {
|
|
256
|
-
}
|
|
257
281
|
getResourceId(instance) {
|
|
258
282
|
const entry = this.resourceInstanceIndex.get(instance);
|
|
259
283
|
return entry ? entry.data.id : null;
|
|
260
284
|
}
|
|
261
|
-
|
|
262
|
-
return
|
|
285
|
+
findResourcesByClassName(className) {
|
|
286
|
+
return [
|
|
287
|
+
...this.resources.values()
|
|
288
|
+
].filter((res) => res.data.className === className || res.sanitizedClassName === className);
|
|
289
|
+
}
|
|
290
|
+
findResourcesByAnnotation(annotation) {
|
|
291
|
+
return [
|
|
292
|
+
...this.resources.values()
|
|
293
|
+
].filter((res) => res.annotation === annotation);
|
|
263
294
|
}
|
|
264
295
|
refresh() {
|
|
265
296
|
for (const resource2 of this.resources.values()) {
|
|
@@ -285,27 +316,9 @@ var TraceProcessor = class {
|
|
|
285
316
|
subscription.flush();
|
|
286
317
|
}
|
|
287
318
|
}
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
].filter((r) => r.data.className === className || r.sanitizedClassName === className);
|
|
292
|
-
}
|
|
293
|
-
findByAnnotation(annotation) {
|
|
294
|
-
return [
|
|
295
|
-
...this.resources.values()
|
|
296
|
-
].filter((r) => r.annotation === annotation);
|
|
297
|
-
}
|
|
298
|
-
getDiagnostics() {
|
|
299
|
-
this.refresh();
|
|
300
|
-
return {
|
|
301
|
-
resources: Object.fromEntries(Array.from(this.resources.entries()).map(([id, entry]) => [
|
|
302
|
-
`${entry.sanitizedClassName}#${entry.data.instanceId}`,
|
|
303
|
-
entry.data
|
|
304
|
-
])),
|
|
305
|
-
spans: Array.from(this.spans.values()),
|
|
306
|
-
logs: this.logs.filter((log2) => log2.level >= import_log.LogLevel.INFO)
|
|
307
|
-
};
|
|
308
|
-
}
|
|
319
|
+
//
|
|
320
|
+
// Implementation
|
|
321
|
+
//
|
|
309
322
|
/**
|
|
310
323
|
* @internal
|
|
311
324
|
*/
|
|
@@ -435,7 +448,6 @@ var sanitizeValue = (value, depth, traceProcessor) => {
|
|
|
435
448
|
case "boolean":
|
|
436
449
|
case "undefined":
|
|
437
450
|
return value;
|
|
438
|
-
break;
|
|
439
451
|
case "object":
|
|
440
452
|
case "function":
|
|
441
453
|
if (value === null) {
|
|
@@ -502,7 +514,7 @@ var resource = (options) => (constructor) => {
|
|
|
502
514
|
const klass = /* @__PURE__ */ (() => class extends constructor {
|
|
503
515
|
constructor(...rest) {
|
|
504
516
|
super(...rest);
|
|
505
|
-
TRACE_PROCESSOR.
|
|
517
|
+
TRACE_PROCESSOR.createTraceResource({
|
|
506
518
|
constructor,
|
|
507
519
|
annotation: options?.annotation,
|
|
508
520
|
instance: this
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/api.ts", "../../../src/symbols.ts", "../../../src/trace-processor.ts", "../../../src/trace-sender.ts", "../../../src/metrics/base.ts", "../../../src/metrics/unary-counter.ts", "../../../src/metrics/time-series-counter.ts", "../../../src/metrics/time-usage-counter.ts", "../../../src/metrics/map-counter.ts"],
|
|
4
|
-
"sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nimport { Context } from '@dxos/context';\n\nimport { getTracingContext } from './symbols';\nimport { TRACE_PROCESSOR } from './trace-processor';\n\n/**\n * Annotates a class as a tracked resource.\n */\nconst resource =\n (options?: { annotation?: symbol }) =>\n <T extends { new (...args: any[]): {} }>(constructor: T) => {\n // Wrapping class declaration into an IIFE so it doesn't capture the `klass` class name.\n const klass = (() =>\n class extends constructor {\n constructor(...rest: any[]) {\n super(...rest);\n TRACE_PROCESSOR.traceResourceConstructor({ constructor, annotation: options?.annotation, instance: this });\n }\n })();\n Object.defineProperty(klass, 'name', { value: constructor.name });\n return klass;\n };\n\nexport type InfoOptions = {\n /**\n * Value is of enum type and should be converted to string.\n *\n * Example:\n *\n * ```ts\n * @trace.info({ enum: SpaceState })\n * get state(): SpaceState { ... }\n * ```\n */\n enum?: Record<string, any>;\n\n /**\n * Max depth of the object to be included in the resource info section.\n *\n * null means no limit (a limit of 8 nested objects is still imposed).\n *\n * Default: 0 - objects will be stringified with toString.\n */\n depth?: number | null;\n};\n\n/**\n * Marks a property or a method to be included in the resource info section.\n */\nconst info =\n (opts: InfoOptions = {}) =>\n (target: any, propertyKey: string, descriptor?: PropertyDescriptor) => {\n getTracingContext(target).infoProperties[propertyKey] = { options: opts };\n };\n\nconst mark = (name: string) => {\n performance.mark(name);\n};\n\nexport type SpanOptions = {\n showInBrowserTimeline?: boolean;\n};\n\nconst span =\n ({ showInBrowserTimeline = false }: SpanOptions = {}) =>\n (target: any, propertyKey: string, descriptor: TypedPropertyDescriptor<(...args: any) => any>) => {\n const method = descriptor.value!;\n\n descriptor.value = async function (this: any, ...args: any) {\n const parentCtx = args[0] instanceof Context ? args[0] : null;\n const span = TRACE_PROCESSOR.traceSpan({\n parentCtx,\n methodName: propertyKey,\n instance: this,\n showInBrowserTimeline,\n });\n\n const callArgs = span.ctx ? [span.ctx, ...args.slice(1)] : args;\n try {\n return await method.apply(this, callArgs);\n } catch (err) {\n span.markError(err);\n throw err;\n } finally {\n span.markSuccess();\n }\n };\n };\n\n/**\n * Attaches metrics counter to the resource.\n */\nconst metricsCounter = () => (target: any, propertyKey: string, descriptor?: PropertyDescriptor) => {\n getTracingContext(target).metricsProperties[propertyKey] = {};\n};\n\nexport type AddLinkOptions = {};\n\nconst addLink = (parent: any, child: any, opts: AddLinkOptions = {}) => {\n TRACE_PROCESSOR.addLink(parent, child, opts);\n};\n\nexport const trace = {\n resource,\n info,\n mark,\n span,\n metricsCounter,\n\n addLink,\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { type InfoOptions } from './api';\n\nexport const symbolTracingContext = Symbol('dxos.tracing.context');\n\nexport type TracingContext = {\n infoProperties: Record<\n string,\n {\n options: InfoOptions;\n }\n >;\n metricsProperties: Record<string, {}>;\n};\n\nexport const getTracingContext = (target: any): TracingContext => {\n return ((target[symbolTracingContext] as TracingContext | undefined) ??= {\n infoProperties: {},\n metricsProperties: {},\n });\n};\n\nexport const TRACE_SPAN_ATTRIBUTE = 'dxos.trace-span';\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { unrefTimeout } from '@dxos/async';\nimport { type Context } from '@dxos/context';\nimport { LogLevel, type LogProcessor, getContextFromEntry, log } from '@dxos/log';\nimport { type LogEntry } from '@dxos/protocols/proto/dxos/client/services';\nimport { type Error as SerializedError } from '@dxos/protocols/proto/dxos/error';\nimport { type Metric, type Resource, type Span } from '@dxos/protocols/proto/dxos/tracing';\nimport { getPrototypeSpecificInstanceId } from '@dxos/util';\n\nimport type { AddLinkOptions } from './api';\nimport { type BaseCounter } from './metrics';\nimport { TRACE_SPAN_ATTRIBUTE, getTracingContext } from './symbols';\nimport { TraceSender } from './trace-sender';\n\nexport type TraceResourceConstructorParams = {\n constructor: { new (...args: any[]): {} };\n instance: any;\n annotation?: symbol;\n};\n\nexport type TraceSpanParams = {\n instance: any;\n methodName: string;\n parentCtx: Context | null;\n showInBrowserTimeline: boolean;\n};\n\nexport class ResourceEntry {\n /**\n * Sometimes bundlers mangle class names: WebFile -> WebFile2.\n *\n * We use a heuristic to remove the suffix.\n */\n public readonly sanitizedClassName: string;\n\n constructor(\n public readonly data: Resource,\n public readonly instance: WeakRef<any>,\n public readonly annotation?: symbol,\n ) {\n this.sanitizedClassName = sanitizeClassName(data.className);\n }\n\n getMetric(name: string): Metric | undefined {\n return this.data.metrics?.find((metric) => metric.name === name);\n }\n}\n\nexport type TraceSubscription = {\n flush: () => void;\n\n dirtyResources: Set<number>;\n dirtySpans: Set<number>;\n newLogs: LogEntry[];\n};\n\nconst MAX_RESOURCE_RECORDS = 2_000;\nconst MAX_SPAN_RECORDS = 1_000;\nconst MAX_LOG_RECORDS = 1_000;\n\nconst REFRESH_INTERVAL = 1_000;\n\nconst MAX_INFO_OBJECT_DEPTH = 8;\n\nexport class TraceProcessor {\n resources = new Map<number, ResourceEntry>();\n resourceInstanceIndex = new WeakMap<any, ResourceEntry>();\n resourceIdList: number[] = [];\n\n spans = new Map<number, Span>();\n spanIdList: number[] = [];\n\n logs: LogEntry[] = [];\n\n subscriptions: Set<TraceSubscription> = new Set();\n\n constructor() {\n log.addProcessor(this._logProcessor.bind(this));\n\n const refreshInterval = setInterval(this.refresh.bind(this), REFRESH_INTERVAL);\n unrefTimeout(refreshInterval);\n }\n\n traceResourceConstructor(params: TraceResourceConstructorParams) {\n const id = this.resources.size;\n\n // init metrics counters.\n const tracingContext = getTracingContext(Object.getPrototypeOf(params.instance));\n for (const key of Object.keys(tracingContext.metricsProperties)) {\n (params.instance[key] as BaseCounter)._assign(params.instance, key);\n }\n\n const entry = new ResourceEntry(\n {\n id,\n className: params.constructor.name,\n instanceId: getPrototypeSpecificInstanceId(params.instance),\n info: this.getResourceInfo(params.instance),\n links: [],\n metrics: this.getResourceMetrics(params.instance),\n },\n new WeakRef(params.instance),\n params.annotation,\n );\n\n this.resources.set(id, entry);\n this.resourceInstanceIndex.set(params.instance, entry);\n this.resourceIdList.push(id);\n if (this.resourceIdList.length > MAX_RESOURCE_RECORDS) {\n this._clearResources();\n }\n this._markResourceDirty(id);\n }\n\n getResourceInfo(instance: any): Record<string, any> {\n const res: Record<string, any> = {};\n const tracingContext = getTracingContext(Object.getPrototypeOf(instance));\n\n for (const [key, { options }] of Object.entries(tracingContext.infoProperties)) {\n try {\n const value = typeof instance[key] === 'function' ? instance[key]() : instance[key];\n\n if (options.enum) {\n res[key] = options.enum[value];\n } else {\n res[key] = sanitizeValue(\n value,\n options.depth === undefined ? 1 : options.depth ?? MAX_INFO_OBJECT_DEPTH,\n this,\n );\n }\n } catch (err: any) {\n res[key] = err.message;\n }\n }\n\n return res;\n }\n\n getResourceMetrics(instance: any): Metric[] {\n const res: Metric[] = [];\n const tracingContext = getTracingContext(Object.getPrototypeOf(instance));\n\n for (const [key, _opts] of Object.entries(tracingContext.metricsProperties)) {\n res.push(instance[key].getData());\n }\n\n return res;\n }\n\n traceSpan(params: TraceSpanParams): TracingSpan {\n const span = new TracingSpan(this, params);\n this._flushSpan(span);\n return span;\n }\n\n addLink(parent: any, child: any, opts: AddLinkOptions) {}\n\n getResourceId(instance: any): number | null {\n const entry = this.resourceInstanceIndex.get(instance);\n return entry ? entry.data.id : null;\n }\n\n createTraceSender() {\n return new TraceSender(this);\n }\n\n refresh() {\n for (const resource of this.resources.values()) {\n const instance = resource.instance.deref();\n if (!instance) {\n continue;\n }\n\n const tracingContext = getTracingContext(Object.getPrototypeOf(instance));\n const time = performance.now();\n for (const key of Object.keys(tracingContext.metricsProperties)) {\n (instance[key] as BaseCounter)._tick?.(time);\n }\n\n let _changed = false;\n\n const oldInfo = resource.data.info;\n resource.data.info = this.getResourceInfo(instance);\n _changed ||= !areEqualShallow(oldInfo, resource.data.info);\n\n const oldMetrics = resource.data.metrics;\n resource.data.metrics = this.getResourceMetrics(instance);\n _changed ||= !areEqualShallow(oldMetrics, resource.data.metrics);\n\n // TODO(dmaretskyi): Test if works and enable.\n // if (changed) {\n this._markResourceDirty(resource.data.id);\n // }\n }\n\n for (const subscription of this.subscriptions) {\n subscription.flush();\n }\n }\n\n findResourcesByClassName(className: string): ResourceEntry[] {\n return [...this.resources.values()].filter(\n (r) => r.data.className === className || r.sanitizedClassName === className,\n );\n }\n\n findByAnnotation(annotation: symbol): ResourceEntry[] {\n return [...this.resources.values()].filter((r) => r.annotation === annotation);\n }\n\n getDiagnostics() {\n this.refresh();\n\n return {\n resources: Object.fromEntries(\n Array.from(this.resources.entries()).map(([id, entry]) => [\n `${entry.sanitizedClassName}#${entry.data.instanceId}`,\n entry.data,\n ]),\n ),\n spans: Array.from(this.spans.values()),\n logs: this.logs.filter((log) => log.level >= LogLevel.INFO),\n };\n }\n\n /**\n * @internal\n */\n _flushSpan(runtimeSpan: TracingSpan) {\n const span = runtimeSpan.serialize();\n this.spans.set(span.id, span);\n this.spanIdList.push(span.id);\n if (this.spanIdList.length > MAX_SPAN_RECORDS) {\n this._clearSpans();\n }\n this._markSpanDirty(span.id);\n }\n\n private _markResourceDirty(id: number) {\n for (const subscription of this.subscriptions) {\n subscription.dirtyResources.add(id);\n }\n }\n\n private _markSpanDirty(id: number) {\n for (const subscription of this.subscriptions) {\n subscription.dirtySpans.add(id);\n }\n }\n\n private _clearResources() {\n // TODO(dmaretskyi): Use FinalizationRegistry to delete finalized resources first.\n while (this.resourceIdList.length > MAX_RESOURCE_RECORDS) {\n const id = this.resourceIdList.shift()!;\n this.resources.delete(id);\n }\n }\n\n private _clearSpans() {\n while (this.spanIdList.length > MAX_SPAN_RECORDS) {\n const id = this.spanIdList.shift()!;\n this.spans.delete(id);\n }\n }\n\n private _pushLog(log: LogEntry) {\n this.logs.push(log);\n if (this.logs.length > MAX_LOG_RECORDS) {\n this.logs.shift();\n }\n\n for (const subscription of this.subscriptions) {\n subscription.newLogs.push(log);\n }\n }\n\n private _logProcessor: LogProcessor = (config, entry) => {\n switch (entry.level) {\n case LogLevel.ERROR:\n case LogLevel.WARN:\n case LogLevel.TRACE: {\n const scope = entry.meta?.S;\n const resource = this.resourceInstanceIndex.get(scope);\n if (!resource) {\n return;\n }\n\n const context = getContextFromEntry(entry) ?? {};\n\n for (const key of Object.keys(context)) {\n context[key] = sanitizeValue(context[key], 0, this);\n }\n\n const entryToPush: LogEntry = {\n level: entry.level,\n message: entry.message,\n context,\n timestamp: new Date(),\n meta: {\n file: entry.meta?.F ?? '',\n line: entry.meta?.L ?? 0,\n resourceId: resource.data.id,\n },\n };\n this._pushLog(entryToPush);\n break;\n }\n default:\n }\n };\n}\n\nexport class TracingSpan {\n static nextId = 0;\n\n readonly id: number;\n readonly parentId: number | null = null;\n readonly methodName: string;\n readonly resourceId: number | null = null;\n startTs: number;\n endTs: number | null = null;\n error: SerializedError | null = null;\n\n private _showInBrowserTimeline: boolean;\n private readonly _ctx: Context | null = null;\n\n constructor(\n private _traceProcessor: TraceProcessor,\n params: TraceSpanParams,\n ) {\n this.id = TracingSpan.nextId++;\n this.methodName = params.methodName;\n this.resourceId = _traceProcessor.getResourceId(params.instance);\n this.startTs = performance.now();\n this._showInBrowserTimeline = params.showInBrowserTimeline;\n\n if (params.parentCtx) {\n this._ctx = params.parentCtx.derive({\n attributes: {\n [TRACE_SPAN_ATTRIBUTE]: this.id,\n },\n });\n const parentId = params.parentCtx.getAttribute(TRACE_SPAN_ATTRIBUTE);\n if (typeof parentId === 'number') {\n this.parentId = parentId;\n }\n }\n }\n\n get ctx(): Context | null {\n return this._ctx;\n }\n\n markSuccess() {\n this.endTs = performance.now();\n this._traceProcessor._flushSpan(this);\n\n if (this._showInBrowserTimeline) {\n this._markInBrowserTimeline();\n }\n }\n\n markError(err: unknown) {\n this.endTs = performance.now();\n this.error = serializeError(err);\n this._traceProcessor._flushSpan(this);\n\n if (this._showInBrowserTimeline) {\n this._markInBrowserTimeline();\n }\n }\n\n serialize(): Span {\n return {\n id: this.id,\n resourceId: this.resourceId ?? undefined,\n methodName: this.methodName,\n parentId: this.parentId ?? undefined,\n startTs: this.startTs.toFixed(3),\n endTs: this.endTs?.toFixed(3) ?? undefined,\n error: this.error ?? undefined,\n };\n }\n\n private _markInBrowserTimeline() {\n const resource = this._traceProcessor.resources.get(this.resourceId!);\n const name = resource\n ? `${resource.sanitizedClassName}#${resource.data.instanceId}.${this.methodName}`\n : this.methodName;\n performance.measure(name, { start: this.startTs, end: this.endTs! });\n }\n}\n\nconst serializeError = (err: unknown): SerializedError => {\n if (err instanceof Error) {\n return {\n name: err.name,\n message: err.message,\n };\n }\n\n return {\n message: String(err),\n };\n};\n\nexport const TRACE_PROCESSOR: TraceProcessor = ((globalThis as any).TRACE_PROCESSOR ??= new TraceProcessor());\n\nconst sanitizeValue = (value: any, depth: number, traceProcessor: TraceProcessor): any => {\n switch (typeof value) {\n case 'string':\n case 'number':\n case 'boolean':\n case 'undefined':\n return value;\n break;\n case 'object':\n case 'function':\n if (value === null) {\n return value;\n }\n\n {\n const resourceEntry = traceProcessor.resourceInstanceIndex.get(value);\n if (resourceEntry) {\n return `${resourceEntry.sanitizedClassName}#${resourceEntry.data.instanceId}`;\n }\n }\n\n if (typeof value.toJSON === 'function') {\n // TODO(dmaretskyi): This has potential to cause infinite recursion.\n return sanitizeValue(value.toJSON(), depth, traceProcessor);\n }\n\n if (depth > 0) {\n if (isSetLike(value)) {\n return Object.fromEntries(\n Array.from(value.entries()).map((value) => sanitizeValue(value, depth - 1, traceProcessor)),\n );\n } else if (isMapLike(value)) {\n return Object.fromEntries(\n Array.from(value.entries()).map(([key, value]) => [key, sanitizeValue(value, depth - 1, traceProcessor)]),\n );\n } else if (Array.isArray(value)) {\n return value.map((item: any) => sanitizeValue(item, depth - 1, traceProcessor));\n } else if (typeof value === 'object') {\n const res: any = {};\n for (const key of Object.keys(value)) {\n res[key] = sanitizeValue(value[key], depth - 1, traceProcessor);\n }\n return res;\n }\n }\n\n // TODO(dmaretskyi): Expose trait.\n if (typeof value.truncate === 'function') {\n return value.truncate();\n }\n\n return value.toString();\n }\n};\n\nconst areEqualShallow = (a: any, b: any) => {\n for (const key in a) {\n if (!(key in b) || a[key] !== b[key]) {\n return false;\n }\n }\n for (const key in b) {\n if (!(key in a) || a[key] !== b[key]) {\n return false;\n }\n }\n return true;\n};\n\nexport const sanitizeClassName = (className: string) => {\n const SANITIZE_REGEX = /[^_](\\d+)$/;\n const m = className.match(SANITIZE_REGEX);\n if (!m) {\n return className;\n } else {\n return className.slice(0, -m[1].length);\n }\n};\n\nconst isSetLike = (value: any): value is Set<any> =>\n value instanceof Set ||\n (typeof value === 'object' && value !== null && Object.getPrototypeOf(value).constructor.name === 'ComplexSet');\n\nconst isMapLike = (value: any): value is Map<any, any> =>\n value instanceof Map ||\n (typeof value === 'object' && value !== null && Object.getPrototypeOf(value).constructor.name === 'ComplexMap');\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { Stream } from '@dxos/codec-protobuf';\nimport { type LogEntry } from '@dxos/protocols/proto/dxos/client/services';\nimport { type StreamTraceEvent, type TracingService } from '@dxos/protocols/proto/dxos/tracing';\n\nimport { type TraceProcessor, type TraceSubscription } from './trace-processor';\n\nexport class TraceSender implements TracingService {\n constructor(private _traceProcessor: TraceProcessor) {}\n\n streamTrace(request: void): Stream<StreamTraceEvent> {\n return new Stream(({ ctx, next }) => {\n const flushEvents = (resources: Set<number> | null, spans: Set<number> | null, logs: LogEntry[] | null) => {\n const event: StreamTraceEvent = {\n resourceAdded: [],\n resourceRemoved: [],\n spanAdded: [],\n logAdded: [],\n };\n\n if (resources) {\n for (const id of resources) {\n const entry = this._traceProcessor.resources.get(id);\n if (entry) {\n event.resourceAdded!.push({ resource: entry.data });\n } else {\n event.resourceRemoved!.push({ id });\n }\n }\n } else {\n for (const entry of this._traceProcessor.resources.values()) {\n event.resourceAdded!.push({ resource: entry.data });\n }\n }\n\n if (spans) {\n for (const id of spans) {\n const span = this._traceProcessor.spans.get(id);\n if (span) {\n event.spanAdded!.push({ span });\n }\n }\n } else {\n for (const span of this._traceProcessor.spans.values()) {\n event.spanAdded!.push({ span });\n }\n }\n\n if (logs) {\n for (const log of logs) {\n event.logAdded!.push({ log });\n }\n } else {\n for (const log of this._traceProcessor.logs) {\n event.logAdded!.push({ log });\n }\n }\n\n if (event.resourceAdded!.length > 0 || event.resourceRemoved!.length > 0 || event.spanAdded!.length > 0) {\n next(event);\n }\n };\n\n const flush = () => {\n flushEvents(subscription.dirtyResources, subscription.dirtySpans, subscription.newLogs);\n subscription.dirtyResources.clear();\n subscription.dirtySpans.clear();\n subscription.newLogs.length = 0;\n };\n\n const subscription: TraceSubscription = {\n flush,\n dirtyResources: new Set(),\n dirtySpans: new Set(),\n newLogs: [],\n };\n this._traceProcessor.subscriptions.add(subscription);\n ctx.onDispose(() => {\n this._traceProcessor.subscriptions.delete(subscription);\n });\n\n flushEvents(null, null, null);\n });\n }\n}\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { type Metric } from '@dxos/protocols/proto/dxos/tracing';\n\nexport abstract class BaseCounter {\n /**\n * @internal\n */\n _instance: any;\n\n name?: string;\n\n /**\n * @internal\n */\n _assign(instance: any, name: string) {\n this._instance = instance;\n this.name = name;\n }\n\n abstract getData(): Metric;\n\n _tick(time: number): void {}\n}\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { type Metric } from '@dxos/protocols/proto/dxos/tracing';\n\nimport { BaseCounter } from './base';\n\nexport class UnaryCounter extends BaseCounter {\n value = 0;\n units?: string;\n\n constructor({ units }: { units?: string } = {}) {\n super();\n this.units = units;\n }\n\n inc(by = 1) {\n this.value += by;\n }\n\n getData(): Metric {\n return {\n name: this.name!,\n counter: {\n value: this.value,\n units: this.units,\n },\n };\n }\n}\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { type Metric } from '@dxos/protocols/proto/dxos/tracing';\n\nimport { BaseCounter } from './base';\n\nconst MAX_BUCKETS = 60;\n\nexport class TimeSeriesCounter extends BaseCounter {\n private _currentValue = 0;\n private _totalValue = 0;\n private _buckets: number[] = [];\n units?: string;\n\n constructor({ units }: { units?: string } = {}) {\n super();\n this.units = units;\n }\n\n inc(by = 1) {\n this._currentValue += by;\n this._totalValue += by;\n }\n\n override _tick(time: number): void {\n this._buckets.push(this._currentValue);\n if (this._buckets.length > MAX_BUCKETS) {\n this._buckets.shift();\n }\n this._currentValue = 0;\n }\n\n override getData(): Metric {\n return {\n name: this.name!,\n timeSeries: {\n tracks: [\n {\n name: this.name!,\n units: this.units,\n points: this._buckets.map((value, index) => ({\n value,\n })),\n total: this._totalValue,\n },\n ],\n },\n };\n }\n}\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { type Metric } from '@dxos/protocols/proto/dxos/tracing';\n\nimport { BaseCounter } from './base';\n\nconst MAX_BUCKETS = 60;\n\nexport class TimeUsageCounter extends BaseCounter {\n private _currentValue = 0;\n private _totalValue = 0;\n private _buckets: number[] = [];\n\n private _lastTickTime = performance.now();\n\n record(time: number) {\n this._currentValue += time;\n this._totalValue += time;\n }\n\n beginRecording(): { end: () => void } {\n const start = performance.now();\n return {\n end: () => {\n const end = performance.now();\n this.record(end - start);\n },\n };\n }\n\n override _tick(time: number): void {\n const delta = time - this._lastTickTime;\n this._lastTickTime = time;\n\n const percentage = (this._currentValue / delta) * 100;\n this._buckets.push(percentage);\n if (this._buckets.length > MAX_BUCKETS) {\n this._buckets.shift();\n }\n this._currentValue = 0;\n }\n\n override getData(): Metric {\n return {\n name: this.name!,\n timeSeries: {\n tracks: [\n {\n name: this.name!,\n units: '%',\n points: this._buckets.map((value, index) => ({\n value,\n })),\n total: this._totalValue,\n },\n ],\n },\n };\n }\n}\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { type Metric } from '@dxos/protocols/proto/dxos/tracing';\n\nimport { BaseCounter } from './base';\n\nexport class MapCounter extends BaseCounter {\n values = new Map<string, number>();\n units?: string;\n\n constructor({ units }: { units?: string } = {}) {\n super();\n this.units = units;\n }\n\n inc(key: string, by = 1) {\n const prev = this.values.get(key) ?? 0;\n this.values.set(key, prev + by);\n }\n\n getData(): Metric {\n return {\n name: this.name!,\n multiCounter: {\n records: Array.from(this.values.entries()).map(([key, value]) => ({\n key,\n value,\n })),\n units: this.units,\n },\n };\n }\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["symbolTracingContext", "Symbol", "getTracingContext", "target", "infoProperties", "metricsProperties", "TRACE_SPAN_ATTRIBUTE", "TraceSender", "constructor", "_traceProcessor", "streamTrace", "request", "Stream", "ctx", "next", "flushEvents", "resources", "spans", "logs", "event", "resourceAdded", "resourceRemoved", "spanAdded", "logAdded", "id", "entry", "get", "push", "resource", "data", "values", "span", "log", "length", "flush", "subscription", "dirtyResources", "dirtySpans", "newLogs", "clear", "Set", "subscriptions", "add", "onDispose", "delete", "ResourceEntry", "instance", "annotation", "sanitizedClassName", "sanitizeClassName", "className", "getMetric", "name", "metrics", "find", "metric", "MAX_RESOURCE_RECORDS", "MAX_SPAN_RECORDS", "MAX_LOG_RECORDS", "REFRESH_INTERVAL", "MAX_INFO_OBJECT_DEPTH", "TraceProcessor", "Map", "resourceInstanceIndex", "WeakMap", "resourceIdList", "spanIdList", "_logProcessor", "config", "level", "LogLevel", "ERROR", "WARN", "TRACE", "scope", "meta", "S", "context", "getContextFromEntry", "key", "Object", "keys", "sanitizeValue", "entryToPush", "message", "timestamp", "Date", "file", "F", "line", "L", "resourceId", "_pushLog", "addProcessor", "bind", "refreshInterval", "setInterval", "refresh", "unrefTimeout", "
|
|
4
|
+
"sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nimport { Context } from '@dxos/context';\n\nimport { getTracingContext } from './symbols';\nimport { TRACE_PROCESSOR } from './trace-processor';\n\n/**\n * Annotates a class as a tracked resource.\n */\nconst resource =\n (options?: { annotation?: symbol }) =>\n <T extends { new (...args: any[]): {} }>(constructor: T) => {\n // Wrapping class declaration into an IIFE so it doesn't capture the `klass` class name.\n const klass = (() =>\n class extends constructor {\n constructor(...rest: any[]) {\n super(...rest);\n TRACE_PROCESSOR.createTraceResource({ constructor, annotation: options?.annotation, instance: this });\n }\n })();\n Object.defineProperty(klass, 'name', { value: constructor.name });\n return klass;\n };\n\nexport type InfoOptions = {\n /**\n * Value is of enum type and should be converted to string.\n *\n * Example:\n *\n * ```ts\n * @trace.info({ enum: SpaceState })\n * get state(): SpaceState { ... }\n * ```\n */\n enum?: Record<string, any>;\n\n /**\n * Max depth of the object to be included in the resource info section.\n *\n * null means no limit (a limit of 8 nested objects is still imposed).\n *\n * Default: 0 - objects will be stringified with toString.\n */\n depth?: number | null;\n};\n\n/**\n * Marks a property or a method to be included in the resource info section.\n */\nconst info =\n (opts: InfoOptions = {}) =>\n (target: any, propertyKey: string, descriptor?: PropertyDescriptor) => {\n getTracingContext(target).infoProperties[propertyKey] = { options: opts };\n };\n\nconst mark = (name: string) => {\n performance.mark(name);\n};\n\nexport type SpanOptions = {\n showInBrowserTimeline?: boolean;\n};\n\nconst span =\n ({ showInBrowserTimeline = false }: SpanOptions = {}) =>\n (target: any, propertyKey: string, descriptor: TypedPropertyDescriptor<(...args: any) => any>) => {\n const method = descriptor.value!;\n\n descriptor.value = async function (this: any, ...args: any) {\n const parentCtx = args[0] instanceof Context ? args[0] : null;\n const span = TRACE_PROCESSOR.traceSpan({\n parentCtx,\n methodName: propertyKey,\n instance: this,\n showInBrowserTimeline,\n });\n\n const callArgs = span.ctx ? [span.ctx, ...args.slice(1)] : args;\n try {\n return await method.apply(this, callArgs);\n } catch (err) {\n span.markError(err);\n throw err;\n } finally {\n span.markSuccess();\n }\n };\n };\n\n/**\n * Attaches metrics counter to the resource.\n */\nconst metricsCounter = () => (target: any, propertyKey: string, descriptor?: PropertyDescriptor) => {\n getTracingContext(target).metricsProperties[propertyKey] = {};\n};\n\nexport type AddLinkOptions = {};\n\nconst addLink = (parent: any, child: any, opts: AddLinkOptions = {}) => {\n TRACE_PROCESSOR.addLink(parent, child, opts);\n};\n\nexport const trace = {\n resource,\n info,\n mark,\n span,\n metricsCounter,\n\n addLink,\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { type InfoOptions } from './api';\n\nexport const symbolTracingContext = Symbol('dxos.tracing.context');\n\nexport type TracingContext = {\n infoProperties: Record<\n string,\n {\n options: InfoOptions;\n }\n >;\n metricsProperties: Record<string, {}>;\n};\n\nexport const getTracingContext = (target: any): TracingContext => {\n return ((target[symbolTracingContext] as TracingContext | undefined) ??= {\n infoProperties: {},\n metricsProperties: {},\n });\n};\n\nexport const TRACE_SPAN_ATTRIBUTE = 'dxos.trace-span';\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { unrefTimeout } from '@dxos/async';\nimport { type Context } from '@dxos/context';\nimport { LogLevel, type LogProcessor, getContextFromEntry, log } from '@dxos/log';\nimport { type LogEntry } from '@dxos/protocols/proto/dxos/client/services';\nimport { type Error as SerializedError } from '@dxos/protocols/proto/dxos/error';\nimport { type Metric, type Resource, type Span } from '@dxos/protocols/proto/dxos/tracing';\nimport { getPrototypeSpecificInstanceId } from '@dxos/util';\n\nimport type { AddLinkOptions } from './api';\nimport { type BaseCounter } from './metrics';\nimport { TRACE_SPAN_ATTRIBUTE, getTracingContext } from './symbols';\nimport { TraceSender } from './trace-sender';\n\nexport type Diagnostics = {\n resources: Record<string, Resource>;\n spans: Span[];\n logs: LogEntry[];\n};\n\nexport type TraceResourceConstructorParams = {\n constructor: { new (...args: any[]): {} };\n instance: any;\n annotation?: symbol;\n};\n\nexport type TraceSpanParams = {\n instance: any;\n methodName: string;\n parentCtx: Context | null;\n showInBrowserTimeline: boolean;\n};\n\nexport class ResourceEntry {\n /**\n * Sometimes bundlers mangle class names: WebFile -> WebFile2.\n *\n * We use a heuristic to remove the suffix.\n */\n public readonly sanitizedClassName: string;\n\n constructor(\n public readonly data: Resource,\n public readonly instance: WeakRef<any>,\n public readonly annotation?: symbol,\n ) {\n this.sanitizedClassName = sanitizeClassName(data.className);\n }\n\n getMetric(name: string): Metric | undefined {\n return this.data.metrics?.find((metric) => metric.name === name);\n }\n}\n\nexport type TraceSubscription = {\n flush: () => void;\n\n dirtyResources: Set<number>;\n dirtySpans: Set<number>;\n newLogs: LogEntry[];\n};\n\nconst MAX_RESOURCE_RECORDS = 2_000;\nconst MAX_SPAN_RECORDS = 1_000;\nconst MAX_LOG_RECORDS = 1_000;\n\nconst REFRESH_INTERVAL = 1_000;\n\nconst MAX_INFO_OBJECT_DEPTH = 8;\n\nexport class TraceProcessor {\n readonly subscriptions: Set<TraceSubscription> = new Set();\n\n readonly resources = new Map<number, ResourceEntry>();\n readonly resourceInstanceIndex = new WeakMap<any, ResourceEntry>();\n readonly resourceIdList: number[] = [];\n\n readonly spans = new Map<number, Span>();\n readonly spanIdList: number[] = [];\n\n readonly logs: LogEntry[] = [];\n\n constructor() {\n log.addProcessor(this._logProcessor.bind(this));\n\n const refreshInterval = setInterval(this.refresh.bind(this), REFRESH_INTERVAL);\n unrefTimeout(refreshInterval);\n }\n\n /**\n * @internal\n */\n // TODO(burdon): Comment.\n createTraceResource(params: TraceResourceConstructorParams) {\n const id = this.resources.size;\n\n // Init metrics counters.\n const tracingContext = getTracingContext(Object.getPrototypeOf(params.instance));\n for (const key of Object.keys(tracingContext.metricsProperties)) {\n (params.instance[key] as BaseCounter)._assign(params.instance, key);\n }\n\n const entry = new ResourceEntry(\n {\n id,\n className: params.constructor.name,\n instanceId: getPrototypeSpecificInstanceId(params.instance),\n info: this.getResourceInfo(params.instance),\n links: [],\n metrics: this.getResourceMetrics(params.instance),\n },\n new WeakRef(params.instance),\n params.annotation,\n );\n\n this.resources.set(id, entry);\n this.resourceInstanceIndex.set(params.instance, entry);\n this.resourceIdList.push(id);\n if (this.resourceIdList.length > MAX_RESOURCE_RECORDS) {\n this._clearResources();\n }\n\n this._markResourceDirty(id);\n }\n\n createTraceSender() {\n return new TraceSender(this);\n }\n\n traceSpan(params: TraceSpanParams): TracingSpan {\n const span = new TracingSpan(this, params);\n this._flushSpan(span);\n return span;\n }\n\n // TODO(burdon): Not implemented.\n addLink(parent: any, child: any, opts: AddLinkOptions) {}\n\n //\n // Getters\n //\n\n // TODO(burdon): Define type.\n // TODO(burdon): Reconcile with system service.\n getDiagnostics(): Diagnostics {\n this.refresh();\n\n return {\n resources: Object.fromEntries(\n Array.from(this.resources.entries()).map(([id, entry]) => [\n `${entry.sanitizedClassName}#${entry.data.instanceId}`,\n entry.data,\n ]),\n ),\n spans: Array.from(this.spans.values()),\n logs: this.logs.filter((log) => log.level >= LogLevel.INFO),\n };\n }\n\n getResourceInfo(instance: any): Record<string, any> {\n const res: Record<string, any> = {};\n const tracingContext = getTracingContext(Object.getPrototypeOf(instance));\n for (const [key, { options }] of Object.entries(tracingContext.infoProperties)) {\n try {\n const value = typeof instance[key] === 'function' ? instance[key]() : instance[key];\n if (options.enum) {\n res[key] = options.enum[value];\n } else {\n res[key] = sanitizeValue(\n value,\n options.depth === undefined ? 1 : options.depth ?? MAX_INFO_OBJECT_DEPTH,\n this,\n );\n }\n } catch (err: any) {\n res[key] = err.message;\n }\n }\n\n return res;\n }\n\n getResourceMetrics(instance: any): Metric[] {\n const res: Metric[] = [];\n const tracingContext = getTracingContext(Object.getPrototypeOf(instance));\n for (const [key, _opts] of Object.entries(tracingContext.metricsProperties)) {\n res.push(instance[key].getData());\n }\n\n return res;\n }\n\n getResourceId(instance: any): number | null {\n const entry = this.resourceInstanceIndex.get(instance);\n return entry ? entry.data.id : null;\n }\n\n findResourcesByClassName(className: string): ResourceEntry[] {\n return [...this.resources.values()].filter(\n (res) => res.data.className === className || res.sanitizedClassName === className,\n );\n }\n\n findResourcesByAnnotation(annotation: symbol): ResourceEntry[] {\n return [...this.resources.values()].filter((res) => res.annotation === annotation);\n }\n\n refresh() {\n for (const resource of this.resources.values()) {\n const instance = resource.instance.deref();\n if (!instance) {\n continue;\n }\n\n const tracingContext = getTracingContext(Object.getPrototypeOf(instance));\n const time = performance.now();\n for (const key of Object.keys(tracingContext.metricsProperties)) {\n (instance[key] as BaseCounter)._tick?.(time);\n }\n\n let _changed = false;\n\n const oldInfo = resource.data.info;\n resource.data.info = this.getResourceInfo(instance);\n _changed ||= !areEqualShallow(oldInfo, resource.data.info);\n\n const oldMetrics = resource.data.metrics;\n resource.data.metrics = this.getResourceMetrics(instance);\n _changed ||= !areEqualShallow(oldMetrics, resource.data.metrics);\n\n // TODO(dmaretskyi): Test if works and enable.\n // if (changed) {\n this._markResourceDirty(resource.data.id);\n // }\n }\n\n for (const subscription of this.subscriptions) {\n subscription.flush();\n }\n }\n\n //\n // Implementation\n //\n\n /**\n * @internal\n */\n _flushSpan(runtimeSpan: TracingSpan) {\n const span = runtimeSpan.serialize();\n this.spans.set(span.id, span);\n this.spanIdList.push(span.id);\n if (this.spanIdList.length > MAX_SPAN_RECORDS) {\n this._clearSpans();\n }\n this._markSpanDirty(span.id);\n }\n\n private _markResourceDirty(id: number) {\n for (const subscription of this.subscriptions) {\n subscription.dirtyResources.add(id);\n }\n }\n\n private _markSpanDirty(id: number) {\n for (const subscription of this.subscriptions) {\n subscription.dirtySpans.add(id);\n }\n }\n\n private _clearResources() {\n // TODO(dmaretskyi): Use FinalizationRegistry to delete finalized resources first.\n while (this.resourceIdList.length > MAX_RESOURCE_RECORDS) {\n const id = this.resourceIdList.shift()!;\n this.resources.delete(id);\n }\n }\n\n private _clearSpans() {\n while (this.spanIdList.length > MAX_SPAN_RECORDS) {\n const id = this.spanIdList.shift()!;\n this.spans.delete(id);\n }\n }\n\n private _pushLog(log: LogEntry) {\n this.logs.push(log);\n if (this.logs.length > MAX_LOG_RECORDS) {\n this.logs.shift();\n }\n\n for (const subscription of this.subscriptions) {\n subscription.newLogs.push(log);\n }\n }\n\n private _logProcessor: LogProcessor = (config, entry) => {\n switch (entry.level) {\n case LogLevel.ERROR:\n case LogLevel.WARN:\n case LogLevel.TRACE: {\n const scope = entry.meta?.S;\n const resource = this.resourceInstanceIndex.get(scope);\n if (!resource) {\n return;\n }\n\n const context = getContextFromEntry(entry) ?? {};\n for (const key of Object.keys(context)) {\n context[key] = sanitizeValue(context[key], 0, this);\n }\n\n const entryToPush: LogEntry = {\n level: entry.level,\n message: entry.message,\n context,\n timestamp: new Date(),\n meta: {\n file: entry.meta?.F ?? '',\n line: entry.meta?.L ?? 0,\n resourceId: resource.data.id,\n },\n };\n this._pushLog(entryToPush);\n break;\n }\n default:\n }\n };\n}\n\n// TODO(burdon): Comment.\nexport class TracingSpan {\n static nextId = 0;\n\n readonly id: number;\n readonly parentId: number | null = null;\n readonly methodName: string;\n readonly resourceId: number | null = null;\n startTs: number;\n endTs: number | null = null;\n error: SerializedError | null = null;\n\n private _showInBrowserTimeline: boolean;\n private readonly _ctx: Context | null = null;\n\n constructor(\n private _traceProcessor: TraceProcessor,\n params: TraceSpanParams,\n ) {\n this.id = TracingSpan.nextId++;\n this.methodName = params.methodName;\n this.resourceId = _traceProcessor.getResourceId(params.instance);\n this.startTs = performance.now();\n this._showInBrowserTimeline = params.showInBrowserTimeline;\n\n if (params.parentCtx) {\n this._ctx = params.parentCtx.derive({\n attributes: {\n [TRACE_SPAN_ATTRIBUTE]: this.id,\n },\n });\n const parentId = params.parentCtx.getAttribute(TRACE_SPAN_ATTRIBUTE);\n if (typeof parentId === 'number') {\n this.parentId = parentId;\n }\n }\n }\n\n get ctx(): Context | null {\n return this._ctx;\n }\n\n markSuccess() {\n this.endTs = performance.now();\n this._traceProcessor._flushSpan(this);\n\n if (this._showInBrowserTimeline) {\n this._markInBrowserTimeline();\n }\n }\n\n markError(err: unknown) {\n this.endTs = performance.now();\n this.error = serializeError(err);\n this._traceProcessor._flushSpan(this);\n\n if (this._showInBrowserTimeline) {\n this._markInBrowserTimeline();\n }\n }\n\n serialize(): Span {\n return {\n id: this.id,\n resourceId: this.resourceId ?? undefined,\n methodName: this.methodName,\n parentId: this.parentId ?? undefined,\n startTs: this.startTs.toFixed(3),\n endTs: this.endTs?.toFixed(3) ?? undefined,\n error: this.error ?? undefined,\n };\n }\n\n private _markInBrowserTimeline() {\n const resource = this._traceProcessor.resources.get(this.resourceId!);\n const name = resource\n ? `${resource.sanitizedClassName}#${resource.data.instanceId}.${this.methodName}`\n : this.methodName;\n performance.measure(name, { start: this.startTs, end: this.endTs! });\n }\n}\n\n// TODO(burdon): Log cause.\nconst serializeError = (err: unknown): SerializedError => {\n if (err instanceof Error) {\n return {\n name: err.name,\n message: err.message,\n };\n }\n\n return {\n message: String(err),\n };\n};\n\n// TODO(burdon): Rename singleton and move out of package.\nexport const TRACE_PROCESSOR: TraceProcessor = ((globalThis as any).TRACE_PROCESSOR ??= new TraceProcessor());\n\nconst sanitizeValue = (value: any, depth: number, traceProcessor: TraceProcessor): any => {\n switch (typeof value) {\n case 'string':\n case 'number':\n case 'boolean':\n case 'undefined':\n return value;\n case 'object':\n case 'function':\n if (value === null) {\n return value;\n }\n\n {\n const resourceEntry = traceProcessor.resourceInstanceIndex.get(value);\n if (resourceEntry) {\n return `${resourceEntry.sanitizedClassName}#${resourceEntry.data.instanceId}`;\n }\n }\n\n if (typeof value.toJSON === 'function') {\n // TODO(dmaretskyi): This has potential to cause infinite recursion.\n return sanitizeValue(value.toJSON(), depth, traceProcessor);\n }\n\n if (depth > 0) {\n if (isSetLike(value)) {\n return Object.fromEntries(\n Array.from(value.entries()).map((value) => sanitizeValue(value, depth - 1, traceProcessor)),\n );\n } else if (isMapLike(value)) {\n return Object.fromEntries(\n Array.from(value.entries()).map(([key, value]) => [key, sanitizeValue(value, depth - 1, traceProcessor)]),\n );\n } else if (Array.isArray(value)) {\n return value.map((item: any) => sanitizeValue(item, depth - 1, traceProcessor));\n } else if (typeof value === 'object') {\n const res: any = {};\n for (const key of Object.keys(value)) {\n res[key] = sanitizeValue(value[key], depth - 1, traceProcessor);\n }\n return res;\n }\n }\n\n // TODO(dmaretskyi): Expose trait.\n if (typeof value.truncate === 'function') {\n return value.truncate();\n }\n\n return value.toString();\n }\n};\n\nconst areEqualShallow = (a: any, b: any) => {\n for (const key in a) {\n if (!(key in b) || a[key] !== b[key]) {\n return false;\n }\n }\n for (const key in b) {\n if (!(key in a) || a[key] !== b[key]) {\n return false;\n }\n }\n return true;\n};\n\nexport const sanitizeClassName = (className: string) => {\n const SANITIZE_REGEX = /[^_](\\d+)$/;\n const m = className.match(SANITIZE_REGEX);\n if (!m) {\n return className;\n } else {\n return className.slice(0, -m[1].length);\n }\n};\n\nconst isSetLike = (value: any): value is Set<any> =>\n value instanceof Set ||\n (typeof value === 'object' && value !== null && Object.getPrototypeOf(value).constructor.name === 'ComplexSet');\n\nconst isMapLike = (value: any): value is Map<any, any> =>\n value instanceof Map ||\n (typeof value === 'object' && value !== null && Object.getPrototypeOf(value).constructor.name === 'ComplexMap');\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { Stream } from '@dxos/codec-protobuf';\nimport { type LogEntry } from '@dxos/protocols/proto/dxos/client/services';\nimport { type StreamTraceEvent, type TracingService } from '@dxos/protocols/proto/dxos/tracing';\n\nimport { type TraceProcessor, type TraceSubscription } from './trace-processor';\n\nexport class TraceSender implements TracingService {\n constructor(private _traceProcessor: TraceProcessor) {}\n\n streamTrace(request: void): Stream<StreamTraceEvent> {\n return new Stream(({ ctx, next }) => {\n const flushEvents = (resources: Set<number> | null, spans: Set<number> | null, logs: LogEntry[] | null) => {\n const event: StreamTraceEvent = {\n resourceAdded: [],\n resourceRemoved: [],\n spanAdded: [],\n logAdded: [],\n };\n\n if (resources) {\n for (const id of resources) {\n const entry = this._traceProcessor.resources.get(id);\n if (entry) {\n event.resourceAdded!.push({ resource: entry.data });\n } else {\n event.resourceRemoved!.push({ id });\n }\n }\n } else {\n for (const entry of this._traceProcessor.resources.values()) {\n event.resourceAdded!.push({ resource: entry.data });\n }\n }\n\n if (spans) {\n for (const id of spans) {\n const span = this._traceProcessor.spans.get(id);\n if (span) {\n event.spanAdded!.push({ span });\n }\n }\n } else {\n for (const span of this._traceProcessor.spans.values()) {\n event.spanAdded!.push({ span });\n }\n }\n\n if (logs) {\n for (const log of logs) {\n event.logAdded!.push({ log });\n }\n } else {\n for (const log of this._traceProcessor.logs) {\n event.logAdded!.push({ log });\n }\n }\n\n if (event.resourceAdded!.length > 0 || event.resourceRemoved!.length > 0 || event.spanAdded!.length > 0) {\n next(event);\n }\n };\n\n const flush = () => {\n flushEvents(subscription.dirtyResources, subscription.dirtySpans, subscription.newLogs);\n subscription.dirtyResources.clear();\n subscription.dirtySpans.clear();\n subscription.newLogs.length = 0;\n };\n\n const subscription: TraceSubscription = {\n flush,\n dirtyResources: new Set(),\n dirtySpans: new Set(),\n newLogs: [],\n };\n this._traceProcessor.subscriptions.add(subscription);\n ctx.onDispose(() => {\n this._traceProcessor.subscriptions.delete(subscription);\n });\n\n flushEvents(null, null, null);\n });\n }\n}\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { type Metric } from '@dxos/protocols/proto/dxos/tracing';\n\nexport abstract class BaseCounter {\n /**\n * @internal\n */\n _instance: any;\n\n name?: string;\n\n /**\n * @internal\n */\n _assign(instance: any, name: string) {\n this._instance = instance;\n this.name = name;\n }\n\n abstract getData(): Metric;\n\n _tick(time: number): void {}\n}\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { type Metric } from '@dxos/protocols/proto/dxos/tracing';\n\nimport { BaseCounter } from './base';\n\nexport class UnaryCounter extends BaseCounter {\n value = 0;\n units?: string;\n\n constructor({ units }: { units?: string } = {}) {\n super();\n this.units = units;\n }\n\n inc(by = 1) {\n this.value += by;\n }\n\n getData(): Metric {\n return {\n name: this.name!,\n counter: {\n value: this.value,\n units: this.units,\n },\n };\n }\n}\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { type Metric } from '@dxos/protocols/proto/dxos/tracing';\n\nimport { BaseCounter } from './base';\n\nconst MAX_BUCKETS = 60;\n\nexport class TimeSeriesCounter extends BaseCounter {\n private _currentValue = 0;\n private _totalValue = 0;\n private _buckets: number[] = [];\n units?: string;\n\n constructor({ units }: { units?: string } = {}) {\n super();\n this.units = units;\n }\n\n inc(by = 1) {\n this._currentValue += by;\n this._totalValue += by;\n }\n\n override _tick(time: number): void {\n this._buckets.push(this._currentValue);\n if (this._buckets.length > MAX_BUCKETS) {\n this._buckets.shift();\n }\n this._currentValue = 0;\n }\n\n override getData(): Metric {\n return {\n name: this.name!,\n timeSeries: {\n tracks: [\n {\n name: this.name!,\n units: this.units,\n points: this._buckets.map((value, index) => ({\n value,\n })),\n total: this._totalValue,\n },\n ],\n },\n };\n }\n}\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { type Metric } from '@dxos/protocols/proto/dxos/tracing';\n\nimport { BaseCounter } from './base';\n\nconst MAX_BUCKETS = 60;\n\nexport class TimeUsageCounter extends BaseCounter {\n private _currentValue = 0;\n private _totalValue = 0;\n private _buckets: number[] = [];\n\n private _lastTickTime = performance.now();\n\n record(time: number) {\n this._currentValue += time;\n this._totalValue += time;\n }\n\n beginRecording(): { end: () => void } {\n const start = performance.now();\n return {\n end: () => {\n const end = performance.now();\n this.record(end - start);\n },\n };\n }\n\n override _tick(time: number): void {\n const delta = time - this._lastTickTime;\n this._lastTickTime = time;\n\n const percentage = (this._currentValue / delta) * 100;\n this._buckets.push(percentage);\n if (this._buckets.length > MAX_BUCKETS) {\n this._buckets.shift();\n }\n this._currentValue = 0;\n }\n\n override getData(): Metric {\n return {\n name: this.name!,\n timeSeries: {\n tracks: [\n {\n name: this.name!,\n units: '%',\n points: this._buckets.map((value, index) => ({\n value,\n })),\n total: this._totalValue,\n },\n ],\n },\n };\n }\n}\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { type Metric } from '@dxos/protocols/proto/dxos/tracing';\n\nimport { BaseCounter } from './base';\n\nexport class MapCounter extends BaseCounter {\n values = new Map<string, number>();\n units?: string;\n\n constructor({ units }: { units?: string } = {}) {\n super();\n this.units = units;\n }\n\n inc(key: string, by = 1) {\n const prev = this.values.get(key) ?? 0;\n this.values.set(key, prev + by);\n }\n\n getData(): Metric {\n return {\n name: this.name!,\n multiCounter: {\n records: Array.from(this.values.entries()).map(([key, value]) => ({\n key,\n value,\n })),\n units: this.units,\n },\n };\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["symbolTracingContext", "Symbol", "getTracingContext", "target", "infoProperties", "metricsProperties", "TRACE_SPAN_ATTRIBUTE", "TraceSender", "constructor", "_traceProcessor", "streamTrace", "request", "Stream", "ctx", "next", "flushEvents", "resources", "spans", "logs", "event", "resourceAdded", "resourceRemoved", "spanAdded", "logAdded", "id", "entry", "get", "push", "resource", "data", "values", "span", "log", "length", "flush", "subscription", "dirtyResources", "dirtySpans", "newLogs", "clear", "Set", "subscriptions", "add", "onDispose", "delete", "ResourceEntry", "instance", "annotation", "sanitizedClassName", "sanitizeClassName", "className", "getMetric", "name", "metrics", "find", "metric", "MAX_RESOURCE_RECORDS", "MAX_SPAN_RECORDS", "MAX_LOG_RECORDS", "REFRESH_INTERVAL", "MAX_INFO_OBJECT_DEPTH", "TraceProcessor", "Map", "resourceInstanceIndex", "WeakMap", "resourceIdList", "spanIdList", "_logProcessor", "config", "level", "LogLevel", "ERROR", "WARN", "TRACE", "scope", "meta", "S", "context", "getContextFromEntry", "key", "Object", "keys", "sanitizeValue", "entryToPush", "message", "timestamp", "Date", "file", "F", "line", "L", "resourceId", "_pushLog", "addProcessor", "bind", "refreshInterval", "setInterval", "refresh", "unrefTimeout", "createTraceResource", "params", "size", "tracingContext", "getPrototypeOf", "_assign", "instanceId", "getPrototypeSpecificInstanceId", "info", "getResourceInfo", "links", "getResourceMetrics", "WeakRef", "set", "_clearResources", "_markResourceDirty", "createTraceSender", "traceSpan", "TracingSpan", "_flushSpan", "addLink", "parent", "child", "opts", "getDiagnostics", "fromEntries", "Array", "from", "entries", "map", "filter", "INFO", "res", "options", "value", "enum", "depth", "undefined", "err", "_opts", "getData", "getResourceId", "findResourcesByClassName", "findResourcesByAnnotation", "deref", "time", "performance", "now", "_tick", "_changed", "oldInfo", "areEqualShallow", "oldMetrics", "runtimeSpan", "serialize", "_clearSpans", "_markSpanDirty", "shift", "nextId", "parentId", "endTs", "error", "_ctx", "methodName", "startTs", "_showInBrowserTimeline", "showInBrowserTimeline", "parentCtx", "derive", "attributes", "getAttribute", "markSuccess", "_markInBrowserTimeline", "markError", "serializeError", "toFixed", "measure", "start", "end", "Error", "String", "TRACE_PROCESSOR", "globalThis", "traceProcessor", "resourceEntry", "toJSON", "isSetLike", "isMapLike", "isArray", "item", "truncate", "toString", "a", "b", "SANITIZE_REGEX", "m", "match", "slice", "klass", "rest", "defineProperty", "propertyKey", "descriptor", "mark", "method", "args", "Context", "callArgs", "apply", "metricsCounter", "trace", "BaseCounter", "_instance", "UnaryCounter", "units", "inc", "by", "counter", "MAX_BUCKETS", "TimeSeriesCounter", "_currentValue", "_totalValue", "_buckets", "timeSeries", "tracks", "points", "index", "total", "TimeUsageCounter", "_lastTickTime", "record", "beginRecording", "delta", "percentage", "MapCounter", "prev", "multiCounter", "records"]
|
|
7
7
|
}
|
package/dist/lib/node/meta.json
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"inputs":{"packages/common/tracing/src/symbols.ts":{"bytes":1811,"imports":[],"format":"esm"},"packages/common/tracing/src/trace-sender.ts":{"bytes":10386,"imports":[{"path":"@dxos/codec-protobuf","kind":"import-statement","external":true}],"format":"esm"},"packages/common/tracing/src/trace-processor.ts":{"bytes":
|
|
1
|
+
{"inputs":{"packages/common/tracing/src/symbols.ts":{"bytes":1811,"imports":[],"format":"esm"},"packages/common/tracing/src/trace-sender.ts":{"bytes":10386,"imports":[{"path":"@dxos/codec-protobuf","kind":"import-statement","external":true}],"format":"esm"},"packages/common/tracing/src/trace-processor.ts":{"bytes":51824,"imports":[{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true},{"path":"packages/common/tracing/src/symbols.ts","kind":"import-statement","original":"./symbols"},{"path":"packages/common/tracing/src/trace-sender.ts","kind":"import-statement","original":"./trace-sender"}],"format":"esm"},"packages/common/tracing/src/api.ts":{"bytes":9411,"imports":[{"path":"@dxos/context","kind":"import-statement","external":true},{"path":"packages/common/tracing/src/symbols.ts","kind":"import-statement","original":"./symbols"},{"path":"packages/common/tracing/src/trace-processor.ts","kind":"import-statement","original":"./trace-processor"}],"format":"esm"},"packages/common/tracing/src/metrics/base.ts":{"bytes":1450,"imports":[],"format":"esm"},"packages/common/tracing/src/metrics/unary-counter.ts":{"bytes":2128,"imports":[{"path":"packages/common/tracing/src/metrics/base.ts","kind":"import-statement","original":"./base"}],"format":"esm"},"packages/common/tracing/src/metrics/time-series-counter.ts":{"bytes":4268,"imports":[{"path":"packages/common/tracing/src/metrics/base.ts","kind":"import-statement","original":"./base"}],"format":"esm"},"packages/common/tracing/src/metrics/time-usage-counter.ts":{"bytes":5249,"imports":[{"path":"packages/common/tracing/src/metrics/base.ts","kind":"import-statement","original":"./base"}],"format":"esm"},"packages/common/tracing/src/metrics/map-counter.ts":{"bytes":2977,"imports":[{"path":"packages/common/tracing/src/metrics/base.ts","kind":"import-statement","original":"./base"}],"format":"esm"},"packages/common/tracing/src/metrics/index.ts":{"bytes":892,"imports":[{"path":"packages/common/tracing/src/metrics/base.ts","kind":"import-statement","original":"./base"},{"path":"packages/common/tracing/src/metrics/unary-counter.ts","kind":"import-statement","original":"./unary-counter"},{"path":"packages/common/tracing/src/metrics/time-series-counter.ts","kind":"import-statement","original":"./time-series-counter"},{"path":"packages/common/tracing/src/metrics/time-usage-counter.ts","kind":"import-statement","original":"./time-usage-counter"},{"path":"packages/common/tracing/src/metrics/map-counter.ts","kind":"import-statement","original":"./map-counter"}],"format":"esm"},"packages/common/tracing/src/index.ts":{"bytes":831,"imports":[{"path":"packages/common/tracing/src/api.ts","kind":"import-statement","original":"./api"},{"path":"packages/common/tracing/src/symbols.ts","kind":"import-statement","original":"./symbols"},{"path":"packages/common/tracing/src/trace-processor.ts","kind":"import-statement","original":"./trace-processor"},{"path":"packages/common/tracing/src/trace-sender.ts","kind":"import-statement","original":"./trace-sender"},{"path":"packages/common/tracing/src/metrics/index.ts","kind":"import-statement","original":"./metrics"}],"format":"esm"}},"outputs":{"packages/common/tracing/dist/lib/node/index.cjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":44718},"packages/common/tracing/dist/lib/node/index.cjs":{"imports":[{"path":"@dxos/context","kind":"import-statement","external":true},{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true},{"path":"@dxos/codec-protobuf","kind":"import-statement","external":true}],"exports":["BaseCounter","MapCounter","ResourceEntry","TRACE_PROCESSOR","TRACE_SPAN_ATTRIBUTE","TimeSeriesCounter","TimeUsageCounter","TraceProcessor","TraceSender","TracingSpan","UnaryCounter","getTracingContext","sanitizeClassName","symbolTracingContext","trace"],"entryPoint":"packages/common/tracing/src/index.ts","inputs":{"packages/common/tracing/src/api.ts":{"bytesInOutput":1631},"packages/common/tracing/src/symbols.ts":{"bytesInOutput":245},"packages/common/tracing/src/trace-processor.ts":{"bytesInOutput":11951},"packages/common/tracing/src/trace-sender.ts":{"bytesInOutput":2555},"packages/common/tracing/src/index.ts":{"bytesInOutput":0},"packages/common/tracing/src/metrics/base.ts":{"bytesInOutput":159},"packages/common/tracing/src/metrics/index.ts":{"bytesInOutput":0},"packages/common/tracing/src/metrics/unary-counter.ts":{"bytesInOutput":324},"packages/common/tracing/src/metrics/time-series-counter.ts":{"bytesInOutput":812},"packages/common/tracing/src/metrics/time-usage-counter.ts":{"bytesInOutput":1136},"packages/common/tracing/src/metrics/map-counter.ts":{"bytesInOutput":509}},"bytes":20192}}}
|
|
@@ -4,6 +4,11 @@ import { type Error as SerializedError } from '@dxos/protocols/proto/dxos/error'
|
|
|
4
4
|
import { type Metric, type Resource, type Span } from '@dxos/protocols/proto/dxos/tracing';
|
|
5
5
|
import type { AddLinkOptions } from './api';
|
|
6
6
|
import { TraceSender } from './trace-sender';
|
|
7
|
+
export type Diagnostics = {
|
|
8
|
+
resources: Record<string, Resource>;
|
|
9
|
+
spans: Span[];
|
|
10
|
+
logs: LogEntry[];
|
|
11
|
+
};
|
|
7
12
|
export type TraceResourceConstructorParams = {
|
|
8
13
|
constructor: {
|
|
9
14
|
new (...args: any[]): {};
|
|
@@ -37,31 +42,24 @@ export type TraceSubscription = {
|
|
|
37
42
|
newLogs: LogEntry[];
|
|
38
43
|
};
|
|
39
44
|
export declare class TraceProcessor {
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
45
|
+
readonly subscriptions: Set<TraceSubscription>;
|
|
46
|
+
readonly resources: Map<number, ResourceEntry>;
|
|
47
|
+
readonly resourceInstanceIndex: WeakMap<any, ResourceEntry>;
|
|
48
|
+
readonly resourceIdList: number[];
|
|
49
|
+
readonly spans: Map<number, Span>;
|
|
50
|
+
readonly spanIdList: number[];
|
|
51
|
+
readonly logs: LogEntry[];
|
|
47
52
|
constructor();
|
|
48
|
-
|
|
49
|
-
getResourceInfo(instance: any): Record<string, any>;
|
|
50
|
-
getResourceMetrics(instance: any): Metric[];
|
|
53
|
+
createTraceSender(): TraceSender;
|
|
51
54
|
traceSpan(params: TraceSpanParams): TracingSpan;
|
|
52
55
|
addLink(parent: any, child: any, opts: AddLinkOptions): void;
|
|
56
|
+
getDiagnostics(): Diagnostics;
|
|
57
|
+
getResourceInfo(instance: any): Record<string, any>;
|
|
58
|
+
getResourceMetrics(instance: any): Metric[];
|
|
53
59
|
getResourceId(instance: any): number | null;
|
|
54
|
-
createTraceSender(): TraceSender;
|
|
55
|
-
refresh(): void;
|
|
56
60
|
findResourcesByClassName(className: string): ResourceEntry[];
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
resources: {
|
|
60
|
-
[k: string]: Resource;
|
|
61
|
-
};
|
|
62
|
-
spans: Span[];
|
|
63
|
-
logs: LogEntry[];
|
|
64
|
-
};
|
|
61
|
+
findResourcesByAnnotation(annotation: symbol): ResourceEntry[];
|
|
62
|
+
refresh(): void;
|
|
65
63
|
private _markResourceDirty;
|
|
66
64
|
private _markSpanDirty;
|
|
67
65
|
private _clearResources;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"trace-processor.d.ts","sourceRoot":"","sources":["../../../src/trace-processor.ts"],"names":[],"mappings":"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;IACd,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,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;aASN,IAAI,EAAE,QAAQ;aACd,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC;aACtB,UAAU,CAAC;IAV7B;;;;OAIG;IACH,SAAgB,kBAAkB,EAAE,MAAM,CAAC;gBAGzB,IAAI,EAAE,QAAQ,EACd,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,EACtB,UAAU,CAAC,oBAAQ;IAKrC,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;AAUF,qBAAa,cAAc;IACzB,SAAS,6BAAoC;
|
|
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,WAAW,GAAG;IACxB,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IACpC,KAAK,EAAE,IAAI,EAAE,CAAC;IACd,IAAI,EAAE,QAAQ,EAAE,CAAC;CAClB,CAAC;AAEF,MAAM,MAAM,8BAA8B,GAAG;IAC3C,WAAW,EAAE;QAAE,KAAK,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,CAAA;KAAE,CAAC;IAC1C,QAAQ,EAAE,GAAG,CAAC;IACd,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,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;aASN,IAAI,EAAE,QAAQ;aACd,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC;aACtB,UAAU,CAAC;IAV7B;;;;OAIG;IACH,SAAgB,kBAAkB,EAAE,MAAM,CAAC;gBAGzB,IAAI,EAAE,QAAQ,EACd,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,EACtB,UAAU,CAAC,oBAAQ;IAKrC,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;AAUF,qBAAa,cAAc;IACzB,QAAQ,CAAC,aAAa,EAAE,GAAG,CAAC,iBAAiB,CAAC,CAAa;IAE3D,QAAQ,CAAC,SAAS,6BAAoC;IACtD,QAAQ,CAAC,qBAAqB,8BAAqC;IACnE,QAAQ,CAAC,cAAc,EAAE,MAAM,EAAE,CAAM;IAEvC,QAAQ,CAAC,KAAK,oBAA2B;IACzC,QAAQ,CAAC,UAAU,EAAE,MAAM,EAAE,CAAM;IAEnC,QAAQ,CAAC,IAAI,EAAE,QAAQ,EAAE,CAAM;;IA6C/B,iBAAiB;IAIjB,SAAS,CAAC,MAAM,EAAE,eAAe,GAAG,WAAW;IAO/C,OAAO,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,cAAc;IAQrD,cAAc,IAAI,WAAW;IAe7B,eAAe,CAAC,QAAQ,EAAE,GAAG,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;IAuBnD,kBAAkB,CAAC,QAAQ,EAAE,GAAG,GAAG,MAAM,EAAE;IAU3C,aAAa,CAAC,QAAQ,EAAE,GAAG,GAAG,MAAM,GAAG,IAAI;IAK3C,wBAAwB,CAAC,SAAS,EAAE,MAAM,GAAG,aAAa,EAAE;IAM5D,yBAAyB,CAAC,UAAU,EAAE,MAAM,GAAG,aAAa,EAAE;IAI9D,OAAO;IAmDP,OAAO,CAAC,kBAAkB;IAM1B,OAAO,CAAC,cAAc;IAMtB,OAAO,CAAC,eAAe;IAQvB,OAAO,CAAC,WAAW;IAOnB,OAAO,CAAC,QAAQ;IAWhB,OAAO,CAAC,aAAa,CAgCnB;CACH;AAGD,qBAAa,WAAW;IAepB,OAAO,CAAC,eAAe;IAdzB,MAAM,CAAC,MAAM,SAAK;IAElB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAQ;IACxC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAQ;IAC1C,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAQ;IAC5B,KAAK,EAAE,eAAe,GAAG,IAAI,CAAQ;IAErC,OAAO,CAAC,sBAAsB,CAAU;IACxC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAwB;gBAGnC,eAAe,EAAE,cAAc,EACvC,MAAM,EAAE,eAAe;IAqBzB,IAAI,GAAG,IAAI,OAAO,GAAG,IAAI,CAExB;IAED,WAAW;IASX,SAAS,CAAC,GAAG,EAAE,OAAO;IAUtB,SAAS,IAAI,IAAI;IAYjB,OAAO,CAAC,sBAAsB;CAO/B;AAiBD,eAAO,MAAM,eAAe,EAAE,cAA+E,CAAC;AAsE9G,eAAO,MAAM,iBAAiB,cAAe,MAAM,WAQlD,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@dxos/tracing",
|
|
3
|
-
"version": "0.5.
|
|
3
|
+
"version": "0.5.1-main.0ec204c",
|
|
4
4
|
"description": "Async utilities.",
|
|
5
5
|
"homepage": "https://dxos.org",
|
|
6
6
|
"bugs": "https://github.com/dxos/dxos/issues",
|
|
@@ -16,18 +16,18 @@
|
|
|
16
16
|
"src"
|
|
17
17
|
],
|
|
18
18
|
"dependencies": {
|
|
19
|
-
"@dxos/async": "0.5.
|
|
20
|
-
"@dxos/
|
|
21
|
-
"@dxos/
|
|
22
|
-
"@dxos/debug": "0.5.
|
|
23
|
-
"@dxos/invariant": "0.5.
|
|
24
|
-
"@dxos/log": "0.5.
|
|
25
|
-
"@dxos/node-std": "0.5.
|
|
26
|
-
"@dxos/protocols": "0.5.
|
|
27
|
-
"@dxos/util": "0.5.
|
|
19
|
+
"@dxos/async": "0.5.1-main.0ec204c",
|
|
20
|
+
"@dxos/codec-protobuf": "0.5.1-main.0ec204c",
|
|
21
|
+
"@dxos/context": "0.5.1-main.0ec204c",
|
|
22
|
+
"@dxos/debug": "0.5.1-main.0ec204c",
|
|
23
|
+
"@dxos/invariant": "0.5.1-main.0ec204c",
|
|
24
|
+
"@dxos/log": "0.5.1-main.0ec204c",
|
|
25
|
+
"@dxos/node-std": "0.5.1-main.0ec204c",
|
|
26
|
+
"@dxos/protocols": "0.5.1-main.0ec204c",
|
|
27
|
+
"@dxos/util": "0.5.1-main.0ec204c"
|
|
28
28
|
},
|
|
29
29
|
"devDependencies": {
|
|
30
|
-
"@dxos/test": "0.5.
|
|
30
|
+
"@dxos/test": "0.5.1-main.0ec204c"
|
|
31
31
|
},
|
|
32
32
|
"publishConfig": {
|
|
33
33
|
"access": "public"
|
package/src/api.ts
CHANGED
|
@@ -18,7 +18,7 @@ const resource =
|
|
|
18
18
|
class extends constructor {
|
|
19
19
|
constructor(...rest: any[]) {
|
|
20
20
|
super(...rest);
|
|
21
|
-
TRACE_PROCESSOR.
|
|
21
|
+
TRACE_PROCESSOR.createTraceResource({ constructor, annotation: options?.annotation, instance: this });
|
|
22
22
|
}
|
|
23
23
|
})();
|
|
24
24
|
Object.defineProperty(klass, 'name', { value: constructor.name });
|
package/src/trace-processor.ts
CHANGED
|
@@ -15,6 +15,12 @@ import { type BaseCounter } from './metrics';
|
|
|
15
15
|
import { TRACE_SPAN_ATTRIBUTE, getTracingContext } from './symbols';
|
|
16
16
|
import { TraceSender } from './trace-sender';
|
|
17
17
|
|
|
18
|
+
export type Diagnostics = {
|
|
19
|
+
resources: Record<string, Resource>;
|
|
20
|
+
spans: Span[];
|
|
21
|
+
logs: LogEntry[];
|
|
22
|
+
};
|
|
23
|
+
|
|
18
24
|
export type TraceResourceConstructorParams = {
|
|
19
25
|
constructor: { new (...args: any[]): {} };
|
|
20
26
|
instance: any;
|
|
@@ -66,16 +72,16 @@ const REFRESH_INTERVAL = 1_000;
|
|
|
66
72
|
const MAX_INFO_OBJECT_DEPTH = 8;
|
|
67
73
|
|
|
68
74
|
export class TraceProcessor {
|
|
69
|
-
|
|
70
|
-
resourceInstanceIndex = new WeakMap<any, ResourceEntry>();
|
|
71
|
-
resourceIdList: number[] = [];
|
|
75
|
+
readonly subscriptions: Set<TraceSubscription> = new Set();
|
|
72
76
|
|
|
73
|
-
|
|
74
|
-
|
|
77
|
+
readonly resources = new Map<number, ResourceEntry>();
|
|
78
|
+
readonly resourceInstanceIndex = new WeakMap<any, ResourceEntry>();
|
|
79
|
+
readonly resourceIdList: number[] = [];
|
|
75
80
|
|
|
76
|
-
|
|
81
|
+
readonly spans = new Map<number, Span>();
|
|
82
|
+
readonly spanIdList: number[] = [];
|
|
77
83
|
|
|
78
|
-
|
|
84
|
+
readonly logs: LogEntry[] = [];
|
|
79
85
|
|
|
80
86
|
constructor() {
|
|
81
87
|
log.addProcessor(this._logProcessor.bind(this));
|
|
@@ -84,10 +90,14 @@ export class TraceProcessor {
|
|
|
84
90
|
unrefTimeout(refreshInterval);
|
|
85
91
|
}
|
|
86
92
|
|
|
87
|
-
|
|
93
|
+
/**
|
|
94
|
+
* @internal
|
|
95
|
+
*/
|
|
96
|
+
// TODO(burdon): Comment.
|
|
97
|
+
createTraceResource(params: TraceResourceConstructorParams) {
|
|
88
98
|
const id = this.resources.size;
|
|
89
99
|
|
|
90
|
-
//
|
|
100
|
+
// Init metrics counters.
|
|
91
101
|
const tracingContext = getTracingContext(Object.getPrototypeOf(params.instance));
|
|
92
102
|
for (const key of Object.keys(tracingContext.metricsProperties)) {
|
|
93
103
|
(params.instance[key] as BaseCounter)._assign(params.instance, key);
|
|
@@ -112,17 +122,50 @@ export class TraceProcessor {
|
|
|
112
122
|
if (this.resourceIdList.length > MAX_RESOURCE_RECORDS) {
|
|
113
123
|
this._clearResources();
|
|
114
124
|
}
|
|
125
|
+
|
|
115
126
|
this._markResourceDirty(id);
|
|
116
127
|
}
|
|
117
128
|
|
|
129
|
+
createTraceSender() {
|
|
130
|
+
return new TraceSender(this);
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
traceSpan(params: TraceSpanParams): TracingSpan {
|
|
134
|
+
const span = new TracingSpan(this, params);
|
|
135
|
+
this._flushSpan(span);
|
|
136
|
+
return span;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
// TODO(burdon): Not implemented.
|
|
140
|
+
addLink(parent: any, child: any, opts: AddLinkOptions) {}
|
|
141
|
+
|
|
142
|
+
//
|
|
143
|
+
// Getters
|
|
144
|
+
//
|
|
145
|
+
|
|
146
|
+
// TODO(burdon): Define type.
|
|
147
|
+
// TODO(burdon): Reconcile with system service.
|
|
148
|
+
getDiagnostics(): Diagnostics {
|
|
149
|
+
this.refresh();
|
|
150
|
+
|
|
151
|
+
return {
|
|
152
|
+
resources: Object.fromEntries(
|
|
153
|
+
Array.from(this.resources.entries()).map(([id, entry]) => [
|
|
154
|
+
`${entry.sanitizedClassName}#${entry.data.instanceId}`,
|
|
155
|
+
entry.data,
|
|
156
|
+
]),
|
|
157
|
+
),
|
|
158
|
+
spans: Array.from(this.spans.values()),
|
|
159
|
+
logs: this.logs.filter((log) => log.level >= LogLevel.INFO),
|
|
160
|
+
};
|
|
161
|
+
}
|
|
162
|
+
|
|
118
163
|
getResourceInfo(instance: any): Record<string, any> {
|
|
119
164
|
const res: Record<string, any> = {};
|
|
120
165
|
const tracingContext = getTracingContext(Object.getPrototypeOf(instance));
|
|
121
|
-
|
|
122
166
|
for (const [key, { options }] of Object.entries(tracingContext.infoProperties)) {
|
|
123
167
|
try {
|
|
124
168
|
const value = typeof instance[key] === 'function' ? instance[key]() : instance[key];
|
|
125
|
-
|
|
126
169
|
if (options.enum) {
|
|
127
170
|
res[key] = options.enum[value];
|
|
128
171
|
} else {
|
|
@@ -143,7 +186,6 @@ export class TraceProcessor {
|
|
|
143
186
|
getResourceMetrics(instance: any): Metric[] {
|
|
144
187
|
const res: Metric[] = [];
|
|
145
188
|
const tracingContext = getTracingContext(Object.getPrototypeOf(instance));
|
|
146
|
-
|
|
147
189
|
for (const [key, _opts] of Object.entries(tracingContext.metricsProperties)) {
|
|
148
190
|
res.push(instance[key].getData());
|
|
149
191
|
}
|
|
@@ -151,21 +193,19 @@ export class TraceProcessor {
|
|
|
151
193
|
return res;
|
|
152
194
|
}
|
|
153
195
|
|
|
154
|
-
traceSpan(params: TraceSpanParams): TracingSpan {
|
|
155
|
-
const span = new TracingSpan(this, params);
|
|
156
|
-
this._flushSpan(span);
|
|
157
|
-
return span;
|
|
158
|
-
}
|
|
159
|
-
|
|
160
|
-
addLink(parent: any, child: any, opts: AddLinkOptions) {}
|
|
161
|
-
|
|
162
196
|
getResourceId(instance: any): number | null {
|
|
163
197
|
const entry = this.resourceInstanceIndex.get(instance);
|
|
164
198
|
return entry ? entry.data.id : null;
|
|
165
199
|
}
|
|
166
200
|
|
|
167
|
-
|
|
168
|
-
return
|
|
201
|
+
findResourcesByClassName(className: string): ResourceEntry[] {
|
|
202
|
+
return [...this.resources.values()].filter(
|
|
203
|
+
(res) => res.data.className === className || res.sanitizedClassName === className,
|
|
204
|
+
);
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
findResourcesByAnnotation(annotation: symbol): ResourceEntry[] {
|
|
208
|
+
return [...this.resources.values()].filter((res) => res.annotation === annotation);
|
|
169
209
|
}
|
|
170
210
|
|
|
171
211
|
refresh() {
|
|
@@ -202,30 +242,9 @@ export class TraceProcessor {
|
|
|
202
242
|
}
|
|
203
243
|
}
|
|
204
244
|
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
);
|
|
209
|
-
}
|
|
210
|
-
|
|
211
|
-
findByAnnotation(annotation: symbol): ResourceEntry[] {
|
|
212
|
-
return [...this.resources.values()].filter((r) => r.annotation === annotation);
|
|
213
|
-
}
|
|
214
|
-
|
|
215
|
-
getDiagnostics() {
|
|
216
|
-
this.refresh();
|
|
217
|
-
|
|
218
|
-
return {
|
|
219
|
-
resources: Object.fromEntries(
|
|
220
|
-
Array.from(this.resources.entries()).map(([id, entry]) => [
|
|
221
|
-
`${entry.sanitizedClassName}#${entry.data.instanceId}`,
|
|
222
|
-
entry.data,
|
|
223
|
-
]),
|
|
224
|
-
),
|
|
225
|
-
spans: Array.from(this.spans.values()),
|
|
226
|
-
logs: this.logs.filter((log) => log.level >= LogLevel.INFO),
|
|
227
|
-
};
|
|
228
|
-
}
|
|
245
|
+
//
|
|
246
|
+
// Implementation
|
|
247
|
+
//
|
|
229
248
|
|
|
230
249
|
/**
|
|
231
250
|
* @internal
|
|
@@ -290,7 +309,6 @@ export class TraceProcessor {
|
|
|
290
309
|
}
|
|
291
310
|
|
|
292
311
|
const context = getContextFromEntry(entry) ?? {};
|
|
293
|
-
|
|
294
312
|
for (const key of Object.keys(context)) {
|
|
295
313
|
context[key] = sanitizeValue(context[key], 0, this);
|
|
296
314
|
}
|
|
@@ -314,6 +332,7 @@ export class TraceProcessor {
|
|
|
314
332
|
};
|
|
315
333
|
}
|
|
316
334
|
|
|
335
|
+
// TODO(burdon): Comment.
|
|
317
336
|
export class TracingSpan {
|
|
318
337
|
static nextId = 0;
|
|
319
338
|
|
|
@@ -395,6 +414,7 @@ export class TracingSpan {
|
|
|
395
414
|
}
|
|
396
415
|
}
|
|
397
416
|
|
|
417
|
+
// TODO(burdon): Log cause.
|
|
398
418
|
const serializeError = (err: unknown): SerializedError => {
|
|
399
419
|
if (err instanceof Error) {
|
|
400
420
|
return {
|
|
@@ -408,6 +428,7 @@ const serializeError = (err: unknown): SerializedError => {
|
|
|
408
428
|
};
|
|
409
429
|
};
|
|
410
430
|
|
|
431
|
+
// TODO(burdon): Rename singleton and move out of package.
|
|
411
432
|
export const TRACE_PROCESSOR: TraceProcessor = ((globalThis as any).TRACE_PROCESSOR ??= new TraceProcessor());
|
|
412
433
|
|
|
413
434
|
const sanitizeValue = (value: any, depth: number, traceProcessor: TraceProcessor): any => {
|
|
@@ -417,7 +438,6 @@ const sanitizeValue = (value: any, depth: number, traceProcessor: TraceProcessor
|
|
|
417
438
|
case 'boolean':
|
|
418
439
|
case 'undefined':
|
|
419
440
|
return value;
|
|
420
|
-
break;
|
|
421
441
|
case 'object':
|
|
422
442
|
case 'function':
|
|
423
443
|
if (value === null) {
|
package/src/tracing.test.ts
CHANGED
|
@@ -68,6 +68,6 @@ describe('tracing', () => {
|
|
|
68
68
|
|
|
69
69
|
test('findByAnnotation', async () => {
|
|
70
70
|
const store = new FeedStore();
|
|
71
|
-
expect(TRACE_PROCESSOR.
|
|
71
|
+
expect(TRACE_PROCESSOR.findResourcesByAnnotation(FeedStoreResource)[0].instance.deref()).to.eq(store);
|
|
72
72
|
});
|
|
73
73
|
});
|