fg-tracker-sdk 0.6.0 → 0.7.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 CHANGED
@@ -1,5 +1,13 @@
1
1
  # Changelog — fg-tracker-sdk
2
2
 
3
+ ## 0.7.0 — 2026-09-18
4
+
5
+ - **Saída HTTP de `node:http`/`node:https` vira span `http.client`** (`instrumentNodeHttp`, default `true`). O `fetch` instrumentado só cobre quem chama `fetch`; o resto do ecossistema fala pelo módulo `http` — AWS SDK v3 (`@smithy/node-http-handler`), axios, got, node-fetch 2, gaxios (`google-auth-library`) e web-push. Sem isso, essas chamadas viravam tempo sem span nenhum, indistinguível de CPU travada. Usa `diagnostics_channel` em vez de monkeypatch: nada é substituído, outra biblioteca instrumentando o mesmo módulo não conflita e a ordem de import não importa. Mesmas regras do fetch (span só dentro de um trace, `propagateTraceTo`, header já definido preservado, endpoint do coletor ignorado). `shutdown()` cancela as inscrições. Chamadas feitas direto pela API do `undici` não são cobertas.
6
+ - **Atraso do event loop por requisição** (`measureEventLoopLag`, default `true`): grava `eventLoop.maxLagMs` e `eventLoop.blockedMs` no span raiz quando o loop trava acima de `eventLoopLagThresholdMs` (default 50 ms). É o que separa "o processo parou" de "estávamos esperando alguém lá fora" num trecho sem span. A amostragem só roda enquanto há requisição aberta: não gasta nada com processo ocioso e o congelamento do Lambda entre invocações não vira falso positivo.
7
+ - **`tracker.measure(name, fn, options?)`**: mede um trecho e só cria o span acima de `autoSpanMinDurationMs` (default 5 ms) ou em erro. Preserva função síncrona como síncrona. O span nasce depois do trecho terminar, então não é pai dos spans criados dentro dele — use `tracker.span()` onde o aninhamento importa.
8
+ - **`tracker.instrumentNest(container, options?)`**: envolve os métodos de providers e controllers de uma aplicação NestJS a partir de `app.get(ModulesContainer)`, sem decorar nada. Lê o container estruturalmente, então o SDK não importa `@nestjs/core` nem ganha peer dependency. Pula providers do próprio framework (que o Nest re-registra em todo módulo) e hooks de ciclo de vida.
9
+ - Novas opções: `instrumentNodeHttp`, `measureEventLoopLag`, `eventLoopLagThresholdMs`, `autoSpanMinDurationMs`. Novos exports de tipo: `MeasureOptions`, `NestContainerLike`, `NestInstrumentationOptions`. Sem novas dependências de runtime.
10
+
3
11
  ## 0.5.0 — 2026-09-15
4
12
 
5
13
  - **Agregados de infraestrutura** (CONTRATO.md §27.4): o tracker agrega em processo por recurso e envia `infra[]` no mesmo `POST /v1/ingest` dos spans. Contadores nunca são amostrados (independem de `tracesSampleRate`, `tracesSampler` e `beforeSend`). Janela de 60 s (`infra.idleIntervalMs`) ou `liveIntervalMs` enquanto a resposta da ingestão trouxer `live: true`. Processo só com infra envia `{ traces: [], infra }`; sem agregados o body é idêntico ao da 0.4.
package/README.md CHANGED
@@ -14,7 +14,7 @@ pnpm add fg-tracker-sdk # publicado no npm
14
14
 
15
15
  ## Endpoint
16
16
 
17
- O default de `endpoint` é `http://localhost:4050` (constante `DEFAULT_ENDPOINT`, API local do monorepo). Em produção passe a URL da API mostrada no painel em **Conectar** (por exemplo via `FG_TRACKER_URL`). O domínio `https://track-api.fortground.com.br` será o endereço definitivo da API; até ele entrar no ar, use a URL atual do painel.
17
+ O default de `endpoint` é `http://localhost:4050` (constante `DEFAULT_ENDPOINT`, API local do monorepo). Em produção passe a URL da API mostrada no painel em **Conectar** (por exemplo via `FG_TRACKER_URL`). O endereço de produção da API é `https://tracker-api.fortground.com.br` (o antigo `track-api.fortground.com.br` continua respondendo).
18
18
 
19
19
  ## API
20
20
 
@@ -50,6 +50,13 @@ await tracker.flush(); await tracker.shutdown();
50
50
  | `environment` | detectado | `FG_TRACKER_ENV`, `APP_ENV` ou `NODE_ENV`; `false` desliga |
51
51
  | `propagateTraceTo` | `true` | destinos que recebem `traceparent` no fetch instrumentado (`true`, lista de hosts/prefixos/RegExp ou `false`) |
52
52
  | `instrumentGlobalFetch` | `false` | substitui `globalThis.fetch` pelo fetch instrumentado (provedores externos viram spans) |
53
+ | `instrumentNodeHttp` | `true` | spans `http.client` para a saída de `node:http`/`node:https` (AWS SDK, axios, got, node-fetch 2, gaxios, web-push) |
54
+ <<<<<<< HEAD
55
+ | `autoSpanMinDurationMs` | `5` | duração mínima para um trecho medido com `measure`/`instrumentNest` virar span |
56
+ =======
57
+ | `measureEventLoopLag` | `true` | mede o atraso do event loop na requisição e grava `eventLoop.maxLagMs`/`eventLoop.blockedMs` no span raiz quando o loop trava |
58
+ | `eventLoopLagThresholdMs` | `50` | atraso mínimo para virar atributo |
59
+ >>>>>>> origin/main
53
60
  | `captureGlobalErrors` | `false` | `uncaughtExceptionMonitor` + `unhandledRejection` viram spans com erro |
54
61
  | `tracesSampleRate` | `1` | fração de traces enviados (decidida na raiz; filhos seguem; `traceparent` sai com `-00` quando não amostrado) |
55
62
  | `tracesSampler` | — | `(ctx: { kind, name, attributes, parentSampled? }) => taxa` por operação (ex.: `0` para `GET /health`) |
@@ -164,6 +171,86 @@ globalThis.fetch = tracker.wrapFetch(globalThis.fetch);
164
171
 
165
172
  Cada chamada vira um span `http.client` nomeado `${method} ${origin}${pathname normalizado}` (ex.: `GET https://api.github.com/repos/:id`). É isso que alimenta a detecção de **LOOP**: a mesma chamada repetida ≥ `loop_threshold` vezes sob o mesmo pai. Chamadas ao próprio endpoint do FG Tracker são ignoradas.
166
173
 
