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/CHANGELOG.md CHANGED
@@ -1,5 +1,41 @@
1
1
  # Changelog — fg-tracker-sdk
2
2
 
3
+ ## 0.11.0
4
+
5
+ Contexto distribuído por filas, eventos, banco e transações (CONTRATO.md §16.1). Nada removido; a forma antiga de cada API continua valendo.
6
+
7
+ - **SQS com contexto por mensagem.** Dentro de um trace, `SendMessage`/`SendMessageBatch` de um client instrumentado (`instrumentAws`) ganham o span `custom` `SQS publish <fila>` e levam `traceparent` (e `tracestate`, quando o trace veio com um) nos `MessageAttributes`, dentro das cotas do SQS: 10 atributos (com 9 do usuário vai só o `traceparent`), 1 MiB por mensagem e 1 MiB somando o lote. Sem espaço, a mensagem segue como o usuário a montou; uma recusa por validação com o contexto (fila com `MaximumMessageSize` menor) é repetida sem ele. Em fila FIFO, nada é reenviado fora de ordem: sem `sqsMaxMessageBytes`, o contexto só vai em mensagens de até 1 KiB. A resposta mantém o `MD5OfMessageAttributes` dos atributos do usuário.
8
+ - **`ReceiveMessage`** pede o contexto e os atributos de sistema (`SentTimestamp`, `ApproximateReceiveCount`) sem mudar o que o chamador recebe: o que só a instrumentação pediu sai da resposta, com o MD5 recalculado.
9
+ - **`trackMessage(queue, fn, { record })`** e **`trackMessage(queue, record, fn)`** (aditivas): o processamento continua o trace do produtor (raiz local com `remoteParentSpanId`), com `messaging.message.receive.latency` e `messaging.message.retry.count`, um contexto isolado por mensagem (inclusive em `Promise.all`) e link para a invocação. `trackMessage(queue, fn)` continua igual (só local, sem produtor).
10
+ - **`wrapLambda`** continua o trace de eventos de origem única (um record SQS, EventBridge com `detail.traceparent`, HTTP com header `traceparent`); lote de mensagens fica num trace próprio com `links` para cada produtor. `continueTrace: false` volta ao comportamento anterior.
11
+ - **EventBridge `PutEvents`**: `traceparent` no `Detail` (objeto JSON), inserido sem reescrever o texto do usuário, só enquanto a soma das entradas fica abaixo de 1 MiB. **Efeito ao atualizar:** consumidores do evento passam a ver a chave `traceparent` no `detail`; `instrumentAws(client, { propagation: false })` desliga.
12
+ - **`pg`**: `pool.connect()` vira span `pg connect` com a espera por conexão (`db.poolWaitMs`) e a ocupação do pool; o client devolvido gera spans `db.query`; `BEGIN … COMMIT/ROLLBACK` vira `pg transaction`, pai das queries, com `db.transaction.outcome` (também quando a conexão termina com a transação aberta: `connection_closed`). O callback de `client.query(sql, cb)` roda no contexto de quem enviou a query. `pool.query` recebe `db.poolWaitMs` quando esperou na fila. O callback de `pool.connect(cb)` volta a rodar no contexto de quem pediu. `instrumentPg` aceita também um `pg.Client`. **Efeito ao atualizar:** quem usa `pool.connect()` passa a ver as queries do client e os spans de conexão e transação no waterfall.
13
+ - **`postgres.js`**: `sql.begin(fn)` vira `postgres transaction`, pai das queries do callback.
14
+ - **Normalização do SQL em tempo linear.** A troca de listas `IN (…)` por `IN (?)` usava uma expressão com backtracking exponencial: uma lista que não fecha só com valores (`in (1, 1, …, outra_coluna)`, SQL válido) prendia o event loop da aplicação a cada query (26 itens: 2,6 s; 40, horas). A nova reconhece as mesmas listas, com a mesma saída. A redação dos literais também deixou de reler o texto já produzido a cada literal, o que tornava um INSERT em lote quadrático (40 mil linhas: 2 s; agora 11 ms).
15
+ - **Queries**: `db.query.fingerprint` (hash do SQL normalizado inteiro, antes do corte de 200 caracteres: o `/database` da API separa queries com o mesmo prefixo), `db.query.text` e `db.operation.name`. Falhas com SQLSTATE levam `db.response.status_code` e, em disputa de lock, `db.lock.outcome` (`deadlock`, `lock_not_available`, `serialization_failure`, `query_canceled`).
16
+ - **Semconv OTel em paralelo aos atributos atuais**: `deployment.environment.name`, `http.request.method`, `http.response.status_code`, `url.full` (sem credenciais nem valores da query), `server.address` e `server.port`.
17
+ - **`tracestate`** recebido é repassado (HTTP, filas, eventos) e devolvido por `traceHeaders()`. **`respectUpstreamSampling`** (padrão `true`): `false` ignora a flag `00` de quem está a montante e decide pela amostragem local.
18
+ - Novos exports: `parseTraceContext`, `TRACESTATE_HEADER`, `sqsAttributesMd5`, `SQS_MAX_MESSAGE_ATTRIBUTES`, `SQS_MAX_MESSAGE_BYTES`, `SQS_MAX_BATCH_BYTES`, `EVENTBRIDGE_MAX_REQUEST_BYTES`, `MAX_LINKS` e os tipos `AwsInstrumentationOptions`, `TrackMessageOptions`, `QueueMessageLike`, `SpanLink`.
19
+ - Links entre traces são o atributo `links` (`[{ traceId, spanId }]`, até 32): a API grava e devolve, mas ainda não navega por eles.
20
+
21
+ ## 0.10.0
22
+
23
+ Transporte confiável (CONTRATO.md §4.3). Nenhuma API pública removida; opções novas são aditivas.
24
+
25
+ - **Timeout de 10 s no POST de ingestão** (`requestTimeoutMs`). Antes, com a rede engolindo pacotes, `flush()`/`shutdown()` esperavam o timeout do undici (~300 s).
26
+ - **Backoff exponencial com jitter e `Retry-After`** em rede, 408, 429 e 5xx (1 s → 60 s; `Retry-After` limitado a 5 min). Antes o lote era reenviado a cada flush, sem espera. Durante o backoff, `flush()` volta sem enviar.
27
+ - **Lotes limitados por bytes** (`maxBatchBytes`, 1,5 MiB; a API recusa acima de 2 MiB) e **413 divide o lote** (spans e agregados de infra) em vez de descartá-lo; um 202 cujo corpo cai no meio não confirma o lote. Fila limitada também em memória (`maxQueueBytes`, 32 MiB). `attributes`/`error` acima de 60 KiB são cortados com `attributes['fg.truncated'] = true` em vez de a API recusar o span; atributo circular, BigInt ou `toJSON` que lança não trava a fila nem lança para a aplicação.
28
+ - **gzip** nos lotes ≥ 4 KiB (`compression`), ligado com o `fetch` global e desligado com `fetch` próprio (o corpo continua string). Se a API responder 400/415 ao corpo comprimido, o SDK desliga o gzip no processo e reenvia sem.
29
+ - **Recusa parcial**: spans recusados num 202 (`rejected`) não são reenviados; agregados de infra em `infra.retryableIds` voltam para a fila com o mesmo id e esperam o backoff, que continua crescendo enquanto a falha durar.
30
+ - **Agregados de infra com `id`** (`<emissor>:<sequência>`): o reenvio não soma de novo na API.
31
+ - **Encerramento com prazo**: `shutdown({ timeoutMs })` (padrão `shutdownTimeoutMs` = 10 s) volta no prazo mesmo com a API muda e aborta a requisição pendente. Prazos que se sobrepõem (sinal de saída e `shutdown` da aplicação) valem pelo menor, inclusive durante a espera de backoff.
32
+ - **Envio na saída do processo** (`exitHooks`, padrão ligado): `beforeExit` envia o que ficou (scripts e jobs sem `shutdown()`); SIGTERM/SIGINT enviam (inclusive o lote que já está em voo) e reemitem o sinal quando a aplicação não o trata; com handler da aplicação (inclusive `process.once` assíncrono), ela decide e o SDK nunca mata o processo. Não instala na Lambda nem em worker threads. Um registro por processo, compartilhado também entre cópias do pacote (duas versões instaladas não se tomam por handler da aplicação). **Efeito ao atualizar:** um processo que recebe SIGTERM/SIGINT com spans na fila passa a levar até `shutdownTimeoutMs` para sair; `exitHooks: false` volta ao comportamento anterior.
33
+ - **`captureGlobalErrors`**: sem outro listener de `uncaughtException`, o SDK envia a fila (até 2 s) antes de o processo sair com código 1, como o Node; antes o envio era cortado pela saída. Vários trackers com a opção não engolem mais a exceção nem a rejeição não tratada. Com handler `uncaughtException` da aplicação (inclusive `process.once` assíncrono), ela decide.
34
+ - **`wrapLambda` sem a extensão**: o fim da invocação espera no máximo `flushTimeoutMs`, sem esperar backoff, e a requisição é abortada no prazo.
35
+ - **Logs** (`createLogShipper`, pino, winston, Nest): mesmo transporte, um `eventId` por linha (a API deduplica o reenvio) e `shutdown({ timeoutMs })`. Opções novas: `maxBatchBytes`, `maxQueueBytes`, `requestTimeoutMs`, `shutdownTimeoutMs`, `compression`, `exitHooks`.
36
+ - **`sendUnsampledErrors`** (padrão `false`): com amostragem, envia o span que falhou num trace não amostrado e a raiz local dele (`attributes['sampling.kept'] = 'error'`). Spans que fecharam antes do erro não voltam. Traces excluídos por `ignoreTransactions` nunca são enviados, nem com esta opção. Desligado por padrão porque a API ainda conta essas raízes nas métricas.
37
+ - Requer, para a dedupe de logs e agregados, a API com `track_ingest_dedupe` (mesmo PR). Com APIs anteriores os campos novos são ignorados e o envio funciona como antes.
38
+
3
39
  ## 0.9.0
