@dxos/tracing 0.1.56-main.d9d1c3e

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.
@@ -0,0 +1,342 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // packages/common/tracing/src/index.ts
21
+ var src_exports = {};
22
+ __export(src_exports, {
23
+ TRACE_PROCESSOR: () => TRACE_PROCESSOR,
24
+ TRACE_SPAN_ATTRIBUTE: () => TRACE_SPAN_ATTRIBUTE,
25
+ TraceProcessor: () => TraceProcessor,
26
+ TraceSender: () => TraceSender,
27
+ TracingSpan: () => TracingSpan,
28
+ getTracingContext: () => getTracingContext,
29
+ symbolTracingContext: () => symbolTracingContext,
30
+ trace: () => trace
31
+ });
32
+ module.exports = __toCommonJS(src_exports);
33
+
34
+ // packages/common/tracing/src/api.ts
35
+ var import_context = require("@dxos/context");
36
+
37
+ // packages/common/tracing/src/symbols.ts
38
+ var symbolTracingContext = Symbol("dxos.tracing-context");
39
+ var getTracingContext = (target) => {
40
+ var _a2;
41
+ return (_a2 = target[symbolTracingContext]) != null ? _a2 : target[symbolTracingContext] = {
42
+ infoProperties: {}
43
+ };
44
+ };
45
+ var TRACE_SPAN_ATTRIBUTE = "dxos.trace-span";
46
+
47
+ // packages/common/tracing/src/trace-processor.ts
48
+ var import_util = require("@dxos/util");
49
+
50
+ // packages/common/tracing/src/trace-sender.ts
51
+ var import_codec_protobuf = require("@dxos/codec-protobuf");
52
+ var FLUSH_INTERVAL = 1e3;
53
+ var TraceSender = class {
54
+ constructor(_traceProcessor) {
55
+ this._traceProcessor = _traceProcessor;
56
+ }
57
+ streamTrace(request) {
58
+ return new import_codec_protobuf.Stream(({ ctx, next }) => {
59
+ const subscription = {
60
+ dirtyResources: /* @__PURE__ */ new Set(),
61
+ dirtySpans: /* @__PURE__ */ new Set()
62
+ };
63
+ this._traceProcessor.subscriptions.add(subscription);
64
+ ctx.onDispose(() => {
65
+ this._traceProcessor.subscriptions.delete(subscription);
66
+ });
67
+ const flushEvents = (resources, spans) => {
68
+ const event = {
69
+ resourceAdded: [],
70
+ resourceRemoved: [],
71
+ spanAdded: []
72
+ };
73
+ if (resources) {
74
+ for (const id of resources) {
75
+ const entry = this._traceProcessor.resources.get(id);
76
+ if (entry) {
77
+ event.resourceAdded.push({
78
+ resource: entry.data
79
+ });
80
+ } else {
81
+ event.resourceRemoved.push({
82
+ id
83
+ });
84
+ }
85
+ }
86
+ } else {
87
+ for (const entry of this._traceProcessor.resources.values()) {
88
+ event.resourceAdded.push({
89
+ resource: entry.data
90
+ });
91
+ }
92
+ }
93
+ if (spans) {
94
+ for (const id of spans) {
95
+ const span2 = this._traceProcessor.spans.get(id);
96
+ if (span2) {
97
+ event.spanAdded.push({
98
+ span: span2
99
+ });
100
+ }
101
+ }
102
+ } else {
103
+ for (const span2 of this._traceProcessor.spans.values()) {
104
+ event.spanAdded.push({
105
+ span: span2
106
+ });
107
+ }
108
+ }
109
+ if (event.resourceAdded.length > 0 || event.resourceRemoved.length > 0 || event.spanAdded.length > 0) {
110
+ next(event);
111
+ }
112
+ };
113
+ flushEvents(null, null);
114
+ const timer = setInterval(() => {
115
+ flushEvents(subscription.dirtyResources, subscription.dirtySpans);
116
+ subscription.dirtyResources.clear();
117
+ subscription.dirtySpans.clear();
118
+ }, FLUSH_INTERVAL);
119
+ ctx.onDispose(() => {
120
+ clearInterval(timer);
121
+ });
122
+ });
123
+ }
124
+ };
125
+
126
+ // packages/common/tracing/src/trace-processor.ts
127
+ var MAX_RESOURCE_RECORDS = 500;
128
+ var MAX_SPAN_RECORDS = 1e3;
129
+ var TraceProcessor = class {
130
+ constructor() {
131
+ this.resources = /* @__PURE__ */ new Map();
132
+ this.resourceInstanceIndex = /* @__PURE__ */ new WeakMap();
133
+ this.resourceIdList = [];
134
+ this.spans = /* @__PURE__ */ new Map();
135
+ this.spanIdList = [];
136
+ this.subscriptions = /* @__PURE__ */ new Set();
137
+ }
138
+ traceResourceConstructor(params) {
139
+ const id = this.resources.size;
140
+ const entry = {
141
+ data: {
142
+ id,
143
+ className: params.constructor.name,
144
+ instanceId: (0, import_util.getPrototypeSpecificInstanceId)(params.instance),
145
+ info: this.getResourceInfo(params.instance),
146
+ links: []
147
+ },
148
+ instance: new WeakRef(params.instance)
149
+ };
150
+ this.resources.set(id, entry);
151
+ this.resourceInstanceIndex.set(params.instance, entry);
152
+ this.resourceIdList.push(id);
153
+ if (this.resourceIdList.length > MAX_RESOURCE_RECORDS) {
154
+ this._clearResources();
155
+ }
156
+ this._markResourceDirty(id);
157
+ }
158
+ getResourceInfo(instance) {
159
+ const res = {};
160
+ const tracingContext = getTracingContext(Object.getPrototypeOf(instance));
161
+ for (const [key, _opts] of Object.entries(tracingContext.infoProperties)) {
162
+ try {
163
+ res[key] = typeof instance[key] === "function" ? instance[key]() : instance[key];
164
+ } catch (err) {
165
+ res[key] = err.message;
166
+ }
167
+ }
168
+ return res;
169
+ }
170
+ traceSpan(params) {
171
+ const span2 = new TracingSpan(this, params);
172
+ this._flushSpan(span2);
173
+ return span2;
174
+ }
175
+ addLink(parent, child, opts) {
176
+ }
177
+ getResourceId(instance) {
178
+ const entry = this.resourceInstanceIndex.get(instance);
179
+ return entry ? entry.data.id : null;
180
+ }
181
+ createTraceSender() {
182
+ return new TraceSender(this);
183
+ }
184
+ /**
185
+ * @internal
186
+ */
187
+ _flushSpan(runtimeSpan) {
188
+ const span2 = runtimeSpan.serialize();
189
+ this.spans.set(span2.id, span2);
190
+ this.spanIdList.push(span2.id);
191
+ if (this.spanIdList.length > MAX_SPAN_RECORDS) {
192
+ this._clearSpans();
193
+ }
194
+ this._markSpanDirty(span2.id);
195
+ }
196
+ _markResourceDirty(id) {
197
+ for (const subscription of this.subscriptions) {
198
+ subscription.dirtyResources.add(id);
199
+ }
200
+ }
201
+ _markSpanDirty(id) {
202
+ for (const subscription of this.subscriptions) {
203
+ subscription.dirtySpans.add(id);
204
+ }
205
+ }
206
+ _clearResources() {
207
+ while (this.resourceIdList.length > MAX_RESOURCE_RECORDS) {
208
+ const id = this.resourceIdList.shift();
209
+ this.resources.delete(id);
210
+ }
211
+ }
212
+ _clearSpans() {
213
+ while (this.spanIdList.length > MAX_SPAN_RECORDS) {
214
+ const id = this.spanIdList.shift();
215
+ this.spans.delete(id);
216
+ }
217
+ }
218
+ };
219
+ var _TracingSpan = class {
220
+ constructor(_traceProcessor, params) {
221
+ this._traceProcessor = _traceProcessor;
222
+ this.parentId = null;
223
+ this.resourceId = null;
224
+ this.endTs = null;
225
+ this.error = null;
226
+ this._ctx = null;
227
+ this.id = _TracingSpan.nextId++;
228
+ this.methodName = params.methodName;
229
+ this.resourceId = _traceProcessor.getResourceId(params.instance);
230
+ this.startTs = performance.now();
231
+ if (params.parentCtx) {
232
+ this._ctx = params.parentCtx.derive({
233
+ attributes: {
234
+ [TRACE_SPAN_ATTRIBUTE]: this.id
235
+ }
236
+ });
237
+ const parentId = params.parentCtx.getAttribute(TRACE_SPAN_ATTRIBUTE);
238
+ if (typeof parentId === "number") {
239
+ this.parentId = parentId;
240
+ }
241
+ }
242
+ }
243
+ get ctx() {
244
+ return this._ctx;
245
+ }
246
+ markSuccess() {
247
+ this.endTs = performance.now();
248
+ this._traceProcessor._flushSpan(this);
249
+ }
250
+ markError(err) {
251
+ this.endTs = performance.now();
252
+ this.error = serializeError(err);
253
+ this._traceProcessor._flushSpan(this);
254
+ }
255
+ serialize() {
256
+ var _a2, _b, _c, _d, _e;
257
+ return {
258
+ id: this.id,
259
+ resourceId: (_a2 = this.resourceId) != null ? _a2 : void 0,
260
+ methodName: this.methodName,
261
+ parentId: (_b = this.parentId) != null ? _b : void 0,
262
+ startTs: this.startTs.toFixed(3),
263
+ endTs: (_d = (_c = this.endTs) == null ? void 0 : _c.toFixed(3)) != null ? _d : void 0,
264
+ error: (_e = this.error) != null ? _e : void 0
265
+ };
266
+ }
267
+ };
268
+ var TracingSpan = _TracingSpan;
269
+ TracingSpan.nextId = 0;
270
+ var serializeError = (err) => {
271
+ if (err instanceof Error) {
272
+ return {
273
+ name: err.name,
274
+ message: err.message
275
+ };
276
+ }
277
+ return {
278
+ message: String(err)
279
+ };
280
+ };
281
+ var _a;
282
+ var TRACE_PROCESSOR = (_a = globalThis.TRACE_PROCESSOR) != null ? _a : globalThis.TRACE_PROCESSOR = new TraceProcessor();
283
+
284
+ // packages/common/tracing/src/api.ts
285
+ var resource = () => (constructor) => {
286
+ return class extends constructor {
287
+ constructor(...rest) {
288
+ super(...rest);
289
+ TRACE_PROCESSOR.traceResourceConstructor({
290
+ constructor,
291
+ instance: this
292
+ });
293
+ }
294
+ };
295
+ };
296
+ var info = () => (target, propertyKey, descriptor) => {
297
+ getTracingContext(target).infoProperties[propertyKey] = {};
298
+ };
299
+ var span = () => (target, propertyKey, descriptor) => {
300
+ const method = descriptor.value;
301
+ descriptor.value = async function(...args) {
302
+ const parentCtx = args[0] instanceof import_context.Context ? args[0] : null;
303
+ const span2 = TRACE_PROCESSOR.traceSpan({
304
+ parentCtx,
305
+ methodName: propertyKey,
306
+ instance: this
307
+ });
308
+ const callArgs = span2.ctx ? [
309
+ span2.ctx,
310
+ ...args.slice(1)
311
+ ] : args;
312
+ try {
313
+ return await method.apply(this, callArgs);
314
+ } catch (err) {
315
+ span2.markError(err);
316
+ throw err;
317
+ } finally {
318
+ span2.markSuccess();
319
+ }
320
+ };
321
+ };
322
+ var addLink = (parent, child, opts = {}) => {
323
+ TRACE_PROCESSOR.addLink(parent, child, opts);
324
+ };
325
+ var trace = {
326
+ resource,
327
+ info,
328
+ span,
329
+ addLink
330
+ };
331
+ // Annotate the CommonJS export names for ESM import in node:
332
+ 0 && (module.exports = {
333
+ TRACE_PROCESSOR,
334
+ TRACE_SPAN_ATTRIBUTE,
335
+ TraceProcessor,
336
+ TraceSender,
337
+ TracingSpan,
338
+ getTracingContext,
339
+ symbolTracingContext,
340
+ trace
341
+ });
342
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/index.ts", "../../../src/api.ts", "../../../src/symbols.ts", "../../../src/trace-processor.ts", "../../../src/trace-sender.ts"],
4
+ "sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nexport * from './api';\nexport * from './symbols';\nexport * from './trace-processor';\nexport * from './trace-sender';\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { Context } from '@dxos/context';\n\nimport { getTracingContext } from './symbols';\nimport { TRACE_PROCESSOR } from './trace-processor';\n\nconst resource =\n () =>\n <T extends { new (...args: any[]): {} }>(constructor: T) => {\n return class extends constructor {\n constructor(...rest: any[]) {\n super(...rest);\n TRACE_PROCESSOR.traceResourceConstructor({ constructor, instance: this });\n }\n };\n };\n\nconst info = () => (target: any, propertyKey: string, descriptor?: PropertyDescriptor) => {\n getTracingContext(target).infoProperties[propertyKey] = {};\n};\n\nconst span = () => (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({ parentCtx, methodName: propertyKey, instance: this });\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\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 span,\n\n addLink,\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nexport const symbolTracingContext = Symbol('dxos.tracing-context');\n\nexport type TracingContext = {\n infoProperties: Record<string, {}>;\n};\n\nexport const getTracingContext = (target: any): TracingContext => {\n return (target[symbolTracingContext] ??= {\n infoProperties: {},\n });\n};\n\nexport const TRACE_SPAN_ATTRIBUTE = 'dxos.trace-span';\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { Context } from '@dxos/context';\nimport { Error as SerializedError } from '@dxos/protocols/proto/dxos/error';\nimport { Resource, Span } from '@dxos/protocols/proto/dxos/tracing';\nimport { getPrototypeSpecificInstanceId } from '@dxos/util';\n\nimport type { AddLinkOptions } from './api';\nimport { TRACE_SPAN_ATTRIBUTE, getTracingContext } from './symbols';\nimport { TraceSender } from './trace-sender';\n\nexport type TraceResourceConstructorParams = {\n constructor: { new (...args: any[]): {} };\n instance: any;\n};\n\nexport type TraceSpanParams = {\n instance: any;\n methodName: string;\n parentCtx: Context | null;\n};\n\nexport type ResourceEntry = {\n data: Resource;\n instance: WeakRef<any>;\n};\n\nexport type TraceSubscription = {\n dirtyResources: Set<number>;\n dirtySpans: Set<number>;\n};\n\nconst MAX_RESOURCE_RECORDS = 500;\nconst MAX_SPAN_RECORDS = 1_000;\n\nexport class TraceProcessor {\n resources = new Map<number, ResourceEntry>();\n resourceInstanceIndex = new WeakMap<any, ResourceEntry>();\n resourceIdList: number[] = [];\n\n spans = new Map<number, Span>();\n spanIdList: number[] = [];\n\n subscriptions: Set<TraceSubscription> = new Set();\n\n traceResourceConstructor(params: TraceResourceConstructorParams) {\n const id = this.resources.size;\n const entry: ResourceEntry = {\n data: {\n id,\n className: params.constructor.name,\n instanceId: getPrototypeSpecificInstanceId(params.instance),\n info: this.getResourceInfo(params.instance),\n links: [],\n },\n instance: new WeakRef(params.instance),\n };\n this.resources.set(id, entry);\n this.resourceInstanceIndex.set(params.instance, entry);\n this.resourceIdList.push(id);\n if (this.resourceIdList.length > MAX_RESOURCE_RECORDS) {\n this._clearResources();\n }\n this._markResourceDirty(id);\n }\n\n getResourceInfo(instance: any): Record<string, any> {\n const res: Record<string, any> = {};\n const tracingContext = getTracingContext(Object.getPrototypeOf(instance));\n\n for (const [key, _opts] of Object.entries(tracingContext.infoProperties)) {\n try {\n res[key] = typeof instance[key] === 'function' ? instance[key]() : instance[key];\n } catch (err: any) {\n res[key] = err.message;\n }\n }\n\n return res;\n }\n\n 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 /**\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\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 readonly _ctx: Context | null = null;\n\n constructor(private _traceProcessor: TraceProcessor, params: TraceSpanParams) {\n this.id = TracingSpan.nextId++;\n this.methodName = params.methodName;\n this.resourceId = _traceProcessor.getResourceId(params.instance);\n this.startTs = performance.now();\n\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\n markError(err: unknown) {\n this.endTs = performance.now();\n this.error = serializeError(err);\n this._traceProcessor._flushSpan(this);\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\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", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { Stream } from '@dxos/codec-protobuf';\nimport { StreamTraceEvent, TracingService } from '@dxos/protocols/proto/dxos/tracing';\n\nimport { TraceProcessor, TraceSubscription } from './trace-processor';\n\nconst FLUSH_INTERVAL = 1_000;\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 subscription: TraceSubscription = {\n dirtyResources: new Set(),\n dirtySpans: new Set(),\n };\n this._traceProcessor.subscriptions.add(subscription);\n ctx.onDispose(() => {\n this._traceProcessor.subscriptions.delete(subscription);\n });\n\n const flushEvents = (resources: Set<number> | null, spans: Set<number> | null) => {\n const event: StreamTraceEvent = {\n resourceAdded: [],\n resourceRemoved: [],\n spanAdded: [],\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 (event.resourceAdded!.length > 0 || event.resourceRemoved!.length > 0 || event.spanAdded!.length > 0) {\n next(event);\n }\n };\n\n flushEvents(null, null);\n\n const timer = setInterval(() => {\n flushEvents(subscription.dirtyResources, subscription.dirtySpans);\n subscription.dirtyResources.clear();\n subscription.dirtySpans.clear();\n }, FLUSH_INTERVAL);\n ctx.onDispose(() => {\n clearInterval(timer);\n });\n });\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["symbolTracingContext", "Symbol", "getTracingContext", "target", "_a", "infoProperties", "TRACE_SPAN_ATTRIBUTE", "FLUSH_INTERVAL", "TraceSender", "constructor", "_traceProcessor", "streamTrace", "request", "Stream", "ctx", "next", "subscription", "dirtyResources", "Set", "dirtySpans", "subscriptions", "add", "onDispose", "delete", "flushEvents", "resources", "spans", "event", "resourceAdded", "resourceRemoved", "spanAdded", "id", "entry", "get", "push", "resource", "data", "values", "span", "length", "timer", "setInterval", "clear", "clearInterval", "MAX_RESOURCE_RECORDS", "MAX_SPAN_RECORDS", "TraceProcessor", "resources", "Map", "resourceInstanceIndex", "WeakMap", "resourceIdList", "spans", "spanIdList", "subscriptions", "Set", "traceResourceConstructor", "params", "id", "size", "entry", "data", "className", "constructor", "name", "instanceId", "getPrototypeSpecificInstanceId", "instance", "info", "getResourceInfo", "links", "WeakRef", "set", "push", "length", "_clearResources", "_markResourceDirty", "res", "tracingContext", "getTracingContext", "Object", "getPrototypeOf", "key", "_opts", "entries", "infoProperties", "err", "message", "traceSpan", "span", "TracingSpan", "_flushSpan", "addLink", "parent", "child", "opts", "getResourceId", "get", "createTraceSender", "TraceSender", "runtimeSpan", "serialize", "_clearSpans", "_markSpanDirty", "subscription", "dirtyResources", "add", "dirtySpans", "shift", "delete", "_traceProcessor", "parentId", "resourceId", "endTs", "error", "_ctx", "nextId", "methodName", "startTs", "performance", "now", "parentCtx", "derive", "attributes", "TRACE_SPAN_ATTRIBUTE", "getAttribute", "ctx", "markSuccess", "markError", "serializeError", "_a", "undefined", "toFixed", "Error", "String", "TRACE_PROCESSOR", "globalThis", "resource", "constructor", "rest", "TRACE_PROCESSOR", "traceResourceConstructor", "instance", "info", "target", "propertyKey", "descriptor", "getTracingContext", "infoProperties", "span", "method", "value", "args", "parentCtx", "Context", "traceSpan", "methodName", "callArgs", "ctx", "slice", "apply", "err", "markError", "markSuccess", "addLink", "parent", "child", "opts", "trace"]
7
+ }
@@ -0,0 +1 @@
1
+ {"inputs":{"packages/common/tracing/src/symbols.ts":{"bytes":1464,"imports":[]},"packages/common/tracing/src/trace-sender.ts":{"bytes":9080,"imports":[{"path":"@dxos/codec-protobuf","kind":"import-statement","external":true}]},"packages/common/tracing/src/trace-processor.ts":{"bytes":20068,"imports":[{"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"}]},"packages/common/tracing/src/api.ts":{"bytes":5722,"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"}]},"packages/common/tracing/src/index.ts":{"bytes":744,"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"}]}},"outputs":{"packages/common/tracing/dist/lib/node/index.cjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":18611},"packages/common/tracing/dist/lib/node/index.cjs":{"imports":[{"path":"@dxos/context","kind":"require-call","external":true},{"path":"@dxos/util","kind":"require-call","external":true},{"path":"@dxos/codec-protobuf","kind":"require-call","external":true}],"exports":[],"entryPoint":"packages/common/tracing/src/index.ts","inputs":{"packages/common/tracing/src/index.ts":{"bytesInOutput":415},"packages/common/tracing/src/api.ts":{"bytesInOutput":1176},"packages/common/tracing/src/symbols.ts":{"bytesInOutput":280},"packages/common/tracing/src/trace-processor.ts":{"bytesInOutput":4527},"packages/common/tracing/src/trace-sender.ts":{"bytesInOutput":2265}},"bytes":10044}}}
@@ -0,0 +1,10 @@
1
+ export type AddLinkOptions = {};
2
+ export declare const trace: {
3
+ resource: () => <T extends new (...args: any[]) => {}>(constructor: T) => {
4
+ new (...rest: any[]): {};
5
+ } & T;
6
+ info: () => (target: any, propertyKey: string, descriptor?: PropertyDescriptor) => void;
7
+ span: () => (target: any, propertyKey: string, descriptor: TypedPropertyDescriptor<(...args: any) => any>) => void;
8
+ addLink: (parent: any, child: any, opts?: AddLinkOptions) => void;
9
+ };
10
+ //# sourceMappingURL=api.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../../src/api.ts"],"names":[],"mappings":"AA2CA,MAAM,MAAM,cAAc,GAAG,EAAE,CAAC;AAMhC,eAAO,MAAM,KAAK;6CAtCW,GAAG,EAAE,KAAG,EAAE;sBAEZ,GAAG,EAAE;;yBAOJ,GAAG,eAAe,MAAM,eAAe,kBAAkB;yBAIzD,GAAG,eAAe,MAAM,gDAAgD,GAAG,KAAK,GAAG;sBAqBtF,GAAG,SAAS,GAAG,SAAQ,cAAc;CAU7D,CAAC"}
@@ -0,0 +1,5 @@
1
+ export * from './api';
2
+ export * from './symbols';
3
+ export * from './trace-processor';
4
+ export * from './trace-sender';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.ts"],"names":[],"mappings":"AAIA,cAAc,OAAO,CAAC;AACtB,cAAc,WAAW,CAAC;AAC1B,cAAc,mBAAmB,CAAC;AAClC,cAAc,gBAAgB,CAAC"}
@@ -0,0 +1,7 @@
1
+ export declare const symbolTracingContext: unique symbol;
2
+ export type TracingContext = {
3
+ infoProperties: Record<string, {}>;
4
+ };
5
+ export declare const getTracingContext: (target: any) => TracingContext;
6
+ export declare const TRACE_SPAN_ATTRIBUTE = "dxos.trace-span";
7
+ //# sourceMappingURL=symbols.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"symbols.d.ts","sourceRoot":"","sources":["../../../src/symbols.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,oBAAoB,eAAiC,CAAC;AAEnE,MAAM,MAAM,cAAc,GAAG;IAC3B,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;CACpC,CAAC;AAEF,eAAO,MAAM,iBAAiB,WAAY,GAAG,KAAG,cAI/C,CAAC;AAEF,eAAO,MAAM,oBAAoB,oBAAoB,CAAC"}
@@ -0,0 +1,61 @@
1
+ import { Context } from '@dxos/context';
2
+ import { Error as SerializedError } from '@dxos/protocols/proto/dxos/error';
3
+ import { Resource, Span } from '@dxos/protocols/proto/dxos/tracing';
4
+ import type { AddLinkOptions } from './api';
5
+ import { TraceSender } from './trace-sender';
6
+ export type TraceResourceConstructorParams = {
7
+ constructor: {
8
+ new (...args: any[]): {};
9
+ };
10
+ instance: any;
11
+ };
12
+ export type TraceSpanParams = {
13
+ instance: any;
14
+ methodName: string;
15
+ parentCtx: Context | null;
16
+ };
17
+ export type ResourceEntry = {
18
+ data: Resource;
19
+ instance: WeakRef<any>;
20
+ };
21
+ export type TraceSubscription = {
22
+ dirtyResources: Set<number>;
23
+ dirtySpans: Set<number>;
24
+ };
25
+ export declare class TraceProcessor {
26
+ resources: Map<number, ResourceEntry>;
27
+ resourceInstanceIndex: WeakMap<any, ResourceEntry>;
28
+ resourceIdList: number[];
29
+ spans: Map<number, Span>;
30
+ spanIdList: number[];
31
+ subscriptions: Set<TraceSubscription>;
32
+ traceResourceConstructor(params: TraceResourceConstructorParams): void;
33
+ getResourceInfo(instance: any): Record<string, any>;
34
+ traceSpan(params: TraceSpanParams): TracingSpan;
35
+ addLink(parent: any, child: any, opts: AddLinkOptions): void;
36
+ getResourceId(instance: any): number | null;
37
+ createTraceSender(): TraceSender;
38
+ private _markResourceDirty;
39
+ private _markSpanDirty;
40
+ private _clearResources;
41
+ private _clearSpans;
42
+ }
43
+ export declare class TracingSpan {
44
+ private _traceProcessor;
45
+ static nextId: number;
46
+ readonly id: number;
47
+ readonly parentId: number | null;
48
+ readonly methodName: string;
49
+ readonly resourceId: number | null;
50
+ startTs: number;
51
+ endTs: number | null;
52
+ error: SerializedError | null;
53
+ private readonly _ctx;
54
+ constructor(_traceProcessor: TraceProcessor, params: TraceSpanParams);
55
+ get ctx(): Context | null;
56
+ markSuccess(): void;
57
+ markError(err: unknown): void;
58
+ serialize(): Span;
59
+ }
60
+ export declare const TRACE_PROCESSOR: TraceProcessor;
61
+ //# sourceMappingURL=trace-processor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trace-processor.d.ts","sourceRoot":"","sources":["../../../src/trace-processor.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACxC,OAAO,EAAE,KAAK,IAAI,eAAe,EAAE,MAAM,kCAAkC,CAAC;AAC5E,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,oCAAoC,CAAC;AAGpE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,OAAO,CAAC;AAE5C,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAE7C,MAAM,MAAM,8BAA8B,GAAG;IAC3C,WAAW,EAAE;QAAE,KAAK,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,CAAA;KAAE,CAAC;IAC1C,QAAQ,EAAE,GAAG,CAAC;CACf,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG;IAC5B,QAAQ,EAAE,GAAG,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,OAAO,GAAG,IAAI,CAAC;CAC3B,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG;IAC1B,IAAI,EAAE,QAAQ,CAAC;IACf,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC;CACxB,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,cAAc,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAC5B,UAAU,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;CACzB,CAAC;AAKF,qBAAa,cAAc;IACzB,SAAS,6BAAoC;IAC7C,qBAAqB,8BAAqC;IAC1D,cAAc,EAAE,MAAM,EAAE,CAAM;IAE9B,KAAK,oBAA2B;IAChC,UAAU,EAAE,MAAM,EAAE,CAAM;IAE1B,aAAa,EAAE,GAAG,CAAC,iBAAiB,CAAC,CAAa;IAElD,wBAAwB,CAAC,MAAM,EAAE,8BAA8B;IAqB/D,eAAe,CAAC,QAAQ,EAAE,GAAG,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;IAenD,SAAS,CAAC,MAAM,EAAE,eAAe,GAAG,WAAW;IAM/C,OAAO,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,cAAc;IAErD,aAAa,CAAC,QAAQ,EAAE,GAAG,GAAG,MAAM,GAAG,IAAI;IAK3C,iBAAiB;IAiBjB,OAAO,CAAC,kBAAkB;IAM1B,OAAO,CAAC,cAAc;IAMtB,OAAO,CAAC,eAAe;IAQvB,OAAO,CAAC,WAAW;CAMpB;AAED,qBAAa,WAAW;IAaV,OAAO,CAAC,eAAe;IAZnC,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,QAAQ,CAAC,IAAI,CAAwB;gBAEzB,eAAe,EAAE,cAAc,EAAE,MAAM,EAAE,eAAe;IAmB5E,IAAI,GAAG,IAAI,OAAO,GAAG,IAAI,CAExB;IAED,WAAW;IAKX,SAAS,CAAC,GAAG,EAAE,OAAO;IAMtB,SAAS,IAAI,IAAI;CAWlB;AAeD,eAAO,MAAM,eAAe,EAAE,cAA+E,CAAC"}
@@ -0,0 +1,9 @@
1
+ import { Stream } from '@dxos/codec-protobuf';
2
+ import { StreamTraceEvent, TracingService } from '@dxos/protocols/proto/dxos/tracing';
3
+ import { TraceProcessor } from './trace-processor';
4
+ export declare class TraceSender implements TracingService {
5
+ private _traceProcessor;
6
+ constructor(_traceProcessor: TraceProcessor);
7
+ streamTrace(request: void): Stream<StreamTraceEvent>;
8
+ }
9
+ //# sourceMappingURL=trace-sender.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trace-sender.d.ts","sourceRoot":"","sources":["../../../src/trace-sender.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAC9C,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AAEtF,OAAO,EAAE,cAAc,EAAqB,MAAM,mBAAmB,CAAC;AAItE,qBAAa,WAAY,YAAW,cAAc;IACpC,OAAO,CAAC,eAAe;gBAAf,eAAe,EAAE,cAAc;IAEnD,WAAW,CAAC,OAAO,EAAE,IAAI,GAAG,MAAM,CAAC,gBAAgB,CAAC;CA+DrD"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=tracing.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tracing.test.d.ts","sourceRoot":"","sources":["../../../src/tracing.test.ts"],"names":[],"mappings":""}
package/package.json ADDED
@@ -0,0 +1,32 @@
1
+ {
2
+ "name": "@dxos/tracing",
3
+ "version": "0.1.56-main.d9d1c3e",
4
+ "description": "Async utilities.",
5
+ "homepage": "https://dxos.org",
6
+ "bugs": "https://github.com/dxos/dxos/issues",
7
+ "license": "MIT",
8
+ "author": "DXOS.org",
9
+ "main": "dist/lib/node/index.cjs",
10
+ "browser": {
11
+ "./dist/lib/node/index.cjs": "./dist/lib/browser/index.mjs"
12
+ },
13
+ "types": "dist/types/src/index.d.ts",
14
+ "files": [
15
+ "dist",
16
+ "src"
17
+ ],
18
+ "dependencies": {
19
+ "@dxos/codec-protobuf": "0.1.56-main.d9d1c3e",
20
+ "@dxos/context": "0.1.56-main.d9d1c3e",
21
+ "@dxos/debug": "0.1.56-main.d9d1c3e",
22
+ "@dxos/invariant": "0.1.56-main.d9d1c3e",
23
+ "@dxos/log": "0.1.56-main.d9d1c3e",
24
+ "@dxos/node-std": "0.1.56-main.d9d1c3e",
25
+ "@dxos/protocols": "0.1.56-main.d9d1c3e",
26
+ "@dxos/util": "0.1.56-main.d9d1c3e"
27
+ },
28
+ "devDependencies": {},
29
+ "publishConfig": {
30
+ "access": "public"
31
+ }
32
+ }
package/src/api.ts ADDED
@@ -0,0 +1,56 @@
1
+ //
2
+ // Copyright 2023 DXOS.org
3
+ //
4
+
5
+ import { Context } from '@dxos/context';
6
+
7
+ import { getTracingContext } from './symbols';
8
+ import { TRACE_PROCESSOR } from './trace-processor';
9
+
10
+ const resource =
11
+ () =>
12
+ <T extends { new (...args: any[]): {} }>(constructor: T) => {
13
+ return class extends constructor {
14
+ constructor(...rest: any[]) {
15
+ super(...rest);
16
+ TRACE_PROCESSOR.traceResourceConstructor({ constructor, instance: this });
17
+ }
18
+ };
19
+ };
20
+
21
+ const info = () => (target: any, propertyKey: string, descriptor?: PropertyDescriptor) => {
22
+ getTracingContext(target).infoProperties[propertyKey] = {};
23
+ };
24
+
25
+ const span = () => (target: any, propertyKey: string, descriptor: TypedPropertyDescriptor<(...args: any) => any>) => {
26
+ const method = descriptor.value!;
27
+
28
+ descriptor.value = async function (this: any, ...args: any) {
29
+ const parentCtx = args[0] instanceof Context ? args[0] : null;
30
+ const span = TRACE_PROCESSOR.traceSpan({ parentCtx, methodName: propertyKey, instance: this });
31
+
32
+ const callArgs = span.ctx ? [span.ctx, ...args.slice(1)] : args;
33
+ try {
34
+ return await method.apply(this, callArgs);
35
+ } catch (err) {
36
+ span.markError(err);
37
+ throw err;
38
+ } finally {
39
+ span.markSuccess();
40
+ }
41
+ };
42
+ };
43
+
44
+ export type AddLinkOptions = {};
45
+
46
+ const addLink = (parent: any, child: any, opts: AddLinkOptions = {}) => {
47
+ TRACE_PROCESSOR.addLink(parent, child, opts);
48
+ };
49
+
50
+ export const trace = {
51
+ resource,
52
+ info,
53
+ span,
54
+
55
+ addLink,
56
+ };
package/src/index.ts ADDED
@@ -0,0 +1,8 @@
1
+ //
2
+ // Copyright 2023 DXOS.org
3
+ //
4
+
5
+ export * from './api';
6
+ export * from './symbols';
7
+ export * from './trace-processor';
8
+ export * from './trace-sender';
package/src/symbols.ts ADDED
@@ -0,0 +1,17 @@
1
+ //
2
+ // Copyright 2023 DXOS.org
3
+ //
4
+
5
+ export const symbolTracingContext = Symbol('dxos.tracing-context');
6
+
7
+ export type TracingContext = {
8
+ infoProperties: Record<string, {}>;
9
+ };
10
+
11
+ export const getTracingContext = (target: any): TracingContext => {
12
+ return (target[symbolTracingContext] ??= {
13
+ infoProperties: {},
14
+ });
15
+ };
16
+
17
+ export const TRACE_SPAN_ATTRIBUTE = 'dxos.trace-span';