174
+ ## node:http e node:https (automático)
175
+
176
+ O `fetch` cobre quem chama `fetch`. Todo o resto do ecossistema Node continua falando pelo módulo `http`, e por isso o SDK também instrumenta a saída de `node:http`/`node:https` — **ligado por default, sem nenhuma linha de código**:
177
+
178
+ | biblioteca | transporte |
179
+ |---|---|
180
+ | AWS SDK v3 (S3, DynamoDB, Lambda, SQS…) | `@smithy/node-http-handler` → `node:https` |
181
+ | `google-auth-library`, `googleapis` | gaxios → node-fetch 2 → `node:https` |
182
+ | `axios`, `got`, `node-fetch` 2, `request` | `node:http`/`node:https` |
183
+ | `web-push`, `@apple/app-store-server-library` | `node:https` |
184
+
185
+ Vale para qualquer cliente, inclusive um que você nem sabe que existe dentro de uma dependência — e não depende de lembrar de envolver cada cliente. A implementação usa [`diagnostics_channel`](https://nodejs.org/api/diagnostics_channel.html), o ponto de observação que o próprio Node publica: nada é substituído por monkeypatch, nada quebra se outra biblioteca instrumentar o mesmo módulo, e a ordem de import não importa.
186
+
187
+ As regras são as mesmas do `fetch`: span `http.client` com o mesmo nome e `attributes.host`, só dentro de um trace em andamento (um poller de background não vira trace órfão), `traceparent` propagado conforme `propagateTraceTo` e sem tocar num header que o chamador já definiu, 5xx marcando erro no span, e chamadas ao próprio endpoint do FG Tracker ignoradas.
188
+
189
+ Para desligar:
190
+
191
+ ```ts
192
+ createTracker({ apiKey, serviceName: 'minha-app', instrumentNodeHttp: false });
193
+ ```
194
+
195
+ > 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.
196
+
197
+ <<<<<<< HEAD
198
+ ## Spans por método, automáticos (NestJS)
199
+
200
+ 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:
201
+
202
+ ```ts
203
+ import { ModulesContainer } from '@nestjs/core';
204
+
205
+ const app = await NestFactory.create(AppModule);
206
+ tracker.instrumentNest(app.get(ModulesContainer)); // devolve quantos métodos envolveu
207
+ ```
208
+
209
+ Cada método vira `Classe.metodo`, e **só aparece no trace se passar de `autoSpanMinDurationMs`** (default 5 ms). Método trivial chamado mil vezes por requisição não deixa rastro; o método que segurou 1,6 s aparece com nome e duração. Erro sempre vira span, mesmo rápido.
210
+
211
+ O container é lido estruturalmente: o SDK **não importa `@nestjs/core`**, não ganha peer dependency e não fica preso a uma versão do Nest. Providers do próprio framework (`Reflector`, `ApplicationConfig`, …) são pulados — o Nest os re-registra em todo módulo, e medir o framework não diz nada sobre a latência de uma rota. Hooks de ciclo de vida (`onModuleInit` e companhia) também ficam de fora, porque rodam no boot.
212
+
213
+ ```ts
214
+ tracker.instrumentNest(container, {
215
+ minDurationMs: 20,
216
+ includeClass: (className, moduleName) => moduleName !== 'BillingModule',
217
+ includeMethod: (className, methodName) => !methodName.startsWith('_'),
218
+ });
219
+ ```
220
+
221
+ ### Em qualquer framework
222
+
223
+ `measure` é o primitivo por trás disso e funciona sozinho:
224
+
225
+ ```ts
226
+ const artists = await tracker.measure('resolveAvatars', () => Promise.all(rows.map(resolveAvatar)));
227
+ ```
228
+
229
+ Diferença para `tracker.span()`: `span` cria o span sempre — é o certo para um trecho escolhido a dedo. `measure` guarda só dois números na chamada e descarta o que foi rápido, que é o que torna viável instrumentar tudo. Preserva função síncrona como síncrona.
230
+
231
+ > O preço da troca: o span de `measure` é criado depois que o trecho terminou, então ele não é o **pai** dos spans criados lá dentro. Uma query feita dentro de um método medido aparece como irmã dele, não aninhada. Para aninhar, use `tracker.span()`.
232
+
233
+ =======
234
+ ## Atraso do event loop (automático)
235
+
236
+ Um trecho do request sem span nenhum tem duas causas possíveis e opostas: o processo **parou** (laço em memória, JSON gigante, cripto síncrona) ou o processo estava **esperando** alguém lá fora que ninguém instrumentou. As duas produzem exatamente o mesmo espaço em branco no waterfall.
237
+
238
+ O SDK mede o atraso do event loop durante cada requisição e, quando o loop realmente travou, grava no span raiz:
239
+
240
+ | atributo | significado |
241
+ |---|---|
242
+ | `eventLoop.maxLagMs` | pior travada isolada durante a requisição |
243
+ | `eventLoop.blockedMs` | quanto do request o processo passou parado |
244
+
245
+ Abaixo do limiar (`eventLoopLagThresholdMs`, default 50 ms) nada é gravado — um atributo em todo span raiz só engordaria o payload. Então a presença do atributo já é o sinal.
246
+
247
+ A amostragem roda **apenas enquanto há requisição aberta**: processo ocioso não gasta nada, e o congelamento do Lambda entre invocações não vira falso positivo (um timer armado antes do congelamento dispararia segundos depois parecendo uma travada gigante).
248
+
249
+ ```ts
250
+ createTracker({ apiKey, serviceName: 'minha-app', measureEventLoopLag: false }); // desliga
251
+ ```
252
+
253
+ >>>>>>> origin/main
167
254
  ## Spans manuais
168
255
 
169
256
  ```ts
@@ -7,8 +7,8 @@ export declare const API_KEY_HEADER = "x-fg-tracker-key";
7
7
  /**
8
8
  * Endpoint usado quando `endpoint` não é informado (API local do monorepo).
9
9
  * Em produção passe o endpoint explicitamente (ex.: `FG_TRACKER_URL`). O domínio
10
- * `https://track-api.fortground.com.br` é o destino futuro da API; enquanto ele não
11
- * estiver no ar, use a URL de produção atual informada no painel (Conectar).
10
+ * A API de produção é `https://tracker-api.fortground.com.br` (o antigo
11
+ * `track-api.fortground.com.br` continua respondendo).
12
12
  */
13
13
  export declare const DEFAULT_ENDPOINT = "http://localhost:4050";
14
14
  /** Prefixo das variáveis de ambiente lidas pelo SDK e pelos CLIs. */
package/dist/constants.js CHANGED
@@ -7,8 +7,8 @@ export const API_KEY_HEADER = 'x-fg-tracker-key';
7
7
  /**
8
8
  * Endpoint usado quando `endpoint` não é informado (API local do monorepo).
9
9
  * Em produção passe o endpoint explicitamente (ex.: `FG_TRACKER_URL`). O domínio
10
- * `https://track-api.fortground.com.br` é o destino futuro da API; enquanto ele não
11
- * estiver no ar, use a URL de produção atual informada no painel (Conectar).
10
+ * A API de produção é `https://tracker-api.fortground.com.br` (o antigo
11
+ * `track-api.fortground.com.br` continua respondendo).
12
12
  */
13
13
  export const DEFAULT_ENDPOINT = 'http://localhost:4050';
14
14
  /** Prefixo das variáveis de ambiente lidas pelo SDK e pelos CLIs. */
@@ -0,0 +1,61 @@
1
+ /**
2
+ * Atraso do event loop durante uma requisição.
3
+ *
4
+ * Um span diz onde o tempo foi quando alguém instrumentou aquele trecho. Não
5
+ * diz nada quando o tempo foi embora **sem** ninguém estar esperando I/O: um
6
+ * laço em memória, um JSON gigante, uma criptografia síncrona. Nesse caso o
7
+ * processo inteiro para, e o trace mostra só espaço em branco — idêntico ao
8
+ * espaço em branco de uma chamada externa não instrumentada.
9
+ *
10
+ * Medir o atraso do loop separa os dois casos: se o loop travou junto com o
11
+ * buraco, foi CPU deste processo; se o loop estava livre, o request estava
12
+ * esperando alguém lá fora.
13
+ *
14
+ * A amostragem roda **apenas enquanto há requisição aberta**. Além de não
15
+ * gastar nada com o processo ocioso, isso evita o falso positivo do Lambda:
16
+ * entre invocações o processo é congelado, e um timer armado antes do
17
+ * congelamento dispararia segundos depois parecendo um travamento gigantesco.
18
+ */
19
+ export interface EventLoopWindow {
20
+ /** Pior atraso observado numa única amostra da janela. */
21
+ maxLagMs: number;
22
+ /** Soma dos atrasos na janela: quanto do request o processo passou parado. */
23
+ blockedMs: number;
24
+ }
25
+ export declare const DEFAULT_RESOLUTION_MS = 20;
26
+ export declare class EventLoopMonitor {
27
+ private readonly resolutionMs;
28
+ private readonly retention;
29
+ private readonly samples;
30
+ private cursor;
31
+ private timer;
32
+ private lastTick;
33
+ /** Requisições abertas: a amostragem liga na primeira e desliga na última. */
34
+ private refs;
35
+ constructor(resolutionMs?: number, retention?: number);
36
+ /** A amostragem está ligada (há requisição aberta). */
37
+ get sampling(): boolean;
38
+ /** Uma requisição abriu. */
39
+ acquire(): void;
40
+ /** Uma requisição fechou. */
41
+ release(): void;
42
+ private start;
43
+ private stop;
44
+ /**
45
+ * O atraso é o quanto o tick passou do horário previsto. Um loop livre
46
+ * acorda a cada `resolutionMs`; um loop bloqueado por 1,6 s produz um tick
47
+ * 1,6 s atrasado.
48
+ */
49
+ private tick;
50
+ /**
51
+ * Atraso observado entre dois instantes de `performance.now()`.
52
+ *
53
+ * Cada amostra é contabilizada pela parte do seu intervalo que cai dentro da
54
+ * janela, e não pelo instante do tick: um bloqueio que começou antes da
55
+ * requisição não conta inteiro para ela.
56
+ */
57
+ window(fromPerf: number, toPerf: number): EventLoopWindow;
58
+ /** Só para encerramento do tracker: para o timer independente do refcount. */
59
+ dispose(): void;
60
+ }
61
+ //# sourceMappingURL=event-loop.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"event-loop.d.ts","sourceRoot":"","sources":["../src/event-loop.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;GAiBG;AAEH,MAAM,WAAW,eAAe;IAC9B,0DAA0D;IAC1D,QAAQ,EAAE,MAAM,CAAC;IACjB,8EAA8E;IAC9E,SAAS,EAAE,MAAM,CAAC;CACnB;AASD,eAAO,MAAM,qBAAqB,KAAK,CAAC;AAIxC,qBAAa,gBAAgB;IASzB,OAAO,CAAC,QAAQ,CAAC,YAAY;IAC7B,OAAO,CAAC,QAAQ,CAAC,SAAS;IAT5B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAgB;IACxC,OAAO,CAAC,MAAM,CAAK;IACnB,OAAO,CAAC,KAAK,CAA+C;IAC5D,OAAO,CAAC,QAAQ,CAAK;IACrB,8EAA8E;IAC9E,OAAO,CAAC,IAAI,CAAK;gBAGE,YAAY,GAAE,MAA8B,EAC5C,SAAS,GAAE,MAA0B;IAGxD,uDAAuD;IACvD,IAAI,QAAQ,IAAI,OAAO,CAEtB;IAED,4BAA4B;IAC5B,OAAO,IAAI,IAAI;IAKf,6BAA6B;IAC7B,OAAO,IAAI,IAAI;IAKf,OAAO,CAAC,KAAK;IAQb,OAAO,CAAC,IAAI;IAMZ;;;;OAIG;IACH,OAAO,CAAC,IAAI;IAiBZ;;;;;;OAMG;IACH,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,eAAe;IAyBzD,8EAA8E;IAC9E,OAAO,IAAI,IAAI;CAIhB"}
@@ -0,0 +1,115 @@
1
+ import { performance } from 'node:perf_hooks';
2
+ export const DEFAULT_RESOLUTION_MS = 20;
3
+ /** 60 s de histórico a 20 ms; o suficiente para qualquer request que valha investigar. */
4
+ const DEFAULT_RETENTION = 3_000;
5
+ export class EventLoopMonitor {
6
+ resolutionMs;
7
+ retention;
8
+ samples = [];
9
+ cursor = 0;
10
+ timer = null;
11
+ lastTick = 0;
12
+ /** Requisições abertas: a amostragem liga na primeira e desliga na última. */
13
+ refs = 0;
14
+ constructor(resolutionMs = DEFAULT_RESOLUTION_MS, retention = DEFAULT_RETENTION) {
15
+ this.resolutionMs = resolutionMs;
16
+ this.retention = retention;
17
+ }
18
+ /** A amostragem está ligada (há requisição aberta). */
19
+ get sampling() {
20
+ return this.timer !== null;
21
+ }
22
+ /** Uma requisição abriu. */
23
+ acquire() {
24
+ this.refs += 1;
25
+ if (this.refs === 1)
26
+ this.start();
27
+ }
28
+ /** Uma requisição fechou. */
29
+ release() {
30
+ this.refs = Math.max(0, this.refs - 1);
31
+ if (this.refs === 0)
32
+ this.stop();
33
+ }
34
+ start() {
35
+ if (this.timer)
36
+ return;
37
+ this.lastTick = performance.now();
38
+ this.timer = setInterval(() => this.tick(), this.resolutionMs);
39
+ // Telemetria nunca segura o processo vivo.
40
+ if (typeof this.timer === 'object' && this.timer && 'unref' in this.timer)
41
+ this.timer.unref();
42
+ }
43
+ stop() {
44
+ if (!this.timer)
45
+ return;
46
+ clearInterval(this.timer);
47
+ this.timer = null;
48
+ }
49
+ /**
50
+ * O atraso é o quanto o tick passou do horário previsto. Um loop livre
51
+ * acorda a cada `resolutionMs`; um loop bloqueado por 1,6 s produz um tick
52
+ * 1,6 s atrasado.
53
+ */
54
+ tick() {
55
+ const now = performance.now();
56
+ const from = this.lastTick;
57
+ const lagMs = Math.max(0, now - from - this.resolutionMs);
58
+ this.lastTick = now;
59
+ // Buffer circular: memória constante, sem alocar a cada amostra.
60
+ const sample = this.samples[this.cursor];
61
+ if (sample) {
62
+ sample.from = from;
63
+ sample.to = now;
64
+ sample.lagMs = lagMs;
65
+ }
66
+ else {
67
+ this.samples[this.cursor] = { from, to: now, lagMs };
68
+ }
69
+ this.cursor = (this.cursor + 1) % this.retention;
70
+ }
71
+ /**
72
+ * Atraso observado entre dois instantes de `performance.now()`.
73
+ *
74
+ * Cada amostra é contabilizada pela parte do seu intervalo que cai dentro da
75
+ * janela, e não pelo instante do tick: um bloqueio que começou antes da
76
+ * requisição não conta inteiro para ela.
77
+ */
78
+ window(fromPerf, toPerf) {
79
+ let maxLagMs = 0;
80
+ let blockedMs = 0;
81
+ const consider = (from, to, lagMs) => {
82
+ if (lagMs <= 0)
83
+ return;
84
+ const overlap = Math.min(to, toPerf) - Math.max(from, fromPerf);
85
+ if (overlap <= 0)
86
+ return;
87
+ const share = Math.min(lagMs, overlap);
88
+ if (share > maxLagMs)
89
+ maxLagMs = share;
90
+ blockedMs += share;
91
+ };
92
+ for (const sample of this.samples) {
93
+ if (sample)
94
+ consider(sample.from, sample.to, sample.lagMs);
95
+ }
96
+ // Bloqueio ainda não observado: se o loop travou até agora, o tick não teve
97
+ // chance de rodar e não existe amostra nenhuma — é justamente o caso de um
98
+ // request que termina logo depois de travar o processo.
99
+ // Limitado a agora: uma janela no futuro não pode inventar bloqueio.
100
+ if (this.timer) {
101
+ const until = Math.min(toPerf, performance.now());
102
+ consider(this.lastTick, until, until - this.lastTick - this.resolutionMs);
103
+ }
104
+ return { maxLagMs: round(maxLagMs), blockedMs: round(blockedMs) };
105
+ }
106
+ /** Só para encerramento do tracker: para o timer independente do refcount. */
107
+ dispose() {
108
+ this.refs = 0;
109
+ this.stop();
110
+ }
111
+ }
112
+ function round(value) {
113
+ return Math.round(value * 10) / 10;
114
+ }
115
+ //# sourceMappingURL=event-loop.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"event-loop.js","sourceRoot":"","sources":["../src/event-loop.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -1,6 +1,8 @@
1
1
  export type { DatabaseInstrumentationOptions, DatabaseOperation, PostgresSqlLike } from "./database.js";
2
2
  import type { Tracker, TrackerOptions } from './types.js';
3
3
  export type { ActiveSpan, CheckInHandle, CheckInOptions, ExpressErrorMiddleware, ExpressLikeRequest, ExpressLikeResponse, ExpressMiddleware, ExpressOptions, InfraOptions, NextRouteHandler, PgPoolLike, PropagationTargets, RegisterReleaseInput, ReleaseCommitInput, SamplingContext, Span, SpanError, SpanKind, Tracker, TrackerOptions, UserRef, } from './types.js';
4
+ export type { MeasureOptions } from './measure.js';
5
+ export type { NestContainerLike, NestInstrumentationOptions } from './nest.js';
4
6
  export { normalizePath, normalizeSql } from './normalize.js';
5
7
  export { detectEnvironment, detectRelease, shouldPropagate } from './tracker.js';
6
8
  export { formatTraceparent, parseTraceparent, TRACEPARENT_HEADER } from './context.js';
@@ -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;AAaxG,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,OAAO,GACR,MAAM,YAAY,CAAC;AACpB,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,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AACvF,OAAO,EAAE,oBAAoB,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AACnE,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAC3E,OAAO,EAAE,eAAe,EAAE,kBAAkB,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACtF,YAAY,EAAE,cAAc,EAAE,sBAAsB,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACjH,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AACvD,YAAY,EAAE,aAAa,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AACvF,YAAY,EAAE,oBAAoB,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAChF,YAAY,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAC1E,OAAO,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAC9E,YAAY,EAAE,iBAAiB,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAE7F;;;;;;;;GAQG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CA2G9D;AAyBD,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAClD,YAAY,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACjE,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AACzD,YAAY,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAC3D,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,YAAY,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,YAAY,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAC5I,OAAO,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC/D,YAAY,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAEtH,YAAY,EAAE,uBAAuB,EAAE,MAAM,mBAAmB,CAAC"}
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,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,aAAa,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC7D,OAAO,EAAE,iBAAiB,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AACjF,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AACvF,OAAO,EAAE,oBAAoB,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AACnE,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAC3E,OAAO,EAAE,eAAe,EAAE,kBAAkB,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACtF,YAAY,EAAE,cAAc,EAAE,sBAAsB,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACjH,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AACvD,YAAY,EAAE,aAAa,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AACvF,YAAY,EAAE,oBAAoB,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAChF,YAAY,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAC1E,OAAO,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAC9E,YAAY,EAAE,iBAAiB,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAE7F;;;;;;;;GAQG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAwH9D;AAyBD,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAClD,YAAY,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACjE,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AACzD,YAAY,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAC3D,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,YAAY,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,YAAY,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAC5I,OAAO,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC/D,YAAY,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAEtH,YAAY,EAAE,uBAAuB,EAAE,MAAM,mBAAmB,CAAC"}
package/dist/index.js CHANGED
@@ -3,6 +3,9 @@ import { createExpressErrorHandler, createExpressMiddleware } from './express.js
3
3
  import { createInstrumentedFetch } from './fetch.js';
4
4
  import { installGlobalErrorCapture } from './global-errors.js';
5
5
  import { createMonitor, runCheckIn } from './monitors.js';
6
+ import { measure } from './measure.js';
7
+ import { instrumentNestContainer } from './nest.js';
8
+ import { instrumentNodeHttp } from './node-http.js';
6
9
  import { wrapNextRouteHandler } from './next.js';
7
10
  import { instrumentPgPool } from './pg.js';
8
11
  import { registerRelease } from './releases.js';
@@ -40,6 +43,9 @@ export function createTracker(options) {
40
43
  };
41
44
  if (options.instrumentGlobalFetch && core.enabled)
42
45
  instrumentGlobalFetch();
46
+ // Ligado por default: a saída HTTP que não passa pelo `fetch` (AWS SDK, axios,
47
+ // got, node-fetch 2, gaxios, web-push) é invisível sem isto.
48
+ const uninstrumentNodeHttp = options.instrumentNodeHttp !== false && core.enabled ? instrumentNodeHttp(core) : undefined;
43
49
  if (options.captureGlobalErrors && core.enabled)
44
50
  installGlobalErrorCapture(core);
45
51
  const tracker = {
@@ -91,6 +97,8 @@ export function createTracker(options) {
91
97
  span.end();
92
98
  }
93
99
  },
100
+ measure: (name, fn, measureOptions) => measure(core, name, fn, measureOptions),
101
+ instrumentNest: (container, nestOptions) => instrumentNestContainer(core, container, nestOptions),
94
102
  wrapNextRoute: (handler) => wrapNextRouteHandler(core, handler),
95
103
  wrapFetch: (fetchImpl) => createInstrumentedFetch(core, fetchImpl),
96
104
  instrumentGlobalFetch,
@@ -132,7 +140,12 @@ export function createTracker(options) {
132
140
  return core.options.environment;
133
141
  },
134
142
  flush: () => core.flush(),
135
- shutdown: () => core.shutdown(),
143
+ // As inscrições em `diagnostics_channel` são do processo, não do tracker:
144
+ // sem cancelar, um tracker desligado continuaria instrumentando requisições.
145
+ shutdown: async () => {
146
+ uninstrumentNodeHttp?.();
147
+ await core.shutdown();
148
+ },
136
149
  };