4
40
 
5
41
  Reúne o que entrou na `main` desde a 0.8.1 (PR #14) e a renomeação para FG Tracker.
package/README.md CHANGED
@@ -33,7 +33,7 @@ tracker.instrumentPg(pool); // pg.Pool → spans db.query com qu
33
33
  await tracker.span('custom', 'send-email', async (span) => { span.setAttribute('to', email); });
34
34
  export const GET = tracker.wrapNextRoute(async (req) => Response.json({ ok: true }));
35
35
  const fetchTracked = tracker.wrapFetch(); // fetch instrumentado → spans http.client
36
- await tracker.flush(); await tracker.shutdown();
36
+ await tracker.flush(); await tracker.shutdown(); // shutdown espera no máximo 10 s
37
37
  ```
38
38
 
39
39
  | opção | default | descrição |
@@ -44,6 +44,13 @@ await tracker.flush(); await tracker.shutdown();
44
44
  | `flushIntervalMs` | `2000` | intervalo de envio |
45
45
  | `maxBatchSize` | `200` | ≥ N spans na fila dispara envio imediato |
46
46
  | `maxQueueSize` | `5000` | acima disso descarta os spans mais antigos |
47
+ | `maxQueueBytes` | `32 MiB` | memória máxima da fila (JSON dos spans); acima disso descarta os mais antigos |
48
+ | `maxBatchBytes` | `1,5 MiB` | teto do corpo de cada POST (antes do gzip); um 413 divide o lote |
49
+ | `requestTimeoutMs` | `10000` | timeout de cada POST |
50
+ | `shutdownTimeoutMs` | `10000` | prazo do `shutdown()` e do envio na saída do processo |
51
+ | `compression` | `'gzip'` (`'none'` com `fetch` próprio) | gzip para lotes ≥ 4 KiB; desliga sozinho se a API responder 400/415 ao corpo comprimido |
52
+ | `exitHooks` | `true` | envia a fila no `beforeExit` e em SIGTERM/SIGINT (veja **Envio, retry e encerramento**) |
53
+ | `sendUnsampledErrors` | `false` | com amostragem, envia o span que falhou num trace não amostrado e a raiz local dele |
47
54
  | `enabled` | `true` | `false` desliga tudo sem tirar o código |
48
55
  | `debug` | `false` | loga cada envio |
49
56
  | `release` | detectada | versão em execução (`FG_TRACKER_RELEASE`, `GITHUB_SHA`, `VERCEL_GIT_COMMIT_SHA`… → `${serviceName}@${sha}`); `false` desliga |
@@ -54,7 +61,7 @@ await tracker.flush(); await tracker.shutdown();
54
61
  | `autoSpanMinDurationMs` | `5` | duração mínima para um trecho medido com `measure`/`instrumentNest` virar span |
55
62
  | `measureEventLoopLag` | `true` | mede o atraso do event loop na requisição e grava `eventLoop.maxLagMs`/`eventLoop.blockedMs` no span raiz quando o loop trava |
56
63
  | `eventLoopLagThresholdMs` | `50` | atraso mínimo para virar atributo |
57
- | `captureGlobalErrors` | `false` | `uncaughtExceptionMonitor` + `unhandledRejection` viram spans com erro |
64
+ | `captureGlobalErrors` | `false` | `uncaughtException` + `unhandledRejection` viram spans com erro; sem outro listener de `uncaughtException`, envia a fila (até 2 s) antes de sair com código 1 |
58
65
  | `tracesSampleRate` | `1` | fração de traces enviados (decidida na raiz; filhos seguem; `traceparent` sai com `-00` quando não amostrado) |
59
66
  | `tracesSampler` | — | `(ctx: { kind, name, attributes, parentSampled? }) => taxa` por operação (ex.: `0` para `GET /health`) |
60
67
  | `ignoreTransactions` | `[]` | nomes de raiz (string/RegExp) que nunca são enviados |
@@ -63,6 +70,19 @@ await tracker.flush(); await tracker.shutdown();
63
70
  | `beforeSend` | — | `(span) => span \| null`, último filtro antes da fila |
64
71
  | `infra` | `{ enabled: true, idleIntervalMs: 60000 }` | agregados de infraestrutura (veja **Infraestrutura**); nunca amostrados |
65
72
 
73
+ ## Envio, retry e encerramento
74
+
75
+ O envio segue o CONTRATO.md §4.3 e vale também para o shipper de logs:
76
+
77
+ - **Timeout** de 10 s por POST e uma requisição por vez.
78
+ - **Rede, timeout, 408, 429 e 5xx**: o lote volta inteiro para a fila e o próximo envio espera um backoff exponencial com jitter (1 s, 2 s, 4 s… até 60 s) ou o `Retry-After` da resposta, o que for maior (limitado a 5 min). Durante a espera, `flush()` volta sem enviar.
79
+ - **413**: o lote é dividido até caber. **Outro 4xx**: o lote é descartado (repetir daria o mesmo erro).
80
+ - **202 parcial**: spans recusados pela validação da API (`rejected`) não são reenviados. Agregados de infra com falha transitória (`infra.retryableIds`) voltam para a fila com o mesmo `id` e esperam o backoff. O reenvio não duplica: spans, logs, pageviews e agregados têm identidade e a API deduplica.
81
+ - **Memória**: lotes de até 1,5 MiB e 1000 spans; fila de até 5000 spans e 32 MiB. `attributes` ou `error` acima de 60 KiB são cortados antes do envio, com `attributes['fg.truncated'] = true` (a API recusaria o span acima de 64 KiB).
82
+ - **`shutdown({ timeoutMs })`** envia o que der em até 10 s (padrão `shutdownTimeoutMs`) e aborta a requisição pendente no prazo. Com a API muda, volta no prazo; o que sobrou é descartado e contado.
83
+ - **Saída sem `shutdown()`** (`exitHooks`, ligado por padrão): scripts e jobs que terminam sozinhos enviam a fila no `beforeExit`. Em SIGTERM/SIGINT o SDK envia a fila e, se a aplicação não trata o sinal, o reemite: o processo sai como sairia sem o SDK. Se a aplicação tem o próprio handler, ela decide quando sair; chame `await tracker.shutdown()` nele. Na Lambda use `wrapLambda` (abaixo).
84
+ - **Amostragem**: com `tracesSampleRate < 1`, a decisão é por trace, na raiz. Com `sendUnsampledErrors: true`, o span que falhou num trace não amostrado e a raiz local dele são enviados mesmo assim, marcados `attributes['sampling.kept'] = 'error'`. Os spans que fecharam antes do erro já foram descartados e não voltam: preservar o trace inteiro exige amostragem no coletor. O padrão é desligado porque a API ainda conta essas raízes em requests e taxa de erro.
85
+
66
86
  ## Erros, usuários, releases e jobs
67
87
 
68
88
  ```ts
@@ -158,6 +178,26 @@ tracker.instrumentPg(pool);
158
178
 
159
179
  Se você usa drizzle/kysely/knex sobre `pg.Pool`, instrumente o pool antes de passá-lo ao ORM.
160
180
 
181
+ Cada span `db.query` leva também `db.query.fingerprint` (hash do SQL normalizado **inteiro**: duas queries com os mesmos 200 primeiros caracteres não se fundem no painel), `db.query.text` (o SQL normalizado, sem literais) e `db.operation.name`. Uma falha com SQLSTATE leva `db.response.status_code` e, em disputa de lock, `db.lock.outcome` (`deadlock`, `lock_not_available` com `lock_timeout`/`NOWAIT`, `serialization_failure`, `query_canceled` com `statement_timeout`).
182
+
183
+ ### Conexões e transações
184
+
185
+ ```ts
186
+ const client = await pool.connect(); // span `pg connect`: espera por conexão + ocupação do pool
187
+ try {
188
+ await client.query('BEGIN'); // span `pg transaction`, pai das queries até o COMMIT
189
+ await client.query('UPDATE accounts SET …');
190
+ await client.query('COMMIT'); // db.transaction.outcome = 'commit'
191
+ } finally {
192
+ client.release(); // transação ainda aberta aqui → 'released_open'
193
+ }
194
+ ```
195
+
196
+ - `pg connect` (`custom`) mede a espera até a conexão (`db.poolWaitMs`) e grava `db.pool.total`, `db.pool.idle` e `db.pool.waiting` no instante do pedido. Espera por conexão deixa de aparecer como tempo sem span.
197
+ - O client devolvido gera spans `db.query`; `pool.query` continua com um span só por chamada e recebe `db.poolWaitMs` quando esperou na fila do pool.
198
+ - `pg transaction` termina com `db.transaction.outcome`: `commit`, `rollback` (inclusive o COMMIT de uma transação abortada, que o Postgres responde como ROLLBACK), `commit_failed`, `begin_failed` ou `released_open`.
199
+ - `instrumentPg(client)` com um `pg.Client` avulso também acompanha as transações. Com `postgres` (porsager), `sql.begin(fn)` vira `postgres transaction`.
200
+
161
201
  ### Espera de conexão
162
202
 
163
203
  Num span `db.query` do `postgres` (porsager), o atributo **`db.poolWaitMs`** diz quanto daquele tempo foi esperando uma conexão, e não executando SQL.
@@ -300,7 +340,7 @@ curl -X POST http://localhost:4050/v1/ingest \
300
340
 
301
341
  ## Logs (`POST /v1/logs`)
302
342
 
303
- O SDK envia linhas de log para a plataforma em lote (`flushIntervalMs` 2 s, `maxBatch` 200, fila de 5000 descartando as mais antigas, 5xx/rede tenta de novo uma vez e devolve o lote ao próximo flush, 4xx descarta). Quando a linha nasce dentro de um span do tracker (request Express/Nest, `tracker.span`), `traceId`/`spanId` são anexados automaticamente e a linha aparece ligada ao trace no explorador `/logs`.
343
+ O SDK envia linhas de log para a plataforma em lote (`flushIntervalMs` 2 s, `maxBatch` 200, fila de 5000 linhas e 16 MiB descartando as mais antigas), com o mesmo transporte do tracker (veja **Envio, retry e encerramento**). Cada linha leva um `eventId`: o reenvio de um lote que a API já gravou não duplica. Quando a linha nasce dentro de um span do tracker (request Express/Nest, `tracker.span`), `traceId`/`spanId` são anexados automaticamente e a linha aparece ligada ao trace no explorador `/logs`.
304
344
 
305
345
  ### Shipper cru
306
346
 
@@ -319,6 +359,9 @@ await logs.flush(); await logs.shutdown();
319
359
  | `service` | — | nome do serviço (obrigatório) |
320
360
  | `env`, `host` | — / `os.hostname()` | ambiente e host; `host: false` desliga |
321
361
  | `flushIntervalMs`, `maxBatch`, `maxQueueSize` | `2000`, `200`, `5000` | lote e fila |
362
+ | `maxBatchBytes`, `maxQueueBytes` | `1,5 MiB`, `16 MiB` | bytes por POST e memória da fila |
363
+ | `requestTimeoutMs`, `shutdownTimeoutMs` | `10000`, `10000` | timeout por POST e prazo do `shutdown()` |
364
+ | `compression`, `exitHooks` | `'gzip'` (`'none'` com `fetch` próprio), `true` | como no tracker |
322
365
  | `tracker` | — | correlação com o span corrente (sem ele usa o contexto global do SDK, que funciona quando o tracker está no mesmo processo) |
323
366
  | `minLevel` | `trace` | nível mínimo enviado |
324
367
 
@@ -389,14 +432,14 @@ curl -X POST http://localhost:4050/v1/logs \\
389
432
  -H 'content-type: application/json' \\
390
433
  -H 'x-fg-tracker-key: stk_demo_0000000000000000000000000000' \\
391
434
  -d '{ "logs": [
392
- { "ts": "2026-09-12T12:00:00.000Z", "level": "info", "service": "minha-api", "message": "user logged in",
435
+ { "eventId": "9f1c2a7e4b0d4c4e8a51f0d2b3c4d5e6", "ts": "2026-09-12T12:00:00.000Z", "level": "info", "service": "minha-api", "message": "user logged in",
393
436
  "context": { "userId": 42 }, "traceId": "0123456789abcdef0123456789abcdef", "requestId": "req-1", "env": "production" },
394
437
  { "level": "error", "service": "worker", "message": "ECONNRESET while calling payment gateway" }
395
438
  ] }'
