fg-tracker-sdk 0.10.0 → 0.13.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 (74) hide show
  1. package/CHANGELOG.md +30 -0
  2. package/README.md +129 -35
  3. package/dist/context.d.ts +9 -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/express.js +2 -2
  11. package/dist/express.js.map +1 -1
  12. package/dist/fetch.d.ts.map +1 -1
  13. package/dist/fetch.js +47 -10
  14. package/dist/fetch.js.map +1 -1
  15. package/dist/genai/bedrock.d.ts +22 -0
  16. package/dist/genai/bedrock.d.ts.map +1 -0
  17. package/dist/genai/bedrock.js +161 -0
  18. package/dist/genai/bedrock.js.map +1 -0
  19. package/dist/genai/call.d.ts +96 -0
  20. package/dist/genai/call.d.ts.map +1 -0
  21. package/dist/genai/call.js +260 -0
  22. package/dist/genai/call.js.map +1 -0
  23. package/dist/genai/config.d.ts +71 -0
  24. package/dist/genai/config.d.ts.map +1 -0
  25. package/dist/genai/config.js +110 -0
  26. package/dist/genai/config.js.map +1 -0
  27. package/dist/genai/http.d.ts +49 -0
  28. package/dist/genai/http.d.ts.map +1 -0
  29. package/dist/genai/http.js +795 -0
  30. package/dist/genai/http.js.map +1 -0
  31. package/dist/genai/semconv.d.ts +64 -0
  32. package/dist/genai/semconv.d.ts.map +1 -0
  33. package/dist/genai/semconv.js +52 -0
  34. package/dist/genai/semconv.js.map +1 -0
  35. package/dist/genai/sse.d.ts +26 -0
  36. package/dist/genai/sse.d.ts.map +1 -0
  37. package/dist/genai/sse.js +100 -0
  38. package/dist/genai/sse.js.map +1 -0
  39. package/dist/index.d.ts +7 -2
  40. package/dist/index.d.ts.map +1 -1
  41. package/dist/index.js +11 -3
  42. package/dist/index.js.map +1 -1
  43. package/dist/infra/aws.d.ts +45 -3
  44. package/dist/infra/aws.d.ts.map +1 -1
  45. package/dist/infra/aws.js +455 -29
  46. package/dist/infra/aws.js.map +1 -1
  47. package/dist/infra/lambda.d.ts +19 -0
  48. package/dist/infra/lambda.d.ts.map +1 -1
  49. package/dist/infra/lambda.js +61 -9
  50. package/dist/infra/lambda.js.map +1 -1
  51. package/dist/infra/messaging.d.ts +133 -0
  52. package/dist/infra/messaging.d.ts.map +1 -0
  53. package/dist/infra/messaging.js +366 -0
  54. package/dist/infra/messaging.js.map +1 -0
  55. package/dist/next.js +2 -2
  56. package/dist/next.js.map +1 -1
  57. package/dist/node-http.d.ts.map +1 -1
  58. package/dist/node-http.js +7 -3
  59. package/dist/node-http.js.map +1 -1
  60. package/dist/normalize.d.ts +32 -0
  61. package/dist/normalize.d.ts.map +1 -1
  62. package/dist/normalize.js +165 -10
  63. package/dist/normalize.js.map +1 -1
  64. package/dist/pg.d.ts +8 -3
  65. package/dist/pg.d.ts.map +1 -1
  66. package/dist/pg.js +512 -41
  67. package/dist/pg.js.map +1 -1
  68. package/dist/tracker.d.ts +17 -1
  69. package/dist/tracker.d.ts.map +1 -1
  70. package/dist/tracker.js +50 -5
  71. package/dist/tracker.js.map +1 -1
  72. package/dist/types.d.ts +26 -4
  73. package/dist/types.d.ts.map +1 -1
  74. package/package.json +7 -1
package/CHANGELOG.md CHANGED
@@ -1,5 +1,35 @@
1
1
  # Changelog — fg-tracker-sdk
2
2
 
