@descryy/runtime-database-observation 0.5.1 → 0.5.3

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 (56) hide show
  1. package/dist/index.d.ts +7 -5
  2. package/dist/index.d.ts.map +1 -1
  3. package/dist/index.js +4 -3
  4. package/dist/index.js.map +1 -1
  5. package/dist/mysql-row-collector.d.ts +33 -19
  6. package/dist/mysql-row-collector.d.ts.map +1 -1
  7. package/dist/mysql-row-collector.js +480 -26
  8. package/dist/mysql-row-collector.js.map +1 -1
  9. package/dist/postgres-log-parser.d.ts +15 -29
  10. package/dist/postgres-log-parser.d.ts.map +1 -1
  11. package/dist/postgres-log-parser.js +103 -32
  12. package/dist/postgres-log-parser.js.map +1 -1
  13. package/dist/postgres-log-source.d.ts +2 -0
  14. package/dist/postgres-log-source.d.ts.map +1 -1
  15. package/dist/postgres-log-source.js +171 -35
  16. package/dist/postgres-log-source.js.map +1 -1
  17. package/dist/postgres-query-collector.d.ts.map +1 -1
  18. package/dist/postgres-query-collector.js +43 -13
  19. package/dist/postgres-query-collector.js.map +1 -1
  20. package/dist/postgres-row-collector.d.ts +9 -0
  21. package/dist/postgres-row-collector.d.ts.map +1 -1
  22. package/dist/postgres-row-collector.js +114 -18
  23. package/dist/postgres-row-collector.js.map +1 -1
  24. package/dist/prisma-instrumentation.d.ts +20 -0
  25. package/dist/prisma-instrumentation.d.ts.map +1 -0
  26. package/dist/prisma-instrumentation.js +99 -0
  27. package/dist/prisma-instrumentation.js.map +1 -0
  28. package/dist/query-collector.d.ts +2 -0
  29. package/dist/query-collector.d.ts.map +1 -1
  30. package/dist/query-collector.js +38 -13
  31. package/dist/query-collector.js.map +1 -1
  32. package/dist/query-line-parser.d.ts.map +1 -1
  33. package/dist/query-line-parser.js +2 -1
  34. package/dist/query-line-parser.js.map +1 -1
  35. package/dist/query-marker.d.ts +10 -1
  36. package/dist/query-marker.d.ts.map +1 -1
  37. package/dist/query-marker.js +2 -0
  38. package/dist/query-marker.js.map +1 -1
  39. package/dist/row-capture-policy.d.ts +31 -0
  40. package/dist/row-capture-policy.d.ts.map +1 -0
  41. package/dist/row-capture-policy.js +95 -0
  42. package/dist/row-capture-policy.js.map +1 -0
  43. package/dist/smoke.d.ts +2 -0
  44. package/dist/smoke.d.ts.map +1 -0
  45. package/dist/smoke.js +28 -0
  46. package/dist/smoke.js.map +1 -0
  47. package/dist/sqlite-instrumentation.js +9 -2
  48. package/dist/sqlite-instrumentation.js.map +1 -1
  49. package/dist/sqlite-row-snapshot.d.ts +4 -0
  50. package/dist/sqlite-row-snapshot.d.ts.map +1 -1
  51. package/dist/sqlite-row-snapshot.js +153 -25
  52. package/dist/sqlite-row-snapshot.js.map +1 -1
  53. package/dist/table-extraction.d.ts.map +1 -1
  54. package/dist/table-extraction.js +124 -5
  55. package/dist/table-extraction.js.map +1 -1
  56. package/package.json +10 -8
@@ -36,6 +36,7 @@
36
36
  * refuses by name, same as a failed precondition check.
37
37
  */
38
38
  import type { Collector } from "@descryy/runtime-contracts";
39
+ import { type RowCapturePolicy } from "./row-capture-policy.ts";
39
40
  /** The narrow slice of `pg`'s `Client` this module calls — same shape `live-schema.ts` uses, small enough to be satisfied by a test double with no real database involved. */
40
41
  export interface PgRowClient {
41
42
  connect(): Promise<void>;
@@ -43,7 +44,9 @@ export interface PgRowClient {
43
44
  rows: readonly Record<string, unknown>[];
44
45
  }>;
45
46
  end(): Promise<void>;
47
+ on?(event: "error", listener: (error: Error) => void): unknown;
46
48
  }