396
- # → 202 { "accepted": 2 }
439
+ # → 202 { "accepted": 2, "duplicates": 0 }
397
440
  ```
398
441
 
399
- Limites: 500 linhas por lote, 32 KB por mensagem, `context` truncado a 8 KB, `ts` fora da retenção vira `now()`.
442
+ Limites: 500 linhas por lote, 32 KB por mensagem, `context` truncado a 8 KB, `ts` fora da retenção vira `now()`. `eventId` é opcional: com ele, reenviar a mesma linha não grava de novo (48 h); sem ele, cada envio grava.
400
443
 
401
444
  ## Infraestrutura
402
445
 
@@ -442,21 +485,51 @@ await sqs.send(new SendMessageCommand({ QueueUrl, MessageBody }));
442
485
  - Quando há um trace em andamento, **toda** chamada AWS (de qualquer serviço) vira um span `http.client` `AWS <serviço> <operação> <recurso>` com `attributes['aws.service']`, `aws.operation`, `aws.resourceArn`, `aws.region` e `statusCode`/erro. Esses spans seguem a amostragem normal.
443
486
  - Nomes viram ARN quando a conta é conhecida (aprendida de ARNs/URLs vistos ou `AWS_ACCOUNT_ID`); sem conta, a API casa o nó por nome + região + serviço.
444
487
 
488
+ ### Contexto pelas filas (SQS e EventBridge)
489
+
490
+ Dentro de um trace, um client instrumentado leva o contexto nas mensagens: `SendMessage`/`SendMessageBatch` ganham o span `custom` `SQS publish <fila>` e o atributo de mensagem `traceparent` (e `tracestate`, quando o trace veio com um); `PutEvents` ganha `EventBridge publish <barramento>` e `"traceparent"` no `Detail` (só quando ele é um objeto JSON). As cotas de cada serviço são respeitadas: sem espaço (10 atributos, 1 MiB por mensagem, 1 MiB somando o lote do SQS ou o pedido do EventBridge), a mensagem segue exatamente como você a montou, e uma recusa por validação com o contexto é repetida sem ele. A publicação nunca falha por causa da instrumentação.
491
+
492
+ ```ts
493
+ const sqs = tracker.instrumentAws(new SQSClient({}), {
494
+ propagation: true, // default (false desliga; propagateTraceTo: false também)
495
+ sqsMaxMessageBytes: 262_144, // MaximumMessageSize da fila, se for menor que 1 MiB
496
+ });
497
+ ```
498
+
499
+ Em fila FIFO o SDK nunca reenvia uma entrada do lote fora de ordem. Por isso, sem `sqsMaxMessageBytes`, ele só põe o contexto em mensagens que ficam com até 1 KiB (o menor `MaximumMessageSize` possível); informe o limite da fila para propagar também nas maiores.
500
+
501
+ **Efeito no EventBridge:** quem consome o evento passa a ver a chave `traceparent` no `detail`. Se o consumidor valida um schema estrito, use `propagation: false` nesse client.
502
+
445
503
  ### Consumidores de fila
446
504
 
447
505
  ```ts
