fg-tracker-sdk 0.6.0 → 0.8.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.
@@ -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"}
@@ -1 +1 @@
1
- {"version":3,"file":"monitors.d.ts","sourceRoot":"","sources":["../src/monitors.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAqBhE,wBAAsB,WAAW,CAAC,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CASlH;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,cAAmB,GAAG;IAAE,KAAK,IAAI,OAAO,CAAC,aAAa,CAAC,CAAA;CAAE,CAsBhI;AAED,wBAAsB,UAAU,CAAC,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,GAAE,cAAmB,GAAG,OAAO,CAAC,CAAC,CAAC,CAUvI"}
1
+ {"version":3,"file":"monitors.d.ts","sourceRoot":"","sources":["../src/monitors.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAgChE,wBAAsB,WAAW,CAAC,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CASlH;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,cAAmB,GAAG;IAAE,KAAK,IAAI,OAAO,CAAC,aAAa,CAAC,CAAA;CAAE,CAsBhI;AAED,wBAAsB,UAAU,CAAC,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,GAAE,cAAmB,GAAG,OAAO,CAAC,CAAC,CAAC,CAUvI"}
package/dist/monitors.js CHANGED
@@ -4,9 +4,15 @@ import { toSpanError } from './normalize.js';
4
4
  * Check-ins de jobs agendados (CONTRATO.md §18): `in_progress` ao começar,
5
5
  * `ok`/`fail` ao terminar, com a duração. Sem apiKey vira no-op.
6
6
  */
7
- function payload(status, options, extra = {}) {
7
+ function payload(core, status, options, extra = {}) {
8
+ // Quando o job roda dentro de um span (por exemplo sob `wrapLambda`), o
9
+ // check-in carrega o trace da execução: a partir do histórico do cron dá
10
+ // para abrir o waterfall e os logs daquela rodada, como num endpoint.
11
+ const traceId = core.currentContext()?.traceId;
8
12
  return {
9
13
  status,
14
+ ...(traceId ? { traceId } : {}),
15
+ ...(core.options.release ? { release: core.options.release } : {}),
10
16
  ...(options.name ? { name: options.name } : {}),
11
17
  ...(options.intervalSeconds ? { intervalSeconds: options.intervalSeconds } : {}),
12
18
  ...(options.graceSeconds !== undefined ? { graceSeconds: options.graceSeconds } : {}),
@@ -33,7 +39,7 @@ export function createMonitor(core, slug, options = {}) {
33
39
  return {
34
40
  async start() {
35
41
  const startedAt = performance.now();
36
- await sendCheckIn(core, slug, payload('in_progress', options));
42
+ await sendCheckIn(core, slug, payload(core, 'in_progress', options));
37
43
  let closed = false;
38
44
  const durationMs = () => Math.round((performance.now() - startedAt) * 10) / 10;
39
45
  return {
@@ -41,14 +47,14 @@ export function createMonitor(core, slug, options = {}) {
41
47
  if (closed)
42
48
  return;
43
49
  closed = true;
44
- await sendCheckIn(core, slug, payload('ok', options, { durationMs: durationMs() }));
50
+ await sendCheckIn(core, slug, payload(core, 'ok', options, { durationMs: durationMs() }));
45
51
  },
46
52
  async fail(error) {
47
53
  if (closed)
48
54
  return;
49
55
  closed = true;
50
56
  const message = error === undefined ? 'Job reportou falha' : toSpanError(error).message;
51
- await sendCheckIn(core, slug, payload('fail', options, { durationMs: durationMs(), error: message.slice(0, 2000) }));
57
+ await sendCheckIn(core, slug, payload(core, 'fail', options, { durationMs: durationMs(), error: message.slice(0, 2000) }));
52
58
  },
53
59
  };
54
60
  },
@@ -1 +1 @@
1
- {"version":3,"file":"monitors.js","sourceRoot":"","sources":["../src/monitors.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"monitors.js","sourceRoot":"","sources":["../src/monitors.ts"],"names":[],"mappings":"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"}
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"}
package/dist/nest.js ADDED
@@ -0,0 +1,128 @@
1
+ import { measure } from './measure.js';
2
+ /**
3
+ * Métodos que o Nest chama fora de uma requisição. Medi-los não diz nada sobre
4
+ * latência de rota e só sujaria o boot.
5
+ */
6
+ const LIFECYCLE_METHODS = new Set([
7
+ 'onModuleInit',
8
+ 'onModuleDestroy',
9
+ 'onApplicationBootstrap',
10
+ 'onApplicationShutdown',
11
+ 'beforeApplicationShutdown',
12
+ 'configure',
13
+ ]);
14
+ /** Módulos internos do Nest: instrumentá-los mede o framework, não a aplicação. */
15
+ const INTERNAL_MODULES = new Set(['InternalCoreModule']);
16
+ /**
17
+ * Providers do próprio Nest. Não basta pular o `InternalCoreModule`: o
18
+ * framework re-registra os seus em **todo** módulo da aplicação — num app com
19
+ * duas classes, `ApplicationConfig` sozinho traz 28 métodos. Medir o framework
20
+ * não diz nada sobre a latência de uma rota.
21
+ */
22
+ const INTERNAL_CLASSES = new Set([
23
+ 'ApplicationConfig',
24
+ 'DiscoveryService',
25
+ 'ExternalContextCreator',
26
+ 'HttpAdapterHost',
27
+ 'LazyModuleLoader',
28
+ 'MetadataScanner',
29
+ 'ModuleRef',
30
+ 'ModulesContainer',
31
+ 'NestApplicationContext',
32
+ 'Reflector',
33
+ 'SerializedGraph',
34
+ ]);
35
+ const INSTRUMENTED = Symbol.for('fg-tracker.instrumented');
36
+ function modulesOf(container) {
37
+ const modules = [];
38
+ const candidate = container;
39
+ if (typeof candidate.values === 'function') {
40
+ for (const module of candidate.values())
41
+ modules.push(module);
42
+ return modules;
43
+ }
44
+ for (const entry of container) {
45
+ if (Array.isArray(entry) && entry[1])
46
+ modules.push(entry[1]);
47
+ }
48
+ return modules;
49
+ }
50
+ /**
51
+ * Nomes de método próprios do protótipo, ignorando acessores — ler um getter
52
+ * aqui executaria código da aplicação durante a instrumentação.
53
+ */
54
+ function methodNames(instance) {
55
+ const prototype = Object.getPrototypeOf(instance);
56
+ if (!prototype || prototype === Object.prototype)
57
+ return [];
58
+ const names = [];
59
+ for (const name of Object.getOwnPropertyNames(prototype)) {
60
+ if (name === 'constructor' || LIFECYCLE_METHODS.has(name))
61
+ continue;
62
+ const descriptor = Object.getOwnPropertyDescriptor(prototype, name);
63
+ if (!descriptor || typeof descriptor.value !== 'function')
64
+ continue;
65
+ names.push(name);
66
+ }
67
+ return names;
68
+ }
69
+ /**
70
+ * Envolve os métodos de providers e controllers do container. Devolve quantos
71
+ * métodos foram instrumentados. Idempotente.
72
+ */
73
+ export function instrumentNestContainer(core, container, options = {}) {
74
+ if (!core.enabled)
75
+ return 0;
76
+ let wrapped = 0;
77
+ for (const module of modulesOf(container)) {
78
+ const moduleName = module?.metatype?.name ?? '';
79
+ if (INTERNAL_MODULES.has(moduleName))
80
+ continue;
81
+ for (const collection of [module?.providers, module?.controllers]) {
82
+ if (!collection || typeof collection.values !== 'function')
83
+ continue;
84
+ for (const item of collection.values()) {
85
+ const instance = item?.instance;
86
+ if (!instance || typeof instance !== 'object')
87
+ continue;
88
+ const className = instance.constructor?.name ?? '';
89
+ // Classe anônima ou do próprio Nest: não é código da aplicação.
90
+ if (!className || INTERNAL_CLASSES.has(className))
91
+ continue;
92
+ if (options.includeClass && !options.includeClass(className, moduleName))
93
+ continue;
94
+ for (const methodName of methodNames(instance)) {
95
+ if (options.includeMethod && !options.includeMethod(className, methodName))
96
+ continue;
97
+ const original = instance[methodName];
98
+ if (typeof original !== 'function')
99
+ continue;
100
+ // Um provider aparece em vários módulos; instrumentar duas vezes
101
+ // criaria spans aninhados do mesmo método.
102
+ if (original[INSTRUMENTED])
103
+ continue;
104
+ const name = `${className}.${methodName}`;
105
+ const fn = original;
106
+ const instrumented = function instrumentedMethod(...args) {
107
+ return measure(core, name, () => fn.apply(this, args), {
108
+ ...(options.minDurationMs === undefined ? {} : { minDurationMs: options.minDurationMs }),
109
+ });
110
+ };
111
+ Object.defineProperty(instrumented, 'name', { value: methodName, configurable: true });
112
+ Object.defineProperty(instrumented, INSTRUMENTED, { value: true });
113
+ // Escrito na instância: o protótipo (e as outras instâncias da
114
+ // classe) continuam intactos.
115
+ Object.defineProperty(instance, methodName, {
116
+ value: instrumented,
117
+ writable: true,
118
+ configurable: true,
119
+ enumerable: false,
120
+ });
121
+ wrapped += 1;
122
+ }
123
+ }
124
+ }
125
+ }
126
+ return wrapped;
127
+ }
128
+ //# sourceMappingURL=nest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nest.js","sourceRoot":"","sources":["../src/nest.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import { type TrackerCore } from './tracker.js';
2
+ /**
3
+ * Instrumenta a saída HTTP do processo. Idempotente por tracker; devolve a
4
+ * função que cancela as inscrições.
5
+ */
6
+ export declare function instrumentNodeHttp(core: TrackerCore): () => void;
7
+ //# sourceMappingURL=node-http.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node-http.d.ts","sourceRoot":"","sources":["../src/node-http.ts"],"names":[],"mappings":"AAIA,OAAO,EAAmB,KAAK,WAAW,EAAE,MAAM,cAAc,CAAC;AA0DjE;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,WAAW,GAAG,MAAM,IAAI,CAkFhE"}
@@ -0,0 +1,115 @@
1
+ import { subscribe, unsubscribe } from 'node:diagnostics_channel';
2
+ import { formatTraceparent, TRACEPARENT_HEADER } from './context.js';
3
+ import { normalizePath } from './normalize.js';
4
+ import { shouldPropagate } from './tracker.js';
5
+ const CREATED = 'http.client.request.created';
6
+ const RESPONSE = 'http.client.response.finish';
7
+ const ERROR = 'http.client.request.error';
8
+ /**
9
+ * URL absoluta da requisição. `request.path` traz caminho + query, e o header
10
+ * `host` traz host + porta — juntos reconstroem a origem sem depender de
11
+ * campos internos do agente.
12
+ */
13
+ function requestUrl(request) {
14
+ const protocol = request.protocol ?? 'http:';
15
+ const hostHeader = request.getHeader('host');
16
+ const host = typeof hostHeader === 'string' && hostHeader ? hostHeader : request.host;
17
+ if (!host)
18
+ return null;
19
+ try {
20
+ return new URL(`${protocol}//${host}${request.path ?? '/'}`);
21
+ }
22
+ catch {
23
+ return null;
24
+ }
25
+ }
26
+ /**
27
+ * Instrumenta a saída HTTP do processo. Idempotente por tracker; devolve a
28
+ * função que cancela as inscrições.
29
+ */
30
+ export function instrumentNodeHttp(core) {
31
+ // O span vive preso ao ClientRequest: `response.finish` e `error` chegam
32
+ // depois, possivelmente noutro contexto assíncrono. WeakMap para um request
33
+ // que nunca termina não segurar memória.
34
+ const spans = new WeakMap();
35
+ const finish = (request, apply) => {
36
+ const span = spans.get(request);
37
+ if (!span)
38
+ return;
39
+ // Uma única finalização por request: `close` sempre vem depois de
40
+ // `response.finish`/`error` e não pode fechar o span duas vezes.
41
+ spans.delete(request);
42
+ try {
43
+ apply(span);
44
+ }
45
+ finally {
46
+ span.end();
47
+ }
48
+ };
49
+ const onCreated = (message) => {
50
+ const request = message.request;
51
+ if (!request || typeof request.setHeader !== 'function')
52
+ return;
53
+ // Fora de um request instrumentado não há trace a que pendurar a chamada.
54
+ if (!core.enabled || !core.currentContext())
55
+ return;
56
+ const url = requestUrl(request);
57
+ if (!url)
58
+ return;
59
+ // Nunca instrumentar a entrega ao próprio coletor: daria loop de ingestão.
60
+ if (`${url.origin}${url.pathname}`.startsWith(core.options.endpoint))
61
+ return;
62
+ const method = (request.method ?? 'GET').toUpperCase();
63
+ const span = core.startSpan('http.client', `${method} ${url.origin}${normalizePath(url.pathname)}`, {
64
+ url: url.origin + url.pathname + url.search,
65
+ host: url.host,
66
+ });
67
+ span.method = method;
68
+ span.route = normalizePath(url.pathname);
69
+ spans.set(request, span);
70
+ // `created` é publicado antes dos headers irem para a rede; `start` já é tarde.
71
+ if (!request.headersSent && !request.getHeader(TRACEPARENT_HEADER) && shouldPropagate(core.options.propagateTraceTo, url)) {
72
+ try {
73
+ request.setHeader(TRACEPARENT_HEADER, formatTraceparent({ traceId: span.traceId, spanId: span.spanId, sampled: span.sampled }));
74
+ span.setAttribute('propagated', true);
75
+ }
76
+ catch {
77
+ // Header já enviado por uma corrida qualquer: a chamada continua, sem propagação.
78
+ }
79
+ }
80
+ // Rede de segurança: requisição abortada ou destruída sem resposta nem erro
81
+ // não pode deixar o span aberto para sempre.
82
+ try {
83
+ request.once('close', () => finish(request, (open) => open.setAttribute('aborted', true)));
84
+ }
85
+ catch {
86
+ // `once` indisponível: o span ainda fecha por `response.finish` ou `error`.
87
+ }
88
+ };
89
+ const onResponse = (message) => {
90
+ const { request, response } = message;
91
+ if (!request || !response)
92
+ return;
93
+ finish(request, (span) => {
94
+ const status = response.statusCode ?? null;
95
+ span.statusCode = status;
96
+ if (status !== null && status >= 500)
97
+ span.setError({ name: 'HttpError', message: `HTTP ${status}` });
98
+ });
99
+ };
100
+ const onError = (message) => {
101
+ const { request, error } = message;
102
+ if (!request)
103
+ return;
104
+ finish(request, (span) => span.setError(error));
105
+ };
106
+ subscribe(CREATED, onCreated);
107
+ subscribe(RESPONSE, onResponse);
108
+ subscribe(ERROR, onError);
109
+ return () => {
110
+ unsubscribe(CREATED, onCreated);
111
+ unsubscribe(RESPONSE, onResponse);
112
+ unsubscribe(ERROR, onError);
113
+ };
114
+ }
115
+ //# sourceMappingURL=node-http.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node-http.js","sourceRoot":"","sources":["../src/node-http.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Tempo que uma query passou esperando conexão, separado do tempo de execução.
3
+ *
4
+ * Um span `db.query` envolve a chamada ao driver, e a chamada inclui a espera
5
+ * na fila do pool. Então uma query trivial que aparece com 2 s não diz o que
6
+ * aconteceu: ou o SQL é lento (falta índice, plano ruim) ou o pool estava
7
+ * cheio e ela ficou na fila. As duas causas têm soluções opostas — mexer no
8
+ * SQL não resolve pool saturado, e aumentar o pool não resolve query ruim.
9
+ *
10
+ * O driver `postgres` (porsager) marca `query.active = true` no momento em que
11
+ * a conexão assume a query (`src/connection.js`). Interceptar essa atribuição
12
+ * dá o instante exato da aquisição, sem polling e sem estimativa.
13
+ */
14
+ /** Abaixo disto a espera é ruído de agendamento, não fila. */
15
+ export declare const MIN_POOL_WAIT_MS = 1;
16
+ /**
17
+ * Observa a aquisição de conexão de uma query do `postgres`. Devolve uma
18
+ * função que informa quanto tempo ela esperou, ou `undefined` quando a espera
19
+ * foi irrelevante ou o driver não expôs o sinal.
20
+ *
21
+ * Falha em silêncio de propósito: o campo é interno do driver, e uma mudança
22
+ * lá não pode derrubar a query da aplicação — no pior caso perde-se a medida.
23
+ */
24
+ export declare function watchPoolWait(query: object): () => number | undefined;
25
+ //# sourceMappingURL=pool-wait.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pool-wait.d.ts","sourceRoot":"","sources":["../src/pool-wait.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;GAYG;AAEH,8DAA8D;AAC9D,eAAO,MAAM,gBAAgB,IAAI,CAAC;AAElC;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,MAAM,GAAG,SAAS,CA+BrE"}
@@ -0,0 +1,58 @@
1
+ import { performance } from 'node:perf_hooks';
2
+ /**
3
+ * Tempo que uma query passou esperando conexão, separado do tempo de execução.
4
+ *
5
+ * Um span `db.query` envolve a chamada ao driver, e a chamada inclui a espera
6
+ * na fila do pool. Então uma query trivial que aparece com 2 s não diz o que
7
+ * aconteceu: ou o SQL é lento (falta índice, plano ruim) ou o pool estava
8
+ * cheio e ela ficou na fila. As duas causas têm soluções opostas — mexer no
9
+ * SQL não resolve pool saturado, e aumentar o pool não resolve query ruim.
10
+ *
11
+ * O driver `postgres` (porsager) marca `query.active = true` no momento em que
12
+ * a conexão assume a query (`src/connection.js`). Interceptar essa atribuição
13
+ * dá o instante exato da aquisição, sem polling e sem estimativa.
14
+ */
15
+ /** Abaixo disto a espera é ruído de agendamento, não fila. */
16
+ export const MIN_POOL_WAIT_MS = 1;
17
+ /**
18
+ * Observa a aquisição de conexão de uma query do `postgres`. Devolve uma
19
+ * função que informa quanto tempo ela esperou, ou `undefined` quando a espera
20
+ * foi irrelevante ou o driver não expôs o sinal.
21
+ *
22
+ * Falha em silêncio de propósito: o campo é interno do driver, e uma mudança
23
+ * lá não pode derrubar a query da aplicação — no pior caso perde-se a medida.
24
+ */
25
+ export function watchPoolWait(query) {
26
+ const startedPerf = performance.now();
27
+ let acquiredPerf;
28
+ try {
29
+ const descriptor = Object.getOwnPropertyDescriptor(query, 'active');
30
+ // Só um campo de dado simples pode ser trocado por acessor com segurança.
31
+ if (!descriptor || !descriptor.configurable || !('value' in descriptor)) {
32
+ return () => undefined;
33
+ }
34
+ let active = descriptor.value;
35
+ Object.defineProperty(query, 'active', {
36
+ configurable: true,
37
+ enumerable: descriptor.enumerable,
38
+ get: () => active,
39
+ set: (value) => {
40
+ // A primeira transição para verdadeiro é a aquisição; o driver também
41
+ // devolve o campo para falso ao resolver, e isso não interessa.
42
+ if (value && acquiredPerf === undefined)
43
+ acquiredPerf = performance.now();
44
+ active = value;
45
+ },
46
+ });
47
+ }
48
+ catch {
49
+ return () => undefined;
50
+ }
51
+ return () => {
52
+ if (acquiredPerf === undefined)
53
+ return undefined;
54
+ const waitMs = Math.round((acquiredPerf - startedPerf) * 10) / 10;
55
+ return waitMs >= MIN_POOL_WAIT_MS ? waitMs : undefined;
56
+ };
57
+ }
58
+ //# sourceMappingURL=pool-wait.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pool-wait.js","sourceRoot":"","sources":["../src/pool-wait.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAE9C;;;;;;;;;;;;GAYG;AAEH,8DAA8D;AAC9D,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC;AAElC;;;;;;;GAOG;AACH,MAAM,UAAU,aAAa,CAAC,KAAa;IACzC,MAAM,WAAW,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;IACtC,IAAI,YAAgC,CAAC;IAErC,IAAI,CAAC;QACH,MAAM,UAAU,GAAG,MAAM,CAAC,wBAAwB,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;QACpE,0EAA0E;QAC1E,IAAI,CAAC,UAAU,IAAI,CAAC,UAAU,CAAC,YAAY,IAAI,CAAC,CAAC,OAAO,IAAI,UAAU,CAAC,EAAE,CAAC;YACxE,OAAO,GAAG,EAAE,CAAC,SAAS,CAAC;QACzB,CAAC;QACD,IAAI,MAAM,GAAG,UAAU,CAAC,KAAgB,CAAC;QACzC,MAAM,CAAC,cAAc,CAAC,KAAK,EAAE,QAAQ,EAAE;YACrC,YAAY,EAAE,IAAI;YAClB,UAAU,EAAE,UAAU,CAAC,UAAU;YACjC,GAAG,EAAE,GAAG,EAAE,CAAC,MAAM;YACjB,GAAG,EAAE,CAAC,KAAc,EAAE,EAAE;gBACtB,sEAAsE;gBACtE,gEAAgE;gBAChE,IAAI,KAAK,IAAI,YAAY,KAAK,SAAS;oBAAE,YAAY,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;gBAC1E,MAAM,GAAG,KAAK,CAAC;YACjB,CAAC;SACF,CAAC,CAAC;IACL,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,GAAG,EAAE,CAAC,SAAS,CAAC;IACzB,CAAC;IAED,OAAO,GAAG,EAAE;QACV,IAAI,YAAY,KAAK,SAAS;YAAE,OAAO,SAAS,CAAC;QACjD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,YAAY,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC;QAClE,OAAO,MAAM,IAAI,gBAAgB,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;IACzD,CAAC,CAAC;AACJ,CAAC"}
package/dist/tracker.d.ts CHANGED
@@ -22,6 +22,9 @@ export interface ResolvedOptions {
22
22
  fetch: typeof globalThis.fetch;
23
23
  infraEnabled: boolean;
24
24
  infraIdleIntervalMs: number;
25
+ autoSpanMinDurationMs: number;
26
+ measureEventLoopLag: boolean;
27
+ eventLoopLagThresholdMs: number;
25
28
  }
26
29
  /** Release detectada do ambiente (CONTRATO.md §15): `${serviceName}@${sha}` para SHAs de CI/hosting. */
27
30
  export declare function detectRelease(serviceName: string | undefined, env?: NodeJS.ProcessEnv): string | undefined;
@@ -56,6 +59,8 @@ export declare class TrackerCore {
56
59
  liveIntervalMs: number;
57
60
  /** Callbacks de encerramento (reporters, timers de pool). */
58
61
  private readonly disposers;
62
+ /** Atraso do event loop durante cada requisição; `null` quando desligado. */
63
+ private readonly eventLoop;
59
64
  constructor(options: TrackerOptions);
60
65
  get enabled(): boolean;
61
66
  currentContext(): SpanContext | undefined;
@@ -70,6 +75,17 @@ export declare class TrackerCore {
70
75
  * para as métricas por requisição continuarem contando este serviço.
71
76
  */
72
77
  startRemoteRoot(kind: SpanKind, name: string, attributes: Record<string, unknown>, remote: SpanContext): ActiveSpanImpl;
78
+ /**
79
+ * Uma requisição abriu: liga a amostragem do event loop enquanto ela durar.
80
+ * Chamado pelo próprio `ActiveSpanImpl` quando o span nasce sem pai local.
81
+ */
82
+ openRootSpan(): void;
83
+ /**
84
+ * A requisição fechou: desliga a amostragem e, se o loop travou de verdade
85
+ * durante ela, grava quanto. Abaixo do limiar nada é gravado — um atributo
86
+ * em todo span raiz só engordaria o payload sem dizer nada.
87
+ */
88
+ closeRootSpan(span: ActiveSpanImpl, fromPerf: number, toPerf: number): void;
73
89
  /** Span aberto correspondente ao contexto assíncrono atual (se houver). */
74
90
  currentSpan(): ActiveSpanImpl | undefined;
75
91
  /** Span raiz local do contexto atual (sobe pelos pais ainda abertos). */
@@ -78,6 +94,26 @@ export declare class TrackerCore {
78
94
  traceHeaders(): Record<string, string>;
79
95
  /** Chamado por ActiveSpanImpl.end(): amostragem, ignoreErrors, scrubbing e beforeSend. */
80
96
  finishSpan(span: ActiveSpanImpl, payload: Span): void;
97
+ /**
98
+ * Registra um span que já terminou, sem ter existido um `ActiveSpanImpl`
99
+ * durante a execução.
100
+ *
101
+ * É o que permite instrumentar método a método sem pagar alocação e id
102
+ * aleatório em toda chamada: mede-se o tempo (dois números) e só o que passou
103
+ * do limiar vira span. Sem pai não há span — como no fetch e no node:http,
104
+ * nada vira trace órfão.
105
+ */
106
+ recordSpan(input: {
107
+ kind: SpanKind;
108
+ name: string;
109
+ attributes?: Record<string, unknown>;
110
+ parent: SpanContext;
111
+ startedAt: Date;
112
+ durationMs: number;
113
+ error?: unknown;
114
+ }): void;
115
+ /** ignoreErrors, scrubbing e beforeSend antes de entrar na fila. */
116
+ private emit;
81
117
  /** Executa `fn` com `span` como contexto pai das operações internas. */
82
118
  runInSpan<T>(span: ActiveSpanImpl, fn: () => T): T;
83
119
  enqueue(span: Span): void;
@@ -1 +1 @@
1
- {"version":3,"file":"tracker.d.ts","sourceRoot":"","sources":["../src/tracker.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"tracker.d.ts","sourceRoot":"","sources":["../src/tracker.ts"],"names":[],"mappings":"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"}