fg-tracker-sdk 0.9.0 → 0.11.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 (75) hide show
  1. package/CHANGELOG.md +36 -0
  2. package/README.md +83 -10
  3. package/dist/context.d.ts +16 -0
  4. package/dist/context.d.ts.map +1 -1
  5. package/dist/context.js +27 -0
  6. package/dist/context.js.map +1 -1
  7. package/dist/database.d.ts.map +1 -1
  8. package/dist/database.js +34 -5
  9. package/dist/database.js.map +1 -1
  10. package/dist/exit-hooks.d.ts +23 -0
  11. package/dist/exit-hooks.d.ts.map +1 -0
  12. package/dist/exit-hooks.js +88 -0
  13. package/dist/exit-hooks.js.map +1 -0
  14. package/dist/express.js +2 -2
  15. package/dist/express.js.map +1 -1
  16. package/dist/fetch.d.ts.map +1 -1
  17. package/dist/fetch.js +16 -8
  18. package/dist/fetch.js.map +1 -1
  19. package/dist/global-errors.d.ts +8 -5
  20. package/dist/global-errors.d.ts.map +1 -1
  21. package/dist/global-errors.js +59 -10
  22. package/dist/global-errors.js.map +1 -1
  23. package/dist/index.d.ts +4 -2
  24. package/dist/index.d.ts.map +1 -1
  25. package/dist/index.js +14 -7
  26. package/dist/index.js.map +1 -1
  27. package/dist/infra/aggregator.d.ts +5 -0
  28. package/dist/infra/aggregator.d.ts.map +1 -1
  29. package/dist/infra/aggregator.js.map +1 -1
  30. package/dist/infra/aws.d.ts +45 -3
  31. package/dist/infra/aws.d.ts.map +1 -1
  32. package/dist/infra/aws.js +419 -29
  33. package/dist/infra/aws.js.map +1 -1
  34. package/dist/infra/lambda.d.ts +19 -0
  35. package/dist/infra/lambda.d.ts.map +1 -1
  36. package/dist/infra/lambda.js +63 -10
  37. package/dist/infra/lambda.js.map +1 -1
  38. package/dist/infra/messaging.d.ts +133 -0
  39. package/dist/infra/messaging.d.ts.map +1 -0
  40. package/dist/infra/messaging.js +366 -0
  41. package/dist/infra/messaging.js.map +1 -0
  42. package/dist/logs/shipper.d.ts +5 -4
  43. package/dist/logs/shipper.d.ts.map +1 -1
  44. package/dist/logs/shipper.js +170 -52
  45. package/dist/logs/shipper.js.map +1 -1
  46. package/dist/logs/types.d.ts +18 -2
  47. package/dist/logs/types.d.ts.map +1 -1
  48. package/dist/next.js +2 -2
  49. package/dist/next.js.map +1 -1
  50. package/dist/node-http.d.ts.map +1 -1
  51. package/dist/node-http.js +7 -3
  52. package/dist/node-http.js.map +1 -1
  53. package/dist/normalize.d.ts +32 -0
  54. package/dist/normalize.d.ts.map +1 -1
  55. package/dist/normalize.js +165 -10
  56. package/dist/normalize.js.map +1 -1
  57. package/dist/pg.d.ts +8 -3
  58. package/dist/pg.d.ts.map +1 -1
  59. package/dist/pg.js +512 -41
  60. package/dist/pg.js.map +1 -1
  61. package/dist/scrub.d.ts +5 -0
  62. package/dist/scrub.d.ts.map +1 -1
  63. package/dist/scrub.js +17 -1
  64. package/dist/scrub.js.map +1 -1
  65. package/dist/tracker.d.ts +109 -7
  66. package/dist/tracker.d.ts.map +1 -1
  67. package/dist/tracker.js +502 -95
  68. package/dist/tracker.js.map +1 -1
  69. package/dist/transport.d.ts +115 -0
  70. package/dist/transport.d.ts.map +1 -0
  71. package/dist/transport.js +323 -0
  72. package/dist/transport.js.map +1 -0
  73. package/dist/types.d.ts +61 -8
  74. package/dist/types.d.ts.map +1 -1
  75. package/package.json +4 -1
package/dist/pg.js CHANGED
@@ -1,8 +1,12 @@
1
+ import { AsyncResource } from 'node:async_hooks';
2
+ import { performance } from 'node:perf_hooks';
1
3
  import { databaseHost } from './database.js';
2
- import { normalizeSql } from './normalize.js';
4
+ import { databaseErrorAttributes, sqlCommandText, sqlSpanFields } from './normalize.js';
5
+ import { MIN_POOL_WAIT_MS } from './pool-wait.js';
3
6
  const PATCHED = Symbol.for('fg-tracker.pg.patched');