506
+ // Lambda com evento SQS: cada mensagem continua o trace de quem a publicou.
507
+ export const handler = tracker.wrapLambda(async (event) => {
508
+ await Promise.all(event.Records.map((record) =>
509
+ tracker.trackMessage(QueueUrl, record, () => handle(record)),
510
+ ));
511
+ });
512
+
513
+ // Polling: ReceiveMessage num client instrumentado guarda o contexto de cada mensagem.
514
+ const { Messages } = await sqs.send(new ReceiveMessageCommand({ QueueUrl }));
448
515
  for (const message of Messages ?? []) {
449
- await tracker.trackMessage(QueueUrl, () => handle(message)); // URL ou ARN da fila
516
+ await tracker.trackMessage(QueueUrl, message, () => handle(message));
450
517
  }
518
+
519
+ // Forma anterior, que continua valendo: mede só localmente, sem ligação com o produtor.
520
+ await tracker.trackMessage(QueueUrl, () => handle(message));
451
521
  ```
452
522
 
453
- Mede `processingMsSum`/`processingMsMax` e conta `errors` quando `fn` lança (o erro é relançado). Cria um span `custom` `SQS process <fila>` para os spans internos formarem um trace.
523
+ - `trackMessage(queue, record, fn)` e `trackMessage(queue, fn, { record })` aceitam o record do evento da Lambda ou a `Message` do `ReceiveMessage`. O span `custom` `SQS process <fila>` continua o trace do produtor (aparece em jobs e no waterfall de quem publicou), com `messaging.message.receive.latency` (ms desde o envio) e `messaging.message.retry.count`. Cada mensagem tem o próprio contexto, inclusive em `Promise.all`.
524
+ - No `ReceiveMessage`, o SDK pede `traceparent`/`tracestate` e `SentTimestamp`/`ApproximateReceiveCount` sem mudar o que você recebe: o que só ele pediu sai da resposta, com o `MD5OfMessageAttributes` recalculado.
525
+ - `wrapLambda` continua o trace de eventos de origem única (um record SQS, EventBridge com `detail.traceparent`, HTTP com `traceparent`); um lote de mensagens fica num trace próprio, com `attributes.links` apontando para cada produtor (`continueTrace: false` desliga).
526
+ - Mede `processingMsSum`/`processingMsMax` e conta `errors` quando `fn` lança (o erro é relançado).
454
527
 
455
528
  ### Pool de conexões (pg)
456
529
 
457
530
  ```ts
458
531
  const pool = new Pool({ connectionString: process.env.DATABASE_URL });
459
- tracker.instrumentPg(pool); // spans db.query (inalterado)
532
+ tracker.instrumentPg(pool); // spans db.query, `pg connect` e `pg transaction`
460
533
  tracker.instrumentPgPool(pool, { name: 'orders-db' }); // agregado db_pool
461
534
  ```
462
535
 
@@ -481,7 +554,7 @@ export const handler = tracker.wrapLambda(async (event, context) => {
481
554
  ```
482
555
 
483
556
  - Cria um span raiz `custom` `lambda <função>` por invocação (`faas.coldStart`, `faas.requestId`); desligue com `{ span: false }`.
484
- - **Sem a camada da extensão**: aguarda `flush()` (até `flushTimeoutMs`) ao fim de cada invocação, para spans e agregados não se perderem no congelamento do ambiente.
557
+ - **Sem a camada da extensão**: aguarda o envio (até `flushTimeoutMs`) ao fim de cada invocação, para spans e agregados não se perderem no congelamento do ambiente. Não espera backoff e aborta a requisição no prazo: com a API fora, a invocação atrasa no máximo `flushTimeoutMs`.
485
558
  - **Com a camada** (`/opt/extensions/fg-tracker-extension` existe): não bloqueia a resposta; a fila sobrevive ao congelamento e é enviada no SIGTERM do encerramento (quando nenhum outro handler de SIGTERM está registrado).
486
559
  - Handlers com callback não são suportados (use `async`).
487
560
 
package/dist/context.d.ts CHANGED
@@ -4,6 +4,15 @@ export interface SpanContext {
4
4
  spanId: string;
5
5
  /** `false` quando o trace foi descartado pela amostragem (spans não são enviados, mas o contexto se propaga). */
6
6
  sampled?: boolean;
7
+ /** Trace excluído por `ignoreTransactions` (não é decisão de amostragem): nada dele é enviado. */
8
+ ignored?: boolean;
9
+ /**
10
+ * `spanId` da raiz local (span sem pai neste serviço) do ramo. Um mesmo trace distribuído pode ter
11
+ * várias raízes locais no processo (duas requisições do mesmo trace).
12
+ */
13
+ localRootId?: string;
14
+ /** `tracestate` recebido de outro serviço, repassado sem alteração a quem vem depois (W3C). */
15
+ traceState?: string;
7
16
  }
8
17
  /** Contexto assíncrono compartilhado: quem é o span pai da operação corrente. */
9
18
  export declare const als: AsyncLocalStorage<SpanContext>;
@@ -15,8 +24,15 @@ export declare function newTraceId(): string;
15
24
  */
16
25
  export declare function currentSpanContext(): SpanContext | undefined;
17
26
  export declare const TRACEPARENT_HEADER = "traceparent";
27
+ export declare const TRACESTATE_HEADER = "tracestate";
18
28
  /** Header `traceparent` (`00-<traceId>-<spanId>-01`; flag `00` quando não amostrado) do contexto informado. */
19
29
  export declare function formatTraceparent(ctx: SpanContext): string;
20
30
  /** Lê um `traceparent` recebido; `undefined` quando ausente, malformado ou com ids nulos. */
21
31
  export declare function parseTraceparent(value: string | string[] | undefined | null): SpanContext | undefined;
32
+ /** `tracestate` aceitável para repasse: texto ASCII imprimível de até 512 caracteres; senão `undefined`. */
33
+ export declare function sanitizeTraceState(value: string | string[] | undefined | null): string | undefined;
34
+ /** `traceparent` + `tracestate` recebidos; o `tracestate` só vale junto de um `traceparent` válido. */
35
+ export declare function parseTraceContext(traceparent: string | string[] | undefined | null, tracestate?: string | string[] | undefined | null): SpanContext | undefined;
36
+ /** Headers W3C (`traceparent` e, quando houver, `tracestate`) de um contexto. */
37
+ export declare function traceContextHeaders(ctx: SpanContext): Record<string, string>;
22
38
  //# sourceMappingURL=context.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAGrD,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,iHAAiH;IACjH,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,iFAAiF;AACjF,eAAO,MAAM,GAAG,gCAAuC,CAAC;AAExD,wBAAgB,SAAS,IAAI,MAAM,CAElC;AAED,wBAAgB,UAAU,IAAI,MAAM,CAEnC;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,IAAI,WAAW,GAAG,SAAS,CAE5D;AAMD,eAAO,MAAM,kBAAkB,gBAAgB,CAAC;AAGhD,+GAA+G;AAC/G,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,WAAW,GAAG,MAAM,CAE1D;AAED,6FAA6F;AAC7F,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,GAAG,IAAI,GAAG,WAAW,GAAG,SAAS,CAUrG"}
