convex-tracer 0.1.0

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.
Files changed (86) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +592 -0
  3. package/dist/client/_generated/_ignore.d.ts +1 -0
  4. package/dist/client/_generated/_ignore.d.ts.map +1 -0
  5. package/dist/client/_generated/_ignore.js +3 -0
  6. package/dist/client/_generated/_ignore.js.map +1 -0
  7. package/dist/client/helpers.d.ts +31 -0
  8. package/dist/client/helpers.d.ts.map +1 -0
  9. package/dist/client/helpers.js +177 -0
  10. package/dist/client/helpers.js.map +1 -0
  11. package/dist/client/index.d.ts +210 -0
  12. package/dist/client/index.d.ts.map +1 -0
  13. package/dist/client/index.js +355 -0
  14. package/dist/client/index.js.map +1 -0
  15. package/dist/client/tracer-api/index.d.ts +27 -0
  16. package/dist/client/tracer-api/index.d.ts.map +1 -0
  17. package/dist/client/tracer-api/index.js +177 -0
  18. package/dist/client/tracer-api/index.js.map +1 -0
  19. package/dist/client/tracer-api/types.d.ts +143 -0
  20. package/dist/client/tracer-api/types.d.ts.map +1 -0
  21. package/dist/client/tracer-api/types.js +2 -0
  22. package/dist/client/tracer-api/types.js.map +1 -0
  23. package/dist/client/types.d.ts +168 -0
  24. package/dist/client/types.d.ts.map +1 -0
  25. package/dist/client/types.js +2 -0
  26. package/dist/client/types.js.map +1 -0
  27. package/dist/component/_generated/api.d.ts +36 -0
  28. package/dist/component/_generated/api.d.ts.map +1 -0
  29. package/dist/component/_generated/api.js +31 -0
  30. package/dist/component/_generated/api.js.map +1 -0
  31. package/dist/component/_generated/component.d.ts +139 -0
  32. package/dist/component/_generated/component.d.ts.map +1 -0
  33. package/dist/component/_generated/component.js +11 -0
  34. package/dist/component/_generated/component.js.map +1 -0
  35. package/dist/component/_generated/dataModel.d.ts +46 -0
  36. package/dist/component/_generated/dataModel.d.ts.map +1 -0
  37. package/dist/component/_generated/dataModel.js +11 -0
  38. package/dist/component/_generated/dataModel.js.map +1 -0
  39. package/dist/component/_generated/server.d.ts +121 -0
  40. package/dist/component/_generated/server.d.ts.map +1 -0
  41. package/dist/component/_generated/server.js +78 -0
  42. package/dist/component/_generated/server.js.map +1 -0
  43. package/dist/component/convex.config.d.ts +3 -0
  44. package/dist/component/convex.config.d.ts.map +1 -0
  45. package/dist/component/convex.config.js +3 -0
  46. package/dist/component/convex.config.js.map +1 -0
  47. package/dist/component/lib.d.ts +161 -0
  48. package/dist/component/lib.d.ts.map +1 -0
  49. package/dist/component/lib.js +349 -0
  50. package/dist/component/lib.js.map +1 -0
  51. package/dist/component/schema.d.ts +75 -0
  52. package/dist/component/schema.d.ts.map +1 -0
  53. package/dist/component/schema.js +46 -0
  54. package/dist/component/schema.js.map +1 -0
  55. package/dist/component/types.d.ts +286 -0
  56. package/dist/component/types.d.ts.map +1 -0
  57. package/dist/component/types.js +28 -0
  58. package/dist/component/types.js.map +1 -0
  59. package/dist/react/index.d.ts +6 -0
  60. package/dist/react/index.d.ts.map +1 -0
  61. package/dist/react/index.js +11 -0
  62. package/dist/react/index.js.map +1 -0
  63. package/dist/react/types.d.ts +8 -0
  64. package/dist/react/types.d.ts.map +1 -0
  65. package/dist/react/types.js +2 -0
  66. package/dist/react/types.js.map +1 -0
  67. package/package.json +121 -0
  68. package/src/client/_generated/_ignore.ts +1 -0
  69. package/src/client/helpers.ts +278 -0
  70. package/src/client/index.ts +593 -0
  71. package/src/client/setup.test.ts +26 -0
  72. package/src/client/tracer-api/index.ts +235 -0
  73. package/src/client/tracer-api/types.ts +168 -0
  74. package/src/client/types.ts +257 -0
  75. package/src/component/_generated/api.ts +52 -0
  76. package/src/component/_generated/component.ts +199 -0
  77. package/src/component/_generated/dataModel.ts +60 -0
  78. package/src/component/_generated/server.ts +161 -0
  79. package/src/component/convex.config.ts +3 -0
  80. package/src/component/lib.ts +399 -0
  81. package/src/component/schema.ts +62 -0
  82. package/src/component/setup.test.ts +11 -0
  83. package/src/component/types.ts +38 -0
  84. package/src/react/index.ts +36 -0
  85. package/src/react/types.ts +15 -0
  86. package/src/test.ts +18 -0