137
150
  return tracker;
138
151
  }
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAErH,OAAO,EAAE,yBAAyB,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAC;AAClF,OAAO,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAC;AACrD,OAAO,EAAE,yBAAyB,EAAE,MAAM,oBAAoB,CAAC;AAC/D,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC1D,OAAO,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAC3C,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACxE,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AA0BtD,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,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AACvF,OAAO,EAAE,oBAAoB,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AACnE,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAC3E,OAAO,EAAE,eAAe,EAAE,kBAAkB,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAEtF,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAIvD,OAAO,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAG9E;;;;;;;;GAQG;AACH,MAAM,UAAU,aAAa,CAAC,OAAuB;IACnD,MAAM,IAAI,GAAG,IAAI,WAAW,CAAC,OAAO,CAAC,CAAC;IACtC,IAAI,aAAa,GAAmC,IAAI,CAAC;IAEzD,MAAM,qBAAqB,GAAG,GAA4B,EAAE;QAC1D,IAAI,aAAa;YAAE,OAAO,aAAa,CAAC;QACxC,aAAa,GAAG,UAAU,CAAC,KAAK,CAAC;QACjC,UAAU,CAAC,KAAK,GAAG,uBAAuB,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;QAChE,OAAO,aAAa,CAAC;IACvB,CAAC,CAAC;IACF,IAAI,OAAO,CAAC,qBAAqB,IAAI,IAAI,CAAC,OAAO;QAAE,qBAAqB,EAAE,CAAC;IAC3E,IAAI,OAAO,CAAC,mBAAmB,IAAI,IAAI,CAAC,OAAO;QAAE,yBAAyB,CAAC,IAAI,CAAC,CAAC;IAEjF,MAAM,OAAO,GAAY;QACvB,OAAO,EAAE,CAAC,cAA+B,EAAE,EAAE,CAAC,uBAAuB,CAAC,IAAI,EAAE,cAAc,CAAC;QAC3F,mBAAmB,EAAE,GAAG,EAAE,CAAC,yBAAyB,CAAC,IAAI,CAAC;QAC1D,kBAAkB,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,wBAAwB,CAAC,IAAI,EAAE,MAAM,CAAC;QACtE,kBAAkB,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE,CAAC,wBAAwB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC;QACxF,KAAK,CAAC,aAAa,CAAC,SAAS,EAAE,EAAE;YAC/B,MAAM,IAAI,GAAG,iBAAiB,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;YAChD,IAAI,CAAC;gBAAC,OAAO,MAAM,EAAE,EAAE,CAAC;YAAC,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBAAC,aAAa,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;gBAAC,MAAM,KAAK,CAAC;YAAC,CAAC;oBAAS,CAAC;gBAAC,IAAI,EAAE,GAAG,EAAE,CAAC;YAAC,CAAC;QAChH,CAAC;QACD,iBAAiB,CAAC,SAAS,EAAE,EAAE;YAC7B,MAAM,IAAI,GAAG,iBAAiB,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;YAChD,IAAI,CAAC;gBAAC,OAAO,EAAE,EAAE,CAAC;YAAC,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBAAC,aAAa,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;gBAAC,MAAM,KAAK,CAAC;YAAC,CAAC;oBAAS,CAAC;gBAAC,IAAI,EAAE,GAAG,EAAE,CAAC;YAAC,CAAC;QAC1G,CAAC;QAED,YAAY,EAAE,CAAuB,IAAO,EAAK,EAAE,CAAC,gBAAgB,CAAC,IAAI,EAAE,IAAI,CAAC;QAEhF,KAAK,CAAC,IAAI,CAAI,IAAc,EAAE,IAAY,EAAE,EAAwC,EAAE,aAAsC,EAAE;YAC5H,IAAI,CAAC,IAAI,CAAC,OAAO;gBAAE,OAAO,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC;YAC/D,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC;YACpD,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;gBAC1D,OAAO,MAAM,CAAC;YAChB,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,IAAI,CAAC,IAAI,CAAC,KAAK;oBAAE,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;gBACpC,MAAM,GAAG,CAAC;YACZ,CAAC;oBAAS,CAAC;gBACT,IAAI,CAAC,GAAG,EAAE,CAAC;YACb,CAAC;QACH,CAAC;QAED,aAAa,EAAE,CAAiB,OAA+B,EAAE,EAAE,CAAC,oBAAoB,CAAC,IAAI,EAAE,OAAO,CAAC;QAEvG,SAAS,EAAE,CAAC,SAAmC,EAAE,EAAE,CAAC,uBAAuB,CAAC,IAAI,EAAE,SAAS,CAAC;QAE5F,qBAAqB;QAErB,WAAW,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,WAAW,EAAE;QAErC,QAAQ,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,QAAQ,EAAE;QAE/B,cAAc,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,cAAc,EAAE,EAAE,OAAO;QAEpD,YAAY,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,YAAY,EAAE;QAEvC,OAAO,CAAC,IAAoB;YAC1B,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;QACzD,CAAC;QAED,gBAAgB,CAAC,GAAY,EAAE,aAAsC,EAAE;YACrE,IAAI,CAAC,IAAI,CAAC,OAAO;gBAAE,OAAO;YAC1B,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,EAAE,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACnD,IAAI,IAAI,EAAE,CAAC;gBACT,IAAI,CAAC,IAAI,CAAC,KAAK;oBAAE,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;gBACpC,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC;oBAAE,IAAI,CAAC,YAAY,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;gBACrF,OAAO;YACT,CAAC;YACD,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,WAAW,EAAE,UAAU,EAAE,IAAI,CAAC,CAAC;YACrE,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;YACnB,IAAI,CAAC,GAAG,EAAE,CAAC;QACb,CAAC;QAED,SAAS,EAAE,CAAC,IAAc,EAAE,IAAY,EAAE,aAAsC,EAAE,EAAc,EAAE,CAChG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,EAAE,UAAU,CAAC;QAE1F,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE,EAAE,cAAc,EAAE,EAAE,CAAC,UAAU,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,cAAc,CAAC;QAEjF,OAAO,EAAE,CAAC,IAAI,EAAE,cAAc,EAAE,EAAE,CAAC,aAAa,CAAC,IAAI,EAAE,IAAI,EAAE,cAAc,CAAC;QAE5E,eAAe,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,eAAe,CAAC,IAAI,EAAE,KAAK,CAAC;QAExD,aAAa,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,mBAAmB,CAAC,IAAI,EAAE,MAAM,CAAC;QAE5D,YAAY,EAAE,CAAC,KAAK,EAAE,EAAE,EAAE,EAAE,CAAC,iBAAiB,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;QAE/D,gBAAgB,EAAE,CAAC,IAAI,EAAE,WAAW,EAAE,EAAE,CAAC,aAAa,CAAC,IAAI,EAAE,IAAI,EAAE,WAAW,CAAC;QAE/E,kBAAkB,EAAE,CAAC,eAAe,EAAE,EAAE,CAAC,kBAAkB,CAAC,IAAI,EAAE,eAAe,CAAC;QAElF,UAAU,EAAE,CAAC,OAAO,EAAE,aAAa,EAAE,EAAE,CAAC,iBAAiB,CAAC,IAAI,EAAE,OAAO,EAAE,aAAa,CAAC;QAEvF,IAAI,OAAO;YACT,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC;QAC9B,CAAC;QAED,IAAI,WAAW;YACb,OAAO,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC;QAClC,CAAC;QAED,KAAK,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,EAAE;QAEzB,QAAQ,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,QAAQ,EAAE;KAChC,CAAC;IAEF,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,QAAQ,CAAC,IAAc,EAAE,IAAY,EAAE,UAAmC;IACjF,OAAO;QACL,OAAO,EAAE,EAAE;QACX,MAAM,EAAE,EAAE;QACV,YAAY,EAAE,IAAI;QAClB,IAAI;QACJ,IAAI;QACJ,MAAM,EAAE,IAAI;QACZ,KAAK,EAAE,IAAI;QACX,UAAU,EAAE,IAAI;QAChB,UAAU;QACV,KAAK,EAAE,IAAI;QACX,OAAO,EAAE,KAAK;QACd,YAAY,KAAI,CAAC;QACjB,QAAQ,KAAI,CAAC;QACb,OAAO,KAAI,CAAC;QACZ,GAAG,KAAI,CAAC;KACT,CAAC;AACJ,CAAC;AAED,wEAAwE;AACxE,yEAAyE;AACzE,wEAAwE;AACxE,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAElD,OAAO,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACjE,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAEzD,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAEnD,OAAO,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAErH,OAAO,EAAE,yBAAyB,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAC;AAClF,OAAO,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAC;AACrD,OAAO,EAAE,yBAAyB,EAAE,MAAM,oBAAoB,CAAC;AAC/D,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC1D,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,uBAAuB,EAAE,MAAM,WAAW,CAAC;AACpD,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAC3C,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACxE,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AA6BtD,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,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AACvF,OAAO,EAAE,oBAAoB,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AACnE,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAC3E,OAAO,EAAE,eAAe,EAAE,kBAAkB,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAEtF,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAIvD,OAAO,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAG9E;;;;;;;;GAQG;AACH,MAAM,UAAU,aAAa,CAAC,OAAuB;IACnD,MAAM,IAAI,GAAG,IAAI,WAAW,CAAC,OAAO,CAAC,CAAC;IACtC,IAAI,aAAa,GAAmC,IAAI,CAAC;IAEzD,MAAM,qBAAqB,GAAG,GAA4B,EAAE;QAC1D,IAAI,aAAa;YAAE,OAAO,aAAa,CAAC;QACxC,aAAa,GAAG,UAAU,CAAC,KAAK,CAAC;QACjC,UAAU,CAAC,KAAK,GAAG,uBAAuB,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;QAChE,OAAO,aAAa,CAAC;IACvB,CAAC,CAAC;IACF,IAAI,OAAO,CAAC,qBAAqB,IAAI,IAAI,CAAC,OAAO;QAAE,qBAAqB,EAAE,CAAC;IAC3E,+EAA+E;IAC/E,6DAA6D;IAC7D,MAAM,oBAAoB,GACxB,OAAO,CAAC,kBAAkB,KAAK,KAAK,IAAI,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAC9F,IAAI,OAAO,CAAC,mBAAmB,IAAI,IAAI,CAAC,OAAO;QAAE,yBAAyB,CAAC,IAAI,CAAC,CAAC;IAEjF,MAAM,OAAO,GAAY;QACvB,OAAO,EAAE,CAAC,cAA+B,EAAE,EAAE,CAAC,uBAAuB,CAAC,IAAI,EAAE,cAAc,CAAC;QAC3F,mBAAmB,EAAE,GAAG,EAAE,CAAC,yBAAyB,CAAC,IAAI,CAAC;QAC1D,kBAAkB,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,wBAAwB,CAAC,IAAI,EAAE,MAAM,CAAC;QACtE,kBAAkB,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE,CAAC,wBAAwB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC;QACxF,KAAK,CAAC,aAAa,CAAC,SAAS,EAAE,EAAE;YAC/B,MAAM,IAAI,GAAG,iBAAiB,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;YAChD,IAAI,CAAC;gBAAC,OAAO,MAAM,EAAE,EAAE,CAAC;YAAC,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBAAC,aAAa,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;gBAAC,MAAM,KAAK,CAAC;YAAC,CAAC;oBAAS,CAAC;gBAAC,IAAI,EAAE,GAAG,EAAE,CAAC;YAAC,CAAC;QAChH,CAAC;QACD,iBAAiB,CAAC,SAAS,EAAE,EAAE;YAC7B,MAAM,IAAI,GAAG,iBAAiB,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;YAChD,IAAI,CAAC;gBAAC,OAAO,EAAE,EAAE,CAAC;YAAC,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBAAC,aAAa,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;gBAAC,MAAM,KAAK,CAAC;YAAC,CAAC;oBAAS,CAAC;gBAAC,IAAI,EAAE,GAAG,EAAE,CAAC;YAAC,CAAC;QAC1G,CAAC;QAED,YAAY,EAAE,CAAuB,IAAO,EAAK,EAAE,CAAC,gBAAgB,CAAC,IAAI,EAAE,IAAI,CAAC;QAEhF,KAAK,CAAC,IAAI,CAAI,IAAc,EAAE,IAAY,EAAE,EAAwC,EAAE,aAAsC,EAAE;YAC5H,IAAI,CAAC,IAAI,CAAC,OAAO;gBAAE,OAAO,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC;YAC/D,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC;YACpD,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;gBAC1D,OAAO,MAAM,CAAC;YAChB,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,IAAI,CAAC,IAAI,CAAC,KAAK;oBAAE,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;gBACpC,MAAM,GAAG,CAAC;YACZ,CAAC;oBAAS,CAAC;gBACT,IAAI,CAAC,GAAG,EAAE,CAAC;YACb,CAAC;QACH,CAAC;QAED,OAAO,EAAE,CAAI,IAAY,EAAE,EAAW,EAAE,cAA+B,EAAK,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,cAAc,CAAC;QAEtH,cAAc,EAAE,CAAC,SAAS,EAAE,WAAW,EAAE,EAAE,CAAC,uBAAuB,CAAC,IAAI,EAAE,SAAS,EAAE,WAAW,CAAC;QAEjG,aAAa,EAAE,CAAiB,OAA+B,EAAE,EAAE,CAAC,oBAAoB,CAAC,IAAI,EAAE,OAAO,CAAC;QAEvG,SAAS,EAAE,CAAC,SAAmC,EAAE,EAAE,CAAC,uBAAuB,CAAC,IAAI,EAAE,SAAS,CAAC;QAE5F,qBAAqB;QAErB,WAAW,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,WAAW,EAAE;QAErC,QAAQ,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,QAAQ,EAAE;QAE/B,cAAc,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,cAAc,EAAE,EAAE,OAAO;QAEpD,YAAY,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,YAAY,EAAE;QAEvC,OAAO,CAAC,IAAoB;YAC1B,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;QACzD,CAAC;QAED,gBAAgB,CAAC,GAAY,EAAE,aAAsC,EAAE;YACrE,IAAI,CAAC,IAAI,CAAC,OAAO;gBAAE,OAAO;YAC1B,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,EAAE,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACnD,IAAI,IAAI,EAAE,CAAC;gBACT,IAAI,CAAC,IAAI,CAAC,KAAK;oBAAE,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;gBACpC,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC;oBAAE,IAAI,CAAC,YAAY,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;gBACrF,OAAO;YACT,CAAC;YACD,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,WAAW,EAAE,UAAU,EAAE,IAAI,CAAC,CAAC;YACrE,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;YACnB,IAAI,CAAC,GAAG,EAAE,CAAC;QACb,CAAC;QAED,SAAS,EAAE,CAAC,IAAc,EAAE,IAAY,EAAE,aAAsC,EAAE,EAAc,EAAE,CAChG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,EAAE,UAAU,CAAC;QAE1F,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE,EAAE,cAAc,EAAE,EAAE,CAAC,UAAU,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,cAAc,CAAC;QAEjF,OAAO,EAAE,CAAC,IAAI,EAAE,cAAc,EAAE,EAAE,CAAC,aAAa,CAAC,IAAI,EAAE,IAAI,EAAE,cAAc,CAAC;QAE5E,eAAe,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,eAAe,CAAC,IAAI,EAAE,KAAK,CAAC;QAExD,aAAa,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,mBAAmB,CAAC,IAAI,EAAE,MAAM,CAAC;QAE5D,YAAY,EAAE,CAAC,KAAK,EAAE,EAAE,EAAE,EAAE,CAAC,iBAAiB,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;QAE/D,gBAAgB,EAAE,CAAC,IAAI,EAAE,WAAW,EAAE,EAAE,CAAC,aAAa,CAAC,IAAI,EAAE,IAAI,EAAE,WAAW,CAAC;QAE/E,kBAAkB,EAAE,CAAC,eAAe,EAAE,EAAE,CAAC,kBAAkB,CAAC,IAAI,EAAE,eAAe,CAAC;QAElF,UAAU,EAAE,CAAC,OAAO,EAAE,aAAa,EAAE,EAAE,CAAC,iBAAiB,CAAC,IAAI,EAAE,OAAO,EAAE,aAAa,CAAC;QAEvF,IAAI,OAAO;YACT,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC;QAC9B,CAAC;QAED,IAAI,WAAW;YACb,OAAO,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC;QAClC,CAAC;QAED,KAAK,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,EAAE;QAEzB,0EAA0E;QAC1E,6EAA6E;QAC7E,QAAQ,EAAE,KAAK,IAAI,EAAE;YACnB,oBAAoB,EAAE,EAAE,CAAC;YACzB,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC;QACxB,CAAC;KACF,CAAC;IAEF,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,QAAQ,CAAC,IAAc,EAAE,IAAY,EAAE,UAAmC;IACjF,OAAO;QACL,OAAO,EAAE,EAAE;QACX,MAAM,EAAE,EAAE;QACV,YAAY,EAAE,IAAI;QAClB,IAAI;QACJ,IAAI;QACJ,MAAM,EAAE,IAAI;QACZ,KAAK,EAAE,IAAI;QACX,UAAU,EAAE,IAAI;QAChB,UAAU;QACV,KAAK,EAAE,IAAI;QACX,OAAO,EAAE,KAAK;QACd,YAAY,KAAI,CAAC;QACjB,QAAQ,KAAI,CAAC;QACb,OAAO,KAAI,CAAC;QACZ,GAAG,KAAI,CAAC;KACT,CAAC;AACJ,CAAC;AAED,wEAAwE;AACxE,yEAAyE;AACzE,wEAAwE;AACxE,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAElD,OAAO,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACjE,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAEzD,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAEnD,OAAO,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC"}
@@ -0,0 +1,32 @@
1
+ import type { TrackerCore } from './tracker.js';
2
+ import type { SpanKind } from './types.js';
3
+ /**
4
+ * Span que só existe se o trecho tiver sido lento.
5
+ *
6
+ * `tracker.span()` cria o span sempre: é o certo para um trecho que você
7
+ * escolheu a dedo. Não serve para instrumentar *tudo*, porque um método
8
+ * chamado milhares de vezes por requisição pagaria alocação e id aleatório em
9
+ * toda chamada, e encheria o trace de barras de 0 ms.
10
+ *
11
+ * `measure` inverte isso: na chamada guarda só dois números (o instante e o
12
+ * contexto) e, no fim, descarta o que foi rápido. O que sobra no waterfall é
13
+ * exatamente o que merece atenção — mais um erro, que sempre vira span mesmo
14
+ * quando rápido, porque aí a duração não é o ponto.
15
+ *
16
+ * O preço dessa troca: o span é criado depois que o trecho terminou, então ele
17
+ * não é o pai dos spans criados lá dentro. Uma query feita dentro de um método
18
+ * medido aparece como irmã dele, não aninhada.
19
+ */
20
+ export interface MeasureOptions {
21
+ kind?: SpanKind;
22
+ /** Abaixo disto o trecho não vira span. Default: `autoSpanMinDurationMs` do tracker. */
23
+ minDurationMs?: number;
24
+ attributes?: Record<string, unknown>;
25
+ }
26
+ /**
27
+ * Executa `fn` medindo o tempo. Preserva a natureza da função: o que é
28
+ * síncrono continua síncrono (envolver um método qualquer não pode
29
+ * transformá-lo em Promise).
30
+ */
31
+ export declare function measure<T>(core: TrackerCore, name: string, fn: () => T, options?: MeasureOptions): T;
32
+ //# sourceMappingURL=measure.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"measure.d.ts","sourceRoot":"","sources":["../src/measure.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE3C;;;;;;;;;;;;;;;;GAgBG;AAEH,MAAM,WAAW,cAAc;IAC7B,IAAI,CAAC,EAAE,QAAQ,CAAC;IAChB,wFAAwF;IACxF,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACtC;AAMD;;;;GAIG;AACH,wBAAgB,OAAO,CAAC,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,OAAO,GAAE,cAAmB,GAAG,CAAC,CAgDxG"}
@@ -0,0 +1,57 @@
1
+ import { performance } from 'node:perf_hooks';
2
+ function isThenable(value) {
3
+ return typeof value?.then === 'function';
4
+ }
5
+ /**
6
+ * Executa `fn` medindo o tempo. Preserva a natureza da função: o que é
7
+ * síncrono continua síncrono (envolver um método qualquer não pode
8
+ * transformá-lo em Promise).
9
+ */
10
+ export function measure(core, name, fn, options = {}) {
11
+ const parent = core.currentContext();
12
+ // Fora de uma requisição não há trace a que pendurar o trecho.
13
+ if (!core.enabled || !parent)
14
+ return fn();
15
+ const minDurationMs = options.minDurationMs ?? core.options.autoSpanMinDurationMs;
16
+ const startedAt = new Date();
17
+ const startedPerf = performance.now();
18
+ let settled = false;
19
+ const settle = (error) => {
20
+ if (settled)
21
+ return;
22
+ settled = true;
23
+ const durationMs = Math.round((performance.now() - startedPerf) * 1000) / 1000;
24
+ // Erro sempre vira span: uma falha rápida é tão interessante quanto uma lenta.
25
+ if (durationMs < minDurationMs && error === undefined)
26
+ return;
27
+ core.recordSpan({
28
+ kind: options.kind ?? 'custom',
29
+ name,
30
+ ...(options.attributes ? { attributes: options.attributes } : {}),
31
+ parent,
32
+ startedAt,
33
+ durationMs,
34
+ ...(error === undefined ? {} : { error }),
35
+ });
36
+ };
37
+ let result;
38
+ try {
39
+ result = fn();
40
+ }
41
+ catch (error) {
42
+ settle(error);
43
+ throw error;
44
+ }
45
+ if (isThenable(result)) {
46
+ return result.then((value) => {
47
+ settle();
48
+ return value;
49
+ }, (error) => {
50
+ settle(error);
51
+ throw error;
52
+ });
53
+ }
54
+ settle();
55
+ return result;
56
+ }
57
+ //# sourceMappingURL=measure.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"measure.js","sourceRoot":"","sources":["../src/measure.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AA8B9C,SAAS,UAAU,CAAC,KAAc;IAChC,OAAO,OAAQ,KAAqC,EAAE,IAAI,KAAK,UAAU,CAAC;AAC5E,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,OAAO,CAAI,IAAiB,EAAE,IAAY,EAAE,EAAW,EAAE,UAA0B,EAAE;IACnG,MAAM,MAAM,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;IACrC,+DAA+D;IAC/D,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,MAAM;QAAE,OAAO,EAAE,EAAE,CAAC;IAE1C,MAAM,aAAa,GAAG,OAAO,CAAC,aAAa,IAAI,IAAI,CAAC,OAAO,CAAC,qBAAqB,CAAC;IAClF,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC;IAC7B,MAAM,WAAW,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;IACtC,IAAI,OAAO,GAAG,KAAK,CAAC;IAEpB,MAAM,MAAM,GAAG,CAAC,KAAe,EAAQ,EAAE;QACvC,IAAI,OAAO;YAAE,OAAO;QACpB,OAAO,GAAG,IAAI,CAAC;QACf,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,WAAW,CAAC,GAAG,EAAE,GAAG,WAAW,CAAC,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC;QAC/E,+EAA+E;QAC/E,IAAI,UAAU,GAAG,aAAa,IAAI,KAAK,KAAK,SAAS;YAAE,OAAO;QAC9D,IAAI,CAAC,UAAU,CAAC;YACd,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,QAAQ;YAC9B,IAAI;YACJ,GAAG,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACjE,MAAM;YACN,SAAS;YACT,UAAU;YACV,GAAG,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC;SAC1C,CAAC,CAAC;IACL,CAAC,CAAC;IAEF,IAAI,MAAS,CAAC;IACd,IAAI,CAAC;QACH,MAAM,GAAG,EAAE,EAAE,CAAC;IAChB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,CAAC,KAAK,CAAC,CAAC;QACd,MAAM,KAAK,CAAC;IACd,CAAC;IACD,IAAI,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;QACvB,OAAQ,MAA+B,CAAC,IAAI,CAC1C,CAAC,KAAK,EAAE,EAAE;YACR,MAAM,EAAE,CAAC;YACT,OAAO,KAAK,CAAC;QACf,CAAC,EACD,CAAC,KAAc,EAAE,EAAE;YACjB,MAAM,CAAC,KAAK,CAAC,CAAC;YACd,MAAM,KAAK,CAAC;QACd,CAAC,CACG,CAAC;IACT,CAAC;IACD,MAAM,EAAE,CAAC;IACT,OAAO,MAAM,CAAC;AAChB,CAAC"}
package/dist/nest.d.ts ADDED
@@ -0,0 +1,53 @@
1
+ import type { TrackerCore } from './tracker.js';
2
+ /**
3
+ * Spans por método em toda aplicação NestJS, sem decorar nada.
4
+ *
5
+ * Instrumentar à mão só instrumenta o que alguém já suspeitava. O trecho que
6
+ * some do waterfall é justamente aquele em que ninguém pensou — foi assim com
7
+ * `GET /artists/me`, onde 93% do request estava fora de qualquer span.
8
+ *
9
+ * Aqui o container de DI é percorrido e cada método de provider e controller é
10
+ * envolvido por `measure`: mede sempre, vira span só quando passa do limiar.
11
+ * Método trivial chamado mil vezes não deixa rastro; o método que segurou 1,6 s
12
+ * aparece com nome e duração.
13
+ *
14
+ * O container é lido estruturalmente, sem importar `@nestjs/core`: o SDK não
15
+ * ganha peer dependency nem fica preso a uma versão do Nest.
16
+ *
17
+ * ```ts
18
+ * import { ModulesContainer } from '@nestjs/core';
19
+ * tracker.instrumentNest(app.get(ModulesContainer));
20
+ * ```
21
+ */
22
+ /** Forma mínima do `InstanceWrapper` do Nest. */
23
+ interface WrapperLike {
24
+ instance?: unknown;
25
+ name?: unknown;
26
+ }
27
+ /** Forma mínima do `Module` do Nest. */
28
+ interface ModuleLike {
29
+ providers?: Map<unknown, WrapperLike> | undefined;
30
+ controllers?: Map<unknown, WrapperLike> | undefined;
31
+ metatype?: {
32
+ name?: string;
33
+ } | undefined;
34
+ }
35
+ /** Forma mínima do `ModulesContainer` (um `Map` de módulos). */
36
+ export type NestContainerLike = Iterable<[unknown, ModuleLike]> | {
37
+ values(): Iterable<ModuleLike>;
38
+ };
39
+ export interface NestInstrumentationOptions {
40
+ /** Abaixo disto o método não vira span. Default: `autoSpanMinDurationMs` do tracker. */
41
+ minDurationMs?: number;
42
+ /** `false` recusa a classe inteira; recebe o nome da classe e o do módulo. */
43
+ includeClass?: (className: string, moduleName: string) => boolean;
44
+ /** `false` recusa um método específico. */
45
+ includeMethod?: (className: string, methodName: string) => boolean;
46
+ }
47
+ /**
48
+ * Envolve os métodos de providers e controllers do container. Devolve quantos
49
+ * métodos foram instrumentados. Idempotente.
50
+ */
51
+ export declare function instrumentNestContainer(core: TrackerCore, container: NestContainerLike, options?: NestInstrumentationOptions): number;
52
+ export {};
53
+ //# sourceMappingURL=nest.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nest.d.ts","sourceRoot":"","sources":["../src/nest.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAEhD;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,iDAAiD;AACjD,UAAU,WAAW;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,wCAAwC;AACxC,UAAU,UAAU;IAClB,SAAS,CAAC,EAAE,GAAG,CAAC,OAAO,EAAE,WAAW,CAAC,GAAG,SAAS,CAAC;IAClD,WAAW,CAAC,EAAE,GAAG,CAAC,OAAO,EAAE,WAAW,CAAC,GAAG,SAAS,CAAC;IACpD,QAAQ,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,SAAS,CAAC;CAC1C;AAED,gEAAgE;AAChE,MAAM,MAAM,iBAAiB,GAAG,QAAQ,CAAC,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC,GAAG;IAAE,MAAM,IAAI,QAAQ,CAAC,UAAU,CAAC,CAAA;CAAE,CAAC;AAErG,MAAM,WAAW,0BAA0B;IACzC,wFAAwF;IACxF,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,8EAA8E;IAC9E,YAAY,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,KAAK,OAAO,CAAC;IAClE,2CAA2C;IAC3C,aAAa,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,KAAK,OAAO,CAAC;CACpE;AAsED;;;GAGG;AACH,wBAAgB,uBAAuB,CACrC,IAAI,EAAE,WAAW,EACjB,SAAS,EAAE,iBAAiB,EAC5B,OAAO,GAAE,0BAA+B,GACvC,MAAM,CAiDR"}