1
+ {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAGrD,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,iHAAiH;IACjH,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,kGAAkG;IAClG,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,+FAA+F;IAC/F,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,iFAAiF;AACjF,eAAO,MAAM,GAAG,gCAAuC,CAAC;AAExD,wBAAgB,SAAS,IAAI,MAAM,CAElC;AAED,wBAAgB,UAAU,IAAI,MAAM,CAEnC;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,IAAI,WAAW,GAAG,SAAS,CAE5D;AAMD,eAAO,MAAM,kBAAkB,gBAAgB,CAAC;AAChD,eAAO,MAAM,iBAAiB,eAAe,CAAC;AAK9C,+GAA+G;AAC/G,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,WAAW,GAAG,MAAM,CAE1D;AAED,6FAA6F;AAC7F,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,GAAG,IAAI,GAAG,WAAW,GAAG,SAAS,CAUrG;AAED,4GAA4G;AAC5G,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,GAAG,IAAI,GAAG,MAAM,GAAG,SAAS,CAMlG;AAED,uGAAuG;AACvG,wBAAgB,iBAAiB,CAC/B,WAAW,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,GAAG,IAAI,EACjD,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,GAAG,IAAI,GAChD,WAAW,GAAG,SAAS,CAKzB;AAED,iFAAiF;AACjF,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,WAAW,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAI5E"}
package/dist/context.js CHANGED
@@ -19,6 +19,9 @@ export function currentSpanContext() {
19
19
  /* W3C Trace Context (tracing distribuído, CONTRATO.md §16) */
20
20
  /* ------------------------------------------------------------------ */
21
21
  export const TRACEPARENT_HEADER = 'traceparent';
22
+ export const TRACESTATE_HEADER = 'tracestate';
23
+ /** W3C: `tracestate` com mais de 512 caracteres pode ser descartado; acima disso não repassamos. */
24
+ const MAX_TRACESTATE_LENGTH = 512;
22
25
  const TRACEPARENT_RE = /^([0-9a-f]{2})-([0-9a-f]{32})-([0-9a-f]{16})-([0-9a-f]{2})$/i;
23
26
  /** Header `traceparent` (`00-<traceId>-<spanId>-01`; flag `00` quando não amostrado) do contexto informado. */
24
27
  export function formatTraceparent(ctx) {
@@ -39,4 +42,28 @@ export function parseTraceparent(value) {
39
42
  const sampled = (parseInt(match[4], 16) & 1) === 1;
40
43
  return { traceId, spanId, sampled };
41
44
  }
45
+ /** `tracestate` aceitável para repasse: texto ASCII imprimível de até 512 caracteres; senão `undefined`. */
46
+ export function sanitizeTraceState(value) {
47
+ const raw = Array.isArray(value) ? value.join(',') : value;
48
+ if (typeof raw !== 'string')
49
+ return undefined;
50
+ const trimmed = raw.trim();
51
+ if (!trimmed || trimmed.length > MAX_TRACESTATE_LENGTH || !/^[\x20-\x7e]+$/.test(trimmed))
52
+ return undefined;
53
+ return trimmed;
54
+ }
55
+ /** `traceparent` + `tracestate` recebidos; o `tracestate` só vale junto de um `traceparent` válido. */
56
+ export function parseTraceContext(traceparent, tracestate) {
57
+ const ctx = parseTraceparent(traceparent);
58
+ if (!ctx)
59
+ return undefined;
60
+ const traceState = sanitizeTraceState(tracestate);
61
+ return traceState ? { ...ctx, traceState } : ctx;
62
+ }
63
+ /** Headers W3C (`traceparent` e, quando houver, `tracestate`) de um contexto. */
64
+ export function traceContextHeaders(ctx) {
65
+ return ctx.traceState
66
+ ? { [TRACEPARENT_HEADER]: formatTraceparent(ctx), [TRACESTATE_HEADER]: ctx.traceState }
67
+ : { [TRACEPARENT_HEADER]: formatTraceparent(ctx) };
68
+ }
42
69
  //# sourceMappingURL=context.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"context.js","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAS1C,iFAAiF;AACjF,MAAM,CAAC,MAAM,GAAG,GAAG,IAAI,iBAAiB,EAAe,CAAC;AAExD,MAAM,UAAU,SAAS;IACvB,OAAO,WAAW,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS;AAClD,CAAC;AAED,MAAM,UAAU,UAAU;IACxB,OAAO,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS;AACnD,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,kBAAkB;IAChC,OAAO,GAAG,CAAC,QAAQ,EAAE,CAAC;AACxB,CAAC;AAED,wEAAwE;AACxE,yEAAyE;AACzE,wEAAwE;AAExE,MAAM,CAAC,MAAM,kBAAkB,GAAG,aAAa,CAAC;AAChD,MAAM,cAAc,GAAG,8DAA8D,CAAC;AAEtF,+GAA+G;AAC/G,MAAM,UAAU,iBAAiB,CAAC,GAAgB;IAChD,OAAO,MAAM,GAAG,CAAC,OAAO,IAAI,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,OAAO,KAAK,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;AAClF,CAAC;AAED,6FAA6F;AAC7F,MAAM,UAAU,gBAAgB,CAAC,KAA2C;IAC1E,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;IACpD,IAAI,CAAC,GAAG;QAAE,OAAO,SAAS,CAAC;IAC3B,MAAM,KAAK,GAAG,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;IAC9C,IAAI,CAAC,KAAK;QAAE,OAAO,SAAS,CAAC;IAC7B,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,CAAE,CAAC,WAAW,EAAE,CAAC;IACxC,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,CAAE,CAAC,WAAW,EAAE,CAAC;IACvC,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC;QAAE,OAAO,SAAS,CAAC;IAClE,MAAM,OAAO,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAE,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;IACpD,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;AACtC,CAAC"}
1
+ {"version":3,"file":"context.js","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"database.d.ts","sourceRoot":"","sources":["../src/database.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAMhD,wBAAgB,aAAa,CAAC,IAAI,EAAE,UAAU,GAAG,SAAS,EAAE,KAAK,EAAE,OAAO,QAKzE;AAED,MAAM,WAAW,8BAA8B;IAC7C,+EAA+E;IAC/E,MAAM,EAAE,MAAM,CAAC;IACf,0FAA0F;IAC1F,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,SAAS,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,MAAM,CAAC;IACxD,mFAAmF;IACnF,SAAS,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,MAAM,GAAG,SAAS,CAAC;IACpE,8DAA8D;IAC9D,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,4GAA4G;IAC5G,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AACD,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,gFAAgF;AAChF,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAW/D;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,WAAW,EAAE,SAAS,EAAE,iBAAiB,qDAIhF;AAED,iGAAiG;AACjG,wBAAgB,wBAAwB,CAAC,CAAC,SAAS,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC,EAAE,OAAO,EAAE,8BAA8B,GAAG,CAAC,CAsCnI;AAED,MAAM,WAAW,eAAe;IAC9B,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,GAAG,CAAC;IACtB,MAAM,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,CAAC;CACjC;AAED,yFAAyF;AACzF,wBAAgB,wBAAwB,CAAC,CAAC,SAAS,eAAe,EAAE,IAAI,EAAE,WAAW,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,CAuEhG"}
1
+ {"version":3,"file":"database.d.ts","sourceRoot":"","sources":["../src/database.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAMhD,wBAAgB,aAAa,CAAC,IAAI,EAAE,UAAU,GAAG,SAAS,EAAE,KAAK,EAAE,OAAO,QAMzE;AAED,MAAM,WAAW,8BAA8B;IAC7C,+EAA+E;IAC/E,MAAM,EAAE,MAAM,CAAC;IACf,0FAA0F;IAC1F,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,SAAS,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,MAAM,CAAC;IACxD,mFAAmF;IACnF,SAAS,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,MAAM,GAAG,SAAS,CAAC;IACpE,8DAA8D;IAC9D,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,4GAA4G;IAC5G,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AACD,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,gFAAgF;AAChF,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAW/D;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,WAAW,EAAE,SAAS,EAAE,iBAAiB,qDAWhF;AAED,iGAAiG;AACjG,wBAAgB,wBAAwB,CAAC,CAAC,SAAS,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC,EAAE,OAAO,EAAE,8BAA8B,GAAG,CAAC,CAsCnI;AAED,MAAM,WAAW,eAAe;IAC9B,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,GAAG,CAAC;IACtB,MAAM,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,CAAC;CACjC;AAED,yFAAyF;AACzF,wBAAgB,wBAAwB,CAAC,CAAC,SAAS,eAAe,EAAE,IAAI,EAAE,WAAW,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,CAkFhG"}
package/dist/database.js CHANGED
@@ -1,4 +1,4 @@
1
- import { normalizeSql } from './normalize.js';
1
+ import { databaseErrorAttributes, sqlSpanFields } from './normalize.js';
2
2
  import { watchPoolWait } from './pool-wait.js';
3
3
  const genericClients = new WeakMap();
4
4
  const postgresClients = new WeakMap();
@@ -6,9 +6,11 @@ export function databaseError(span, error) {
6
6
  if (!span)
7
7
  return;
8
8
  span.error = { name: 'DatabaseError', message: 'Database operation failed' };
9
- const code = typeof error === 'object' && error ? error.code : undefined;
10
- if (typeof code === 'string' && /^[A-Z0-9_]{3,40}$/.test(code))
11
- span.setAttribute('db.error_code', code);
9
+ const attributes = databaseErrorAttributes(error);
10
+ for (const [key, value] of Object.entries(attributes))
11
+ span.setAttribute(key, value);
12
+ if (attributes['db.response.status_code'])
13
+ span.setAttribute('db.error_code', attributes['db.response.status_code']);
12
14
  }
13
15
  /** Host de uma URL de conexão ou opção `host` (sem usuário, senha ou banco). */
14
16
  export function databaseHost(value) {
@@ -28,7 +30,15 @@ export function databaseHost(value) {
28
30
  export function startDatabaseSpan(core, operation) {
29
31
  if (!core.enabled || !core.currentContext())
30
32
  return;
31
- return core.startSpan('db.query', operation.statement ? normalizeSql(operation.statement) : operation.operation, { 'db.system': operation.system, 'db.operation': operation.operation, ...(operation.host ? { 'db.host': operation.host } : {}) });
33
+ const sql = operation.statement ? sqlSpanFields(operation.statement) : undefined;
34
+ return core.startSpan('db.query', sql?.name ?? operation.operation, {
35
+ 'db.system': operation.system,
36
+ 'db.operation': operation.operation,
37
+ ...(sql?.attributes ?? {}),
38
+ // Sem SQL, a operação informada pelo adaptador é o nome semconv.
39
+ ...(sql?.attributes['db.operation.name'] ? {} : { 'db.operation.name': operation.operation }),
40
+ ...(operation.host ? { 'db.host': operation.host } : {}),
41
+ });
32
42
  }
33
43
  /** Portable adapter for completed operations. Cursor/stream lifecycles need a driver adapter. */
34
44
  export function instrumentDatabaseClient(core, client, options) {
@@ -166,6 +176,25 @@ export function instrumentPostgresClient(core, sql) {
166
176
  if (key === 'begin' || key === 'savepoint') {
167
177
  args = args.map(arg => typeof arg === 'function' ? (scoped) => arg(wrap(scoped)) : arg);
168
178
  }
179
+ // `sql.begin(fn)`: span da transação, pai das queries do callback.
180
+ if (key === 'begin' && core.enabled && core.currentContext()) {
181
+ const tx = core.startSpan('custom', 'postgres transaction', { 'db.system': 'postgresql', 'db.operation.name': 'transaction', ...(host ? { 'db.host': host } : {}) });
182
+ let pending;
183
+ try {
184
+ pending = core.runInSpan(tx, () => Reflect.apply(value, target, args));
185
+ }
186
+ catch (error) {
187
+ tx.setAttribute('db.transaction.outcome', 'begin_failed');
188
+ databaseError(tx, error);
189
+ tx.end();
190
+ throw error;
191
+ }
192
+ if (!pending || typeof pending.then !== 'function') {
193
+ tx.end();
194
+ return pending;
195
+ }
196
+ return pending.then((result) => { tx.setAttribute('db.transaction.outcome', 'commit'); tx.end(); return result; }, (error) => { tx.setAttribute('db.transaction.outcome', 'rollback'); databaseError(tx, error); tx.end(); throw error; });
197
+ }
169
198
  const result = Reflect.apply(value, target, args);
170
199
  if (key === 'reserve')
171
200
  return result.then(wrap);
@@ -1 +1 @@
1
- {"version":3,"file":"database.js","sourceRoot":"","sources":["../src/database.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"database.js","sourceRoot":"","sources":["../src/database.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,uBAAuB,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AACxE,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAE/C,MAAM,cAAc,GAAG,IAAI,OAAO,EAAwC,CAAC;AAC3E,MAAM,eAAe,GAAG,IAAI,OAAO,EAAqC,CAAC;AACzE,MAAM,UAAU,aAAa,CAAC,IAA4B,EAAE,KAAc;IACxE,IAAI,CAAC,IAAI;QAAE,OAAO;IAClB,IAAI,CAAC,KAAK,GAAG,EAAE,IAAI,EAAE,eAAe,EAAE,OAAO,EAAE,2BAA2B,EAAE,CAAC;IAC7E,MAAM,UAAU,GAAG,uBAAuB,CAAC,KAAK,CAAC,CAAC;IAClD,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC;QAAE,IAAI,CAAC,YAAY,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IACrF,IAAI,UAAU,CAAC,yBAAyB,CAAC;QAAE,IAAI,CAAC,YAAY,CAAC,eAAe,EAAE,UAAU,CAAC,yBAAyB,CAAC,CAAC,CAAC;AACvH,CAAC;AAsBD,gFAAgF;AAChF,MAAM,UAAU,YAAY,CAAC,KAAc;IACzC,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;IACtD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK;QAAE,OAAO,SAAS,CAAC;IAC1D,IAAI,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1B,IAAI,CAAC;YACH,OAAO,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,QAAQ,IAAI,SAAS,CAAC;QAC9C,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,SAAS,CAAC;QACnB,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;AACjE,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,IAAiB,EAAE,SAA4B;IAC/E,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE;QAAE,OAAO;IACpD,MAAM,GAAG,GAAG,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC,aAAa,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACjF,OAAO,IAAI,CAAC,SAAS,CAAC,UAAU,EAAE,GAAG,EAAE,IAAI,IAAI,SAAS,CAAC,SAAS,EAAE;QAClE,WAAW,EAAE,SAAS,CAAC,MAAM;QAC7B,cAAc,EAAE,SAAS,CAAC,SAAS;QACnC,GAAG,CAAC,GAAG,EAAE,UAAU,IAAI,EAAE,CAAC;QAC1B,iEAAiE;QACjE,GAAG,CAAC,GAAG,EAAE,UAAU,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,mBAAmB,EAAE,SAAS,CAAC,SAAS,EAAE,CAAC;QAC7F,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACzD,CAAC,CAAC;AACL,CAAC;AAED,iGAAiG;AACjG,MAAM,UAAU,wBAAwB,CAAmB,IAAiB,EAAE,MAAS,EAAE,OAAuC;IAC9H,MAAM,UAAU,GAAG,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI,OAAO,EAAkB,CAAC;IAC7E,cAAc,CAAC,GAAG,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;IACrC,IAAI,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC;QAAE,OAAO,UAAU,CAAC,GAAG,CAAC,MAAM,CAAM,CAAC;IAC/D,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,OAAO,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC;IACjE,MAAM,KAAK,GAAG,IAAI,GAAG,EAAwB,CAAC;IAC9C,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,MAAM,EAAE;QAC9B,GAAG,CAAC,MAAM,EAAE,GAAG,EAAE,QAAQ;YACvB,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC;YAClD,IAAI,OAAO,QAAQ,KAAK,UAAU;gBAAE,OAAO,QAAQ,CAAC;YACpD,IAAI,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC;gBAAE,OAAO,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YAC1C,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;YAC3B,MAAM,OAAO,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,IAAe,EAAE,EAAE;gBACpF,MAAM,IAAI,GAAG,iBAAiB,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,MAAM;oBACvI,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE,CAAC,MAAM,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC;gBAClD,IAAI,CAAC,IAAI;oBAAE,OAAO,OAAO,CAAC,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;gBACxD,MAAM,GAAG,GAAG,CAAC,KAAe,EAAE,EAAE,GAAG,IAAI,KAAK;oBAAE,aAAa,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;gBACxF,MAAM,QAAQ,GAAG,OAAO,CAAC,SAAS,IAAI,OAAO,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAa,CAAC,CAAC,CAAC,SAAS,CAAC;gBAC9G,IAAI,QAAQ;oBAAE,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,UAAyB,GAAG,MAAiB;wBACjF,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;wBAAC,OAAO,OAAO,CAAC,KAAK,CAAC,QAAQ,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;oBAC/D,CAAC,CAAC;gBACF,IAAI,CAAC;oBACH,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;oBACrD,IAAI,QAAQ;wBAAE,OAAO,MAAM,CAAC;oBAC5B,IAAI,MAAM,IAAI,OAAO,MAAM,CAAC,IAAI,KAAK,UAAU;wBAAE,OAAO,MAAM,CAAC,IAAI,CACjE,CAAC,KAAc,EAAE,EAAE,GAAG,GAAG,EAAE,CAAC,CAAC,OAAO,KAAK,CAAC,CAAC,CAAC,EAC5C,CAAC,KAAc,EAAE,EAAE,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;oBACpD,uFAAuF;oBACvF,IAAI,MAAM,IAAI,CAAC,OAAO,MAAM,CAAC,OAAO,KAAK,UAAU,IAAI,OAAO,MAAM,CAAC,EAAE,KAAK,UAAU,IAAI,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,EAAE,CAAC;wBACxH,IAAI,CAAC,YAAY,CAAC,gBAAgB,EAAE,sBAAsB,CAAC,CAAC;oBAC9D,CAAC;oBACD,GAAG,EAAE,CAAC;oBAAC,OAAO,MAAM,CAAC;gBACvB,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBAAC,GAAG,CAAC,KAAK,CAAC,CAAC;oBAAC,MAAM,KAAK,CAAC;gBAAC,CAAC;YAC9C,CAAC,CAAC;YACF,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;YAAC,OAAO,OAAO,CAAC;QAC1C,CAAC;KACF,CAAC,CAAC;IACH,UAAU,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IAAC,UAAU,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IAAC,OAAO,KAAK,CAAC;AAC5E,CAAC;AAOD,yFAAyF;AACzF,MAAM,UAAU,wBAAwB,CAA4B,IAAiB,EAAE,GAAM;IAC3F,MAAM,OAAO,GAAG,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI,OAAO,EAAe,CAAC;IACxE,eAAe,CAAC,GAAG,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IACnC,MAAM,OAAO,GAAG,IAAI,OAAO,EAAe,CAAC;IAC3C,MAAM,OAAO,GAAI,GAAmD,CAAC,OAAO,CAAC;IAC7E,MAAM,IAAI,GAAG,YAAY,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IACzC,SAAS,UAAU,CAAC,KAAU,EAAE,SAAiB;QAC/C,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,CAAC,IAAI,KAAK,UAAU,IAAI,OAAO,KAAK,CAAC,MAAM,KAAK,UAAU;YAAE,OAAO,KAAK,CAAC;QACnG,IAAI,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;YAAE,OAAO,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAClD,IAAI,SAAuC,CAAC;QAC5C,MAAM,OAAO,GAAG,GAAG,EAAE;YACnB,IAAI,CAAC,SAAS,EAAE,CAAC;gBACf,MAAM,IAAI,GAAG,iBAAiB,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,YAAY,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;gBACpG,sEAAsE;gBACtE,qEAAqE;gBACrE,MAAM,QAAQ,GAAG,IAAI,CAAC,CAAC,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;gBACzD,MAAM,MAAM,GAAG,GAAG,EAAE;oBAClB,MAAM,MAAM,GAAG,QAAQ,EAAE,EAAE,CAAC;oBAC5B,IAAI,MAAM,KAAK,SAAS;wBAAE,IAAI,EAAE,YAAY,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC;oBACtE,IAAI,EAAE,GAAG,EAAE,CAAC;gBACd,CAAC,CAAC;gBACF,IAAI,CAAC;oBACH,SAAS,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,KAAc,EAAE,EAAE,GAAG,MAAM,EAAE,CAAC,CAAC,OAAO,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,KAAc,EAAE,EAAE;wBACzF,aAAa,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;wBAAC,MAAM,EAAE,CAAC;wBAAC,MAAM,KAAK,CAAC;oBACpD,CAAC,CAAC,CAAC;gBACL,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBAAC,aAAa,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;oBAAC,MAAM,EAAE,CAAC;oBAAC,MAAM,KAAK,CAAC;gBAAC,CAAC;YACxE,CAAC;YACD,OAAO,SAAU,CAAC;QACpB,CAAC,CAAC;QACF,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,KAAK,EAAE;YAC7B,GAAG,CAAC,MAAM,EAAE,GAAG;gBACb,IAAI,GAAG,KAAK,MAAM,IAAI,GAAG,KAAK,OAAO,IAAI,GAAG,KAAK,SAAS;oBAAE,OAAO,CAAC,GAAG,IAAW,EAAE,EAAE;wBACpF,MAAM,OAAO,GAAG,OAAO,EAAE,CAAC;wBAAC,OAAO,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;oBAC/E,CAAC,CAAC;gBACF,IAAI,GAAG,KAAK,SAAS;oBAAE,OAAO,GAAG,EAAE,GAAG,KAAK,OAAO,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC,CAAC,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC;gBACtF,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC;gBAC/C,IAAI,OAAO,KAAK,KAAK,UAAU;oBAAE,OAAO,KAAK,CAAC;gBAC9C,OAAO,CAAC,GAAG,IAAW,EAAE,EAAE;oBACxB,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;oBAClD,OAAO,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC;gBAC5C,CAAC,CAAC;YACJ,CAAC;SACF,CAAC,CAAC;QACH,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QAAC,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QAAC,OAAO,KAAK,CAAC;IACrE,CAAC;IACD,SAAS,IAAI,CAAC,MAAW;QACvB,IAAI,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC;YAAE,OAAO,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACpD,MAAM,OAAO,GAAG,IAAI,GAAG,EAAwB,CAAC;QAChD,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,MAAM,EAAE;YAC9B,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI;gBACzB,MAAM,SAAS,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,gBAAgB,CAAC;gBACtG,OAAO,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,SAAS,CAAC,CAAC;YACrE,CAAC;YACD,GAAG,CAAC,MAAM,EAAE,GAAG;gBACb,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC;gBAC/C,IAAI,OAAO,KAAK,KAAK,UAAU;oBAAE,OAAO,KAAK,CAAC;gBAC9C,IAAI,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC;oBAAE,OAAO,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;gBAC9C,MAAM,EAAE,GAAG,CAAC,GAAG,IAAW,EAAE,EAAE;oBAC5B,IAAI,GAAG,KAAK,OAAO,IAAI,GAAG,KAAK,WAAW,EAAE,CAAC;wBAC3C,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,OAAO,GAAG,KAAK,UAAU,CAAC,CAAC,CAAC,CAAC,MAAW,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;oBAC/F,CAAC;oBACD,mEAAmE;oBACnE,IAAI,GAAG,KAAK,OAAO,IAAI,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,cAAc,EAAE,EAAE,CAAC;wBAC7D,MAAM,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,sBAAsB,EAAE,EAAE,WAAW,EAAE,YAAY,EAAE,mBAAmB,EAAE,aAAa,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;wBACrK,IAAI,OAAY,CAAC;wBACjB,IAAI,CAAC;4BAAC,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC;wBAAC,CAAC;wBAC/E,OAAO,KAAK,EAAE,CAAC;4BAAC,EAAE,CAAC,YAAY,CAAC,wBAAwB,EAAE,cAAc,CAAC,CAAC;4BAAC,aAAa,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;4BAAC,EAAE,CAAC,GAAG,EAAE,CAAC;4BAAC,MAAM,KAAK,CAAC;wBAAC,CAAC;wBAC7H,IAAI,CAAC,OAAO,IAAI,OAAO,OAAO,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;4BAAC,EAAE,CAAC,GAAG,EAAE,CAAC;4BAAC,OAAO,OAAO,CAAC;wBAAC,CAAC;wBACjF,OAAO,OAAO,CAAC,IAAI,CACjB,CAAC,MAAe,EAAE,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,wBAAwB,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC,OAAO,MAAM,CAAC,CAAC,CAAC,EACtG,CAAC,KAAc,EAAE,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,wBAAwB,EAAE,UAAU,CAAC,CAAC,CAAC,aAAa,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;oBACrI,CAAC;oBACD,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;oBAClD,IAAI,GAAG,KAAK,SAAS;wBAAE,OAAQ,MAAuB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;oBAClE,OAAO,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,MAAM,EAAE,OAAO,IAAI,CAAC,CAAC,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;gBAClH,CAAC,CAAC;gBACF,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;gBAAC,OAAO,EAAE,CAAC;YAClC,CAAC;SACF,CAAC,CAAC;QACH,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QAAC,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QAAC,OAAO,KAAK,CAAC;IACtE,CAAC;IACD,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC;AACnB,CAAC"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Envio da fila na saída do processo (CONTRATO.md §4.3), para scripts e jobs que não chamam
3
+ * `shutdown()`:
4
+ * - `beforeExit` (o event loop esvaziou): envia o que ficou, com prazo; se nada novo entrou
5
+ * desde a última tentativa, não tenta de novo (o processo sai mesmo com a API fora);
6
+ * - SIGTERM/SIGINT: envia com prazo e, se ninguém mais trata o sinal, o reemite para o Node
7
+ * encerrar como encerraria sem o SDK. Com outro listener (inclusive `process.once`, checado na
8
+ * entrega do sinal), quem decide a saída é ele, e o SDK nunca mata o processo.
9
+ * Um registro por processo (um listener por evento), seja quantos trackers, shippers ou cópias do
10
+ * pacote houver.
11
+ * Fora da thread principal e dentro da Lambda (que tem o próprio fluxo, ver `wrapLambda`) não instala.
12
+ */
13
+ export interface ExitParticipant {
14
+ /** Há algo novo para enviar desde a última tentativa de saída? */
15
+ hasPendingForExit(): boolean;
16
+ /** Envia o que der até `deadline` (epoch ms). Nunca lança. */
17
+ flushForExit(deadline: number): Promise<void>;
18
+ readonly exitTimeoutMs: number;
19
+ }
20
+ export declare function exitHooksSupported(): boolean;
21
+ /** Registra o participante; devolve a função que o remove (chamada no `shutdown()`). */
22
+ export declare function registerExitFlush(participant: ExitParticipant): () => void;
23
+ //# sourceMappingURL=exit-hooks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exit-hooks.d.ts","sourceRoot":"","sources":["../src/exit-hooks.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;GAWG;AACH,MAAM,WAAW,eAAe;IAC9B,kEAAkE;IAClE,iBAAiB,IAAI,OAAO,CAAC;IAC7B,8DAA8D;IAC9D,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9C,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;CAChC;AA6DD,wBAAgB,kBAAkB,IAAI,OAAO,CAE5C;AAED,wFAAwF;AACxF,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,eAAe,GAAG,MAAM,IAAI,CAkB1E"}
@@ -0,0 +1,88 @@
1
+ import { isMainThread } from 'node:worker_threads';
2
+ const SIGNALS = ['SIGTERM', 'SIGINT'];
3
+ const REGISTRY_KEY = Symbol.for('fg-tracker.exit-hooks.v1');
4
+ function registry() {
5
+ const holder = globalThis;
6
+ const existing = holder[REGISTRY_KEY];
7
+ if (existing)
8
+ return existing;
9
+ const created = {
10
+ participants: new Set(),
11
+ beforeExitInstalled: false,
12
+ signalsInstalled: false,
13
+ exiting: null,
14
+ handlingSignal: false,
15
+ appHandlesSignal: false,
16
+ onBeforeExit: () => {
17
+ // A promessa (sockets, timers do prazo) mantém o loop vivo; quando terminar, `beforeExit`
18
+ // volta a disparar e, sem nada novo, o processo sai.
19
+ if (created.exiting)
20
+ return;
21
+ created.exiting = flushAll(created).finally(() => {
22
+ created.exiting = null;
23
+ });
24
+ },
25
+ onSignal: (signal) => {
26
+ if (created.handlingSignal) {
27
+ // Segundo sinal durante o envio: sem handler da aplicação, sai já, como sem o SDK.
28
+ if (!created.appHandlesSignal)
29
+ reraise(created, signal);
30
+ return;
31
+ }
32
+ created.handlingSignal = true;
33
+ created.appHandlesSignal = process.listeners(signal).some((listener) => listener !== created.onSignal);
34
+ void flushAll(created).finally(() => {
35
+ created.handlingSignal = false;
36
+ if (!created.appHandlesSignal)
37
+ reraise(created, signal);
38
+ });
39
+ },
40
+ };
41
+ holder[REGISTRY_KEY] = created;
42
+ return created;
43
+ }
44
+ export function exitHooksSupported() {
45
+ return isMainThread && !process.env.AWS_LAMBDA_FUNCTION_NAME;
46
+ }
47
+ /** Registra o participante; devolve a função que o remove (chamada no `shutdown()`). */
48
+ export function registerExitFlush(participant) {
49
+ if (!exitHooksSupported())
50
+ return () => undefined;
51
+ const state = registry();
52
+ state.participants.add(participant);
53
+ if (!state.beforeExitInstalled) {
54
+ state.beforeExitInstalled = true;
55
+ process.on('beforeExit', state.onBeforeExit);
56
+ }
57
+ if (!state.signalsInstalled) {
58
+ state.signalsInstalled = true;
59
+ // Na frente da lista: quando o sinal chega, os handlers da aplicação (inclusive `once`, que o
60
+ // EventEmitter remove ao chamar) ainda estão lá, e a decisão de reemitir é tomada nesse instante.
61
+ for (const signal of SIGNALS)
62
+ process.prependListener(signal, state.onSignal);
63
+ }
64
+ return () => {
65
+ state.participants.delete(participant);
66
+ if (state.participants.size === 0)
67
+ uninstallSignals(state);
68
+ };
69
+ }
70
+ function flushAll(state) {
71
+ const now = Date.now();
72
+ const pending = [...state.participants].filter((participant) => participant.hasPendingForExit());
73
+ if (pending.length === 0)
74
+ return Promise.resolve();
75
+ return Promise.all(pending.map((participant) => participant.flushForExit(now + participant.exitTimeoutMs))).then(() => undefined);
76
+ }
77
+ function reraise(state, signal) {
78
+ uninstallSignals(state);
79
+ process.kill(process.pid, signal);
80
+ }
81
+ function uninstallSignals(state) {
82
+ if (!state.signalsInstalled)
83
+ return;
84
+ state.signalsInstalled = false;
85
+ for (const signal of SIGNALS)
86
+ process.off(signal, state.onSignal);
87
+ }
88
+ //# sourceMappingURL=exit-hooks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exit-hooks.js","sourceRoot":"","sources":["../src/exit-hooks.ts"],"names":[],"mappings":"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"}
package/dist/express.js CHANGED
@@ -1,4 +1,4 @@
1
- import { parseTraceparent } from './context.js';
1
+ import { parseTraceContext } from './context.js';
2
2
  import { normalizePath } from './normalize.js';
3
3
  function headerValue(v) {
4
4
  return Array.isArray(v) ? v[0] : v;
@@ -54,7 +54,7 @@ export function createExpressMiddleware(core, options = {}) {
54
54
  };
55
55
  // Raiz: ignora qualquer contexto herdado (ex.: keep-alive reutilizando o socket);
56
56
  // um `traceparent` válido continua o trace do serviço a montante.
57
- const remote = continueTrace ? parseTraceparent(req.headers['traceparent']) : undefined;
57
+ const remote = continueTrace ? parseTraceContext(req.headers['traceparent'], req.headers['tracestate']) : undefined;
58
58
  const span = remote
59
59
  ? core.startRemoteRoot('http.server', `${method} ${initialRoute}`, attributes, remote)
60
60
  : core.startSpan('http.server', `${method} ${initialRoute}`, attributes, null);
@@ -1 +1 @@
1
- {"version":3,"file":"express.js","sourceRoot":"","sources":["../src/express.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"express.js","sourceRoot":"","sources":["../src/express.ts"],"names":[],"mappings":"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"}