4
7
  /** Marca usada pelo `stread-track-sdk` ≤ 0.3: evita instrumentar duas vezes quando as duas versões convivem. */
5
8
  const LEGACY_PATCHED = Symbol.for('stread-track.pg.patched');
9
+ const CLIENT_PATCHED = Symbol.for('fg-tracker.pg.clientPatched');
6
10
  function extractSql(arg) {
7
11
  if (typeof arg === 'string')
8
12
  return arg;
@@ -21,10 +25,205 @@ function rowCount(result) {
21
25
  }
22
26
  return null;
23
27
  }
28
+ function roundMs(value) {
29
+ return Math.round(value * 10) / 10;
30
+ }
31
+ function recordDbError(span, err) {
32
+ span.setError(err);
33
+ for (const [key, value] of Object.entries(databaseErrorAttributes(err)))
34
+ span.setAttribute(key, value);
35
+ }
36
+ /**
37
+ * Troca o callback da query, venha ele no último argumento (`query(text, values, cb)`) ou no
38
+ * objeto de configuração (`query({ text, callback })`, que o `pg` também aceita), pelo devolvido por
39
+ * `wrap`. O objeto do usuário não é alterado (vai uma cópia). `false` quando não há callback.
40
+ */
41
+ function wrapCallback(args, wrap,
42
+ /** `pool.query` ignora `config.callback` (devolve Promise): só o `Client` o usa. */
43
+ configCallback) {
44
+ const last = args[args.length - 1];
45
+ if (typeof last === 'function') {
46
+ args[args.length - 1] = wrap(last);
47
+ return true;
48
+ }
49
+ const config = args[0];
50
+ // `query(config)` ou `query(config, values)`: com uma função em outro argumento, ela vence (o `pg` faz igual).
51
+ const onlyValues = args.length === 1 || (args.length === 2 && typeof args[1] !== 'function');
52
+ if (configCallback && onlyValues && config && typeof config === 'object' && typeof config.submit !== 'function') {
53
+ const callback = config.callback;
54
+ if (typeof callback === 'function') {
55
+ args[0] = { ...config, callback: wrap(callback) };
56
+ return true;
57
+ }
58
+ }
59
+ return false;
60
+ }
61
+ /**
62
+ * Executa uma query dentro de um span `db.query` (nome = SQL normalizado; `rows`, fingerprint,
63
+ * semconv). Suporta as assinaturas (text), (config), (text, values), (text, cb) e (text, values, cb).
64
+ * `onSettled` roda depois da query, com o erro (ou `undefined`) e o resultado.
65
+ */
66
+ function runQuery(core, original, args, sql, baseAttributes, parent, onStart, onSettled,
67
+ /** Query de um `Client`: o callback pode vir em `config.callback`. */
68
+ clientQuery = false) {
69
+ const fields = sqlSpanFields(sql);
70
+ const span = core.startSpan('db.query', fields.name, { rows: null, ...baseAttributes, ...fields.attributes }, parent);
71
+ onStart?.(span);
72
+ const settle = (err, result) => {
73
+ if (err)
74
+ recordDbError(span, err);
75
+ else
76
+ span.setAttribute('rows', rowCount(result));
77
+ span.end();
78
+ try {
79
+ onSettled?.(err, result);
80
+ }
81
+ catch {
82
+ /* acompanhamento de transação nunca quebra a query */
83
+ }
84
+ };
85
+ // O pg chama o callback no contexto do socket (o de quem abriu a conexão): volta ao de quem
86
+ // enviou a query, para a finalização e o código do usuário.
87
+ const withCallback = wrapCallback(args, (cb) => AsyncResource.bind((err, result) => {
88
+ settle(err, result);
89
+ cb(err, result);
90
+ }), clientQuery);
91
+ if (withCallback)
92
+ return core.runInSpan(span, () => original(...args));
93
+ let out;
94
+ try {
95
+ out = core.runInSpan(span, () => original(...args));
96
+ }
97
+ catch (err) {
98
+ settle(err, undefined);
99
+ throw err;
100
+ }
101
+ if (out && typeof out.then === 'function') {
102
+ return out.then((result) => {
103
+ settle(undefined, result);
104
+ return result;
105
+ }, (err) => {
106
+ settle(err, undefined);
107
+ throw err;
108
+ });
109
+ }
110
+ settle(undefined, out);
111
+ return out;
112
+ }
113
+ /** BEGIN/START TRANSACTION abrem; COMMIT/END fecham; ROLLBACK/ABORT (não `ROLLBACK TO`) desfazem. */
114
+ function transactionCommand(sql) {
115
+ const head = sql.replace(/^\s*(?:--[^\n]*\n\s*|\/\*[\s\S]*?\*\/\s*)*/, '').slice(0, 40).toLowerCase();
116
+ if (/^(begin|start\s+transaction)\b/.test(head))
117
+ return 'begin';
118
+ if (/^(commit|end)\b/.test(head) && !/^commit\s+prepared\b/.test(head))
119
+ return 'commit';
120
+ if (/^(rollback|abort)\b/.test(head) && !/^rollback\s+(to|prepared)\b/.test(head))
121
+ return 'rollback';
122
+ return null;
123
+ }
124
+ /** Comandos do texto (separados por `;`, ignorando literais e comentários) e os de transação, em ordem. */
125
+ function sqlStatements(sql) {
126
+ const statements = sqlCommandText(sql).split(';').filter((statement) => statement.trim());
127
+ const transaction = [];
128
+ for (const statement of statements) {
129
+ const command = transactionCommand(statement);
130
+ if (command)
131
+ transaction.push(command);
132
+ }
133
+ return { count: statements.length, transaction };
134
+ }
135
+ /**
136
+ * Estado da transação no servidor depois da última resposta (`ReadyForQuery`): `I` fora de
137
+ * transação, `T` dentro, `E` dentro e abortada. Vem de `getTransactionStatus()` quando o `pg` o tem
138
+ * e, nas versões sem o método, do `ReadyForQuery` da conexão (observado em `patchClient`).
139
+ * `undefined` quando nenhum dos dois existe (client compatível): cai no texto da query.
140
+ */
141
+ function serverTransactionStatus(client, observed) {
142
+ if (typeof client.getTransactionStatus === 'function') {
143
+ try {
144
+ const status = client.getTransactionStatus();
145
+ if (typeof status === 'string')
146
+ return status;
147
+ }
148
+ catch {
149
+ /* cai no observado */
150
+ }
151
+ }
152
+ return observed;
153
+ }
154
+ /** SQLSTATE de erro de sintaxe: o texto inteiro é recusado antes de qualquer comando rodar. */
155
+ const SYNTAX_ERROR = '42601';
156
+ function errorCode(err) {
157
+ return typeof err === 'object' && err !== null ? err.code : undefined;
158
+ }
159
+ /** Texto de um prepared statement executado só pelo nome, como o `pg` o guardou na conexão. */
160
+ function preparedText(client, config) {
161
+ const name = config && typeof config === 'object' ? config.name : undefined;
162
+ if (typeof name !== 'string' || !name)
163
+ return null;
164
+ const connection = client.connection;
165
+ for (const store of [connection?.parsedStatements, connection?.submittedNamedStatements]) {
166
+ const text = store && Object.hasOwn(store, name) ? store[name] : undefined;
167
+ if (typeof text === 'string' && text)
168
+ return text;
169
+ }
170
+ return null;
171
+ }
172
+ /** Comando da última resposta (`pg` devolve um array com vários comandos num texto só). */
173
+ function answeredCommand(result) {
174
+ const last = Array.isArray(result) ? result[result.length - 1] : result;
175
+ return last?.command;
176
+ }
177
+ /**
178
+ * Acompanha uma query sem SQL em texto (prepared statement executado só pelo nome,
179
+ * `client.query({ name })`): sem span, só para a transação seguir o estado do servidor.
180
+ */
181
+ function observeQuery(original, args, onSettled) {
182
+ const settle = (err, result) => {
183
+ try {
184
+ onSettled(err, result);
185
+ }
186
+ catch {
187
+ /* acompanhamento nunca quebra a query */
188
+ }
189
+ };
190
+ const withCallback = wrapCallback(args, (cb) => AsyncResource.bind((err, result) => {
191
+ settle(err, result);
192
+ cb(err, result);
193
+ }), true);
194
+ if (withCallback)
195
+ return original(...args);
196
+ const out = original(...args);
197
+ if (out && typeof out.then === 'function') {
198
+ return out.then((result) => {
199
+ settle(undefined, result);
200
+ return result;
201
+ }, (err) => {
202
+ settle(err, undefined);
203
+ throw err;
204
+ });
205
+ }
206
+ return out;
207
+ }
208
+ function poolStats(pool) {
209
+ const out = {};
210
+ if (typeof pool.totalCount === 'number')
211
+ out['db.pool.total'] = pool.totalCount;
212
+ if (typeof pool.idleCount === 'number')
213
+ out['db.pool.idle'] = pool.idleCount;
214
+ if (typeof pool.waitingCount === 'number')
215
+ out['db.pool.waiting'] = pool.waitingCount;
216
+ return out;
217
+ }
24
218
  /**
25
- * Monkey-patch de `pool.query` (pg.Pool ou compatível). Cada query vira um
26
- * span `db.query` com o nome = SQL normalizado e `attributes.rows`.
27
- * Suporta as assinaturas (text), (config), (text, values), (text, cb) e (text, values, cb).
219
+ * Instrumenta um `pg.Pool` (ou objeto compatível):
220
+ * - `pool.query`: span `db.query` com SQL normalizado, `rows`, `db.query.fingerprint` e, quando
221
+ * a espera por conexão passa de 1 ms, `db.poolWaitMs`;
222
+ * - `pool.connect()`: span `custom` `pg connect` com a espera por conexão (`db.poolWaitMs`) e a
223
+ * ocupação do pool; o client devolvido também gera spans `db.query`;
224
+ * - transação num client (`BEGIN` … `COMMIT`/`ROLLBACK`): span `custom` `pg transaction`, pai das
225
+ * queries dela, com `db.transaction.outcome` (`commit`, `rollback` ou `released_open` quando o
226
+ * client volta ao pool com a transação aberta).
28
227
  */