3
+ ## 0.13.0
4
+
5
+ Chamadas de IA generativa (CONTRATO.md §30, docs/genai.md). Nada removido; ligado por padrão só onde já havia instrumentação (`fetch` instrumentado e `instrumentAws`), e `genAi: false` desliga.
6
+
7
+ - **Atributos `gen_ai.*` da semconv OpenTelemetry 1.41.1** (`GEN_AI_SEMCONV_VERSION`, e `fg.gen_ai.semconv_version` em cada span) no próprio span da chamada, sem span novo: o `http.client` do `fetch` instrumentado para OpenAI Chat Completions/Embeddings (`api.openai.com`), OpenRouter (`openrouter.ai/api`) e Anthropic Messages (`api.anthropic.com`), e o span de `instrumentAws` para Bedrock Runtime `Converse`/`ConverseStream`. Gateways compatíveis entram por `genAi.endpoints`.
8
+ - Modelo pedido e devolvido, provedor, parâmetros numéricos, motivo de parada, tempo até o primeiro pedaço do stream, `error.type`, `http.request.resend_count` (retentativas dos clientes OpenAI/Anthropic) e o desfecho em `fg.gen_ai.outcome` (`completed`, `incomplete`, `cancelled`, `error`, `unobserved`).
9
+ - **Uso de tokens só quando o provedor informa** (`gen_ai.usage.*`, entrada já com o cache). Nada é estimado nem pedido: o SDK não acrescenta `stream_options` ao pedido. Stream da Anthropic cancelado antes do total leva só a entrada, com `fg.gen_ai.usage.partial`.
10
+ - **Custo**: o informado pelo OpenRouter (`usage.cost`, USD) ou, com `genAi.pricing` (fonte, versão, moeda e preços por milhão de tokens), uma estimativa marcada `fg.gen_ai.cost.estimated = true`. O SDK não traz preços; tabela inválida é ignorada com aviso.
11
+ - **Privacidade**: prompts, mensagens, instruções de sistema, ferramentas, respostas, identificadores de usuário e mensagens de erro do provedor nunca viram atributo. Exceção do Bedrock passa a ir para o `span.error` com o nome da exceção e sem a mensagem do serviço.
12
+ - **Efeito ao atualizar:** com o `fetch` instrumentado, a resposta desses provedores (JSON ou stream) chega à aplicação como uma `Response` equivalente (mesmo status, headers e `url`) cujo corpo passa intacto pela observação. O corpo é um byte stream como o do `fetch` e aceita leitor BYOB. O span `http.client` dessas chamadas passa a durar até o fim do corpo (antes, até os headers), e um 4xx/5xx ganha `error.type`. Num 2xx o corpo é observado enquanto a aplicação o lê, sem leitura adiantada, e a contrapressão da conexão não muda; corpo que ninguém lê fecha o span como `unobserved` depois de `observationIdleMs`. Cancelamento do corpo (`break`, `abort`, `body.cancel()`) fecha a conexão como antes. Numa resposta 2xx o span fecha como `cancelled`, sem `error`; num 4xx/5xx o desfecho segue `error`, com até 50 ms e 64 KiB para ler o código do provedor. `genAi: false` volta ao comportamento anterior.
13
+ - Novos exports: `GEN_AI_SEMCONV_VERSION` e os tipos `GenAiOptions`, `GenAiEndpoint`, `GenAiPricing`, `GenAiModelPrice`, `GenAiApiFormat`, `GenAiOperation`, `GenAiOutcome`.
14
+
15
+ ## 0.11.0
16
+
17
+ Contexto distribuído por filas, eventos, banco e transações (CONTRATO.md §16.1). Nada removido; a forma antiga de cada API continua valendo.
18
+
19
+ - **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.
20
+ - **`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.
21
+ - **`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).
22
+ - **`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.
23
+ - **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.
24
+ - **`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.
25
+ - **`postgres.js`**: `sql.begin(fn)` vira `postgres transaction`, pai das queries do callback.
26
+ - **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).
27
+ - **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`).
28
+ - **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`.
29
+ - **`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.
30
+ - 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`.
31
+ - Links entre traces são o atributo `links` (`[{ traceId, spanId }]`, até 32): a API grava e devolve, mas ainda não navega por eles.
32
+
3
33
  ## 0.10.0
4
34
 
5
35
  Transporte confiável (CONTRATO.md §4.3). Nenhuma API pública removida; opções novas são aditivas.
package/README.md CHANGED
@@ -2,6 +2,8 @@
2
2
 
3
3
  Instrumentação Node para o [FG Tracker](../../README.md) e envio de logs (pino, winston, NestJS Logger). Única dependência de runtime: `pino-abstract-transport` (a instrumentação AWS usa tipos estruturais, sem `@aws-sdk/*`); usa `AsyncLocalStorage` para encadear spans e o `fetch` global do Node para enviar lotes ao `POST /v1/ingest`.
4
4
 
5
+ Guia público (conta, chaves, primeiro trace, integrações e diagnóstico): <https://tracker-site.fortground.com.br/docs/node/>.
6
+
5
7
  Requisitos: Node ≥ 20 (recomendado 24). O pacote é ESM; em projetos CommonJS (NestJS) funciona com `require()` no Node ≥ 22.12 ou via `import()` dinâmico.
6
8
 
7
9
  ## Instalação
@@ -14,7 +16,7 @@ pnpm add fg-tracker-sdk # publicado no npm
14
16
 
15
17
  ## Endpoint
16
18
 
17
- O default de `endpoint` é `http://localhost:4050` (constante `DEFAULT_ENDPOINT`, API local do monorepo). Em produção passe a URL da API mostrada no painel em **Conectar** (por exemplo via `FG_TRACKER_URL`). O endereço de produção da API é `https://tracker-api.fortground.com.br` (o antigo `track-api.fortground.com.br` continua respondendo).
19
+ O default de `endpoint` é `http://localhost:4050` (constante `DEFAULT_ENDPOINT`, API local do monorepo). Em produção passe a URL da API mostrada no painel em **Conectar**: o `createTracker` **não lê** `FG_TRACKER_URL` nem `FG_TRACKER_KEY` sozinho (só os CLIs leem), então passe `endpoint: process.env.FG_TRACKER_URL` e `apiKey: process.env.FG_TRACKER_KEY`. O endereço de produção da API é `https://tracker-api.fortground.com.br` (o antigo `track-api.fortground.com.br` continua respondendo).
18
20
 