49
+ export declare const MAX_ROW_CHANGES_PER_STOP = 50000;
47
50
  export interface PostgresRowChangeCollectorOptions {
48
51
  readonly connectionString: string;
49
52
  /** Which owned system this collector's evidence should be attributed to (plan §16.7). */
@@ -51,6 +54,9 @@ export interface PostgresRowChangeCollectorOptions {
51
54
  readonly processId?: string;
52
55
  /** Test/advanced seam — defaults to a real `pg.Client` loaded dynamically. */
53
56
  readonly clientFactory?: (connectionString: string) => Promise<PgRowClient> | PgRowClient;
57
+ readonly rowCapture?: RowCapturePolicy;
58
+ readonly connectTimeoutMs?: number;
59
+ readonly stopQueryTimeoutMs?: number;
54
60
  }
55
61
  type PgClientConstructor = new (config: unknown) => PgRowClient;
56
62
  /**
@@ -62,6 +68,9 @@ type PgClientConstructor = new (config: unknown) => PgRowClient;
62
68
  * loud error rather than a silent no-op.
63
69
  */
64
70
  export declare function pgClientConstructor(loaded: unknown): PgClientConstructor;
71
+ /** Exported for this package's release smoke hook (`smoke.ts`), which must exercise the real default path, not a helper it calls. */
72
+ export declare function defaultClientFactory(connectionString: string): Promise<PgRowClient>;
73
+ export declare function makeSlotName(processId: string): string;
65
74
  export declare function createPostgresRowChangeCollector(options: PostgresRowChangeCollectorOptions): Collector;
66
75
  export {};
67
76
  //# sourceMappingURL=postgres-row-collector.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"postgres-row-collector.d.ts","sourceRoot":"","sources":["../src/postgres-row-collector.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAmF,MAAM,4BAA4B,CAAC;AAK7I,8KAA8K;AAC9K,MAAM,WAAW,WAAW;IAC1B,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACzB,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,SAAS,OAAO,EAAE,GAAG,OAAO,CAAC;QAAE,IAAI,EAAE,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAA;KAAE,CAAC,CAAC;IACxG,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACtB;AAED,MAAM,WAAW,iCAAiC;IAChD,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,yFAAyF;IACzF,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,8EAA8E;IAC9E,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC,gBAAgB,EAAE,MAAM,KAAK,OAAO,CAAC,WAAW,CAAC,GAAG,WAAW,CAAC;CAC3F;AAMD,KAAK,mBAAmB,GAAG,KAAK,MAAM,EAAE,OAAO,KAAK,WAAW,CAAC;AAEhE;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,OAAO,GAAG,mBAAmB,CAOxE;AAsBD,wBAAgB,gCAAgC,CAAC,OAAO,EAAE,iCAAiC,GAAG,SAAS,CAsMtG"}
1
+ {"version":3,"file":"postgres-row-collector.d.ts","sourceRoot":"","sources":["../src/postgres-row-collector.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AAIH,OAAO,KAAK,EAAE,SAAS,EAAmF,MAAM,4BAA4B,CAAC;AAI7I,OAAO,EAA0D,KAAK,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAExH,8KAA8K;AAC9K,MAAM,WAAW,WAAW;IAC1B,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACzB,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,SAAS,OAAO,EAAE,GAAG,OAAO,CAAC;QAAE,IAAI,EAAE,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAA;KAAE,CAAC,CAAC;IACxG,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACrB,EAAE,CAAC,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,GAAG,OAAO,CAAC;CAChE;AAED,eAAO,MAAM,wBAAwB,QAAS,CAAC;AAuB/C,MAAM,WAAW,iCAAiC;IAChD,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,yFAAyF;IACzF,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,8EAA8E;IAC9E,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC,gBAAgB,EAAE,MAAM,KAAK,OAAO,CAAC,WAAW,CAAC,GAAG,WAAW,CAAC;IAC1F,QAAQ,CAAC,UAAU,CAAC,EAAE,gBAAgB,CAAC;IACvC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IACnC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,MAAM,CAAC;CACtC;AAMD,KAAK,mBAAmB,GAAG,KAAK,MAAM,EAAE,OAAO,KAAK,WAAW,CAAC;AAEhE;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,OAAO,GAAG,mBAAmB,CAOxE;AAED,qIAAqI;AACrI,wBAAsB,oBAAoB,CAAC,gBAAgB,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAazF;AAED,wBAAgB,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAUtD;AAcD,wBAAgB,gCAAgC,CAAC,OAAO,EAAE,iCAAiC,GAAG,SAAS,CAsQtG"}
@@ -43,8 +43,30 @@ var __rewriteRelativeImportExtension = (this && this.__rewriteRelativeImportExte
43
43
  }
44
44
  return path;
45
45
  };
46
+ import { createHash, randomBytes } from "node:crypto";
46
47
  import { parseTestDecodingLine } from "./postgres-decoding-parser.js";
47
48
  import { COLLECTOR_VERSION } from "./collector-version.js";
49
+ import { mergeTruncated, mergeWithheld, resolveRowCapturePolicy } from "./row-capture-policy.js";
50
+ export const MAX_ROW_CHANGES_PER_STOP = 50_000;
51
+ const DEFAULT_CONNECT_TIMEOUT_MS = 10_000;
52
+ const DEFAULT_STOP_QUERY_TIMEOUT_MS = 30_000;
53
+ const STATEMENT_TIMEOUT_MS = 30_000;
54
+ const DROP_SLOT_TIMEOUT_MS = 5_000;
55
+ const MAX_SLOT_NAME_BYTES = 63;
56
+ const SLOT_NAME_PREFIX = "descry_rowcap_";
57
+ const SLOT_NAME_READABLE_CHARS = 16;
58
+ class OperationTimeoutError extends Error {
59
+ }
60
+ function withinTimeout(work, timeoutMs, message) {
61
+ let timer;
62
+ const expired = new Promise((_, reject) => {
63
+ timer = setTimeout(() => reject(new OperationTimeoutError(message)), timeoutMs);
64
+ });
65
+ return Promise.race([work, expired]).finally(() => clearTimeout(timer));
66
+ }
67
+ function describeError(error) {
68
+ return error instanceof Error ? `${error.name}: ${error.message}` : String(error);
69
+ }
48
70
  const EVENT_TYPE = "DATABASE_QUERY";
49
71
  /**
50
72
  * The `Client` constructor from a dynamically imported `pg`. `pg` is CommonJS,
@@ -62,17 +84,37 @@ export function pgClientConstructor(loaded) {
62
84
  }
63
85
  return candidate;
64
86
  }
65
- async function defaultClientFactory(connectionString) {
87
+ /** Exported for this package's release smoke hook (`smoke.ts`), which must exercise the real default path, not a helper it calls. */
88
+ export async function defaultClientFactory(connectionString) {
66
89
  // Read from a variable, not a string literal -- see the module header:
67
90
  // keeps `tsc` from requiring `pg`'s type declarations to check this file,
68
91
  // an ordinary dynamic import at runtime either way.
69
92
  const moduleName = "pg";
70
93
  const Client = pgClientConstructor(await import(__rewriteRelativeImportExtension(moduleName)));
71
- return new Client({ connectionString });
94
+ return new Client({
95
+ connectionString,
96
+ connectionTimeoutMillis: DEFAULT_CONNECT_TIMEOUT_MS,
97
+ statement_timeout: STATEMENT_TIMEOUT_MS,
98
+ query_timeout: STATEMENT_TIMEOUT_MS + 5_000,
99
+ keepAlive: true,
100
+ });
101
+ }
102
+ export function makeSlotName(processId) {
103
+ const readable = processId.toLowerCase().replace(/[^a-z0-9_]/g, "_").slice(0, SLOT_NAME_READABLE_CHARS);
104
+ const digest = createHash("sha256").update(processId).digest("hex").slice(0, 8);
105
+ const issuedAt = Date.now().toString(36);
106
+ const nonce = randomBytes(3).toString("hex");
107
+ const name = `${SLOT_NAME_PREFIX}${readable}_${digest}_${issuedAt}_${nonce}`;
108
+ if (name.length > MAX_SLOT_NAME_BYTES) {
109
+ throw new Error(`replication slot name "${name}" exceeds ${MAX_SLOT_NAME_BYTES} bytes`);
110
+ }
111
+ return name;
72
112
  }
73
- function makeSlotName(processId) {
74
- const safe = processId.replace(/[^a-zA-Z0-9_]/g, "_").slice(0, 40);
75
- return `descry_rowcap_${safe}_${Date.now()}_${Math.floor(Math.random() * 1_000_000)}`;
113
+ function isMissingSlotError(error) {
114
+ if (typeof error !== "object" || error === null)
115
+ return false;
116
+ const { code, message } = error;
117
+ return code === "42704" || (typeof message === "string" && /does not exist/i.test(message));
76
118
  }
77
119
  function replidentToCompleteness(code) {
78
120
  if (code === "f")
@@ -89,6 +131,12 @@ export function createPostgresRowChangeCollector(options) {
89
131
  let savedContext = null;
90
132
  let refusalReason = null;
91
133
  let identityByTable = new Map();
134
+ let connectionLost = null;
135
+ let startGeneration = 0;
136
+ const connectTimeoutMs = options.connectTimeoutMs ?? DEFAULT_CONNECT_TIMEOUT_MS;
137
+ const stopQueryTimeoutMs = options.stopQueryTimeoutMs ?? DEFAULT_STOP_QUERY_TIMEOUT_MS;
138
+ const policyResolution = resolveRowCapturePolicy(options.rowCapture);
139
+ const rowPolicy = policyResolution.ok ? policyResolution.policy : null;
92
140
  function computeCapabilities() {
93
141
  const unrelated = {
94
142
  availability: "unavailable",
@@ -98,9 +146,10 @@ export function createPostgresRowChangeCollector(options) {
98
146
  ? { availability: "unavailable", reason: refusalReason }
99
147
  : {
100
148
  availability: "available",
101
- reason: "row-level INSERT/UPDATE/DELETE via a temporary logical replication slot (test_decoding); " +
149
+ reason: `row-level INSERT/UPDATE/DELETE via a temporary logical replication slot${slot === null ? "" : ` "${slot}"`} (test_decoding); ` +
102
150
  "before-values are full only for tables with REPLICA IDENTITY FULL -- key-only or absent " +
103
- "otherwise, disclosed per row as beforeCompleteness.",
151
+ "otherwise, disclosed per row as beforeCompleteness. " +
152
+ (rowPolicy?.describe() ?? ""),
104
153
  };
105
154
  return {
106
155
  domObservation: unrelated,
@@ -116,7 +165,13 @@ export function createPostgresRowChangeCollector(options) {
116
165
  };
117
166
  }
118
167
  function emitRowChange(context, parsed, xid) {
168
+ if (rowPolicy !== null && !rowPolicy.allows(parsed.table, parsed.schema))
169
+ return;
119
170
  const completeness = identityByTable.get(`${parsed.schema}.${parsed.table}`) ?? "key-only";
171
+ const before = rowPolicy?.filterRow(parsed.before) ?? { row: parsed.before, withheld: [], truncated: [] };
172
+ const after = rowPolicy?.filterRow(parsed.after) ?? { row: parsed.after, withheld: [], truncated: [] };
173
+ const withheldColumns = mergeWithheld(before.withheld, after.withheld);
174
+ const truncatedColumns = mergeTruncated(before.truncated, after.truncated);
120
175
  context.emit({
121
176
  timestamp: new Date().toISOString(),
122
177
  source: "backend-process",
@@ -128,8 +183,10 @@ export function createPostgresRowChangeCollector(options) {
128
183
  schema: parsed.schema,
129
184
  table: parsed.table,
130
185
  op: parsed.op,
131
- before: parsed.before,
132
- after: parsed.after,
186
+ before: before.row,
187
+ after: after.row,
188
+ ...(withheldColumns.length > 0 ? { withheldColumns } : {}),
189
+ ...(truncatedColumns.length > 0 ? { truncatedColumns } : {}),
133
190
  xid: xid === undefined || xid === null ? null : String(xid),
134
191
  beforeCompleteness: completeness,
135
192
  },
@@ -172,14 +229,33 @@ export function createPostgresRowChangeCollector(options) {
172
229
  console.error(`[postgres-row-collector:${processId}] failed (${detail}) AND the failure could not be emitted: ${String(emitError)}`);
173
230
  }
174
231
  }
232
+ async function dropSlotExplicitly(activeClient, activeSlot) {
233
+ try {
234
+ await withinTimeout(activeClient.query("SELECT pg_drop_replication_slot($1)", [activeSlot]), DROP_SLOT_TIMEOUT_MS, `dropping the replication slot did not answer within ${DROP_SLOT_TIMEOUT_MS} ms`);
235
+ }
236
+ catch (error) {
237
+ if (isMissingSlotError(error))
238
+ return;
239
+ if (savedContext !== null) {
240
+ emitCollectorError(savedContext, `replication slot "${activeSlot}" could not be dropped explicitly (${describeError(error)}); it was created temporary and the server drops it when this connection closes`);
241
+ }
242
+ }
243
+ }
175
244
  async function closeClient() {
176
245
  if (client === null)
177
246
  return;
247
+ const closingClient = client;
248
+ const closingSlot = slot;
249
+ if (closingSlot !== null && connectionLost === null) {
250
+ await dropSlotExplicitly(closingClient, closingSlot);
251
+ }
178
252
  try {
179
- await client.end();
253
+ await closingClient.end();
180
254
  }
181
- catch {
182
- // Best-effort close -- the temporary slot drops on disconnect regardless.
255
+ catch (error) {
256
+ if (savedContext !== null) {
257
+ emitCollectorError(savedContext, `closing the database connection failed (${describeError(error)})`);
258
+ }
183
259
  }
184
260
  client = null;
185
261
  slot = null;
@@ -188,14 +264,28 @@ export function createPostgresRowChangeCollector(options) {
188
264
  collectorId: `postgres-row-collector:${processId}`,
189
265
  async start(context) {
190
266
  savedContext = context;
191
- let candidate;
267
+ if (!policyResolution.ok) {
268
+ refusalReason = policyResolution.reason;
269
+ return { available: false, reason: refusalReason };
270
+ }
271
+ let candidate = null;
272
+ connectionLost = null;
273
+ const generation = ++startGeneration;
192
274
  try {
193
275
  candidate = await clientFactory(options.connectionString);
194
- await candidate.connect();
276
+ const connecting = candidate;
277
+ connecting.on?.("error", (error) => {
278
+ if (generation !== startGeneration)
279
+ return;
280
+ connectionLost ??= describeError(error);
281
+ });
282
+ await withinTimeout(connecting.connect(), connectTimeoutMs, `did not connect within ${connectTimeoutMs} ms`);
195
283
  }
196
284
  catch (error) {
197
- const detail = error instanceof Error ? `${error.name}: ${error.message}` : String(error);
285
+ const detail = error instanceof OperationTimeoutError ? error.message : describeError(error);
198
286
  refusalReason = `could not connect for row-level capture (${detail}); the query-text channel is unaffected.`;
287
+ if (candidate !== null)
288
+ await candidate.end().catch(() => undefined);
199
289
  return { available: false, reason: refusalReason };
200
290
  }
201
291
  client = candidate;
@@ -227,7 +317,7 @@ export function createPostgresRowChangeCollector(options) {
227
317
  identityByTable.set(`${String(r.schema)}.${String(r.table)}`, replidentToCompleteness(r.identity));
228
318
  }
229
319
  slot = makeSlotName(processId);
230
- await client.query("SELECT * FROM pg_create_logical_replication_slot($1, 'test_decoding', false, true)", [slot]);
320
+ await client.query("SELECT * FROM pg_create_logical_replication_slot($1, 'test_decoding', true)", [slot]);
231
321
  return { available: true };
232
322
  }
233
323
  catch (error) {
@@ -244,7 +334,13 @@ export function createPostgresRowChangeCollector(options) {
244
334
  const activeSlot = slot;
245
335
  const context = savedContext;
246
336
  try {
247
- const changes = await activeClient.query("SELECT xid, data FROM pg_logical_slot_get_changes($1, NULL, NULL)", [activeSlot]);
337
+ if (connectionLost !== null) {
338
+ throw new Error(`the database connection was lost during the run (${connectionLost}); row changes in this window were not captured`);
339
+ }
340
+ const changes = await withinTimeout(activeClient.query("SELECT xid, data FROM pg_logical_slot_get_changes($1, NULL, $2)", [activeSlot, MAX_ROW_CHANGES_PER_STOP]), stopQueryTimeoutMs, `the replication slot did not answer within ${stopQueryTimeoutMs} ms`);
341
+ if (changes.rows.length >= MAX_ROW_CHANGES_PER_STOP && context !== null) {
342
+ emitCollectorError(context, `the window held at least ${MAX_ROW_CHANGES_PER_STOP} row changes; only the first ${MAX_ROW_CHANGES_PER_STOP} were read and the rest were not captured`);
343
+ }
248
344
  for (const row of changes.rows) {
249
345
  const data = String(row.data ?? "");
250
346
  const xid = row.xid;
@@ -256,7 +352,7 @@ export function createPostgresRowChangeCollector(options) {
256
352
  }
257
353
  }
258
354
  catch (error) {
259
- const detail = error instanceof Error ? `${error.name}: ${error.message}` : String(error);
355
+ const detail = error instanceof OperationTimeoutError || connectionLost !== null ? error.message : describeError(error);
260
356
  refusalReason = `could not read the replication slot: ${detail}`;
261
357
  if (context !== null)
262
358
  emitCollectorError(context, detail);
@@ -1 +1 @@
1
- {"version":3,"file":"postgres-row-collector.js","sourceRoot":"","sources":["../src/postgres-row-collector.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"postgres-row-collector.js","sourceRoot":"","sources":["../src/postgres-row-collector.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * `--import`-loaded preload: observes the SQL Prisma runs. Prisma's query engine is native code
3
+ * of its own, so nothing that watches `node:sqlite` or a Node driver sees its statements.
4
+ *
5
+ * **Mechanism: Prisma's own tracing hook, not a patch.** A Prisma client looks for a tracing
6
+ * helper on `globalThis` (`V<major>_PRISMA_INSTRUMENTATION`, then `PRISMA_INSTRUMENTATION`) --
7
+ * the seam `@prisma/instrumentation` uses to feed OpenTelemetry. This preload puts a minimal
8
+ * helper there: it asks the engine to trace (a sampled `traceparent`), runs every operation's
9
+ * callback unchanged, and turns each `prisma:engine:db_query` span the engine hands back into one
10
+ * `QUERY_MARKER` line. Both hand-back methods are implemented: `dispatchEngineSpans` (Prisma 6+)
11
+ * and `createEngineSpan` (Prisma 5, which also needs `previewFeatures = ["tracing"]` in the
12
+ * schema before its client uses any helper -- not ours to edit, so without it nothing is seen,
13
+ * and the caller discloses that).
14
+ *
15
+ * **It never displaces the application's own tracing.** If the app installs a helper later
16
+ * (its own OpenTelemetry setup), that helper is kept and this one forwards to it, observing
17
+ * alongside. A span's outcome is not carried, so every line is `outcomeKnown: false`.
18
+ */
19
+ export {};
20
+ //# sourceMappingURL=prisma-instrumentation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prisma-instrumentation.d.ts","sourceRoot":"","sources":["../src/prisma-instrumentation.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG"}
@@ -0,0 +1,99 @@
1
+ /**
2
+ * `--import`-loaded preload: observes the SQL Prisma runs. Prisma's query engine is native code
3
+ * of its own, so nothing that watches `node:sqlite` or a Node driver sees its statements.
4
+ *
5
+ * **Mechanism: Prisma's own tracing hook, not a patch.** A Prisma client looks for a tracing
6
+ * helper on `globalThis` (`V<major>_PRISMA_INSTRUMENTATION`, then `PRISMA_INSTRUMENTATION`) --
7
+ * the seam `@prisma/instrumentation` uses to feed OpenTelemetry. This preload puts a minimal
8
+ * helper there: it asks the engine to trace (a sampled `traceparent`), runs every operation's
9
+ * callback unchanged, and turns each `prisma:engine:db_query` span the engine hands back into one
10
+ * `QUERY_MARKER` line. Both hand-back methods are implemented: `dispatchEngineSpans` (Prisma 6+)
11
+ * and `createEngineSpan` (Prisma 5, which also needs `previewFeatures = ["tracing"]` in the
12
+ * schema before its client uses any helper -- not ours to edit, so without it nothing is seen,
13
+ * and the caller discloses that).
14
+ *
15
+ * **It never displaces the application's own tracing.** If the app installs a helper later
16
+ * (its own OpenTelemetry setup), that helper is kept and this one forwards to it, observing
17
+ * alongside. A span's outcome is not carried, so every line is `outcomeKnown: false`.
18
+ */
19
+ import { randomBytes } from "node:crypto";
20
+ import { QUERY_MARKER } from "./query-marker.js";
21
+ function emit(query) {
22
+ process.stdout.write(`${QUERY_MARKER} ${JSON.stringify(query)}\n`);
23
+ }
24
+ /** An OpenTelemetry HrTime (`[seconds, nanos]`) or a number of milliseconds, as milliseconds. */
25
+ function millis(time) {
26
+ if (Array.isArray(time) && typeof time[0] === "number" && typeof time[1] === "number")
27
+ return time[0] * 1000 + time[1] / 1e6;
28
+ return typeof time === "number" ? time : null;
29
+ }
30
+ /** One engine span onto a captured statement, or null for any span that is not a statement. */
31
+ function statementOf(span) {
32
+ if (typeof span !== "object" || span === null)
33
+ return null;
34
+ const s = span;
35
+ if (s["name"] !== "prisma:engine:db_query")
36
+ return null;
37
+ const attributes = (typeof s["attributes"] === "object" && s["attributes"] !== null ? s["attributes"] : {});
38
+ const sql = attributes["db.query.text"] ?? attributes["db.statement"];
39
+ if (typeof sql !== "string" || sql === "")
40
+ return null;
41
+ const start = millis(s["startTime"] ?? s["start_time"]);
42
+ const end = millis(s["endTime"] ?? s["end_time"]);
43
+ return { sql, method: "prisma", durationMs: start !== null && end !== null ? Math.max(0, end - start) : 0, success: true, error: null, outcomeKnown: false };
44
+ }
45
+ function observeSpans(spans) {
46
+ for (const span of spans ?? []) {
47
+ const statement = statementOf(span);
48
+ if (statement !== null)
49
+ emit(statement);
50
+ }
51
+ }
52
+ /** Ours, forwarding to `delegate` when the application installed its own. */
53
+ function helperOver(delegate) {
54
+ return {
55
+ isEnabled: () => true,
56
+ getTraceParent(context) {
57
+ const theirs = delegate();
58
+ // Theirs when present, so the app's own traces keep their ids; ours must be sampled
59
+ // (flags 01), or the engine records no spans.
60
+ if (theirs?.isEnabled() === true)
61
+ return theirs.getTraceParent(context);
62
+ return `00-${randomBytes(16).toString("hex")}-${randomBytes(8).toString("hex")}-01`;
63
+ },
64
+ getActiveContext: () => delegate()?.getActiveContext(),
65
+ runInChildSpan(nameOrOptions, callback) {
66
+ const theirs = delegate();
67
+ return theirs === undefined ? callback() : theirs.runInChildSpan(nameOrOptions, callback);
68
+ },
69
+ dispatchEngineSpans(spans) {
70
+ observeSpans(spans);
71
+ delegate()?.dispatchEngineSpans?.(spans);
72
+ },
73
+ createEngineSpan(event) {
74
+ observeSpans(event.spans);
75
+ delegate()?.createEngineSpan?.(event);
76
+ },
77
+ };
78
+ }
79
+ const PATCHED = Symbol.for("descry.database-observation.prisma-hooked");
80
+ const target = globalThis;
81
+ if (target[PATCHED] !== true) {
82
+ target[PATCHED] = true;
83
+ // Every major a client could look under, plus the unversioned key older clients read.
84
+ const keys = ["PRISMA_INSTRUMENTATION", ...[5, 6, 7, 8].map((major) => `V${major}_PRISMA_INSTRUMENTATION`)];
85
+ for (const key of keys) {
86
+ let appValue = target[key];
87
+ const ours = { helper: helperOver(() => appValue?.helper) };
88
+ Object.defineProperty(globalThis, key, {
89
+ configurable: true,
90
+ enumerable: false,
91
+ get: () => ours,
92
+ // The application's own instrumentation arriving later is kept, and forwarded to.
93
+ set(value) {
94
+ appValue = value;
95
+ },
96
+ });
97
+ }
98
+ }
99
+ //# sourceMappingURL=prisma-instrumentation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prisma-instrumentation.js","sourceRoot":"","sources":["../src/prisma-instrumentation.ts"],"names":[],"mappings":"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"}
@@ -19,6 +19,8 @@ import type { Collector } from "@descryy/runtime-contracts";
19
19
  import { type ProcessOutputSource } from "@descryy/runtime-backend-observation";
20
20
  /** Absolute path to the compiled preload, for a caller building `node --import <this> <app>`. Never imported directly -- loaded by Node itself, in the observed process, before that process's own code runs. */
21
21
  export declare const SQLITE_PRELOAD_MODULE_PATH: string;
22
+ /** The Prisma preload (`prisma-instrumentation.ts`), for a process whose database access goes through Prisma's own engine. Same `QUERY_MARKER` lines, read by the same collector. */
23
+ export declare const PRISMA_PRELOAD_MODULE_PATH: string;
22
24
  export interface DatabaseQueryCollectorOptions {
23
25
  readonly source: ProcessOutputSource;
24
26
  /** Which owned system this collector's evidence should be attributed to (plan §16.7). Null when not applicable. */
@@ -1 +1 @@
1
- {"version":3,"file":"query-collector.d.ts","sourceRoot":"","sources":["../src/query-collector.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAGH,OAAO,KAAK,EAAE,SAAS,EAAmF,MAAM,4BAA4B,CAAC;AAC7I,OAAO,EAAyB,KAAK,mBAAmB,EAAE,MAAM,sCAAsC,CAAC;AAMvG,iNAAiN;AACjN,eAAO,MAAM,0BAA0B,QAAyE,CAAC;AAEjH,MAAM,WAAW,6BAA6B;IAC5C,QAAQ,CAAC,MAAM,EAAE,mBAAmB,CAAC;IACrC,mHAAmH;IACnH,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;CAC3B;AAyBD,wBAAgB,4BAA4B,CAAC,OAAO,EAAE,6BAA6B,GAAG,SAAS,CAgG9F"}
1
+ {"version":3,"file":"query-collector.d.ts","sourceRoot":"","sources":["../src/query-collector.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAGH,OAAO,KAAK,EAAE,SAAS,EAAmF,MAAM,4BAA4B,CAAC;AAC7I,OAAO,EAA0E,KAAK,mBAAmB,EAAE,MAAM,sCAAsC,CAAC;AAOxJ,iNAAiN;AACjN,eAAO,MAAM,0BAA0B,QAAyE,CAAC;AAEjH,qLAAqL;AACrL,eAAO,MAAM,0BAA0B,QAAyE,CAAC;AAEjH,MAAM,WAAW,6BAA6B;IAC5C,QAAQ,CAAC,MAAM,EAAE,mBAAmB,CAAC;IACrC,mHAAmH;IACnH,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;CAC3B;AA8BD,wBAAgB,4BAA4B,CAAC,OAAO,EAAE,6BAA6B,GAAG,SAAS,CAqH9F"}
@@ -16,12 +16,15 @@
16
16
  * is real; this collector just isn't the one that calls it.
17
17
  */
18
18
  import { fileURLToPath } from "node:url";
19
- import { extractCorrelationIds } from "@descryy/runtime-backend-observation";
19
+ import { outputGapReason, outputGapEvidence, isOutputGap, extractCorrelationIds } from "@descryy/runtime-backend-observation";
20
20
  import { parseQueryLine } from "./query-line-parser.js";
21
21
  import { extractTargetTable } from "./table-extraction.js";
22
+ import { MAX_CAPTURED_STATEMENT_CHARS } from "./query-marker.js";
22
23
  import { COLLECTOR_VERSION } from "./collector-version.js";
23
24
  /** Absolute path to the compiled preload, for a caller building `node --import <this> <app>`. Never imported directly -- loaded by Node itself, in the observed process, before that process's own code runs. */
24
25
  export const SQLITE_PRELOAD_MODULE_PATH = fileURLToPath(new URL("./sqlite-instrumentation.js", import.meta.url));
26
+ /** The Prisma preload (`prisma-instrumentation.ts`), for a process whose database access goes through Prisma's own engine. Same `QUERY_MARKER` lines, read by the same collector. */
27
+ export const PRISMA_PRELOAD_MODULE_PATH = fileURLToPath(new URL("./prisma-instrumentation.js", import.meta.url));
25
28
  const EVENT_TYPE = "DATABASE_QUERY";
26
29
  function computeCapabilities() {
27
30
  const reason = "DatabaseQueryCollector observes DATABASE_QUERY events only.";
@@ -38,8 +41,12 @@ function computeCapabilities() {
38
41
  sourceMapping: status,
39
42
  stackCapture: status,
40
43
  processLifecycle: status,
41
- // RT-141 named this missing, deferred as RT-142 -- closed here (RT-146).
42
- databaseObservation: { availability: "available", reason: null },
44
+ databaseObservation: {
45
+ availability: "degraded",
46
+ reason: "queries are observed only through the node:sqlite and Prisma preloads; a process reaching its database through " +
47
+ "any other driver (pg, mysql2, better-sqlite3, Sequelize, Knex, TypeORM, or a non-Node runtime) produces no query " +
48
+ "evidence here, so an absence of queries is not evidence that none ran.",
49
+ },
43
50
  externalServiceObservation: { availability: "unavailable", reason: "DatabaseQueryCollector instruments node:sqlite only; outbound requests are ExternalRequestCollector's to observe (RT-146)." },
44
51
  };
45
52
  }
@@ -47,8 +54,11 @@ export function createDatabaseQueryCollector(options) {
47
54
  const capabilities = computeCapabilities();
48
55
  let consumeLoopDone;
49
56
  let consumptionFailure = null;
57
+ let droppedCharsTotal = 0;
50
58
  function emitCapturedQuery(query, context) {
51
- const { traceId, requestId } = extractCorrelationIds(query.sql);
59
+ const sqlTruncated = query.sql.length > MAX_CAPTURED_STATEMENT_CHARS || query.sqlTruncated === true;
60
+ const sql = query.sql.length > MAX_CAPTURED_STATEMENT_CHARS ? query.sql.slice(0, MAX_CAPTURED_STATEMENT_CHARS) : query.sql;
61
+ const { traceId, requestId } = extractCorrelationIds(sql);
52
62
  context.emit({
53
63
  timestamp: new Date().toISOString(),
54
64
  source: "backend-process",
@@ -56,12 +66,14 @@ export function createDatabaseQueryCollector(options) {
56
66
  process: options.source.processId,
57
67
  eventType: EVENT_TYPE,
58
68
  payload: {
59
- raw: query.sql,
69
+ raw: sql,
70
+ ...(sqlTruncated ? { rawTruncated: true } : {}),
60
71
  method: query.method,
61
72
  durationMs: query.durationMs,
62
73
  success: query.success,
63
74
  error: query.error,
64
- table: extractTargetTable(query.sql),
75
+ ...(query.outcomeKnown === false ? { outcomeKnown: false } : {}),
76
+ table: sqlTruncated ? null : extractTargetTable(sql),
65
77
  },
66
78
  traceId,
67
79
  requestId,
@@ -79,6 +91,17 @@ export function createDatabaseQueryCollector(options) {
79
91
  }
80
92
  async function consume(context) {
81
93
  for await (const line of options.source.lines) {
94
+ if (isOutputGap(line)) {
95
+ droppedCharsTotal += line.gap.droppedChars;
96
+ context.emit(outputGapEvidence({
97
+ collectorId: `database-query-collector:${options.source.processId}`,
98
+ collectorVersion: COLLECTOR_VERSION,
99
+ service: options.source.serviceName ?? options.service ?? null,
100
+ processId: options.source.processId,
101
+ droppedChars: line.gap.droppedChars,
102
+ }));
103
+ continue;
104
+ }
82
105
  const query = parseQueryLine(line.text);
83
106
  if (query !== null)
84
107
  emitCapturedQuery(query, context);
@@ -123,15 +146,17 @@ export function createDatabaseQueryCollector(options) {
123
146
  await consumeLoopDone;
124
147
  },
125
148
  capabilities() {
126
- if (consumptionFailure === null)
127
- return capabilities;
128
- return {
129
- ...capabilities,
130
- distributedTrace: {
149
+ if (consumptionFailure !== null) {
150
+ const stopped = {
131
151
  availability: "unavailable",
132
152
  reason: `consumption stopped early after an error (${consumptionFailure}); output after that point was never observed.`,
133
- },
134
- };
153
+ };
154
+ return { ...capabilities, distributedTrace: stopped, databaseObservation: stopped };
155
+ }
156
+ if (droppedCharsTotal > 0) {
157
+ return { ...capabilities, databaseObservation: { availability: "degraded", reason: outputGapReason(droppedCharsTotal) } };
158
+ }
159
+ return capabilities;
135
160
  },
136
161
  };
137
162
  }
@@ -1 +1 @@
1
- {"version":3,"file":"query-collector.js","sourceRoot":"","sources":["../src/query-collector.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"query-collector.js","sourceRoot":"","sources":["../src/query-collector.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"query-line-parser.d.ts","sourceRoot":"","sources":["../src/query-line-parser.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,OAAO,EAAE,YAAY,EAAE,KAAK,cAAc,EAAE,KAAK,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAc1F;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI,CAUjE;AAED,YAAY,EAAE,cAAc,EAAE,aAAa,EAAE,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,CAAC"}
1
+ {"version":3,"file":"query-line-parser.d.ts","sourceRoot":"","sources":["../src/query-line-parser.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,OAAO,EAAE,YAAY,EAAE,KAAK,cAAc,EAAE,KAAK,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAe1F;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI,CAUjE;AAED,YAAY,EAAE,cAAc,EAAE,aAAa,EAAE,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,CAAC"}
@@ -16,7 +16,8 @@ function isCapturedQuery(value) {
16
16
  typeof v.method === "string" &&
17
17
  typeof v.durationMs === "number" &&
18
18
  typeof v.success === "boolean" &&
19
- (v.error === null || typeof v.error === "string"));
19
+ (v.error === null || typeof v.error === "string") &&
20
+ (v.outcomeKnown === undefined || v.outcomeKnown === false));
20
21
  }
21
22
  /**
22
23
  * `null` for a non-matching line AND for a line that starts with the
@@ -1 +1 @@
1
- {"version":3,"file":"query-line-parser.js","sourceRoot":"","sources":["../src/query-line-parser.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,6EAA6E;AAC7E,2EAA2E;AAC3E,kEAAkE;AAClE,OAAO,EAAE,YAAY,EAA2C,MAAM,mBAAmB,CAAC;AAE1F,SAAS,eAAe,CAAC,KAAc;IACrC,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC;IAC9D,MAAM,CAAC,GAAG,KAAgC,CAAC;IAC3C,OAAO,CACL,OAAO,CAAC,CAAC,GAAG,KAAK,QAAQ;QACzB,OAAO,CAAC,CAAC,MAAM,KAAK,QAAQ;QAC5B,OAAO,CAAC,CAAC,UAAU,KAAK,QAAQ;QAChC,OAAO,CAAC,CAAC,OAAO,KAAK,SAAS;QAC9B,CAAC,CAAC,CAAC,KAAK,KAAK,IAAI,IAAI,OAAO,CAAC,CAAC,KAAK,KAAK,QAAQ,CAAC,CAClD,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAAC,IAAY;IACzC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,YAAY,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IACtD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACjD,IAAI,MAAe,CAAC;IACpB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC5B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;AACjD,CAAC;AAGD,OAAO,EAAE,YAAY,EAAE,CAAC"}
1
+ {"version":3,"file":"query-line-parser.js","sourceRoot":"","sources":["../src/query-line-parser.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,6EAA6E;AAC7E,2EAA2E;AAC3E,kEAAkE;AAClE,OAAO,EAAE,YAAY,EAA2C,MAAM,mBAAmB,CAAC;AAE1F,SAAS,eAAe,CAAC,KAAc;IACrC,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC;IAC9D,MAAM,CAAC,GAAG,KAAgC,CAAC;IAC3C,OAAO,CACL,OAAO,CAAC,CAAC,GAAG,KAAK,QAAQ;QACzB,OAAO,CAAC,CAAC,MAAM,KAAK,QAAQ;QAC5B,OAAO,CAAC,CAAC,UAAU,KAAK,QAAQ;QAChC,OAAO,CAAC,CAAC,OAAO,KAAK,SAAS;QAC9B,CAAC,CAAC,CAAC,KAAK,KAAK,IAAI,IAAI,OAAO,CAAC,CAAC,KAAK,KAAK,QAAQ,CAAC;QACjD,CAAC,CAAC,CAAC,YAAY,KAAK,SAAS,IAAI,CAAC,CAAC,YAAY,KAAK,KAAK,CAAC,CAC3D,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAAC,IAAY;IACzC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,YAAY,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IACtD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACjD,IAAI,MAAe,CAAC;IACpB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC5B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;AACjD,CAAC;AAGD,OAAO,EAAE,YAAY,EAAE,CAAC"}