29
228
  export function instrumentPgPool(core, pool) {
30
229
  const target = pool;
@@ -37,49 +236,321 @@ export function instrumentPgPool(core, pool) {
37
236
  const original = pool.query.bind(pool);
38
237
  const poolOptions = pool.options;
39
238
  const host = databaseHost(poolOptions?.host) ?? databaseHost(poolOptions?.connectionString);
40
- target.query = function fgTrackerQuery(...args) {
41
- if (!core.enabled || !core.currentContext())
42
- return original(...args);
43
- const sql = extractSql(args[0]);
44
- if (!sql)
45
- return original(...args);
46
- const span = core.startSpan('db.query', normalizeSql(sql), { rows: null, db: 'postgres', 'db.system': 'postgresql', ...(host ? { 'db.host': host } : {}) });
47
- const last = args[args.length - 1];
48
- if (typeof last === 'function') {
49
- const cb = last;
50
- args[args.length - 1] = (err, result) => {
51
- if (err)
52
- span.setError(err);
53
- else
54
- span.setAttribute('rows', rowCount(result));
55
- span.end();
56
- cb(err, result);
57
- };
58
- return core.runInSpan(span, () => original(...args));
239
+ const baseAttributes = { db: 'postgres', 'db.system': 'postgresql', ...(host ? { 'db.host': host } : {}) };
240
+ const states = new WeakMap();
241
+ const stateOf = (client) => {
242
+ let state = states.get(client);
243
+ if (!state) {
244
+ state = { tx: null, internal: false, pending: 0, seq: 0, txSeq: 0, closingSeq: 0 };
245
+ states.set(client, state);
59
246
  }
60
- let out;
61
- try {
62
- out = core.runInSpan(span, () => original(...args));
247
+ return state;
248
+ };
249
+ /**
250
+ * `pool.query` chama `this.connect(cb)` de forma síncrona: enquanto ele roda, um `connect` é do
251
+ * próprio pool. O span da query recebe a espera (`db.poolWaitMs`) em vez de um span `pg connect`.
252
+ */
253
+ let poolQuery = null;
254
+ const endTransaction = (state, outcome, err) => {
255
+ const tx = state.tx;
256
+ if (!tx)
257
+ return;
258
+ state.tx = null;
259
+ state.closingSeq = 0;
260
+ tx.setAttribute('db.transaction.outcome', outcome);
261
+ if (err)
262
+ recordDbError(tx, err);
263
+ tx.end();
264
+ };
265
+ /**
266
+ * Fecha ou abre o span da transação depois de uma query. Fonte primária: o estado que o servidor
267
+ * devolve no `ReadyForQuery` (`getTransactionStatus()`, nas versões do `pg` que o têm). Plano B, para drivers sem o
268
+ * método e para erros (o callback de erro do `pg` roda antes do `ReadyForQuery`, com o estado
269
+ * anterior): todos os comandos de transação do texto, em ordem.
270
+ */
271
+ const settleTransaction = (client, state, sql, err, result,
272
+ /** Abre o span da transação no contexto de quem enviou a query; `null` fora de um trace. */
273
+ startTx,
274
+ /** O span da transação foi aberto por esta query (o texto começa com BEGIN). */
275
+ openedHere,
276
+ /** Ordem de envio desta query (`state.seq` no envio). */
277
+ seq) => {
278
+ // Query enviada antes do BEGIN que abriu a transação atual (fila do `pg`): o estado que a
279
+ // resposta dela traz é de antes da transação e não a fecha.
280
+ if (state.tx && seq < state.txSeq)
281
+ return;
282
+ const open = (start) => {
283
+ state.tx = start();
284
+ state.txSeq = seq;
285
+ };
286
+ const outcomeFor = (last) => {
287
+ if (err)
288
+ return last === 'commit' ? 'commit_failed' : last === 'begin' ? 'begin_failed' : 'rollback';
289
+ const answered = answeredCommand(result);
290
+ return answered === 'ROLLBACK' || (answered !== 'COMMIT' && last === 'rollback') ? 'rollback' : 'commit';
291
+ };
292
+ const statements = sqlStatements(sql);
293
+ const last = statements.transaction[statements.transaction.length - 1] ?? null;
294
+ const status = serverTransactionStatus(client, state.observedStatus);
295
+ // Erro com o `ReadyForQuery` ainda por chegar: o estado do servidor é o de antes da query.
296
+ const stale = err !== undefined && err !== null && client.readyForQuery === false;
297
+ const connection = client.connection;
298
+ const canAwaitServer = stale && typeof connection?.once === 'function';
299
+ if (status !== undefined && !stale) {
300
+ if (status === 'I' && state.tx)
301
+ endTransaction(state, outcomeFor(last), err);
302
+ else if (status !== 'I' && !state.tx && startTx)
303
+ open(startTx); // `SELECT 1; BEGIN`, BEGIN preparado
304
+ return;
63
305
  }
64
- catch (err) {
65
- span.setError(err);
66
- span.end();
67
- throw err;
306
+ if (statements.transaction.length > 0) {
307
+ if (!err) {
308
+ // Sem erro, todos os comandos rodaram: vale o efeito do último.
309
+ if (last === 'begin') {
310
+ if (!state.tx && startTx)
311
+ open(startTx);
312
+ }
313
+ else if (state.tx) {
314
+ endTransaction(state, outcomeFor(last), err);
315
+ }
316
+ }
317
+ else if (errorCode(err) === SYNTAX_ERROR) {
318
+ // Erro de sintaxe: o Postgres analisa o texto inteiro antes de executar, então nenhum
319
+ // comando rodou e o estado do servidor é o de antes. Só a transação que esta query abriu
320
+ // (o BEGIN dela) deixa de existir.
321
+ if (openedHere && state.tx)
322
+ endTransaction(state, 'begin_failed', err);
323
+ }
324
+ else if (last === 'commit' || last === 'rollback') {
325
+ // COMMIT que falha termina a transação; com vários comandos não se sabe qual falhou, e
326
+ // fechar é o lado seguro (mantida aberta, a próxima requisição herdaria o trace).
327
+ if (state.tx)
328
+ endTransaction(state, outcomeFor(last), err);
329
+ }
330
+ else if (state.tx && statements.count === 1) {
331
+ endTransaction(state, 'begin_failed', err); // só `BEGIN`, e ele falhou
332
+ }
333
+ // Outro erro num texto que termina com BEGIN: o BEGIN rodou e o comando seguinte falhou, então a
334
+ // transação está abortada (`E`) e continua aberta até o ROLLBACK.
68
335
  }
69
- if (out && typeof out.then === 'function') {
70
- return out.then((result) => {
71
- span.setAttribute('rows', rowCount(result));
72
- span.end();
73
- return result;
74
- }, (err) => {
75
- span.setError(err);
76
- span.end();
77
- throw err;
336
+ // Erro com o servidor ainda por responder: confere o estado quando o `ReadyForQuery` chegar
337
+ // (o estado observado é atualizado na frente de qualquer listener).
338
+ if (canAwaitServer) {
339
+ const current = state.tx;
340
+ try {
341
+ connection.once('readyForQuery', () => {
342
+ // Só a transação desta query: um BEGIN enviado depois já abriu outra.
343
+ if (!current || state.tx !== current)
344
+ return;
345
+ const now = serverTransactionStatus(client, state.observedStatus);
346
+ if (now === 'I')
347
+ endTransaction(state, outcomeFor(last), err);
348
+ });
349
+ }
350
+ catch {
351
+ /* sem o evento, fica o que o texto decidiu */
352
+ }
353
+ }
354
+ };
355
+ const patchClient = (client) => {
356
+ if (!client || typeof client.query !== 'function' || client[CLIENT_PATCHED])
357
+ return;
358
+ client[CLIENT_PATCHED] = true;
359
+ // Conexão encerrada (`client.end()`, queda, término pelo servidor): o Postgres desfaz a
360
+ // transação aberta; o span fecha junto, senão ficaria retido no tracker para sempre.
361
+ if (typeof client.once === 'function') {
362
+ try {
363
+ client.once('end', () => {
364
+ const state = states.get(client);
365
+ if (state?.tx)
366
+ endTransaction(state, 'connection_closed');
367
+ });
368
+ }
369
+ catch {
370
+ /* sem o evento, a transação fecha pela próxima query ou pelo release */
371
+ }
372
+ }
373
+ // Estado do servidor em cada `ReadyForQuery`, na frente do listener do próprio client (que
374
+ // resolve a query): vale para as versões do `pg` sem `getTransactionStatus()`.
375
+ const connection = client.connection;
376
+ if (typeof connection?.prependListener === 'function') {
377
+ try {
378
+ connection.prependListener('readyForQuery', (msg) => {
379
+ const status = msg?.status;
380
+ if (typeof status === 'string')
381
+ stateOf(client).observedStatus = status;
382
+ });
383
+ }
384
+ catch {
385
+ /* sem o evento, fica o texto */
386
+ }
387
+ }
388
+ const clientQuery = client.query.bind(client);
389
+ client.query = function fgTrackerClientQuery(...args) {
390
+ const state = stateOf(client);
391
+ if (!core.enabled || state.internal)
392
+ return clientQuery(...args);
393
+ // Rede de segurança: sem query em voo e com o servidor fora de transação, uma transação que
394
+ // ainda conste aberta terminou por um caminho não observado; não pode virar pai desta query.
395
+ if (state.tx && state.pending === 0 && client.readyForQuery !== false && serverTransactionStatus(client, state.observedStatus) === 'I') {
396
+ endTransaction(state, 'unobserved_end');
397
+ }
398
+ // Prepared statement executado só pelo nome: o texto é o que o `pg` guardou ao prepará-lo nesta
399
+ // conexão (`connection.parsedStatements`), e a query segue o caminho normal (span, transação).
400
+ const sql = extractSql(args[0]) ?? preparedText(client, args[0]);
401
+ // O contexto de quem envia a query: o callback do pg roda no contexto do socket, que pode ser
402
+ // o da requisição que abriu a conexão.
403
+ const sender = core.currentContext();
404
+ const startTx = sender ? () => core.startSpan('custom', 'pg transaction', { ...baseAttributes, 'db.operation.name': 'transaction' }, sender) : null;
405
+ if (!sql) {
406
+ // Sem texto conhecido (client compatível, nome preparado fora desta conexão): sem span, mas um
407
+ // BEGIN, COMMIT ou ROLLBACK preparado abre ou termina a transação pelo estado do servidor.
408
+ if (!state.tx && !startTx)
409
+ return clientQuery(...args);
410
+ const seq = ++state.seq;
411
+ state.pending += 1;
412
+ return observeQuery(clientQuery, args, (err, result) => {
413
+ state.pending = Math.max(0, state.pending - 1);
414
+ settleTransaction(client, state, '', err, result, startTx, false, seq);
415
+ });
416
+ }
417
+ const command = transactionCommand(sql);
418
+ const seq = ++state.seq;
419
+ const openedHere = command === 'begin' && !state.tx && !!startTx;
420
+ if (openedHere) {
421
+ state.tx = startTx();
422
+ state.txSeq = seq;
423
+ }
424
+ // Com um COMMIT/ROLLBACK da transação já a caminho, esta query roda depois dele, fora dela.
425
+ const tx = state.tx && state.closingSeq === 0 ? state.tx : null;
426
+ const parent = tx ? tx.context() : core.currentContext();
427
+ if (!parent)
428
+ return clientQuery(...args);
429
+ // Inclusive no texto que abre e fecha a transação no mesmo envio (`BEGIN; …; COMMIT`).
430
+ if (tx) {
431
+ const statements = sqlStatements(sql);
432
+ const last = statements.transaction[statements.transaction.length - 1];
433
+ if (last === 'commit' || last === 'rollback')
434
+ state.closingSeq = seq;
435
+ }
436
+ state.pending += 1;
437
+ return runQuery(core, clientQuery, args, sql, baseAttributes, parent, undefined, (err, result) => {
438
+ state.pending = Math.max(0, state.pending - 1);
439
+ settleTransaction(client, state, sql, err, result, startTx, openedHere, seq);
440
+ // Respondido sem fechar a transação (erro de sintaxe, por exemplo): ela continua sendo o pai.
441
+ if (state.closingSeq === seq)
442
+ state.closingSeq = 0;
443
+ }, true);
444
+ };
445
+ };
446
+ /** Envolve o `release` desta retirada (o pool troca a função a cada `connect`). */
447
+ const wrapRelease = (client, state) => {
448
+ const release = client.release;
449
+ if (typeof release !== 'function')
450
+ return;
451
+ client.release = function fgTrackerRelease(...args) {
452
+ state.internal = false;
453
+ if (state.tx)
454
+ endTransaction(state, 'released_open', args[0] instanceof Error ? args[0] : undefined);
455
+ client.release = release;
456
+ return Reflect.apply(release, this, args);
457
+ };
458
+ };
459
+ // `pg.Client` avulso (sem contadores de pool): as queries dele, com transações, como num client do pool.
460
+ if (typeof pool.totalCount !== 'number' && typeof pool.idleCount !== 'number') {
461
+ patchClient(target);
462
+ target[PATCHED] = true;
463
+ return pool;
464
+ }
465
+ target.query = function fgTrackerQuery(...args) {
466
+ const sql = core.enabled ? extractSql(args[0]) : null;
467
+ const tracked = sql !== null && !!core.currentContext();
468
+ const marker = { span: null };
469
+ const previous = poolQuery;
470
+ poolQuery = marker;
471
+ try {
472
+ if (!tracked)
473
+ return original(...args);
474
+ return runQuery(core, original, args, sql, baseAttributes, undefined, (span) => {
475
+ marker.span = span;
78
476
  });
79
477
  }
80
- span.end();
81
- return out;
478
+ finally {
479
+ poolQuery = previous;
480
+ }
82
481
  };
482
+ if (typeof target.connect === 'function') {
483
+ const originalConnect = target.connect.bind(pool);
484
+ target.connect = function fgTrackerPgConnect(...args) {
485
+ if (!core.enabled)
486
+ return originalConnect(...args);
487
+ const internal = poolQuery;
488
+ const started = performance.now();
489
+ const callback = typeof args[0] === 'function' ? args[0] : undefined;
490
+ if (internal) {
491
+ // Conexão do próprio `pool.query`: marca o client e passa a espera ao span da query.
492
+ if (!callback)
493
+ return originalConnect(...args);
494
+ return originalConnect((err, client, done) => {
495
+ if (!err && client && typeof client === 'object') {
496
+ const state = stateOf(client);
497
+ state.internal = true;
498
+ wrapRelease(client, state);
499
+ const waitMs = roundMs(performance.now() - started);
500
+ if (internal.span && waitMs >= MIN_POOL_WAIT_MS)
501
+ internal.span.setAttribute('db.poolWaitMs', waitMs);
502
+ }
503
+ callback(err, client, done);
504
+ });
505
+ }
506
+ const span = core.currentContext()
507
+ ? core.startSpan('custom', 'pg connect', { ...baseAttributes, 'db.operation.name': 'connect', ...poolStats(pool) })
508
+ : null;
509
+ const acquired = (err, client) => {
510
+ if (client && typeof client === 'object' && !err) {
511
+ const state = stateOf(client);
512
+ state.internal = false;
513
+ patchClient(client);
514
+ wrapRelease(client, state);
515
+ }
516
+ if (!span)
517
+ return;
518
+ span.setAttribute('db.poolWaitMs', roundMs(performance.now() - started));
519
+ if (err)
520
+ recordDbError(span, err);
521
+ span.end();
522
+ };
523
+ if (callback) {
524
+ // O pool chama o callback no contexto de quem liberou a conexão: volta ao de quem pediu.
525
+ const bound = AsyncResource.bind(callback);
526
+ return originalConnect((err, client, done) => {
527
+ acquired(err, client);
528
+ // O pool passa o `release` desta retirada como `done`, capturado antes da troca: quem
529
+ // libera por ele também precisa fechar a transação aberta.
530
+ const release = client && typeof client === 'object' ? client.release : undefined;
531
+ bound(err, client, typeof release === 'function' && typeof done === 'function' ? release : done);
532
+ });
533
+ }
534
+ let out;
535
+ try {
536
+ out = originalConnect(...args);
537
+ }
538
+ catch (err) {
539
+ acquired(err, undefined);
540
+ throw err;
541
+ }
542
+ if (out && typeof out.then === 'function') {
543
+ return out.then((client) => {
544
+ acquired(undefined, client);
545
+ return client;
546
+ }, (err) => {
547
+ acquired(err, undefined);
548
+ throw err;
549
+ });
550
+ }
551
+ return out;
552
+ };
553
+ }
83
554
  target[PATCHED] = true;
84
555
  return pool;
85
556
  }
package/dist/pg.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"pg.js","sourceRoot":"","sources":["../src/pg.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAG9C,MAAM,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;AACpD,gHAAgH;AAChH,MAAM,cAAc,GAAG,MAAM,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC;AAE7D,SAAS,UAAU,CAAC,GAAY;IAC9B,IAAI,OAAO,GAAG,KAAK,QAAQ;QAAE,OAAO,GAAG,CAAC;IACxC,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI,IAAI,OAAQ,GAA0B,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QACpG,OAAQ,GAAwB,CAAC,IAAI,CAAC;IACxC,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,QAAQ,CAAC,MAAe;IAC/B,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;QAClD,MAAM,CAAC,GAAG,MAAgD,CAAC;QAC3D,IAAI,OAAO,CAAC,CAAC,QAAQ,KAAK,QAAQ;YAAE,OAAO,CAAC,CAAC,QAAQ,CAAC;QACtD,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC;YAAE,OAAO,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC;IAClD,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,gBAAgB,CAAuB,IAAiB,EAAE,IAAO;IAC/E,MAAM,MAAM,GAAG,IAA+D,CAAC;IAC/E,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,MAAM,CAAC,cAAc,CAAC;QAAE,OAAO,IAAI,CAAC;IAC3D,IAAI,OAAO,IAAI,CAAC,KAAK,KAAK,UAAU,EAAE,CAAC;QACrC,OAAO,CAAC,IAAI,CAAC,iEAAiE,CAAC,CAAC;QAChF,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAoC,CAAC;IAC1E,MAAM,WAAW,GAAI,IAAgF,CAAC,OAAO,CAAC;IAC9G,MAAM,IAAI,GAAG,YAAY,CAAC,WAAW,EAAE,IAAI,CAAC,IAAI,YAAY,CAAC,WAAW,EAAE,gBAAgB,CAAC,CAAC;IAE5F,MAAM,CAAC,KAAK,GAAG,SAAS,cAAc,CAAgB,GAAG,IAAe;QACtE,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE;YAAE,OAAO,QAAQ,CAAC,GAAG,IAAI,CAAC,CAAC;QACtE,MAAM,GAAG,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QAChC,IAAI,CAAC,GAAG;YAAE,OAAO,QAAQ,CAAC,GAAG,IAAI,CAAC,CAAC;QAEnC,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,UAAU,EAAE,YAAY,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,UAAU,EAAE,WAAW,EAAE,YAAY,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QAC5J,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAEnC,IAAI,OAAO,IAAI,KAAK,UAAU,EAAE,CAAC;YAC/B,MAAM,EAAE,GAAG,IAAgD,CAAC;YAC5D,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC,GAAY,EAAE,MAAgB,EAAE,EAAE;gBACzD,IAAI,GAAG;oBAAE,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;;oBACvB,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;gBACjD,IAAI,CAAC,GAAG,EAAE,CAAC;gBACX,EAAE,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;YAClB,CAAC,CAAC;YACF,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;QACvD,CAAC;QAED,IAAI,GAAY,CAAC;QACjB,IAAI,CAAC;YACH,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;QACtD,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;YACnB,IAAI,CAAC,GAAG,EAAE,CAAC;YACX,MAAM,GAAG,CAAC;QACZ,CAAC;QACD,IAAI,GAAG,IAAI,OAAQ,GAAwB,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;YAChE,OAAQ,GAAwB,CAAC,IAAI,CACnC,CAAC,MAAM,EAAE,EAAE;gBACT,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;gBAC5C,IAAI,CAAC,GAAG,EAAE,CAAC;gBACX,OAAO,MAAM,CAAC;YAChB,CAAC,EACD,CAAC,GAAG,EAAE,EAAE;gBACN,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;gBACnB,IAAI,CAAC,GAAG,EAAE,CAAC;gBACX,MAAM,GAAG,CAAC;YACZ,CAAC,CACF,CAAC;QACJ,CAAC;QACD,IAAI,CAAC,GAAG,EAAE,CAAC;QACX,OAAO,GAAG,CAAC;IACb,CAAe,CAAC;IAEhB,MAAM,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC;IACvB,OAAO,IAAI,CAAC;AACd,CAAC"}
1
+ {"version":3,"file":"pg.js","sourceRoot":"","sources":["../src/pg.ts"],"names":[],"mappings":"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"}
package/dist/scrub.d.ts CHANGED
@@ -8,4 +8,9 @@ export declare function shouldScrub(key: string, fields: string[]): boolean;
8
8
  export declare function scrubValue(value: unknown, fields: string[], depth?: number): unknown;
9
9
  export declare function scrubAttributes(attributes: Record<string, unknown>, fields: string[]): Record<string, unknown>;
10
10
  export declare function matchesAny(value: string, patterns: (string | RegExp)[] | undefined): boolean;
11
+ /**
12
+ * `RegExp.test` sem depender de estado: com flag `g` ou `y`, `test` começa em `lastIndex` e o
13
+ * avança, e a mesma regra alternaria entre casar e não casar a cada chamada.
14
+ */
15
+ export declare function testPattern(pattern: RegExp, value: string): boolean;
11
16
  //# sourceMappingURL=scrub.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"scrub.d.ts","sourceRoot":"","sources":["../src/scrub.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,eAAO,MAAM,oBAAoB,UAGhC,CAAC;AAEF,eAAO,MAAM,QAAQ,eAAe,CAAC;AAGrC,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAGlE;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,KAAK,SAAI,GAAG,OAAO,CAQ/E;AAED,wBAAgB,eAAe,CAAC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAE9G;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,GAAG,SAAS,GAAG,OAAO,CAG5F"}
1
+ {"version":3,"file":"scrub.d.ts","sourceRoot":"","sources":["../src/scrub.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,eAAO,MAAM,oBAAoB,UAGhC,CAAC;AAEF,eAAO,MAAM,QAAQ,eAAe,CAAC;AAGrC,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAGlE;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,KAAK,SAAI,GAAG,OAAO,CAQ/E;AAED,wBAAgB,eAAe,CAAC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAE9G;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,GAAG,SAAS,GAAG,OAAO,CAG5F;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CASnE"}