19
21
  ## API
20
22
 
@@ -22,8 +24,8 @@ O default de `endpoint` é `http://localhost:4050` (constante `DEFAULT_ENDPOINT`
22
24
  import { createTracker } from 'fg-tracker-sdk';
23
25
 
24
26
  const tracker = createTracker({
25
- apiKey: process.env.FG_TRACKER_KEY!, // stk_...
26
- endpoint: 'http://localhost:4050', // default
27
+ apiKey: process.env.FG_TRACKER_KEY!, // chave de servidor fgsk_... (nunca no navegador)
28
+ endpoint: process.env.FG_TRACKER_URL, // sem ele: http://localhost:4050
27
29
  serviceName: 'minha-app',
28
30
  flushIntervalMs: 2000, // default
29
31
  });
@@ -38,7 +40,7 @@ await tracker.flush(); await tracker.shutdown(); // shutdown espera no máximo
38
40
 
39
41
  | opção | default | descrição |
40
42
  |---|---|---|
41
- | `apiKey` | — | chave do projeto; sem ela o tracker vira no-op (com aviso) |
43
+ | `apiKey` | — | chave de servidor do projeto (`fgsk_…`, Configurações → Chaves de ingestão); sem ela o tracker vira no-op (com aviso) |
42
44
  | `endpoint` | `http://localhost:4050` | URL base da API |
43
45
  | `serviceName` | — | vai em `attributes.serviceName` de todo span |
44
46
  | `flushIntervalMs` | `2000` | intervalo de envio |
@@ -65,8 +67,8 @@ await tracker.flush(); await tracker.shutdown(); // shutdown espera no máximo
65
67
  | `tracesSampleRate` | `1` | fração de traces enviados (decidida na raiz; filhos seguem; `traceparent` sai com `-00` quando não amostrado) |
66
68
  | `tracesSampler` | — | `(ctx: { kind, name, attributes, parentSampled? }) => taxa` por operação (ex.: `0` para `GET /health`) |
67
69
  | `ignoreTransactions` | `[]` | nomes de raiz (string/RegExp) que nunca são enviados |
68
- | `ignoreErrors` | `[]` | erros (`name: message`, string/RegExp) que não viram issue (`attributes.ignoredError = true`) |
69
- | `scrubFields` | `DEFAULT_SCRUB_FIELDS` | chaves de atributos que viram `[Filtered]` (password, token, authorization, cookie, cpf…); `false` desliga |
70
+ | `ignoreErrors` | `[]` | erros (`name: message`, string/RegExp) que não viram issue (o span vai sem `error`, com `attributes.ignoredError = <nome do erro>`) |
71
+ | `scrubFields` | `DEFAULT_SCRUB_FIELDS` | chaves de atributos que viram `[Filtered]` (password, secret, token, authorization, cookie, api_key, access_token, card_number…; CPF e e-mail não estão na lista padrão); `false` desliga |
70
72
  | `beforeSend` | — | `(span) => span \| null`, último filtro antes da fila |
71
73
  | `infra` | `{ enabled: true, idleIntervalMs: 60000 }` | agregados de infraestrutura (veja **Infraestrutura**); nunca amostrados |
72
74
 
@@ -98,8 +100,8 @@ tracker.currentTraceId(); // para logs / x-trace-
98
100
  await tracker.checkIn('backup-diario', () => runBackup(), { intervalSeconds: 86400, graceSeconds: 600 }); // monitor de job
99
101
  const run = await tracker.monitor('sync').start(); /* ... */ await run.ok(); // ou run.fail(err)
100
102
 
101
- await tracker.registerRelease({ commitSha: process.env.GITHUB_SHA, repository: 'FORTGROUND/phase' }); // ou o CLI:
102
- // FG_TRACKER_KEY=stk_... npx fg-tracker-release --service minha-app --previous-sha $PREV --env production
103
+ await tracker.registerRelease({ commitSha: process.env.GITHUB_SHA, repository: 'sua-org/minha-app' }); // ou o CLI:
104
+ // FG_TRACKER_KEY=fgsk_... FG_TRACKER_URL=https://tracker-api.fortground.com.br npx fg-tracker-release --service minha-app --previous-sha $PREV --env production
103
105
  ```
104
106
 
105
107
  O CLI `fg-tracker-release` lê `git log`/`git show` e envia commits, arquivos e intervalos de linhas alterados: o painel usa isso para apontar **commits/PRs suspeitos** em cada issue e comparar a latência de cada rota entre releases.
@@ -108,9 +110,9 @@ Jobs com crontab: `tracker.checkIn('relatorio', run, { cron: '0 3 * * *', timezo
108
110
 
109
111
  Ambientes nos check-ins: o check-in leva o `environment` do tracker, e cada ambiente tem o seu monitor (status, histórico e alertas) para o mesmo slug, então um job de dev não mascara um de produção que parou. `{ environment: 'staging' }` troca o ambiente de um job e `{ environment: false }` envia sem ambiente (vai para o monitor sem ambiente, o de clientes anteriores). Na primeira vez que um ambiente faz check-in, o monitor dele herda nome e configuração do monitor existente com o mesmo slug. O monitor sem ambiente antigo continua sendo cobrado (um cliente antigo pode ter parado) e aparece como "legado" quando os check-ins com ambiente chegam depois do último sem ambiente: depois de atualizar todos os clientes, pause ou remova esse monitor, ou atribua a ele um ambiente na edição para manter o histórico.
110
112
 
111
- Source maps do front (para o `fg-tracker-browser`): `FG_TRACKER_KEY=stk_... npx fg-tracker-sourcemaps --dir dist --release web@$GITHUB_SHA --url-prefix ~/assets` sobe os `.map` de uma release; a API traduz o stack minificado na ingestão.
113
+ Source maps do front (para o `fg-tracker-browser`): `FG_TRACKER_KEY=fgsk_... FG_TRACKER_URL=https://tracker-api.fortground.com.br npx fg-tracker-sourcemaps --dir dist --release web@$GITHUB_SHA --url-prefix ~/assets` sobe os `.map` de uma release; a API traduz o stack minificado na ingestão.
112
114
 
113
- Falhas de envio são logadas **uma vez** e o lote é reenviado no próximo flush (respostas 4xx descartam o lote — normalmente é chave inválida). O timer usa `unref()`, então não segura o processo vivo; chame `shutdown()` no encerramento para não perder os últimos spans.
115
+ Falhas de envio são logadas **uma vez** (até um envio dar certo). Rede, 408, 429 e 5xx voltam para a fila com backoff; outras respostas 4xx descartam o lote — normalmente é chave inválida. O timer usa `unref()`, então não segura o processo vivo; chame `shutdown()` no encerramento para não perder os últimos spans.
114
116
 
115
117
  ## Express
116
118
 
@@ -118,7 +120,7 @@ Falhas de envio são logadas **uma vez** e o lote é reenviado no próximo flush
118
120
  import express from 'express';
119
121
  import { createTracker } from 'fg-tracker-sdk';
120
122
 
121
- const tracker = createTracker({ apiKey: process.env.FG_TRACKER_KEY!, serviceName: 'minha-api' });
123
+ const tracker = createTracker({ apiKey: process.env.FG_TRACKER_KEY!, endpoint: process.env.FG_TRACKER_URL, serviceName: 'minha-api' });
122
124
  const app = express();
123
125
  app.use(tracker.express()); // ANTES de qualquer outro middleware/rota
124
126
  app.get('/users/:id', async (req, res) => { /* ... */ });
@@ -136,7 +138,7 @@ import { NestFactory } from '@nestjs/core';
136
138
  import { createTracker } from 'fg-tracker-sdk';
137
139
  import { AppModule } from './app.module';
138
140
 
139
- export const tracker = createTracker({ apiKey: process.env.FG_TRACKER_KEY!, serviceName: 'minha-api' });
141
+ export const tracker = createTracker({ apiKey: process.env.FG_TRACKER_KEY!, endpoint: process.env.FG_TRACKER_URL, serviceName: 'minha-api' });
140
142
 
141
143
  async function bootstrap() {
142
144
  const app = await NestFactory.create(AppModule);
@@ -154,7 +156,7 @@ Para encerrar limpo, chame `tracker.shutdown()` num `OnApplicationShutdown` (ou
154
156
  ```ts
155
157
  // src/lib/tracker.ts
156
158
  import { createTracker } from 'fg-tracker-sdk';
157
- export const tracker = createTracker({ apiKey: process.env.FG_TRACKER_KEY!, serviceName: 'meu-site' });
159
+ export const tracker = createTracker({ apiKey: process.env.FG_TRACKER_KEY!, endpoint: process.env.FG_TRACKER_URL, serviceName: 'meu-site' });
158
160
 
159
161
  // app/api/users/[id]/route.ts
160
162
  import { tracker } from '@/lib/tracker';
@@ -164,7 +166,7 @@ export const GET = tracker.wrapNextRoute(async (req, ctx) => {
164
166
  });
165
167
  ```
166
168
 
167
- O span `http.server` recebe `${method} ${pathname normalizado}` e o status da `Response`. Só funciona no runtime Node (não no Edge). Em `output: 'export'` não há route handlers dinâmicos, então nada a instrumentar.
169
+ O span `http.server` recebe `${method} ${pathname normalizado}` e o status da `Response`. Só funciona no runtime Node (não no Edge) e só em route handlers do App Router; não espera o envio no fim da requisição, então em plataformas que congelam a função (Vercel e afins) a fila pode se perder. Em `output: 'export'` não há route handlers dinâmicos, então nada a instrumentar.
168
170
 
169
171
  ## pg
170
172
 
@@ -178,6 +180,26 @@ tracker.instrumentPg(pool);
178
180
 
179
181
  Se você usa drizzle/kysely/knex sobre `pg.Pool`, instrumente o pool antes de passá-lo ao ORM.
180
182
 
183
+ 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`).
184
+
185
+ ### Conexões e transações
186
+
187
+ ```ts
188
+ const client = await pool.connect(); // span `pg connect`: espera por conexão + ocupação do pool
189
+ try {
190
+ await client.query('BEGIN'); // span `pg transaction`, pai das queries até o COMMIT
191
+ await client.query('UPDATE accounts SET …');
192
+ await client.query('COMMIT'); // db.transaction.outcome = 'commit'
193
+ } finally {
194
+ client.release(); // transação ainda aberta aqui → 'released_open'
195
+ }
196
+ ```
197
+
198
+ - `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.
199
+ - 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.
200
+ - `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`.
201
+ - `instrumentPg(client)` com um `pg.Client` avulso também acompanha as transações. Com `postgres` (porsager), `sql.begin(fn)` vira `postgres transaction`.
202
+
181
203
  ### Espera de conexão
182
204
 
183
205
  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.
@@ -223,6 +245,46 @@ createTracker({ apiKey, serviceName: 'minha-app', instrumentNodeHttp: false });
223
245
 
224
246
  > Chamadas feitas direto pela API do `undici` (e não por `fetch`) não passam por `node:http` e não são cobertas; use `tracker.wrapFetch()` nesse caso.
225
247
 
248
+ ## Chamadas de IA (GenAI)
249
+
250
+ Chamadas a modelos de IA feitas pelo `fetch` instrumentado ou por um client Bedrock instrumentado ganham atributos `gen_ai.*` da [semconv OpenTelemetry 1.41.1](https://github.com/open-telemetry/semantic-conventions/tree/v1.41.1/docs/gen-ai) no **próprio** span da chamada — nenhum span novo, nenhum duplicado com a instrumentação HTTP. Ligado por padrão (`genAi: false` desliga).
251
+
252
+ ```ts
253
+ import OpenAI from 'openai';
254
+ import Anthropic from '@anthropic-ai/sdk';
255
+ import { BedrockRuntimeClient } from '@aws-sdk/client-bedrock-runtime';
256
+
257
+ const openai = new OpenAI({ fetch: tracker.wrapFetch() }); // ou instrumentGlobalFetch: true
258
+ const anthropic = new Anthropic({ fetch: tracker.wrapFetch() });
259
+ const bedrock = tracker.instrumentAws(new BedrockRuntimeClient({})); // Converse e ConverseStream
260
+ ```
261
+
262
+ | cliente | testado com | operações |
263
+ |---|---|---|
264
+ | `openai` (e OpenRouter por `fetch`, formato OpenAI) | 7.34.0 | Chat Completions (stream inclusive), Embeddings |
265
+ | `@anthropic-ai/sdk` | 0.133.0 | Messages (stream inclusive) |
266
+ | `@aws-sdk/client-bedrock-runtime` | 3.1132.0 | `Converse`, `ConverseStream` |
267
+ | gateway OpenAI/Anthropic-compatível | — | via `genAi.endpoints: [{ baseUrl, provider, api: 'openai' \| 'anthropic' }]` |
268
+
269
+ - **O que vai**: modelo pedido e devolvido, provedor, parâmetros numéricos, motivo de parada, `fg.gen_ai.outcome` (`completed`, `incomplete`, `cancelled`, `error`, `unobserved`), tempo até o primeiro pedaço no stream, `error.type` e, **só quando o provedor informa**, o uso de tokens (`gen_ai.usage.*`; a entrada inclui o cache).
270
+ - **Stream**: a aplicação recebe o corpo intacto; o span fecha no fim da geração. Cancelar (`break`, `controller.abort()`) fecha como `cancelled`, sem erro, e a conexão fecha como antes. Stream da Anthropic cancelado antes do total: só a entrada, com `fg.gen_ai.usage.partial = true`.
271
+ - **Custo**: o informado pelo OpenRouter (`usage.cost`) ou, com `genAi.pricing`, uma estimativa pela **sua** tabela, sempre com fonte, versão e moeda (`fg.gen_ai.cost.estimated = true`). O SDK não traz preços; sem uso completo ou sem preço para o modelo, não há custo.
272
+
273
+ ```ts
274
+ createTracker({
275
+ apiKey, serviceName: 'minha-api', instrumentGlobalFetch: true,
276
+ genAi: {
277
+ pricing: {
278
+ source: 'https://openai.com/api/pricing', version: '2026-10-01', currency: 'USD',
279
+ models: [{ provider: 'openai', model: 'gpt-5-mini', inputPerMillion: 0.25, cacheReadPerMillion: 0.025, outputPerMillion: 2 }],
280
+ },
281
+ },
282
+ });
283
+ ```
284
+
285
+ - **Privacidade**: prompts, mensagens, instruções de sistema, ferramentas, respostas, identificadores de usuário e mensagens de erro do provedor **nunca** viram atributo; não há opção de captura de conteúdo nesta versão.
286
+ - Como todo `http.client`, só há span dentro de um trace (requisição, `tracker.span`, `checkIn`, `trackMessage`). Matriz completa, regras e limites: [docs/genai.md](https://github.com/FORTGROUND/fg-tracker/blob/main/docs/genai.md).
287
+
226
288
  ## Spans por método, automáticos (NestJS)
227
289
 
228
290
  Instrumentar à mão só cobre o que alguém já suspeitava. O trecho que some do waterfall é justamente aquele em que ninguém pensou. Uma linha no bootstrap envolve **todos** os providers e controllers:
@@ -297,25 +359,27 @@ tracker.currentSpan()?.setAttribute('userId', user.id);
297
359
  Não precisa do SDK: basta enviar o body do contrato com a chave no header.
298
360
 
299
361
  ```bash
300
- curl -X POST http://localhost:4050/v1/ingest \
362
+ # startedAt precisa estar dentro da retenção (14 dias) e no máximo 5 min no futuro; ids novos a cada envio
363
+ TRACE_ID=$(openssl rand -hex 16); ROOT=$(openssl rand -hex 8); CHILD=$(openssl rand -hex 8); NOW=$(date -u +%Y-%m-%dT%H:%M:%SZ)
364
+ curl -X POST "$FG_TRACKER_URL/v1/ingest" \
301
365
  -H 'content-type: application/json' \
302
- -H 'x-fg-tracker-key: stk_demo_0000000000000000000000000000' \
366
+ -H "x-fg-tracker-key: $FG_TRACKER_KEY" \
303
367
  -d '{
304
368
  "traces": [{
305
- "traceId": "0123456789abcdef0123456789abcdef",
369
+ "traceId": "'"$TRACE_ID"'",
306
370
  "spans": [
307
- { "spanId": "0123456789abcdef", "parentSpanId": null, "kind": "http.server", "name": "GET /users/:id",
371
+ { "spanId": "'"$ROOT"'", "parentSpanId": null, "kind": "http.server", "name": "GET /users/:id",
308
372
  "method": "GET", "route": "/users/:id", "statusCode": 200,
309
- "startedAt": "2026-09-12T12:00:00.000Z", "endedAt": "2026-09-12T12:00:00.123Z", "durationMs": 123.4,
310
- "attributes": { "url": "/users/42" }, "error": null },
311
- { "spanId": "fedcba9876543210", "parentSpanId": "0123456789abcdef", "kind": "db.query",
373
+ "startedAt": "'"$NOW"'", "endedAt": "'"$NOW"'", "durationMs": 123.4,
374
+ "attributes": { "url": "/users/42", "serviceName": "minha-api" }, "error": null },
375
+ { "spanId": "'"$CHILD"'", "parentSpanId": "'"$ROOT"'", "kind": "db.query",
312
376
  "name": "select * from users where id = ?", "method": null, "route": null, "statusCode": null,
313
- "startedAt": "2026-09-12T12:00:00.010Z", "endedAt": "2026-09-12T12:00:00.050Z", "durationMs": 40,
377
+ "startedAt": "'"$NOW"'", "endedAt": "'"$NOW"'", "durationMs": 40,
314
378
  "attributes": { "rows": 1 }, "error": null }
315
379
  ]
316
380
  }]
317
381
  }'
318
- # → 202 { "accepted": 2, "issuesDetected": 0 }
382
+ # → 202 { "accepted": 2, "rejected": 0, "duplicates": 0, "adjusted": 0, "errors": [], "issuesDetected": 0, ... }
319
383
  ```
320
384
 
321
385
  ## Logs (`POST /v1/logs`)
@@ -327,7 +391,7 @@ O SDK envia linhas de log para a plataforma em lote (`flushIntervalMs` 2 s, `max
327
391
  ```ts
328
392
  import { createLogShipper } from 'fg-tracker-sdk';
329
393
 
330
- const logs = createLogShipper({ apiKey: process.env.FG_TRACKER_KEY!, endpoint: 'http://localhost:4050', service: 'minha-api', env: 'production', tracker });
394
+ const logs = createLogShipper({ apiKey: process.env.FG_TRACKER_KEY!, endpoint: process.env.FG_TRACKER_URL, service: 'minha-api', env: 'production', tracker });
331
395
  logs.push({ level: 'info', message: 'user logged in', context: { userId: 42 }, requestId: req.id });
332
396
  logs.log('error', 'payment failed', { orderId });
333
397
  await logs.flush(); await logs.shutdown();
@@ -357,7 +421,7 @@ import { pinoTransport, traceMixin } from 'fg-tracker-sdk';
357
421
  const logger = pino({
358
422
  level: 'info',
359
423
  mixin: traceMixin(tracker), // opcional; correlação com traces
360
- transport: pinoTransport({ apiKey: process.env.FG_TRACKER_KEY!, endpoint: 'http://localhost:4050', service: 'minha-api', env: 'production' }),
424
+ transport: pinoTransport({ apiKey: process.env.FG_TRACKER_KEY!, endpoint: process.env.FG_TRACKER_URL, service: 'minha-api', env: 'production' }),
361
425
  // equivalente: transport: { target: 'fg-tracker-sdk/pino', options: { apiKey, service } }
362
426
  });
363
427
  app.use(pinoHttp({ logger })); // req.id vira requestId
@@ -377,7 +441,7 @@ const logger = winston.createLogger({
377
441
  format: winston.format.combine(winston.format.timestamp(), winston.format.json()),
378
442
  transports: [
379
443
  new winston.transports.Console(),
380
- new FgTrackerTransport({ apiKey: process.env.FG_TRACKER_KEY!, service: 'minha-api', tracker }),
444
+ new FgTrackerTransport({ apiKey: process.env.FG_TRACKER_KEY!, endpoint: process.env.FG_TRACKER_URL, service: 'minha-api', tracker }),
381
445
  ],
382
446
  });
383
447
  logger.warn('stock low', { sku: 'A-1' }); // meta → context
@@ -394,8 +458,8 @@ Implementa a forma do `LoggerService` sem depender de `@nestjs/common`: espelha
394
458
  import { NestFactory } from '@nestjs/core';
395
459
  import { createTracker, nestLogger } from 'fg-tracker-sdk';
396
460
 
397
- export const tracker = createTracker({ apiKey: process.env.FG_TRACKER_KEY!, serviceName: 'minha-api' });
398
- export const logger = nestLogger({ apiKey: process.env.FG_TRACKER_KEY!, service: 'minha-api', tracker });
461
+ export const tracker = createTracker({ apiKey: process.env.FG_TRACKER_KEY!, endpoint: process.env.FG_TRACKER_URL, serviceName: 'minha-api' });
462
+ export const logger = nestLogger({ apiKey: process.env.FG_TRACKER_KEY!, endpoint: process.env.FG_TRACKER_URL, service: 'minha-api', tracker });
399
463
 
400
464
  const app = await NestFactory.create(AppModule, { logger });
401
465
  app.use(tracker.express());
@@ -408,9 +472,9 @@ Dentro das classes continue usando `new Logger(MinhaClasse.name)` do Nest — el
408
472
  ### Ingestão crua de logs (qualquer linguagem)
409
473
 
410
474
  ```bash
411
- curl -X POST http://localhost:4050/v1/logs \\
412
- -H 'content-type: application/json' \\
413
- -H 'x-fg-tracker-key: stk_demo_0000000000000000000000000000' \\
475
+ curl -X POST "$FG_TRACKER_URL/v1/logs" \
476
+ -H 'content-type: application/json' \
477
+ -H "x-fg-tracker-key: $FG_TRACKER_KEY" \
414
478
  -d '{ "logs": [
415
479
  { "eventId": "9f1c2a7e4b0d4c4e8a51f0d2b3c4d5e6", "ts": "2026-09-12T12:00:00.000Z", "level": "info", "service": "minha-api", "message": "user logged in",
416
480
  "context": { "userId": 42 }, "traceId": "0123456789abcdef0123456789abcdef", "requestId": "req-1", "env": "production" },
@@ -465,21 +529,51 @@ await sqs.send(new SendMessageCommand({ QueueUrl, MessageBody }));
465
529
  - 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.
466
530
  - 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.
467
531
 
532
+ ### Contexto pelas filas (SQS e EventBridge)
533
+
534
+ 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.
535
+
536
+ ```ts
537
+ const sqs = tracker.instrumentAws(new SQSClient({}), {
538
+ propagation: true, // default (false desliga; propagateTraceTo: false também)
539
+ sqsMaxMessageBytes: 262_144, // MaximumMessageSize da fila, se for menor que 1 MiB
540
+ });
541
+ ```
542
+
543
+ 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.
544
+
545
+ **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.
546
+
468
547
  ### Consumidores de fila
469
548
 
470
549
  ```ts
550
+ // Lambda com evento SQS: cada mensagem continua o trace de quem a publicou.
551
+ export const handler = tracker.wrapLambda(async (event) => {
552
+ await Promise.all(event.Records.map((record) =>
553
+ tracker.trackMessage(QueueUrl, record, () => handle(record)),
554
+ ));
555
+ });
556
+
557
+ // Polling: ReceiveMessage num client instrumentado guarda o contexto de cada mensagem.
558
+ const { Messages } = await sqs.send(new ReceiveMessageCommand({ QueueUrl }));
471
559
  for (const message of Messages ?? []) {
472
- await tracker.trackMessage(QueueUrl, () => handle(message)); // URL ou ARN da fila
560
+ await tracker.trackMessage(QueueUrl, message, () => handle(message));
473
561
  }
562
+
563
+ // Forma anterior, que continua valendo: mede só localmente, sem ligação com o produtor.
564
+ await tracker.trackMessage(QueueUrl, () => handle(message));
474
565
  ```
475
566
 
476
- 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.
567
+ - `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`.
568
+ - 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.
569
+ - `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).
570
+ - Mede `processingMsSum`/`processingMsMax` e conta `errors` quando `fn` lança (o erro é relançado).
477
571
 
478
572
  ### Pool de conexões (pg)
479
573
 
480
574
  ```ts
481
575
  const pool = new Pool({ connectionString: process.env.DATABASE_URL });
482
- tracker.instrumentPg(pool); // spans db.query (inalterado)
576
+ tracker.instrumentPg(pool); // spans db.query, `pg connect` e `pg transaction`
483
577
  tracker.instrumentPgPool(pool, { name: 'orders-db' }); // agregado db_pool
484
578
  ```
485
579
 
@@ -537,7 +631,7 @@ O pacote foi renomeado de `stread-track-sdk` (0.3.0) para `fg-tracker-sdk` (0.4.
537
631
  | pino `target: 'stread-track-sdk/pino'` | `target: 'fg-tracker-sdk/pino'` | troque junto com o nome do pacote |
538
632
  | prefixo de log `[stread-track]` | `[fg-tracker]` | — |
539
633
 
540
- Passo a passo: `pnpm remove stread-track-sdk && pnpm add fg-tracker-sdk@^0.4.0`, troque os imports (`from 'stread-track-sdk'` → `from 'fg-tracker-sdk'`, inclusive `/pino` e `/winston`) e, quando quiser, renomeie as variáveis de ambiente e os bins no CI. A API precisa aceitar `x-fg-tracker-key` (versão da API a partir desta mudança) — a produção do FG Tracker já aceita.
634
+ Passo a passo: `pnpm remove stread-track-sdk && pnpm add fg-tracker-sdk@latest`, troque os imports (`from 'stread-track-sdk'` → `from 'fg-tracker-sdk'`, inclusive `/pino` e `/winston`) e, quando quiser, renomeie as variáveis de ambiente e os bins no CI. A API precisa aceitar `x-fg-tracker-key` (versão da API a partir desta mudança) — a produção do FG Tracker já aceita.
541
635
 
542
636
  ## Build
543
637
 
package/dist/context.d.ts CHANGED
@@ -11,6 +11,8 @@ export interface SpanContext {
11
11
  * várias raízes locais no processo (duas requisições do mesmo trace).
12
12
  */
13
13
  localRootId?: string;
14
+ /** `tracestate` recebido de outro serviço, repassado sem alteração a quem vem depois (W3C). */
15
+ traceState?: string;
14
16
  }
15
17
  /** Contexto assíncrono compartilhado: quem é o span pai da operação corrente. */
16
18
  export declare const als: AsyncLocalStorage<SpanContext>;
@@ -22,8 +24,15 @@ export declare function newTraceId(): string;
22
24
  */
23
25
  export declare function currentSpanContext(): SpanContext | undefined;
24
26
  export declare const TRACEPARENT_HEADER = "traceparent";
27
+ export declare const TRACESTATE_HEADER = "tracestate";
25
28
  /** Header `traceparent` (`00-<traceId>-<spanId>-01`; flag `00` quando não amostrado) do contexto informado. */
26
29
  export declare function formatTraceparent(ctx: SpanContext): string;
27
30
  /** Lê um `traceparent` recebido; `undefined` quando ausente, malformado ou com ids nulos. */
28
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>;
29
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;IAClB,kGAAkG;IAClG,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;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;AAgB1C,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":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAkB1C,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,MAAM,iBAAiB,GAAG,YAAY,CAAC;AAC9C,oGAAoG;AACpG,MAAM,qBAAqB,GAAG,GAAG,CAAC;AAClC,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;AAED,4GAA4G;AAC5G,MAAM,UAAU,kBAAkB,CAAC,KAA2C;IAC5E,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;IAC3D,IAAI,OAAO,GAAG,KAAK,QAAQ;QAAE,OAAO,SAAS,CAAC;IAC9C,MAAM,OAAO,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;IAC3B,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,MAAM,GAAG,qBAAqB,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC;QAAE,OAAO,SAAS,CAAC;IAC5G,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,uGAAuG;AACvG,MAAM,UAAU,iBAAiB,CAC/B,WAAiD,EACjD,UAAiD;IAEjD,MAAM,GAAG,GAAG,gBAAgB,CAAC,WAAW,CAAC,CAAC;IAC1C,IAAI,CAAC,GAAG;QAAE,OAAO,SAAS,CAAC;IAC3B,MAAM,UAAU,GAAG,kBAAkB,CAAC,UAAU,CAAC,CAAC;IAClD,OAAO,UAAU,CAAC,CAAC,CAAC,EAAE,GAAG,GAAG,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC;AACnD,CAAC;AAED,iFAAiF;AACjF,MAAM,UAAU,mBAAmB,CAAC,GAAgB;IAClD,OAAO,GAAG,CAAC,UAAU;QACnB,CAAC,CAAC,EAAE,CAAC,kBAAkB,CAAC,EAAE,iBAAiB,CAAC,GAAG,CAAC,EAAE,CAAC,iBAAiB,CAAC,EAAE,GAAG,CAAC,UAAU,EAAE;QACvF,CAAC,CAAC,EAAE,CAAC,kBAAkB,CAAC,EAAE,iBAAiB,CAAC,GAAG,CAAC,EAAE,CAAC;AACvD,CAAC"}
@@ -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":"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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);