@@ -0,0 +1,355 @@
1
+ import { actionGeneric, internalActionGeneric, internalMutationGeneric, mutationGeneric, } from "convex/server";
2
+ import { v } from "convex/values";
3
+ import { statusValidator } from "../component/schema";
4
+ import { executeTracedHandler, extractTraceContext, prepareLogArgs, setupTraceContext, } from "./helpers";
5
+ import TracingAPI from "./tracer-api";
6
+ export * from "../component/types";
7
+ const DEFAULT_CONFIG = {
8
+ sampleRate: 0.1,
9
+ preserveErrors: true,
10
+ retentionMinutes: 120,
11
+ };
12
+ const __traceContext = v.optional(v.object({
13
+ traceId: v.string(),
14
+ spanId: v.string(),
15
+ sampleRate: v.optional(v.number()),
16
+ retentionMinutes: v.optional(v.number()),
17
+ preserveErrors: v.optional(v.boolean()),
18
+ }));
19
+ /**
20
+ * @example
21
+ * ```typescript
22
+ * import { components } from "./_generated/api";
23
+ * import { mutation, action } from "./_generated/server";
24
+ * import { Tracer } from "@convex-dev/tracer";
25
+ *
26
+ * export const { tracedQuery, tracedMutation, tracedAction } = new Tracer(components.tracer, {
27
+ * sampleRate: 0.1,
28
+ * preserveErrors: true,
29
+ * });
30
+ *
31
+ * export const createPost = tracedMutation({
32
+ * name: "createPost",
33
+ * args: { title: v.string() },
34
+ * handler: async (ctx, args) => {
35
+ * await ctx.tracer.info("Creating post");
36
+ * return await ctx.db.insert("posts", args);
37
+ * },
38
+ * });
39
+ * ```
40
+ */
41
+ export class Tracer {
42
+ component;
43
+ sampleRate;
44
+ preserveErrors;
45
+ retentionMinutes;
46
+ constructor(component, config = {}) {
47
+ this.component = component;
48
+ this.sampleRate = config.sampleRate ?? DEFAULT_CONFIG.sampleRate;
49
+ this.preserveErrors =
50
+ config.preserveErrors ?? DEFAULT_CONFIG.preserveErrors;
51
+ this.retentionMinutes =
52
+ config.retentionMinutes ?? DEFAULT_CONFIG.retentionMinutes;
53
+ }
54
+ createRunTracedFunction(ctx, traceContext, type) {
55
+ return async (funcRef, args) => {
56
+ const argsWithTrace = {
57
+ ...args,
58
+ __traceContext: traceContext,
59
+ };
60
+ if (type === "action") {
61
+ return await ctx.runAction(funcRef, argsWithTrace);
62
+ }
63
+ return await ctx.runMutation(funcRef, argsWithTrace);
64
+ };
65
+ }
66
+ createRestrictedQueryContext(ctx, traceContext) {
67
+ const tracerConfig = {
68
+ sampleRate: this.sampleRate,
69
+ preserveErrors: this.preserveErrors,
70
+ retentionMinutes: this.retentionMinutes,
71
+ };
72
+ const { db, storage, ...restOfCtx } = ctx;
73
+ const { get, query, normalizeId, system } = db;
74
+ const { getUrl, getMetadata } = storage;
75
+ const queryCtx = {
76
+ ...restOfCtx,
77
+ db: { get, query, normalizeId, system },
78
+ storage: { getUrl, getMetadata },
79
+ };
80
+ return {
81
+ ...queryCtx,
82
+ tracer: new TracingAPI(ctx, this.component, traceContext.traceId, traceContext.spanId, tracerConfig),
83
+ runTracedQuery: this.createRunTracedFunction(ctx, traceContext, "mutation"),
84
+ };
85
+ }
86
+ createEnhancedContext(ctx, traceContext, type) {
87
+ const tracerConfig = {
88
+ sampleRate: this.sampleRate,
89
+ preserveErrors: this.preserveErrors,
90
+ retentionMinutes: this.retentionMinutes,
91
+ };
92
+ if (type === "query") {
93
+ return this.createRestrictedQueryContext(ctx, traceContext);
94
+ }
95
+ const baseCtx = {
96
+ ...ctx,
97
+ tracer: new TracingAPI(ctx, this.component, traceContext.traceId, traceContext.spanId, tracerConfig),
98
+ runTracedQuery: this.createRunTracedFunction(ctx, traceContext, "mutation"),
99
+ runTracedMutation: this.createRunTracedFunction(ctx, traceContext, "mutation"),
100
+ };
101
+ if (type === "mutation") {
102
+ return baseCtx;
103
+ }
104
+ if (type === "action") {
105
+ return {
106
+ ...baseCtx,
107
+ runTracedAction: this.createRunTracedFunction(ctx, traceContext, "action"),
108
+ };
109
+ }
110
+ throw new Error(`Unexpected function type: ${type}`);
111
+ }
112
+ createTracedHandler(tConfig, functionType, defaultName) {
113
+ const functionName = tConfig.name || defaultName;
114
+ return async (ctx, allArgs) => {
115
+ const startTime = Date.now();
116
+ const { existingContext, args } = extractTraceContext(allArgs);
117
+ const { traceId, spanId, traceContext, isRoot } = await setupTraceContext(ctx, this.component, existingContext, startTime, functionName, tConfig.sampleRate ?? this.sampleRate, tConfig.retentionMinutes ?? this.retentionMinutes, tConfig.preserveErrors ?? this.preserveErrors, {
118
+ functionName,
119
+ args: prepareLogArgs(args, tConfig.logArgs),
120
+ });
121
+ const enhancedCtx = this.createEnhancedContext(ctx, traceContext, functionType);
122
+ return await executeTracedHandler({
123
+ ctx: ctx,
124
+ component: this.component,
125
+ traceId,
126
+ spanId,
127
+ startTime,
128
+ config: tConfig,
129
+ args,
130
+ handler: tConfig.handler,
131
+ enhancedCtx,
132
+ isRoot,
133
+ });
134
+ };
135
+ }
136
+ /**
137
+ * Creates a traced query (runs as mutation internally).
138
+ * @example
139
+ * ```ts
140
+ * export const getUser = tracedQuery({
141
+ * name: "getUser",
142
+ * args: { userId: v.id("users") },
143
+ * onSuccess: async (ctx, args, result) => {
144
+ * await ctx.tracer.info("Succeeded user fetch", { userId: args.userId });
145
+ * },
146
+ * handler: async (ctx, args) => {
147
+ * await ctx.tracer.info("fetching user", { title: args.userId });
148
+ * const user = await ctx.db.get(args.userId);
149
+ * await ctx.tracer.info("user fetched", { userId: args.userId });
150
+ * return user;
151
+ * },
152
+ * });
153
+ * ```
154
+ */
155
+ tracedQuery = (tConfig) => {
156
+ return mutationGeneric({
157
+ args: {
158
+ ...tConfig.args,
159
+ __traceContext,
160
+ },
161
+ handler: this.createTracedHandler(tConfig, "query", "anonymous-query"),
162
+ });
163
+ };
164
+ /**
165
+ * Creates a traced query (runs as mutation internally).
166
+ * @example
167
+ * ```ts
168
+ * export const getUser = internalTracedQuery({
169
+ * name: "getUser",
170
+ * args: { userId: v.id("users") },
171
+ * onSuccess: async (ctx, args, result) => {
172
+ * await ctx.tracer.info("Succeeded user fetch", { userId: args.userId });
173
+ * },
174
+ * handler: async (ctx, args) => {
175
+ * await ctx.tracer.info("fetching user", { title: args.userId });
176
+ * const user = await ctx.db.get(args.userId);
177
+ * await ctx.tracer.info("user fetched", { userId: args.userId });
178
+ * return user;
179
+ * },
180
+ * });
181
+ * ```
182
+ */
183
+ internalTracedQuery = (tConfig) => {
184
+ return internalMutationGeneric({
185
+ args: {
186
+ ...tConfig.args,
187
+ __traceContext,
188
+ },
189
+ handler: this.createTracedHandler(tConfig, "query", "anonymous-internal-query"),
190
+ });
191
+ };
192
+ /**
193
+ * Creates a traced mutation.
194
+ * @example
195
+ * ```ts
196
+ * export const createUser = tracedMutation({
197
+ * name: "createUser",
198
+ * args: { user: v.object({ name: v.string(), email: v.string() }) },
199
+ * handler: async (ctx, args) => {
200
+ * const existing = await ctx.db
201
+ * .query("users")
202
+ * .withIndex("by_email", (q) => q.eq("email", args.user.email))
203
+ * .first();
204
+ *
205
+ * if (existing) {
206
+ * ctx.tracer.info("User already exists", { user: args.user });
207
+ * return existing._id;
208
+ * }
209
+ *
210
+ * ctx.tracer.info("Adding user", { ...args.user });
211
+ *
212
+ * const userId = await ctx.db.insert("users", { ...args.user });
213
+ * ctx.tracer.info("User added", { userId });
214
+ *
215
+ * await ctx.tracer.withSpan("syncUser", async (span) => {
216
+ * span.info("Syncing user");
217
+ * // do something
218
+ * span.info("User synced");
219
+ * });
220
+ *
221
+ * return userId;
222
+ * },
223
+ * });
224
+ * ```
225
+ */
226
+ tracedMutation = (tConfig) => {
227
+ return mutationGeneric({
228
+ args: {
229
+ ...tConfig.args,
230
+ __traceContext,
231
+ },
232
+ handler: this.createTracedHandler(tConfig, "mutation", "anonymous-mutation"),
233
+ });
234
+ };
235
+ /**
236
+ * Creates a traced mutation.
237
+ * @example
238
+ * ```ts
239
+ * export const createUser = internalTracedMutation({
240
+ * name: "createUser",
241
+ * args: { user: v.object({ name: v.string(), email: v.string() }) },
242
+ * handler: async (ctx, args) => {
243
+ * const existing = await ctx.db
244
+ * .query("users")
245
+ * .withIndex("by_email", (q) => q.eq("email", args.user.email))
246
+ * .first();
247
+ *
248
+ * if (existing) {
249
+ * await ctx.tracer.info("User already exists", { user: args.user });
250
+ * return existing._id;
251
+ * }
252
+ *
253
+ * await ctx.tracer.info("Adding user", { ...args.user });
254
+ *
255
+ * const userId = await ctx.db.insert("users", { ...args.user });
256
+ * ctx.tracer.info("User added", { userId });
257
+ *
258
+ * await ctx.tracer.withSpan("syncUser", async (span) => {
259
+ * await span.info("Syncing user");
260
+ * // do something
261
+ * await span.info("User synced");
262
+ * });
263
+ *
264
+ * return userId;
265
+ * },
266
+ * });
267
+ * ```
268
+ */
269
+ internalTracedMutation = (tConfig) => {
270
+ return internalMutationGeneric({
271
+ args: {
272
+ ...tConfig.args,
273
+ __traceContext,
274
+ },
275
+ handler: this.createTracedHandler(tConfig, "mutation", "anonymous-internal-mutation"),
276
+ });
277
+ };
278
+ /**
279
+ * Creates a traced action.
280
+ * @example
281
+ * ```ts
282
+ * export const someAction = tracedAction({
283
+ * name: "someAction",
284
+ * args: { userId: v.id("users") },
285
+ * handler: async (ctx, args) => {
286
+ * // do something
287
+ * },
288
+ * });
289
+ * ```
290
+ */
291
+ tracedAction = (tConfig) => {
292
+ return actionGeneric({
293
+ args: {
294
+ ...tConfig.args,
295
+ __traceContext,
296
+ },
297
+ handler: this.createTracedHandler(tConfig, "action", "anonymous-action"),
298
+ });
299
+ };
300
+ /**
301
+ * Creates a traced action.
302
+ * @example
303
+ * ```ts
304
+ * export const someAction = internalTracedAction({
305
+ * name: "someAction",
306
+ * args: { userId: v.id("users") },
307
+ * handler: async (ctx, args) => {
308
+ * // do something
309
+ * },
310
+ * });
311
+ * ```
312
+ */
313
+ internalTracedAction = (tConfig) => {
314
+ return internalActionGeneric({
315
+ args: {
316
+ ...tConfig.args,
317
+ __traceContext,
318
+ },
319
+ handler: this.createTracedHandler(tConfig, "action", "anonymous-internal-action"),
320
+ });
321
+ };
322
+ get tracer() {
323
+ return {
324
+ /**
325
+ * Retrieves a trace by its ID.
326
+ * @param traceId - The ID of the trace to retrieve.
327
+ * @example
328
+ * ```ts
329
+ * // In a convex function (query, mutation, or action)
330
+ * // Or in a traced function
331
+ * const trace = await tracer.getTrace("123")
332
+ * ```
333
+ */
334
+ getTrace: async (ctx, traceId) => {
335
+ return await ctx.runQuery(this.component.lib.getTrace, { traceId });
336
+ },
337
+ /**
338
+ * Lists traces with optional filtering by status.
339
+ * @param status - The status of the traces to retrieve.
340
+ * @param limit - The maximum number of traces to retrieve.
341
+ * @param userId - The ID of the user to retrieve traces for.
342
+ * @example
343
+ * ```ts
344
+ * // In a convex function (query, mutation, or action)
345
+ * // Or in a traced function
346
+ * const traces = await tracer.listTraces({ status: "success", limit: 10 })
347
+ * ```
348
+ */
349
+ listTraces: async (ctx, args) => {
350
+ return await ctx.runQuery(this.component.lib.listTraces, { ...args });
351
+ },
352
+ };
353
+ }
354
+ }
355
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/client/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ import type { GenericActionCtx, GenericDataModel, GenericMutationCtx } from "convex/server";
2
+ import type { ComponentApi } from "../../component/_generated/component";
3
+ import type { TracerConfig } from "../types";
4
+ import type { SpanAPI, TraceAPI } from "./types";
5
+ export default class TracingAPI implements TraceAPI {
6
+ private ctx;
7
+ private component;
8
+ private traceId;
9
+ private spanId;
10
+ private config;
11
+ constructor(ctx: GenericMutationCtx<GenericDataModel> | GenericActionCtx<GenericDataModel>, component: ComponentApi, traceId: string, spanId: string, config: TracerConfig);
12
+ private addLog;
13
+ getTraceId(): string;
14
+ getSpanId(): string;
15
+ info(message: string, metadata?: Record<string, any>): Promise<void>;
16
+ warn(message: string, metadata?: Record<string, any>): Promise<void>;
17
+ error(message: string, metadata?: Record<string, any>): Promise<void>;
18
+ preserve(): Promise<void>;
19
+ discard(): Promise<void>;
20
+ sample(sampleRate?: number): Promise<void>;
21
+ withSpan<T>(spanName: string, fn: (span: SpanAPI) => Promise<T>): Promise<T>;
22
+ updateMetadata(metadata: Record<string, any>): Promise<void>;
23
+ private createSpanAPI;
24
+ private createAndRunSpan;
25
+ private createNoOpSpanAPI;
26
+ }
27
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/client/tracer-api/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,gBAAgB,EAChB,gBAAgB,EAChB,kBAAkB,EACnB,MAAM,eAAe,CAAC;AAEvB,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sCAAsC,CAAC;AACzE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAC7C,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAEjD,MAAM,CAAC,OAAO,OAAO,UAAW,YAAW,QAAQ;IAE/C,OAAO,CAAC,GAAG;IAGX,OAAO,CAAC,SAAS;IACjB,OAAO,CAAC,OAAO;IACf,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,MAAM;gBANN,GAAG,EACP,kBAAkB,CAAC,gBAAgB,CAAC,GACpC,gBAAgB,CAAC,gBAAgB,CAAC,EAC9B,SAAS,EAAE,YAAY,EACvB,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,YAAY;YAGhB,MAAM;IAepB,UAAU,IAAI,MAAM;IAIpB,SAAS,IAAI,MAAM;IAIb,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAGpE,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAGpE,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAIrE,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IASzB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IASxB,MAAM,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAY1C,QAAQ,CAAC,CAAC,EACd,QAAQ,EAAE,MAAM,EAChB,EAAE,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,OAAO,CAAC,CAAC,CAAC,GAChC,OAAO,CAAC,CAAC,CAAC;IAIP,cAAc,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IASlE,OAAO,CAAC,aAAa;YAiEP,gBAAgB;IA0D9B,OAAO,CAAC,iBAAiB;CAW1B"}
@@ -0,0 +1,177 @@
1
+ export default class TracingAPI {
2
+ ctx;
3
+ component;
4
+ traceId;
5
+ spanId;
6
+ config;
7
+ constructor(ctx, component, traceId, spanId, config) {
8
+ this.ctx = ctx;
9
+ this.component = component;
10
+ this.traceId = traceId;
11
+ this.spanId = spanId;
12
+ this.config = config;
13
+ }
14
+ async addLog(severity, message, metadata) {
15
+ await this.ctx
16
+ .runMutation(this.component.lib.addLog, {
17
+ spanId: this.spanId,
18
+ log: { timestamp: Date.now(), severity, message, metadata },
19
+ })
20
+ .catch((err) => console.error(`[Tracer] Failed to add ${severity} log:`, err));
21
+ }
22
+ getTraceId() {
23
+ return this.traceId;
24
+ }
25
+ getSpanId() {
26
+ return this.spanId;
27
+ }
28
+ async info(message, metadata) {
29
+ await this.addLog("info", message, metadata);
30
+ }
31
+ async warn(message, metadata) {
32
+ await this.addLog("warn", message, metadata);
33
+ }
34
+ async error(message, metadata) {
35
+ await this.addLog("error", message, metadata);
36
+ }
37
+ async preserve() {
38
+ await this.ctx
39
+ .runMutation(this.component.lib.updateTracePreserve, {
40
+ traceId: this.traceId,
41
+ preserve: true,
42
+ })
43
+ .catch((err) => console.error("[Tracer] Failed to preserve trace:", err));
44
+ }
45
+ async discard() {
46
+ await this.ctx
47
+ .runMutation(this.component.lib.updateTracePreserve, {
48
+ traceId: this.traceId,
49
+ preserve: false,
50
+ })
51
+ .catch((err) => console.error("[Tracer] Failed to discard trace:", err));
52
+ }
53
+ async sample(sampleRate) {
54
+ await this.ctx
55
+ .runMutation(this.component.lib.updateTracePreserve, {
56
+ traceId: this.traceId,
57
+ preserve: undefined,
58
+ sampleRate,
59
+ })
60
+ .catch((err) => console.error("[Tracer] Failed to reset trace sampling:", err));
61
+ }
62
+ async withSpan(spanName, fn) {
63
+ return await this.createAndRunSpan(this.spanId, spanName, fn);
64
+ }
65
+ async updateMetadata(metadata) {
66
+ await this.ctx
67
+ .runMutation(this.component.lib.updateSpanMetadata, {
68
+ spanId: this.spanId,
69
+ metadata,
70
+ })
71
+ .catch((err) => console.error("[Tracer] Failed to set metadata:", err));
72
+ }
73
+ createSpanAPI(spanId) {
74
+ return {
75
+ info: async (message, metadata) => {
76
+ await this.ctx
77
+ .runMutation(this.component.lib.addLog, {
78
+ spanId,
79
+ log: { timestamp: Date.now(), severity: "info", message, metadata },
80
+ })
81
+ .catch((err) => console.error("[Tracer] Failed to add info log to child span:", err));
82
+ },
83
+ warn: async (message, metadata) => {
84
+ await this.ctx
85
+ .runMutation(this.component.lib.addLog, {
86
+ spanId,
87
+ log: { timestamp: Date.now(), severity: "warn", message, metadata },
88
+ })
89
+ .catch((err) => console.error("[Tracer] Failed to add warn log to child span:", err));
90
+ },
91
+ error: async (message, metadata) => {
92
+ await this.ctx
93
+ .runMutation(this.component.lib.addLog, {
94
+ spanId,
95
+ log: {
96
+ timestamp: Date.now(),
97
+ severity: "error",
98
+ message,
99
+ metadata,
100
+ },
101
+ })
102
+ .catch((err) => console.error("[Tracer] Failed to add error log to child span:", err));
103
+ },
104
+ updateMetadata: async (metadata) => {
105
+ await this.ctx
106
+ .runMutation(this.component.lib.updateSpanMetadata, {
107
+ spanId,
108
+ metadata,
109
+ })
110
+ .catch((err) => console.error("[Tracer] Failed to set child span metadata:", err));
111
+ },
112
+ withSpan: async (spanName, fn) => {
113
+ return await this.createAndRunSpan(spanId, spanName, fn);
114
+ },
115
+ };
116
+ }
117
+ async createAndRunSpan(parentSpanId, spanName, fn) {
118
+ let childSpanId;
119
+ try {
120
+ childSpanId = await this.ctx.runMutation(this.component.lib.createSpan, {
121
+ traceId: this.traceId,
122
+ span: {
123
+ parentSpanId,
124
+ spanName,
125
+ source: "backend",
126
+ startTime: Date.now(),
127
+ status: "pending",
128
+ },
129
+ });
130
+ }
131
+ catch (err) {
132
+ console.error("[Tracer] Failed to create child span:", err);
133
+ return await fn(this.createNoOpSpanAPI());
134
+ }
135
+ const spanAPI = this.createSpanAPI(childSpanId);
136
+ const startTime = Date.now();
137
+ try {
138
+ const result = await fn(spanAPI);
139
+ await this.ctx
140
+ .runMutation(this.component.lib.completeSpan, {
141
+ spanId: childSpanId,
142
+ endTime: Date.now(),
143
+ duration: Date.now() - startTime,
144
+ status: "success",
145
+ })
146
+ .catch((err) => console.error("[Tracer] Failed to complete span:", err));
147
+ return result;
148
+ }
149
+ catch (error) {
150
+ await this.ctx
151
+ .runMutation(this.component.lib.completeSpan, {
152
+ spanId: childSpanId,
153
+ endTime: Date.now(),
154
+ duration: Date.now() - startTime,
155
+ status: "error",
156
+ error: error instanceof Error ? error.message : String(error),
157
+ })
158
+ .catch((err) => console.error("[Tracer] Failed to complete span with error:", err));
159
+ if (this.config.preserveErrors) {
160
+ await this.preserve();
161
+ }
162
+ throw error;
163
+ }
164
+ }
165
+ createNoOpSpanAPI() {
166
+ return {
167
+ info: async () => { },
168
+ warn: async () => { },
169
+ error: async () => { },
170
+ updateMetadata: async () => { },
171
+ withSpan: async () => {
172
+ return undefined;
173
+ },
174
+ };
175
+ }
176
+ }
177
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/client/tracer-api/index.ts"],"names":[],"mappings":"AAUA,MAAM,CAAC,OAAO,OAAO,UAAU;IAEnB;IAGA;IACA;IACA;IACA;IAPV,YACU,GAE8B,EAC9B,SAAuB,EACvB,OAAe,EACf,MAAc,EACd,MAAoB;QANpB,QAAG,GAAH,GAAG,CAE2B;QAC9B,cAAS,GAAT,SAAS,CAAc;QACvB,YAAO,GAAP,OAAO,CAAQ;QACf,WAAM,GAAN,MAAM,CAAQ;QACd,WAAM,GAAN,MAAM,CAAc;IAC3B,CAAC;IAEI,KAAK,CAAC,MAAM,CAClB,QAAmC,EACnC,OAAe,EACf,QAA8B;QAE9B,MAAM,IAAI,CAAC,GAAG;aACX,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,EAAE;YACtC,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE;SAC5D,CAAC;aACD,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE,CACb,OAAO,CAAC,KAAK,CAAC,0BAA0B,QAAQ,OAAO,EAAE,GAAG,CAAC,CAC9D,CAAC;IACN,CAAC;IAED,UAAU;QACR,OAAO,IAAI,CAAC,OAAO,CAAC;IACtB,CAAC;IAED,SAAS;QACP,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,OAAe,EAAE,QAA8B;QACxD,MAAM,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;IAC/C,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,OAAe,EAAE,QAA8B;QACxD,MAAM,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;IAC/C,CAAC;IACD,KAAK,CAAC,KAAK,CAAC,OAAe,EAAE,QAA8B;QACzD,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;IAChD,CAAC;IAED,KAAK,CAAC,QAAQ;QACZ,MAAM,IAAI,CAAC,GAAG;aACX,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,mBAAmB,EAAE;YACnD,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,QAAQ,EAAE,IAAI;SACf,CAAC;aACD,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,oCAAoC,EAAE,GAAG,CAAC,CAAC,CAAC;IAC9E,CAAC;IAED,KAAK,CAAC,OAAO;QACX,MAAM,IAAI,CAAC,GAAG;aACX,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,mBAAmB,EAAE;YACnD,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,QAAQ,EAAE,KAAK;SAChB,CAAC;aACD,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,mCAAmC,EAAE,GAAG,CAAC,CAAC,CAAC;IAC7E,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,UAAmB;QAC9B,MAAM,IAAI,CAAC,GAAG;aACX,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,mBAAmB,EAAE;YACnD,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,QAAQ,EAAE,SAAS;YACnB,UAAU;SACX,CAAC;aACD,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE,CACb,OAAO,CAAC,KAAK,CAAC,0CAA0C,EAAE,GAAG,CAAC,CAC/D,CAAC;IACN,CAAC;IAED,KAAK,CAAC,QAAQ,CACZ,QAAgB,EAChB,EAAiC;QAEjC,OAAO,MAAM,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,MAAM,EAAE,QAAQ,EAAE,EAAE,CAAC,CAAC;IAChE,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,QAA6B;QAChD,MAAM,IAAI,CAAC,GAAG;aACX,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,kBAAkB,EAAE;YAClD,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,QAAQ;SACT,CAAC;aACD,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,kCAAkC,EAAE,GAAG,CAAC,CAAC,CAAC;IAC5E,CAAC;IAEO,aAAa,CAAC,MAAc;QAClC,OAAO;YACL,IAAI,EAAE,KAAK,EAAE,OAAe,EAAE,QAA8B,EAAE,EAAE;gBAC9D,MAAM,IAAI,CAAC,GAAG;qBACX,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,EAAE;oBACtC,MAAM;oBACN,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE;iBACpE,CAAC;qBACD,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE,CACb,OAAO,CAAC,KAAK,CACX,gDAAgD,EAChD,GAAG,CACJ,CACF,CAAC;YACN,CAAC;YACD,IAAI,EAAE,KAAK,EAAE,OAAe,EAAE,QAA8B,EAAE,EAAE;gBAC9D,MAAM,IAAI,CAAC,GAAG;qBACX,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,EAAE;oBACtC,MAAM;oBACN,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE;iBACpE,CAAC;qBACD,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE,CACb,OAAO,CAAC,KAAK,CACX,gDAAgD,EAChD,GAAG,CACJ,CACF,CAAC;YACN,CAAC;YACD,KAAK,EAAE,KAAK,EAAE,OAAe,EAAE,QAA8B,EAAE,EAAE;gBAC/D,MAAM,IAAI,CAAC,GAAG;qBACX,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,EAAE;oBACtC,MAAM;oBACN,GAAG,EAAE;wBACH,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;wBACrB,QAAQ,EAAE,OAAO;wBACjB,OAAO;wBACP,QAAQ;qBACT;iBACF,CAAC;qBACD,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE,CACb,OAAO,CAAC,KAAK,CACX,iDAAiD,EACjD,GAAG,CACJ,CACF,CAAC;YACN,CAAC;YACD,cAAc,EAAE,KAAK,EAAE,QAA6B,EAAE,EAAE;gBACtD,MAAM,IAAI,CAAC,GAAG;qBACX,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,kBAAkB,EAAE;oBAClD,MAAM;oBACN,QAAQ;iBACT,CAAC;qBACD,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE,CACb,OAAO,CAAC,KAAK,CAAC,6CAA6C,EAAE,GAAG,CAAC,CAClE,CAAC;YACN,CAAC;YACD,QAAQ,EAAE,KAAK,EACb,QAAgB,EAChB,EAAiC,EACrB,EAAE;gBACd,OAAO,MAAM,IAAI,CAAC,gBAAgB,CAAC,MAAM,EAAE,QAAQ,EAAE,EAAE,CAAC,CAAC;YAC3D,CAAC;SACF,CAAC;IACJ,CAAC;IAEO,KAAK,CAAC,gBAAgB,CAC5B,YAAoB,EACpB,QAAgB,EAChB,EAAiC;QAEjC,IAAI,WAAmB,CAAC;QACxB,IAAI,CAAC;YACH,WAAW,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,UAAU,EAAE;gBACtE,OAAO,EAAE,IAAI,CAAC,OAAO;gBACrB,IAAI,EAAE;oBACJ,YAAY;oBACZ,QAAQ;oBACR,MAAM,EAAE,SAAS;oBACjB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;oBACrB,MAAM,EAAE,SAAS;iBAClB;aACF,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,uCAAuC,EAAE,GAAG,CAAC,CAAC;YAC5D,OAAO,MAAM,EAAE,CAAC,IAAI,CAAC,iBAAiB,EAAE,CAAC,CAAC;QAC5C,CAAC;QAED,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC;QAChD,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAE7B,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,CAAC;YACjC,MAAM,IAAI,CAAC,GAAG;iBACX,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,YAAY,EAAE;gBAC5C,MAAM,EAAE,WAAW;gBACnB,OAAO,EAAE,IAAI,CAAC,GAAG,EAAE;gBACnB,QAAQ,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS;gBAChC,MAAM,EAAE,SAAS;aAClB,CAAC;iBACD,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE,CACb,OAAO,CAAC,KAAK,CAAC,mCAAmC,EAAE,GAAG,CAAC,CACxD,CAAC;YACJ,OAAO,MAAM,CAAC;QAChB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,CAAC,GAAG;iBACX,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,YAAY,EAAE;gBAC5C,MAAM,EAAE,WAAW;gBACnB,OAAO,EAAE,IAAI,CAAC,GAAG,EAAE;gBACnB,QAAQ,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS;gBAChC,MAAM,EAAE,OAAO;gBACf,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;aAC9D,CAAC;iBACD,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE,CACb,OAAO,CAAC,KAAK,CAAC,8CAA8C,EAAE,GAAG,CAAC,CACnE,CAAC;YAEJ,IAAI,IAAI,CAAC,MAAM,CAAC,cAAc,EAAE,CAAC;gBAC/B,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC;YACxB,CAAC;YACD,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAEO,iBAAiB;QACvB,OAAO;YACL,IAAI,EAAE,KAAK,IAAI,EAAE,GAAE,CAAC;YACpB,IAAI,EAAE,KAAK,IAAI,EAAE,GAAE,CAAC;YACpB,KAAK,EAAE,KAAK,IAAI,EAAE,GAAE,CAAC;YACrB,cAAc,EAAE,KAAK,IAAI,EAAE,GAAE,CAAC;YAC9B,QAAQ,EAAE,KAAK,IAAmB,EAAE;gBAClC,OAAO,SAAgB,CAAC;YAC1B,CAAC;SACF,CAAC;IACJ,CAAC;CACF"}