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.
- package/CHANGELOG.md +30 -0
- package/README.md +129 -35
- package/dist/context.d.ts +9 -0
- package/dist/context.d.ts.map +1 -1
- package/dist/context.js +27 -0
- package/dist/context.js.map +1 -1
- package/dist/database.d.ts.map +1 -1
- package/dist/database.js +34 -5
- package/dist/database.js.map +1 -1
- package/dist/express.js +2 -2
- package/dist/express.js.map +1 -1
- package/dist/fetch.d.ts.map +1 -1
- package/dist/fetch.js +47 -10
- package/dist/fetch.js.map +1 -1
- package/dist/genai/bedrock.d.ts +22 -0
- package/dist/genai/bedrock.d.ts.map +1 -0
- package/dist/genai/bedrock.js +161 -0
- package/dist/genai/bedrock.js.map +1 -0
- package/dist/genai/call.d.ts +96 -0
- package/dist/genai/call.d.ts.map +1 -0
- package/dist/genai/call.js +260 -0
- package/dist/genai/call.js.map +1 -0
- package/dist/genai/config.d.ts +71 -0
- package/dist/genai/config.d.ts.map +1 -0
- package/dist/genai/config.js +110 -0
- package/dist/genai/config.js.map +1 -0
- package/dist/genai/http.d.ts +49 -0
- package/dist/genai/http.d.ts.map +1 -0
- package/dist/genai/http.js +795 -0
- package/dist/genai/http.js.map +1 -0
- package/dist/genai/semconv.d.ts +64 -0
- package/dist/genai/semconv.d.ts.map +1 -0
- package/dist/genai/semconv.js +52 -0
- package/dist/genai/semconv.js.map +1 -0
- package/dist/genai/sse.d.ts +26 -0
- package/dist/genai/sse.d.ts.map +1 -0
- package/dist/genai/sse.js +100 -0
- package/dist/genai/sse.js.map +1 -0
- package/dist/index.d.ts +7 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +11 -3
- package/dist/index.js.map +1 -1
- package/dist/infra/aws.d.ts +45 -3
- package/dist/infra/aws.d.ts.map +1 -1
- package/dist/infra/aws.js +455 -29
- package/dist/infra/aws.js.map +1 -1
- package/dist/infra/lambda.d.ts +19 -0
- package/dist/infra/lambda.d.ts.map +1 -1
- package/dist/infra/lambda.js +61 -9
- package/dist/infra/lambda.js.map +1 -1
- package/dist/infra/messaging.d.ts +133 -0
- package/dist/infra/messaging.d.ts.map +1 -0
- package/dist/infra/messaging.js +366 -0
- package/dist/infra/messaging.js.map +1 -0
- package/dist/next.js +2 -2
- package/dist/next.js.map +1 -1
- package/dist/node-http.d.ts.map +1 -1
- package/dist/node-http.js +7 -3
- package/dist/node-http.js.map +1 -1
- package/dist/normalize.d.ts +32 -0
- package/dist/normalize.d.ts.map +1 -1
- package/dist/normalize.js +165 -10
- package/dist/normalize.js.map +1 -1
- package/dist/pg.d.ts +8 -3
- package/dist/pg.d.ts.map +1 -1
- package/dist/pg.js +512 -41
- package/dist/pg.js.map +1 -1
- package/dist/tracker.d.ts +17 -1
- package/dist/tracker.d.ts.map +1 -1
- package/dist/tracker.js +50 -5
- package/dist/tracker.js.map +1 -1
- package/dist/types.d.ts +26 -4
- package/dist/types.d.ts.map +1 -1
- 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** (
|
|
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!, //
|
|
26
|
-
endpoint:
|
|
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 =
|
|
69
|
-
| `scrubFields` | `DEFAULT_SCRUB_FIELDS` | chaves de atributos que viram `[Filtered]` (password, token, authorization, cookie,
|
|
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: '
|
|
102
|
-
// FG_TRACKER_KEY=
|
|
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=
|
|
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
|
|
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
|
-
|
|
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
|
|
366
|
+
-H "x-fg-tracker-key: $FG_TRACKER_KEY" \
|
|
303
367
|
-d '{
|
|
304
368
|
"traces": [{
|
|
305
|
-
"traceId": "
|
|
369
|
+
"traceId": "'"$TRACE_ID"'",
|
|
306
370
|
"spans": [
|
|
307
|
-
{ "spanId": "
|
|
371
|
+
{ "spanId": "'"$ROOT"'", "parentSpanId": null, "kind": "http.server", "name": "GET /users/:id",
|
|
308
372
|
"method": "GET", "route": "/users/:id", "statusCode": 200,
|
|
309
|
-
"startedAt": "
|
|
310
|
-
"attributes": { "url": "/users/42" }, "error": null },
|
|
311
|
-
{ "spanId": "
|
|
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": "
|
|
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:
|
|
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:
|
|
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
|
|
412
|
-
-H 'content-type: application/json'
|
|
413
|
-
-H
|
|
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));
|
|
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
|
-
|
|
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
|
|
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
|
|
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
|
package/dist/context.d.ts.map
CHANGED
|
@@ -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;
|
|
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
|
package/dist/context.js.map
CHANGED
|
@@ -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;
|
|
1
|
+
{"version":3,"file":"context.js","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"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"}
|
package/dist/database.d.ts.map
CHANGED
|
@@ -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,
|
|
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 {
|
|
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
|
|
10
|
-
|
|
11
|
-
span.setAttribute(
|
|
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
|
-
|
|
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);
|
package/dist/database.js.map
CHANGED
|
@@ -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 {
|
|
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 ?
|
|
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);
|