fg-tracker-sdk 0.14.0 → 0.16.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 +26 -0
- package/README.md +23 -6
- package/dist/context.d.ts +16 -0
- package/dist/context.d.ts.map +1 -1
- package/dist/context.js +30 -0
- package/dist/context.js.map +1 -1
- package/dist/express.d.ts +6 -1
- package/dist/express.d.ts.map +1 -1
- package/dist/express.js +19 -5
- package/dist/express.js.map +1 -1
- package/dist/fetch.d.ts.map +1 -1
- package/dist/fetch.js +156 -9
- package/dist/fetch.js.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/dist/infra/aws.d.ts.map +1 -1
- package/dist/infra/aws.js +26 -0
- package/dist/infra/aws.js.map +1 -1
- package/dist/infra/lambda.d.ts +2 -0
- package/dist/infra/lambda.d.ts.map +1 -1
- package/dist/infra/lambda.js +5 -2
- package/dist/infra/lambda.js.map +1 -1
- package/dist/logs/shipper.d.ts.map +1 -1
- package/dist/logs/shipper.js +15 -4
- package/dist/logs/shipper.js.map +1 -1
- package/dist/logs/types.d.ts +8 -0
- package/dist/logs/types.d.ts.map +1 -1
- package/dist/monitors.d.ts.map +1 -1
- package/dist/monitors.js +3 -1
- package/dist/monitors.js.map +1 -1
- package/dist/next.d.ts.map +1 -1
- package/dist/next.js +7 -2
- package/dist/next.js.map +1 -1
- package/dist/node-http.d.ts.map +1 -1
- package/dist/node-http.js +12 -3
- package/dist/node-http.js.map +1 -1
- package/dist/scrub.d.ts +62 -4
- package/dist/scrub.d.ts.map +1 -1
- package/dist/scrub.js +656 -11
- package/dist/scrub.js.map +1 -1
- package/dist/tracker.d.ts +24 -0
- package/dist/tracker.d.ts.map +1 -1
- package/dist/tracker.js +84 -17
- package/dist/tracker.js.map +1 -1
- package/dist/types.d.ts +37 -8
- package/dist/types.d.ts.map +1 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,31 @@
|
|
|
1
1
|
# Changelog — fg-tracker-sdk
|
|
2
2
|
|
|
3
|
+
## 0.16.0
|
|
4
|
+
|
|
5
|
+
Taxa de amostragem no span raiz (CONTRATO.md §4.6, §22). Nada removido e nenhuma opção nova. Retoma o #45 (que propunha a 0.12.0, nunca publicada) e vem depois da 0.15.0 (#58).
|
|
6
|
+
|
|
7
|
+
- **`attributes['sampling.rate']` na raiz local amostrada que decidiu sozinha**: a fração do `tracesSampleRate`, ou o número que o `tracesSampler` devolve, limitada a [0, 1]. Sem amostragem, a raiz leva `1`. Com ela, a API estima o volume real (Σ 1/taxa) ao lado da contagem observada, com intervalo de 95% (§4.6). Até aqui nenhuma versão mandava a taxa, e a estimativa ficava `unknown`.
|
|
8
|
+
- **Não levam a taxa**, porque a probabilidade de envio não é conhecida:
|
|
9
|
+
- raiz que continua um trace recebido (`traceparent` no Express, Next, Lambda e filas): a chance dela depende da taxa de quem decidiu antes, que o header não traz;
|
|
10
|
+
- raiz decidida por um `tracesSampler` que devolve boolean;
|
|
11
|
+
- raiz enviada só porque falhou num trace não amostrado (`sendUnsampledErrors`, `sampling.kept`): ela não saiu do sorteio;
|
|
12
|
+
- spans filhos, que seguem a raiz.
|
|
13
|
+
- Uma `sampling.rate` passada pela aplicação nos atributos da raiz (chave plana ou `sampling: { rate }`) prevalece.
|
|
14
|
+
- Custo: um atributo numérico por raiz enviada (cerca de 20 bytes no JSON). Com APIs anteriores ao volume estimado, o atributo fica só em `attributes`.
|
|
15
|
+
- O comentário de `sendUnsampledErrors` dizia que a API ainda contava as raízes preservadas nas métricas. Isso deixou de valer desde a API de 15/10/2026 (§4.4).
|
|
16
|
+
|
|
17
|
+
## 0.15.0
|
|
18
|
+
|
|
19
|
+
Dados sensíveis limpos antes da fila, uma chamada AWS = um span e repasse opt-in do `baggage` (CONTRATO.md §16, §20, §22). Ordem de release combinada: a 0.14.0 (correções pós-#38, PR #64) sai antes, e esta, depois dela.
|
|
20
|
+
|
|
21
|
+
- **Limpeza por valor, como o contrato prometia** (`scrubFields`): JWT, `Bearer`/`Basic`, cartão (Luhn), CPF formatado, chave privada, tokens de formato publicado (`fgsk_`, `fgt_`, AWS, GitHub, Stripe, Slack, `sk-…`, Google) e `chave=valor` sensível viram `[Filtered]`; e-mails viram `<email>`, o marcador da normalização da API (a fingerprint de erros comuns não muda). Vale para atributos, mensagem e stack do erro, nome e rota do span. `cpf`, `jwt`, `secret_access_key` e `secret_key` entram em `DEFAULT_SCRUB_FIELDS` (`secretAccessKey`, `AWS_SECRET_ACCESS_KEY` e `aws.secret_key` casam); chaves com maiúscula em `scrubFields` passam a casar. `release`, `serviceName`, `environment`, `deployment.environment.name`, `service.name` e `service.version` não passam pela limpeza por valor: um carimbo de build que passa no Luhn (`20261017090915`) não vira `[Filtered]` e continua agrupando releases e ambientes na API.
|
|
22
|
+
- **URLs sem os valores da query**: `attributes.url` (Express, `wrapNextRoute`, `fetch`, `node:http`), URLs dentro de texto e de logs saem sem usuário/senha e com `?token=[Filtered]&page=[Filtered]`; as chaves e o caminho ficam. Num frame de stack (`at f (https://cdn/app.js?v=123:1:24567)`, `f@…/App.tsx?t=…:12:5`), a linha e a coluna ficam fora da query: `app.js?v=[Filtered]:1:24567`. `url.full` continua com `REDACTED`.
|
|
23
|
+
- **`sendDefaultPii`** (padrão `false`). **Efeito ao atualizar:** o Express e o `wrapNextRoute` deixam de gravar `ip`, o `identify` padrão grava só `user.id` (sem `user.email`/`user.name` de `req.user`) e as URLs saem sem os valores da query. `sendDefaultPii: true` volta ao comportamento anterior, menos os valores de chaves sensíveis. `setUser` e `identify` próprios continuam gravando o que a aplicação entregar.
|
|
24
|
+
- **Logs, check-ins e avisos**: o shipper de logs limpa `context` (chave e valor) e `message` (valor) antes da fila (`scrubFields`/`sendDefaultPii` também no shipper, no pino, no winston e no `nestLogger`); a mensagem de `fail` do check-in e os avisos do SDK no console saem limpos. Um `context` que lança ao ser lido vira `{ contextDropped }` em vez de quebrar o log.
|
|
25
|
+
- **Uma chamada AWS, um span** (S08): o HTTP de um client de `instrumentAws` (`node:http` ou fetch instrumentado) não gera mais o `POST https://<endpoint>/` filho nem recebe `traceparent`; retries do AWS SDK viram `aws.attempts`. **Efeito ao atualizar:** `/providers` deixa de contar cada chamada AWS duas vezes.
|
|
26
|
+
- **`propagateBaggageTo`** (padrão `false`, nada muda sem ligar): o header `baggage` recebido (Express, `wrapNextRoute`, `wrapLambda` com evento HTTP) é repassado ao `fetch` e ao `node:http` só para destinos que recebem `traceparent` e estão na lista, com até 64 membros e 8192 bytes; nunca vira atributo nem vai em mensagens SQS/EventBridge. Novos exports: `BAGGAGE_HEADER`, `sanitizeBaggage`, `scrubText`, `scrubUrl`.
|
|
27
|
+
- Atributo circular vira `[Circular]` na primeira repetição (a cópia da limpeza não o expande); `Date`/`Buffer` em atributos saem pelo `toJSON` em vez de virar `{}`.
|
|
28
|
+
|
|
3
29
|
## 0.14.0
|
|
4
30
|
|
|
5
31
|
Correções da revisão pós-merge da 0.11 (CONTRATO.md §16, §16.1). Nada removido; as opções novas são aditivas. Vem depois da 0.13.0 (chamadas de IA, #57) e não colide com a 0.12.0 proposta no #45; quem for publicado depois sobe a versão.
|
package/README.md
CHANGED
|
@@ -58,20 +58,35 @@ await tracker.flush(); await tracker.shutdown(); // shutdown espera no máximo
|
|
|
58
58
|
| `release` | detectada | versão em execução (`FG_TRACKER_RELEASE`, `GITHUB_SHA`, `VERCEL_GIT_COMMIT_SHA`… → `${serviceName}@${sha}`); `false` desliga |
|
|
59
59
|
| `environment` | detectado | `FG_TRACKER_ENV`, `APP_ENV` ou `NODE_ENV`; `false` desliga |
|
|
60
60
|
| `propagateTraceTo` | `true` | destinos que recebem `traceparent` no fetch instrumentado (`true`, lista de hosts/prefixos/RegExp ou `false`) |
|
|
61
|
+
| `propagateBaggageTo` | `false` | repasse do header `baggage` recebido para as chamadas de saída (`fetch`, `node:http`), só para destinos que também recebem `traceparent`; prefira uma lista de hosts. Até 64 membros e 8192 bytes; nunca vira atributo nem vai em mensagens SQS/EventBridge; em redirect do `fetch`, cada salto é conferido de novo (só na chamada simples: URL ou `Request` sem corpo com opções padrão, e `init` só com `method`, `headers`, corpo reenviável, `signal` e `redirect`; fora disso, com redirect automático, o `baggage` não vai) |
|
|
61
62
|
| `instrumentGlobalFetch` | `false` | substitui `globalThis.fetch` pelo fetch instrumentado (provedores externos viram spans) |
|
|
62
63
|
| `instrumentNodeHttp` | `true` | spans `http.client` para a saída de `node:http`/`node:https` (AWS SDK, axios, got, node-fetch 2, gaxios, web-push) |
|
|
63
64
|
| `autoSpanMinDurationMs` | `5` | duração mínima para um trecho medido com `measure`/`instrumentNest` virar span |
|
|
64
65
|
| `measureEventLoopLag` | `true` | mede o atraso do event loop na requisição e grava `eventLoop.maxLagMs`/`eventLoop.blockedMs` no span raiz quando o loop trava |
|
|
65
66
|
| `eventLoopLagThresholdMs` | `50` | atraso mínimo para virar atributo |
|
|
66
67
|
| `captureGlobalErrors` | `false` | `uncaughtException` + `unhandledRejection` viram spans com erro; sem outro listener de `uncaughtException`, envia a fila (até 2 s) antes de sair com código 1 |
|
|
67
|
-
| `tracesSampleRate` | `1` | fração de traces enviados (decidida na raiz; filhos seguem; `traceparent` sai com `-00` quando não amostrado) |
|
|
68
|
-
| `tracesSampler` | — | `(ctx: { kind, name, attributes, parentSampled? }) => taxa` por operação (ex.: `0` para `GET /health`) |
|
|
68
|
+
| `tracesSampleRate` | `1` | fração de traces enviados (decidida na raiz; filhos seguem; `traceparent` sai com `-00` quando não amostrado); a raiz amostrada leva a fração em `sampling.rate` |
|
|
69
|
+
| `tracesSampler` | — | `(ctx: { kind, name, attributes, parentSampled? }) => taxa` por operação (ex.: `0` para `GET /health`); devolva número, não boolean, para o volume ser estimado |
|
|
69
70
|
| `ignoreTransactions` | `[]` | nomes de raiz (string/RegExp) que nunca são enviados |
|
|
70
71
|
| `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
|
|
72
|
+
| `scrubFields` | `DEFAULT_SCRUB_FIELDS` | chaves de atributos que viram `[Filtered]` (password, secret, token, authorization, cookie, api_key, access_token, card_number, cpf, jwt…), mais a limpeza por valor (veja **Dados sensíveis**); `false` desliga as duas |
|
|
73
|
+
| `sendDefaultPii` | `false` | dados pessoais automáticos: `ip`, `user.email`/`user.name` de `req.user` e os valores da query das URLs (veja **Dados sensíveis**) |
|
|
72
74
|
| `beforeSend` | — | `(span) => span \| null`, último filtro antes da fila |
|
|
73
75
|
| `infra` | `{ enabled: true, idleIntervalMs: 60000 }` | agregados de infraestrutura (veja **Infraestrutura**); nunca amostrados |
|
|
74
76
|
|
|
77
|
+
## Dados sensíveis
|
|
78
|
+
|
|
79
|
+
A limpeza roda antes da fila (CONTRATO.md §22), em todo span, nas linhas do shipper de logs, na mensagem de falha dos check-ins e nos avisos do próprio SDK no console:
|
|
80
|
+
|
|
81
|
+
- **Por chave** (`scrubFields`): o valor de uma chave sensível vira `[Filtered]` em qualquer profundidade, sem diferenciar maiúsculas.
|
|
82
|
+
- **Por valor**: JWT, `Bearer …`/`Basic …`, número de cartão (bandeiras 2–6, 13 a 19 dígitos, Luhn), CPF formatado (dígitos verificadores), bloco de chave privada, tokens de formato publicado (`fgsk_`/`fgt_`, AWS `AKIA…`, GitHub, Stripe `sk_live_`, Slack `xox…`, `sk-…` de OpenAI/OpenRouter/Anthropic, Google `AIza…`) e `chave=valor`/`"chave": valor` com chave sensível dentro de texto viram `[Filtered]`. E-mails viram `<email>`, o mesmo marcador da normalização de mensagens da API: a fingerprint das issues não muda. Vale para atributos, mensagem e stack do erro, nome e rota do span.
|
|
83
|
+
- **URLs** (`url`, `http.url`, `url.full`, URLs dentro de texto): sem usuário e senha; os valores da query (e de parâmetros no fragmento) viram `[Filtered]` e as chaves ficam: `/reset?token=[Filtered]&page=[Filtered]`.
|
|
84
|
+
- **Não muda**: identificadores (`traceId`, `spanId`, `remoteParentSpanId`, `requestId`, `user.id`, qualquer chave terminada em `id`), `user.email`/`user.name` que a aplicação entregou (`setUser`, `identify` próprio), `db.query.text`/`db.query.fingerprint` e o nome de `db.query` (SQL já sem literais), e IPs dentro de mensagens (`connect ECONNREFUSED 10.0.0.5:5432` é contexto técnico).
|
|
85
|
+
- **`sendDefaultPii: true`** volta a gravar o `ip` do cliente, o e-mail e o nome de `req.user` e os valores da query, menos os de chave sensível (`scrubFields`, assinaturas `X-Amz-Signature`/`X-Goog-Signature`, `key`, `code`, `id_token`…).
|
|
86
|
+
- `scrubFields: false` desliga a limpeza por chave e por valor; sem `sendDefaultPii`, os valores da query continuam fora.
|
|
87
|
+
|
|
88
|
+
Agregados de infraestrutura levam só nomes de recursos (fila, tabela, função) e números; corpos de mensagens SQS/SNS/EventBridge e chaves do DynamoDB nunca são lidos.
|
|
89
|
+
|
|
75
90
|
## Envio, retry e encerramento
|
|
76
91
|
|
|
77
92
|
O envio segue o CONTRATO.md §4.3 e vale também para o shipper de logs:
|
|
@@ -83,7 +98,8 @@ O envio segue o CONTRATO.md §4.3 e vale também para o shipper de logs:
|
|
|
83
98
|
- **Memória**: lotes de até 1,5 MiB e 1000 spans; fila de até 5000 spans e 32 MiB. `attributes` ou `error` acima de 60 KiB são cortados antes do envio, com `attributes['fg.truncated'] = true` (a API recusaria o span acima de 64 KiB).
|
|
84
99
|
- **`shutdown({ timeoutMs })`** envia o que der em até 10 s (padrão `shutdownTimeoutMs`) e aborta a requisição pendente no prazo. Com a API muda, volta no prazo; o que sobrou é descartado e contado.
|
|
85
100
|
- **Saída sem `shutdown()`** (`exitHooks`, ligado por padrão): scripts e jobs que terminam sozinhos enviam a fila no `beforeExit`. Em SIGTERM/SIGINT o SDK envia a fila e, se a aplicação não trata o sinal, o reemite: o processo sai como sairia sem o SDK. Se a aplicação tem o próprio handler, ela decide quando sair; chame `await tracker.shutdown()` nele. Na Lambda use `wrapLambda` (abaixo).
|
|
86
|
-
- **Amostragem**: com `tracesSampleRate < 1`, a decisão é por trace, na raiz. Com `sendUnsampledErrors: true`, o span que falhou num trace não amostrado e a raiz local dele são enviados mesmo assim, marcados `attributes['sampling.kept'] = 'error'`. Os spans que fecharam antes do erro já foram descartados e não voltam: preservar o trace inteiro exige amostragem no coletor.
|
|
101
|
+
- **Amostragem**: com `tracesSampleRate < 1`, a decisão é por trace, na raiz. Com `sendUnsampledErrors: true`, o span que falhou num trace não amostrado e a raiz local dele são enviados mesmo assim, marcados `attributes['sampling.kept'] = 'error'`. Os spans que fecharam antes do erro já foram descartados e não voltam: preservar o trace inteiro exige amostragem no coletor. A API deixa essas raízes fora das métricas e as mostra nas issues e nos traces.
|
|
102
|
+
- **Volume estimado**: a raiz que decide a amostragem sozinha leva a taxa com que foi sorteada em `attributes['sampling.rate']` (1 sem amostragem), e o painel mostra, ao lado das requisições observadas, o volume estimado (Σ 1/taxa) com intervalo de 95%. Não levam a taxa: raiz que continua um trace recebido (`traceparent`; a chance dela depende da taxa do serviço a montante), raiz decidida por um `tracesSampler` que devolve boolean e raiz enviada só pelo erro (`sampling.kept`). Nesses casos o painel mostra só o observado. Uma `sampling.rate` que a aplicação passa nos atributos da raiz prevalece. Percentis e latência continuam sendo os da amostra.
|
|
87
103
|
|
|
88
104
|
## Erros, usuários, releases e jobs
|
|
89
105
|
|
|
@@ -128,7 +144,7 @@ app.get('/users/:id', async (req, res) => { /* ... */ });
|
|
|
128
144
|
process.on('SIGTERM', () => tracker.shutdown().finally(() => process.exit(0)));
|
|
129
145
|
```
|
|
130
146
|
|
|
131
|
-
O middleware cria um span raiz `http.server` por request. O nome é `${method} ${route}`; a rota vem de `req.baseUrl + req.route.path` (disponível no `finish` da resposta), com fallback para o path com uuids/números trocados por `:id`. Atributos: `url
|
|
147
|
+
O middleware cria um span raiz `http.server` por request. O nome é `${method} ${route}`; a rota vem de `req.baseUrl + req.route.path` (disponível no `finish` da resposta), com fallback para o path com uuids/números trocados por `:id`. Atributos: `url` (query sem valores), `userAgent` e, com `sendDefaultPii: true`, `ip`. O `identify` padrão grava `user.id` (`req.user.id` ou `sub`); e-mail e nome só com `sendDefaultPii: true` ou com um `identify` próprio. Status ≥ 500 vira `error`.
|
|
132
148
|
|
|
133
149
|
## NestJS (platform-express)
|
|
134
150
|
|
|
@@ -410,6 +426,7 @@ await logs.flush(); await logs.shutdown();
|
|
|
410
426
|
| `compression`, `exitHooks` | `'gzip'` (`'none'` com `fetch` próprio), `true` | como no tracker |
|
|
411
427
|
| `tracker` | — | correlação com o span corrente (sem ele usa o contexto global do SDK, que funciona quando o tracker está no mesmo processo) |
|
|
412
428
|
| `minLevel` | `trace` | nível mínimo enviado |
|
|
429
|
+
| `scrubFields`, `sendDefaultPii` | `DEFAULT_SCRUB_FIELDS`, `false` | a mesma limpeza dos spans (veja **Dados sensíveis**): `context` por chave e por valor, `message` por valor, URLs do `context` sem os valores da query; `scrubFields: false` desliga |
|
|
413
430
|
|
|
414
431
|
### pino (pino-http, Fastify, NestJS com nestjs-pino)
|
|
415
432
|
|
|
@@ -528,7 +545,7 @@ await sqs.send(new SendMessageCommand({ QueueUrl, MessageBody }));
|
|
|
528
545
|
| Step Functions | `StartExecution`, `StartSyncExecution` | `sfn`: `started`, `succeeded`, `failed` |
|
|
529
546
|
|
|
530
547
|
- No DynamoDB o middleware injeta `ReturnConsumedCapacity: 'TOTAL'` quando você não informa (passar `'NONE'` desliga a contagem de unidades).
|
|
531
|
-
- 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.
|
|
548
|
+
- 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. É **um** span por chamada: o HTTP dela (`node:http` ou fetch instrumentado) não gera um segundo `http.client` nem recebe `traceparent`, e os retries do AWS SDK aparecem como `aws.attempts` (quando > 1).
|
|
532
549
|
- 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.
|
|
533
550
|
|
|
534
551
|
### Contexto pelas filas (SQS e EventBridge)
|
package/dist/context.d.ts
CHANGED
|
@@ -20,6 +20,16 @@ export interface SpanContext {
|
|
|
20
20
|
executionRootId?: string;
|
|
21
21
|
/** `tracestate` recebido de outro serviço, repassado sem alteração a quem vem depois (W3C). */
|
|
22
22
|
traceState?: string;
|
|
23
|
+
/**
|
|
24
|
+
* `baggage` recebido (W3C Baggage), já dentro dos limites; só existe com `propagateBaggageTo`
|
|
25
|
+
* ligado e só sai para os destinos dessa lista. Nunca vira atributo de span.
|
|
26
|
+
*/
|
|
27
|
+
baggage?: string;
|
|
28
|
+
/**
|
|
29
|
+
* A chamada HTTP feita neste contexto já tem span (o `http.client` do AWS SDK): `node:http` e o
|
|
30
|
+
* `fetch` instrumentado não criam outro nem injetam `traceparent` (S08). Não passa para filhos.
|
|
31
|
+
*/
|
|
32
|
+
httpCovered?: boolean;
|
|
23
33
|
}
|
|
24
34
|
/** Contexto assíncrono compartilhado: quem é o span pai da operação corrente. */
|
|
25
35
|
export declare const als: AsyncLocalStorage<SpanContext>;
|
|
@@ -47,6 +57,12 @@ export declare function formatTraceparent(ctx: SpanContext): string;
|
|
|
47
57
|
* de {@link MAX_RAW_TRACEPARENT_LENGTH} é recusado antes de qualquer cópia.
|
|
48
58
|
*/
|
|
49
59
|
export declare function parseTraceparent(value: string | string[] | undefined | null): SpanContext | undefined;
|
|
60
|
+
export declare const BAGGAGE_HEADER = "baggage";
|
|
61
|
+
/**
|
|
62
|
+
* `baggage` aceitável para repasse: membros válidos (os inválidos saem), no máximo 64 e 8192 bytes
|
|
63
|
+
* no total, cortando membros inteiros do fim. Texto fora do ASCII imprimível descarta o membro.
|
|
64
|
+
*/
|
|
65
|
+
export declare function sanitizeBaggage(value: string | string[] | undefined | null): string | undefined;
|
|
50
66
|
/**
|
|
51
67
|
* `tracestate` aceitável para repasse: texto ASCII imprimível de até 512 caracteres; senão
|
|
52
68
|
* `undefined`. Valor bruto acima de {@link MAX_RAW_TRACESTATE_LENGTH} é recusado antes do `trim`.
|
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;IACrB;;;;;OAKG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,+FAA+F;IAC/F,UAAU,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;;;;;OAKG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,+FAA+F;IAC/F,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;OAGG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;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;AAG9C;;;;GAIG;AACH,eAAO,MAAM,0BAA0B,MAAM,CAAC;AAC9C,eAAO,MAAM,yBAAyB,OAAO,CAAC;AAQ9C,+GAA+G;AAC/G,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,WAAW,GAAG,MAAM,CAE1D;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,GAAG,IAAI,GAAG,WAAW,GAAG,SAAS,CAYrG;AAED,eAAO,MAAM,cAAc,YAAY,CAAC;AAOxC;;;GAGG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,GAAG,IAAI,GAAG,MAAM,GAAG,SAAS,CAe/F;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,GAAG,IAAI,GAAG,MAAM,GAAG,SAAS,CAOlG;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
|
@@ -61,6 +61,36 @@ export function parseTraceparent(value) {
|
|
|
61
61
|
const sampled = (parseInt(match[4], 16) & 1) === 1;
|
|
62
62
|
return { traceId, spanId, sampled };
|
|
63
63
|
}
|
|
64
|
+
export const BAGGAGE_HEADER = 'baggage';
|
|
65
|
+
/** W3C Baggage: o mínimo que todo participante precisa repassar (64 membros, 8192 bytes). */
|
|
66
|
+
const MAX_BAGGAGE_MEMBERS = 64;
|
|
67
|
+
const MAX_BAGGAGE_BYTES = 8192;
|
|
68
|
+
/** `chave=valor` com propriedades opcionais (`;p=v`): chave token, valor sem espaço, aspas, vírgula, `;` ou `\`. */
|
|
69
|
+
const BAGGAGE_MEMBER = /^[!#$%&'*+\-.^_`|~0-9A-Za-z]{1,256}[ \t]*=[ \t]*[!#-+\--:<-[\]-~]*(?:[ \t]*;[\x20-\x2b\x2d-\x7e]*)?$/;
|
|
70
|
+
/**
|
|
71
|
+
* `baggage` aceitável para repasse: membros válidos (os inválidos saem), no máximo 64 e 8192 bytes
|
|
72
|
+
* no total, cortando membros inteiros do fim. Texto fora do ASCII imprimível descarta o membro.
|
|
73
|
+
*/
|
|
74
|
+
export function sanitizeBaggage(value) {
|
|
75
|
+
const raw = Array.isArray(value) ? value.join(',') : value;
|
|
76
|
+
if (typeof raw !== 'string' || !raw.trim())
|
|
77
|
+
return undefined;
|
|
78
|
+
const members = [];
|
|
79
|
+
let bytes = 0;
|
|
80
|
+
for (const part of raw.split(',')) {
|
|
81
|
+
if (members.length >= MAX_BAGGAGE_MEMBERS)
|
|
82
|
+
break;
|
|
83
|
+
const member = part.trim();
|
|
84
|
+
if (!member || member.length > MAX_BAGGAGE_BYTES || !BAGGAGE_MEMBER.test(member))
|
|
85
|
+
continue;
|
|
86
|
+
const added = member.length + (members.length > 0 ? 1 : 0);
|
|
87
|
+
if (bytes + added > MAX_BAGGAGE_BYTES)
|
|
88
|
+
break;
|
|
89
|
+
members.push(member);
|
|
90
|
+
bytes += added;
|
|
91
|
+
}
|
|
92
|
+
return members.length > 0 ? members.join(',') : undefined;
|
|
93
|
+
}
|
|
64
94
|
/**
|
|
65
95
|
* `tracestate` aceitável para repasse: texto ASCII imprimível de até 512 caracteres; senão
|
|
66
96
|
* `undefined`. Valor bruto acima de {@link MAX_RAW_TRACESTATE_LENGTH} é recusado antes do `trim`.
|
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":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAmC1C,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;;;;GAIG;AACH,MAAM,CAAC,MAAM,0BAA0B,GAAG,GAAG,CAAC;AAC9C,MAAM,CAAC,MAAM,yBAAyB,GAAG,IAAI,CAAC;AAC9C;;;;GAIG;AACH,MAAM,cAAc,GAAG,oEAAoE,CAAC;AAE5F,+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;;;;GAIG;AACH,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,OAAO,GAAG,KAAK,QAAQ,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,MAAM,GAAG,0BAA0B;QAAE,OAAO,SAAS,CAAC;IACjG,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,IAAI,OAAO,KAAK,IAAI,IAAI,CAAC,OAAO,KAAK,IAAI,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,SAAS,CAAC;QAAE,OAAO,SAAS,CAAC;IACvF,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,MAAM,CAAC,MAAM,cAAc,GAAG,SAAS,CAAC;AACxC,6FAA6F;AAC7F,MAAM,mBAAmB,GAAG,EAAE,CAAC;AAC/B,MAAM,iBAAiB,GAAG,IAAI,CAAC;AAC/B,oHAAoH;AACpH,MAAM,cAAc,GAAG,sGAAsG,CAAC;AAE9H;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,KAA2C;IACzE,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,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE;QAAE,OAAO,SAAS,CAAC;IAC7D,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;QAClC,IAAI,OAAO,CAAC,MAAM,IAAI,mBAAmB;YAAE,MAAM;QACjD,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QAC3B,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,GAAG,iBAAiB,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC;YAAE,SAAS;QAC3F,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC3D,IAAI,KAAK,GAAG,KAAK,GAAG,iBAAiB;YAAE,MAAM;QAC7C,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACrB,KAAK,IAAI,KAAK,CAAC;IACjB,CAAC;IACD,OAAO,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AAC5D,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAAC,KAA2C;IAC5E,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,KAAK,GAAG,CAAC,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,yBAAyB;QAAE,OAAO,SAAS,CAAC;IACrK,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,IAAI,GAAG,CAAC,MAAM,GAAG,yBAAyB;QAAE,OAAO,SAAS,CAAC;IACxF,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"}
|
package/dist/express.d.ts
CHANGED
|
@@ -1,7 +1,12 @@
|
|
|
1
1
|
import type { TrackerCore } from './tracker.js';
|
|
2
2
|
import type { ExpressErrorMiddleware, ExpressLikeRequest, ExpressMiddleware, ExpressOptions, UserRef } from './types.js';
|
|
3
|
-
/**
|
|
3
|
+
/**
|
|
4
|
+
* Usuário de `req.user.id` (passport, Nest guards) com e-mail/nome quando existirem. É o `identify`
|
|
5
|
+
* padrão com `sendDefaultPii: true`; sem ela, o padrão grava só o id (`identifyById`).
|
|
6
|
+
*/
|
|
4
7
|
export declare function defaultIdentify(req: ExpressLikeRequest): UserRef | undefined;
|
|
8
|
+
/** Só o id de `req.user` (`id` ou `sub`): o `identify` padrão sem `sendDefaultPii`. */
|
|
9
|
+
export declare function identifyById(req: ExpressLikeRequest): UserRef | undefined;
|
|
5
10
|
/**
|
|
6
11
|
* Middleware Express: um span raiz `http.server` por request. Deve ser o
|
|
7
12
|
* primeiro middleware para que tudo o que vier depois (handlers, queries,
|
package/dist/express.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"express.d.ts","sourceRoot":"","sources":["../src/express.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,KAAK,EAAE,sBAAsB,EAAE,kBAAkB,EAAuB,iBAAiB,EAAE,cAAc,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAgB9I
|
|
1
|
+
{"version":3,"file":"express.d.ts","sourceRoot":"","sources":["../src/express.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,KAAK,EAAE,sBAAsB,EAAE,kBAAkB,EAAuB,iBAAiB,EAAE,cAAc,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAgB9I;;;GAGG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,kBAAkB,GAAG,OAAO,GAAG,SAAS,CAS5E;AAED,uFAAuF;AACvF,wBAAgB,YAAY,CAAC,GAAG,EAAE,kBAAkB,GAAG,OAAO,GAAG,SAAS,CAGzE;AAED;;;;;GAKG;AACH,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,WAAW,EAAE,OAAO,GAAE,cAAmB,GAAG,iBAAiB,CA8E1G;AAED;;;GAGG;AACH,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,WAAW,GAAG,sBAAsB,CAMnF"}
|
package/dist/express.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { parseTraceContext } from './context.js';
|
|
1
|
+
import { parseTraceContext, sanitizeBaggage } from './context.js';
|
|
2
2
|
import { normalizePath } from './normalize.js';
|
|
3
3
|
function headerValue(v) {
|
|
4
4
|
return Array.isArray(v) ? v[0] : v;
|
|
@@ -12,7 +12,10 @@ function resolveRoute(req, fallbackPath) {
|
|
|
12
12
|
}
|
|
13
13
|
return normalizePath(fallbackPath);
|
|
14
14
|
}
|
|
15
|
-
/**
|
|
15
|
+
/**
|
|
16
|
+
* Usuário de `req.user.id` (passport, Nest guards) com e-mail/nome quando existirem. É o `identify`
|
|
17
|
+
* padrão com `sendDefaultPii: true`; sem ela, o padrão grava só o id (`identifyById`).
|
|
18
|
+
*/
|
|
16
19
|
export function defaultIdentify(req) {
|
|
17
20
|
const user = req.user;
|
|
18
21
|
if (!user || typeof user !== 'object')
|
|
@@ -27,6 +30,11 @@ export function defaultIdentify(req) {
|
|
|
27
30
|
ref.name = user.name;
|
|
28
31
|
return ref;
|
|
29
32
|
}
|
|
33
|
+
/** Só o id de `req.user` (`id` ou `sub`): o `identify` padrão sem `sendDefaultPii`. */
|
|
34
|
+
export function identifyById(req) {
|
|
35
|
+
const user = defaultIdentify(req);
|
|
36
|
+
return user ? { id: user.id } : undefined;
|
|
37
|
+
}
|
|
30
38
|
/**
|
|
31
39
|
* Middleware Express: um span raiz `http.server` por request. Deve ser o
|
|
32
40
|
* primeiro middleware para que tudo o que vier depois (handlers, queries,
|
|
@@ -34,7 +42,8 @@ export function defaultIdentify(req) {
|
|
|
34
42
|
* via `traceparent` (tracing distribuído) e associa o usuário ao fim da resposta.
|
|
35
43
|
*/
|
|
36
44
|
export function createExpressMiddleware(core, options = {}) {
|
|
37
|
-
const
|
|
45
|
+
const pii = core.options.sendDefaultPii;
|
|
46
|
+
const identify = options.identify === false ? null : (options.identify ?? (pii ? defaultIdentify : identifyById));
|
|
38
47
|
const continueTrace = options.continueTrace ?? true;
|
|
39
48
|
return function fgTrackerMiddleware(req, res, next) {
|
|
40
49
|
if (!core.enabled) {
|
|
@@ -44,12 +53,12 @@ export function createExpressMiddleware(core, options = {}) {
|
|
|
44
53
|
const method = (req.method ?? 'GET').toUpperCase();
|
|
45
54
|
const rawUrl = req.originalUrl ?? req.url ?? '/';
|
|
46
55
|
const initialRoute = normalizePath(rawUrl);
|
|
47
|
-
const ip = req.ip ?? headerValue(req.headers['x-forwarded-for'])?.split(',')[0]?.trim() ?? req.socket?.remoteAddress ?? null;
|
|
48
56
|
const requestId = headerValue(req.headers['x-request-id']) ?? null;
|
|
57
|
+
// `url` sai com a query limpa na fila (scrub.ts); o IP do cliente só com `sendDefaultPii`.
|
|
49
58
|
const attributes = {
|
|
50
59
|
url: rawUrl,
|
|
51
60
|
userAgent: headerValue(req.headers['user-agent']) ?? null,
|
|
52
|
-
ip,
|
|
61
|
+
...(pii ? { ip: req.ip ?? headerValue(req.headers['x-forwarded-for'])?.split(',')[0]?.trim() ?? req.socket?.remoteAddress ?? null } : {}),
|
|
53
62
|
...(requestId ? { requestId } : {}),
|
|
54
63
|
};
|
|
55
64
|
// Raiz: ignora qualquer contexto herdado (ex.: keep-alive reutilizando o socket);
|
|
@@ -60,6 +69,11 @@ export function createExpressMiddleware(core, options = {}) {
|
|
|
60
69
|
: core.startSpan('http.server', `${method} ${initialRoute}`, attributes, null);
|
|
61
70
|
span.method = method;
|
|
62
71
|
span.route = initialRoute;
|
|
72
|
+
if (continueTrace && core.options.propagateBaggageTo !== false) {
|
|
73
|
+
const baggage = sanitizeBaggage(req.headers['baggage']);
|
|
74
|
+
if (baggage)
|
|
75
|
+
span.baggage = baggage;
|
|
76
|
+
}
|
|
63
77
|
if (typeof res.setHeader === 'function' && typeof res.getHeader === 'function' && !res.getHeader('x-trace-id')) {
|
|
64
78
|
try {
|
|
65
79
|
res.setHeader('x-trace-id', span.traceId);
|
package/dist/express.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"express.js","sourceRoot":"","sources":["../src/express.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"express.js","sourceRoot":"","sources":["../src/express.ts"],"names":[],"mappings":"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"}
|
package/dist/fetch.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fetch.d.ts","sourceRoot":"","sources":["../src/fetch.ts"],"names":[],"mappings":"AAOA,OAAO,EAAmB,KAAK,WAAW,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"fetch.d.ts","sourceRoot":"","sources":["../src/fetch.ts"],"names":[],"mappings":"AAOA,OAAO,EAAmB,KAAK,WAAW,EAAE,MAAM,cAAc,CAAC;AAqKjE;;;;;GAKG;AACH,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,WAAW,EAAE,SAAS,GAAE,OAAO,UAAU,CAAC,KAAwB,GAAG,OAAO,UAAU,CAAC,KAAK,CA+EzI"}
|
package/dist/fetch.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { performance } from 'node:perf_hooks';
|
|
2
|
-
import { TRACEPARENT_HEADER, TRACESTATE_HEADER, traceContextHeaders } from './context.js';
|
|
2
|
+
import { BAGGAGE_HEADER, TRACEPARENT_HEADER, TRACESTATE_HEADER, traceContextHeaders } from './context.js';
|
|
3
3
|
import { matchGenAiTarget } from './genai/config.js';
|
|
4
4
|
import { failHttpGenAiCall, observeHttpGenAiResponse, startHttpGenAiCall } from './genai/http.js';
|
|
5
5
|
import { httpClientSemconv, normalizePath } from './normalize.js';
|
|
@@ -27,24 +27,144 @@ function describe(input, init) {
|
|
|
27
27
|
/**
|
|
28
28
|
* Acrescenta `traceparent` (e `tracestate`, quando o trace veio com um) ao request sem perder
|
|
29
29
|
* headers já definidos (Request, Headers, array ou objeto). Um `traceparent` já presente vence.
|
|
30
|
+
* Devolve também os headers que o SDK acrescentou (só esses são revistos a cada redirect).
|
|
30
31
|
*/
|
|
31
32
|
function withTraceContext(input, init, values) {
|
|
33
|
+
const injected = {};
|
|
32
34
|
const apply = (headers) => {
|
|
33
35
|
headers.set(TRACEPARENT_HEADER, values[TRACEPARENT_HEADER]);
|
|
34
|
-
|
|
35
|
-
|
|
36
|
+
injected[TRACEPARENT_HEADER] = values[TRACEPARENT_HEADER];
|
|
37
|
+
for (const name of [TRACESTATE_HEADER, BAGGAGE_HEADER]) {
|
|
38
|
+
if (values[name] && !headers.has(name)) {
|
|
39
|
+
headers.set(name, values[name]);
|
|
40
|
+
injected[name] = values[name];
|
|
41
|
+
}
|
|
42
|
+
}
|
|
36
43
|
};
|
|
37
44
|
if (input instanceof Request && !init?.headers) {
|
|
38
45
|
if (input.headers.has(TRACEPARENT_HEADER))
|
|
39
|
-
return { input, init };
|
|
46
|
+
return { input, init, injected };
|
|
40
47
|
const headers = new Headers(input.headers);
|
|
41
48
|
apply(headers);
|
|
42
|
-
return { input: new Request(input, { headers }), init };
|
|
49
|
+
return { input: new Request(input, { headers }), init, injected };
|
|
43
50
|
}
|
|
44
51
|
const headers = new Headers(init?.headers ?? (input instanceof Request ? input.headers : undefined));
|
|
45
52
|
if (!headers.has(TRACEPARENT_HEADER))
|
|
46
53
|
apply(headers);
|
|
47
|
-
return { input, init: { ...init, headers } };
|
|
54
|
+
return { input, init: { ...init, headers }, injected };
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Corpo que pode ser reenviado a cada redirect: texto, `Blob` (imutáveis) e `URLSearchParams`,
|
|
58
|
+
* `ArrayBuffer` e views, que são copiados no início (`frozenBody`). Stream e `FormData` ficam com
|
|
59
|
+
* o fetch nativo.
|
|
60
|
+
*/
|
|
61
|
+
function replayableBody(body) {
|
|
62
|
+
return (body === undefined ||
|
|
63
|
+
body === null ||
|
|
64
|
+
typeof body === 'string' ||
|
|
65
|
+
body instanceof URLSearchParams ||
|
|
66
|
+
body instanceof ArrayBuffer ||
|
|
67
|
+
ArrayBuffer.isView(body) ||
|
|
68
|
+
(typeof Blob !== 'undefined' && body instanceof Blob));
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Retrato do corpo no momento da chamada, como o fetch nativo faz: a aplicação pode alterar ou
|
|
72
|
+
* reutilizar o objeto enquanto a requisição está em voo, e todos os saltos levam os mesmos bytes.
|
|
73
|
+
*/
|
|
74
|
+
function frozenBody(body) {
|
|
75
|
+
if (body instanceof URLSearchParams)
|
|
76
|
+
return new URLSearchParams(body);
|
|
77
|
+
if (body instanceof ArrayBuffer)
|
|
78
|
+
return body.slice(0);
|
|
79
|
+
if (ArrayBuffer.isView(body))
|
|
80
|
+
return new Uint8Array(body.buffer.slice(body.byteOffset, body.byteOffset + body.byteLength));
|
|
81
|
+
return body;
|
|
82
|
+
}
|
|
83
|
+
/** Opções do `RequestInit` que o salto manual reproduz em cada redirect; com qualquer outra, o fetch nativo segue. */
|
|
84
|
+
const MANUAL_FOLLOW_INIT = new Set(['method', 'headers', 'body', 'signal', 'redirect']);
|
|
85
|
+
/**
|
|
86
|
+
* O salto manual (`followRedirects`) só vale para a chamada simples, em que refazer cada redirect
|
|
87
|
+
* como um fetch novo dá o mesmo que o fetch nativo: URL, ou `Request` sem corpo e com as opções
|
|
88
|
+
* padrão, e um `init` só com método, headers, corpo reenviável, `signal` e `redirect`. Qualquer outra
|
|
89
|
+
* coisa (`mode`, `referrer`, `cache`, `integrity`, `credentials`, corpo em stream ou herdado do
|
|
90
|
+
* `Request`…) muda o redirect de um jeito que ele não reproduz: aí o `baggage` não vai e o fetch
|
|
91
|
+
* nativo segue o redirect como sempre.
|
|
92
|
+
*/
|
|
93
|
+
function manualFollowSafe(input, init) {
|
|
94
|
+
if (input instanceof Request) {
|
|
95
|
+
const plain = input.body === null &&
|
|
96
|
+
input.cache === 'default' &&
|
|
97
|
+
input.credentials === 'same-origin' &&
|
|
98
|
+
input.mode === 'cors' &&
|
|
99
|
+
(input.referrer === 'about:client' || input.referrer === '') &&
|
|
100
|
+
input.referrerPolicy === '' &&
|
|
101
|
+
input.integrity === '' &&
|
|
102
|
+
!input.keepalive;
|
|
103
|
+
if (!plain)
|
|
104
|
+
return false;
|
|
105
|
+
}
|
|
106
|
+
if (!init)
|
|
107
|
+
return true;
|
|
108
|
+
for (const [key, value] of Object.entries(init)) {
|
|
109
|
+
if (value !== undefined && !MANUAL_FOLLOW_INIT.has(key))
|
|
110
|
+
return false;
|
|
111
|
+
}
|
|
112
|
+
return replayableBody(init.body);
|
|
113
|
+
}
|
|
114
|
+
const REDIRECT_STATUS = new Set([301, 302, 303, 307, 308]);
|
|
115
|
+
const MAX_REDIRECTS = 20;
|
|
116
|
+
const BODY_HEADERS = ['content-type', 'content-length', 'content-encoding', 'content-language', 'content-location'];
|
|
117
|
+
const CROSS_ORIGIN_DROPPED = ['authorization', 'proxy-authorization', 'cookie', 'host'];
|
|
118
|
+
/**
|
|
119
|
+
* `redirect: 'follow'` feito aqui, salto a salto, quando o SDK acrescentou `baggage`: o fetch nativo
|
|
120
|
+
* mantém headers próprios num redirect para outra origem, e o `baggage` (ids de usuário e tenant)
|
|
121
|
+
* chegaria a um destino fora de `propagateBaggageTo`. Em cada salto, `traceparent`/`tracestate`
|
|
122
|
+
* seguem `propagateTraceTo` e o `baggage` segue as duas listas; o resto é o que o fetch faria:
|
|
123
|
+
* 301/302 com POST e 303 viram GET sem corpo, outra origem perde `authorization`, `cookie` e afins,
|
|
124
|
+
* no máximo 20 saltos. A resposta final tem a URL do último salto (`redirected` fica `false`).
|
|
125
|
+
*/
|
|
126
|
+
async function followRedirects(send, first, start, injected, allow) {
|
|
127
|
+
let res = await send(first.input, { ...first.init, redirect: 'manual' });
|
|
128
|
+
const headers = new Headers(first.init?.headers ?? (first.input instanceof Request ? first.input.headers : undefined));
|
|
129
|
+
const { body: _body, headers: _headers, method: _method, redirect: _redirect, ...rest } = first.init ?? {};
|
|
130
|
+
const signal = first.init?.signal ?? (first.input instanceof Request ? first.input.signal : undefined);
|
|
131
|
+
let { url, method, body } = start;
|
|
132
|
+
for (let hops = 0; REDIRECT_STATUS.has(res.status); hops += 1) {
|
|
133
|
+
const location = res.headers.get('location');
|
|
134
|
+
if (!location)
|
|
135
|
+
return res;
|
|
136
|
+
let next = null;
|
|
137
|
+
try {
|
|
138
|
+
next = new URL(location, url);
|
|
139
|
+
}
|
|
140
|
+
catch {
|
|
141
|
+
next = null;
|
|
142
|
+
}
|
|
143
|
+
await res.body?.cancel().catch(() => undefined);
|
|
144
|
+
if (!next || (next.protocol !== 'http:' && next.protocol !== 'https:'))
|
|
145
|
+
throw new TypeError('fetch failed', { cause: new Error(`redirect para URL inválida: ${location}`) });
|
|
146
|
+
if (hops >= MAX_REDIRECTS)
|
|
147
|
+
throw new TypeError('fetch failed', { cause: new Error('redirect count exceeded') });
|
|
148
|
+
if (((res.status === 301 || res.status === 302) && method === 'POST') || (res.status === 303 && method !== 'GET' && method !== 'HEAD')) {
|
|
149
|
+
method = 'GET';
|
|
150
|
+
body = undefined;
|
|
151
|
+
for (const name of BODY_HEADERS)
|
|
152
|
+
headers.delete(name);
|
|
153
|
+
}
|
|
154
|
+
if (next.origin !== url.origin)
|
|
155
|
+
for (const name of CROSS_ORIGIN_DROPPED)
|
|
156
|
+
headers.delete(name);
|
|
157
|
+
const allowed = allow(next);
|
|
158
|
+
for (const [name, value] of Object.entries(injected)) {
|
|
159
|
+
if (name === BAGGAGE_HEADER ? allowed.baggage : allowed.trace)
|
|
160
|
+
headers.set(name, value);
|
|
161
|
+
else
|
|
162
|
+
headers.delete(name);
|
|
163
|
+
}
|
|
164
|
+
url = next;
|
|
165
|
+
res = await send(next.href, { ...rest, method, headers, body, signal, redirect: 'manual' });
|
|
166
|
+
}
|
|
167
|
+
return res;
|
|
48
168
|
}
|
|
49
169
|
/**
|
|
50
170
|
* Retorna um `fetch` que cria spans `http.client` nomeados
|
|
@@ -56,9 +176,16 @@ export function createInstrumentedFetch(core, fetchImpl = globalThis.fetch) {
|
|
|
56
176
|
const base = fetchImpl;
|
|
57
177
|
const ownEndpoint = core.options.endpoint;
|
|
58
178
|
return async function fgTrackerFetch(input, init) {
|
|
59
|
-
|
|
179
|
+
// Dentro de uma chamada do AWS SDK (handler de fetch), o span dela já cobre este HTTP (S08).
|
|
180
|
+
const parent = core.currentContext();
|
|
181
|
+
if (!core.enabled || !parent)
|
|
60
182
|
return base(input, init);
|
|
61
183
|
const { method, url, raw } = describe(input, init);
|
|
184
|
+
if (parent.httpCovered) {
|
|
185
|
+
if (url)
|
|
186
|
+
core.noteCoveredHttp(url);
|
|
187
|
+
return base(input, init);
|
|
188
|
+
}
|
|
62
189
|
if (!url || raw.startsWith(ownEndpoint))
|
|
63
190
|
return base(input, init);
|
|
64
191
|
const name = `${method} ${url.origin}${normalizePath(url.pathname)}`;
|
|
@@ -79,14 +206,34 @@ export function createInstrumentedFetch(core, fetchImpl = globalThis.fetch) {
|
|
|
79
206
|
}
|
|
80
207
|
}
|
|
81
208
|
let request = { input, init };
|
|
209
|
+
let follow = null;
|
|
82
210
|
if (shouldPropagate(core.options.propagateTraceTo, url)) {
|
|
83
|
-
|
|
211
|
+
const headers = traceContextHeaders(span.context());
|
|
212
|
+
const redirect = init?.redirect ?? (input instanceof Request ? input.redirect : 'follow');
|
|
213
|
+
// `baggage` só para quem também está em `propagateBaggageTo` (padrão: ninguém). Com redirect
|
|
214
|
+
// automático, os saltos são conferidos um a um (`followRedirects`), e só na chamada simples
|
|
215
|
+
// (`manualFollowSafe`); nos outros casos o `baggage` não vai e o fetch nativo segue o redirect.
|
|
216
|
+
const simple = manualFollowSafe(input, init);
|
|
217
|
+
if (span.baggage && shouldPropagate(core.options.propagateBaggageTo, url) && (redirect !== 'follow' || simple)) {
|
|
218
|
+
headers[BAGGAGE_HEADER] = span.baggage;
|
|
219
|
+
}
|
|
220
|
+
const prepared = withTraceContext(input, init, headers);
|
|
221
|
+
request = prepared;
|
|
222
|
+
if (redirect === 'follow' && prepared.injected[BAGGAGE_HEADER] !== undefined) {
|
|
223
|
+
// O corpo é congelado agora (antes de qualquer `await`), e o mesmo retrato vai em todos os saltos.
|
|
224
|
+
const body = frozenBody(init?.body);
|
|
225
|
+
const first = init && 'body' in init ? { input: prepared.input, init: { ...prepared.init, body } } : prepared;
|
|
226
|
+
follow = () => followRedirects(base, first, { url, method, body }, prepared.injected, (next) => {
|
|
227
|
+
const trace = shouldPropagate(core.options.propagateTraceTo, next);
|
|
228
|
+
return { trace, baggage: trace && shouldPropagate(core.options.propagateBaggageTo, next) };
|
|
229
|
+
});
|
|
230
|
+
}
|
|
84
231
|
span.setAttribute('propagated', true);
|
|
85
232
|
}
|
|
86
233
|
let handedOff = false;
|
|
87
234
|
const signal = init?.signal ?? (input instanceof Request ? input.signal : undefined);
|
|
88
235
|
try {
|
|
89
|
-
const res = await core.runInSpan(span, () => base(request.input, request.init));
|
|
236
|
+
const res = await core.runInSpan(span, () => (follow ? follow() : base(request.input, request.init)));
|
|
90
237
|
span.statusCode = res.status;
|
|
91
238
|
if (res.status >= 500)
|
|
92
239
|
span.error = { name: 'HttpError', message: `HTTP ${res.status}` };
|
package/dist/fetch.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fetch.js","sourceRoot":"","sources":["../src/fetch.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"fetch.js","sourceRoot":"","sources":["../src/fetch.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -6,8 +6,8 @@ export type { NestContainerLike, NestInstrumentationOptions } from './nest.js';
|
|
|
6
6
|
export { MIN_POOL_WAIT_MS } from './pool-wait.js';
|
|
7
7
|
export { normalizePath, normalizeSql } from './normalize.js';
|
|
8
8
|
export { detectEnvironment, detectRelease, shouldPropagate } from './tracker.js';
|
|
9
|
-
export { formatTraceparent, parseTraceContext, parseTraceparent, TRACEPARENT_HEADER, TRACESTATE_HEADER } from './context.js';
|
|
10
|
-
export { DEFAULT_SCRUB_FIELDS, scrubAttributes } from './scrub.js';
|
|
9
|
+
export { BAGGAGE_HEADER, formatTraceparent, parseTraceContext, parseTraceparent, sanitizeBaggage, TRACEPARENT_HEADER, TRACESTATE_HEADER } from './context.js';
|
|
10
|
+
export { DEFAULT_SCRUB_FIELDS, scrubAttributes, scrubText, scrubUrl } from './scrub.js';
|
|
11
11
|
export { API_KEY_HEADER, DEFAULT_ENDPOINT, readEnv } from './constants.js';
|
|
12
12
|
export { InfraAggregator, detectArchitecture, infraKey } from './infra/aggregator.js';
|
|
13
13
|
export type { InfraAggregate, InfraAggregatorOptions, InfraKind, InfraResourceRef } from './infra/aggregator.js';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,YAAY,EAAE,8BAA8B,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAiBxG,OAAO,KAAK,EAAsE,OAAO,EAAE,cAAc,EAAW,MAAM,YAAY,CAAC;AAEvI,YAAY,EACV,UAAU,EACV,aAAa,EACb,cAAc,EACd,sBAAsB,EACtB,kBAAkB,EAClB,mBAAmB,EACnB,iBAAiB,EACjB,cAAc,EACd,YAAY,EACZ,gBAAgB,EAChB,UAAU,EACV,kBAAkB,EAClB,oBAAoB,EACpB,kBAAkB,EAClB,eAAe,EACf,IAAI,EACJ,SAAS,EACT,QAAQ,EACR,OAAO,EACP,cAAc,EACd,sBAAsB,EACtB,sBAAsB,EACtB,OAAO,GACR,MAAM,YAAY,CAAC;AACpB,YAAY,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AACnD,YAAY,EAAE,iBAAiB,EAAE,0BAA0B,EAAE,MAAM,WAAW,CAAC;AAC/E,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC7D,OAAO,EAAE,iBAAiB,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AACjF,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|