fg-tracker-sdk 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (91) hide show
  1. package/CHANGELOG.md +17 -0
  2. package/README.md +375 -0
  3. package/dist/cli/release.d.ts +3 -0
  4. package/dist/cli/release.d.ts.map +1 -0
  5. package/dist/cli/release.js +134 -0
  6. package/dist/cli/release.js.map +1 -0
  7. package/dist/cli/sourcemaps.d.ts +3 -0
  8. package/dist/cli/sourcemaps.d.ts.map +1 -0
  9. package/dist/cli/sourcemaps.js +98 -0
  10. package/dist/cli/sourcemaps.js.map +1 -0
  11. package/dist/constants.d.ts +28 -0
  12. package/dist/constants.d.ts.map +1 -0
  13. package/dist/constants.js +35 -0
  14. package/dist/constants.js.map +1 -0
  15. package/dist/context.d.ts +22 -0
  16. package/dist/context.d.ts.map +1 -0
  17. package/dist/context.js +42 -0
  18. package/dist/context.js.map +1 -0
  19. package/dist/database.d.ts +29 -0
  20. package/dist/database.d.ts.map +1 -0
  21. package/dist/database.js +157 -0
  22. package/dist/database.js.map +1 -0
  23. package/dist/express.d.ts +17 -0
  24. package/dist/express.d.ts.map +1 -0
  25. package/dist/express.js +125 -0
  26. package/dist/express.js.map +1 -0
  27. package/dist/fetch.d.ts +9 -0
  28. package/dist/fetch.d.ts.map +1 -0
  29. package/dist/fetch.js +78 -0
  30. package/dist/fetch.js.map +1 -0
  31. package/dist/global-errors.d.ts +11 -0
  32. package/dist/global-errors.d.ts.map +1 -0
  33. package/dist/global-errors.js +35 -0
  34. package/dist/global-errors.js.map +1 -0
  35. package/dist/index.d.ts +29 -0
  36. package/dist/index.d.ts.map +1 -0
  37. package/dist/index.js +154 -0
  38. package/dist/index.js.map +1 -0
  39. package/dist/logs/nest-logger.d.ts +40 -0
  40. package/dist/logs/nest-logger.d.ts.map +1 -0
  41. package/dist/logs/nest-logger.js +99 -0
  42. package/dist/logs/nest-logger.js.map +1 -0
  43. package/dist/logs/pino.d.ts +24 -0
  44. package/dist/logs/pino.d.ts.map +1 -0
  45. package/dist/logs/pino.js +62 -0
  46. package/dist/logs/pino.js.map +1 -0
  47. package/dist/logs/shipper.d.ts +18 -0
  48. package/dist/logs/shipper.d.ts.map +1 -0
  49. package/dist/logs/shipper.js +217 -0
  50. package/dist/logs/shipper.js.map +1 -0
  51. package/dist/logs/types.d.ts +84 -0
  52. package/dist/logs/types.d.ts.map +1 -0
  53. package/dist/logs/types.js +47 -0
  54. package/dist/logs/types.js.map +1 -0
  55. package/dist/logs/winston.d.ts +31 -0
  56. package/dist/logs/winston.d.ts.map +1 -0
  57. package/dist/logs/winston.js +57 -0
  58. package/dist/logs/winston.js.map +1 -0
  59. package/dist/monitors.d.ts +8 -0
  60. package/dist/monitors.d.ts.map +1 -0
  61. package/dist/monitors.js +69 -0
  62. package/dist/monitors.js.map +1 -0
  63. package/dist/next.d.ts +9 -0
  64. package/dist/next.d.ts.map +1 -0
  65. package/dist/next.js +55 -0
  66. package/dist/next.js.map +1 -0
  67. package/dist/normalize.d.ts +12 -0
  68. package/dist/normalize.d.ts.map +1 -0
  69. package/dist/normalize.js +113 -0
  70. package/dist/normalize.js.map +1 -0
  71. package/dist/pg.d.ts +9 -0
  72. package/dist/pg.d.ts.map +1 -0
  73. package/dist/pg.js +83 -0
  74. package/dist/pg.js.map +1 -0
  75. package/dist/releases.d.ts +5 -0
  76. package/dist/releases.d.ts.map +1 -0
  77. package/dist/releases.js +30 -0
  78. package/dist/releases.js.map +1 -0
  79. package/dist/scrub.d.ts +11 -0
  80. package/dist/scrub.d.ts.map +1 -0
  81. package/dist/scrub.js +34 -0
  82. package/dist/scrub.js.map +1 -0
  83. package/dist/tracker.d.ts +99 -0
  84. package/dist/tracker.d.ts.map +1 -0
  85. package/dist/tracker.js +400 -0
  86. package/dist/tracker.js.map +1 -0
  87. package/dist/types.d.ts +264 -0
  88. package/dist/types.d.ts.map +1 -0
  89. package/dist/types.js +2 -0
  90. package/dist/types.js.map +1 -0
  91. package/package.json +98 -0
@@ -0,0 +1,400 @@
1
+ import { performance } from 'node:perf_hooks';
2
+ import { als, formatTraceparent, newSpanId, newTraceId, TRACEPARENT_HEADER } from './context.js';
3
+ import { toSpanError } from './normalize.js';
4
+ import { DEFAULT_SCRUB_FIELDS, matchesAny, scrubAttributes } from './scrub.js';
5
+ import { API_KEY_HEADER, DEFAULT_ENDPOINT, readEnv } from './constants.js';
6
+ const DEFAULT_FLUSH_INTERVAL_MS = 2000;
7
+ const DEFAULT_MAX_BATCH = 200;
8
+ const DEFAULT_MAX_QUEUE = 5000;
9
+ const MAX_SPANS_PER_REQUEST = 1000;
10
+ const RELEASE_ENV_VARS = [
11
+ 'VERCEL_GIT_COMMIT_SHA',
12
+ 'RAILWAY_GIT_COMMIT_SHA',
13
+ 'GITHUB_SHA',
14
+ 'SOURCE_VERSION',
15
+ 'HEROKU_SLUG_COMMIT',
16
+ 'COMMIT_SHA',
17
+ 'GIT_COMMIT',
18
+ 'CI_COMMIT_SHA',
19
+ ];
20
+ /** Release detectada do ambiente (CONTRATO.md §15): `${serviceName}@${sha}` para SHAs de CI/hosting. */
21
+ export function detectRelease(serviceName, env = process.env) {
22
+ // FG_TRACKER_RELEASE (ou o legado STREAD_TRACK_RELEASE) já vem no formato final.
23
+ const explicit = readEnv('RELEASE', env);
24
+ if (explicit)
25
+ return explicit;
26
+ for (const name of RELEASE_ENV_VARS) {
27
+ const value = env[name]?.trim();
28
+ if (!value)
29
+ continue;
30
+ return `${serviceName ?? 'app'}@${value}`;
31
+ }
32
+ const version = env.npm_package_version?.trim();
33
+ return version ? `${serviceName ?? env.npm_package_name ?? 'app'}@${version}` : undefined;
34
+ }
35
+ export function detectEnvironment(env = process.env) {
36
+ return readEnv('ENV', env) || env.APP_ENV?.trim() || env.NODE_ENV?.trim() || undefined;
37
+ }
38
+ export function resolveOptions(options) {
39
+ const endpoint = (options.endpoint ?? DEFAULT_ENDPOINT).replace(/\/+$/, '');
40
+ return {
41
+ apiKey: options.apiKey ?? '',
42
+ endpoint,
43
+ serviceName: options.serviceName,
44
+ release: options.release === false ? undefined : options.release?.trim() || detectRelease(options.serviceName),
45
+ environment: options.environment === false ? undefined : options.environment?.trim() || detectEnvironment(),
46
+ propagateTraceTo: options.propagateTraceTo ?? true,
47
+ tracesSampleRate: Math.min(1, Math.max(0, options.tracesSampleRate ?? 1)),
48
+ tracesSampler: options.tracesSampler,
49
+ ignoreTransactions: options.ignoreTransactions ?? [],
50
+ ignoreErrors: options.ignoreErrors ?? [],
51
+ beforeSend: options.beforeSend,
52
+ scrubFields: options.scrubFields === false ? [] : (options.scrubFields ?? DEFAULT_SCRUB_FIELDS),
53
+ flushIntervalMs: Math.max(100, options.flushIntervalMs ?? DEFAULT_FLUSH_INTERVAL_MS),
54
+ maxBatchSize: Math.max(1, options.maxBatchSize ?? DEFAULT_MAX_BATCH),
55
+ maxQueueSize: Math.max(10, options.maxQueueSize ?? DEFAULT_MAX_QUEUE),
56
+ enabled: (options.enabled ?? true) && Boolean(options.apiKey),
57
+ debug: options.debug ?? false,
58
+ fetch: options.fetch ?? globalThis.fetch,
59
+ };
60
+ }
61
+ /** Decide se um destino recebe o `traceparent` (CONTRATO.md §16). */
62
+ export function shouldPropagate(targets, url) {
63
+ if (targets === true)
64
+ return true;
65
+ if (targets === false)
66
+ return false;
67
+ return targets.some((target) => {
68
+ if (target instanceof RegExp)
69
+ return target.test(url.href);
70
+ const pattern = target.trim();
71
+ if (!pattern)
72
+ return false;
73
+ if (pattern.startsWith('http://') || pattern.startsWith('https://'))
74
+ return url.href.startsWith(pattern);
75
+ return url.host === pattern || url.hostname === pattern || url.hostname.endsWith(`.${pattern}`);
76
+ });
77
+ }
78
+ /**
79
+ * Núcleo do tracker: constrói spans, mantém a fila e faz o envio em lote.
80
+ * As integrações (express, pg, next, fetch) ficam em arquivos separados e só
81
+ * usam `startSpan` / `runInSpan`.
82
+ */
83
+ export class TrackerCore {
84
+ options;
85
+ queue = [];
86
+ timer = null;
87
+ flushing = null;
88
+ warnedFailure = false;
89
+ stopped = false;
90
+ /** Spans ainda abertos, por spanId — permite `currentSpan()` a partir do contexto assíncrono. */
91
+ active = new Map();
92
+ constructor(options) {
93
+ this.options = resolveOptions(options);
94
+ if (!this.options.enabled) {
95
+ if (!options.apiKey && (options.enabled ?? true)) {
96
+ console.warn('[fg-tracker] apiKey ausente: tracker desabilitado.');
97
+ }
98
+ return;
99
+ }
100
+ this.timer = setInterval(() => {
101
+ void this.flush();
102
+ }, this.options.flushIntervalMs);
103
+ // Não segura o processo vivo só por causa do timer.
104
+ if (typeof this.timer === 'object' && this.timer && 'unref' in this.timer)
105
+ this.timer.unref();
106
+ }
107
+ get enabled() {
108
+ return this.options.enabled && !this.stopped;
109
+ }
110
+ currentContext() {
111
+ return als.getStore();
112
+ }
113
+ /** Cria um span; o pai é o contexto assíncrono atual, salvo se `parent` for informado. */
114
+ startSpan(kind, name, attributes = {}, parent) {
115
+ const parentCtx = parent === undefined ? als.getStore() : parent;
116
+ const traceId = parentCtx?.traceId ?? newTraceId();
117
+ const parentSpanId = parentCtx?.spanId ?? null;
118
+ const attrs = this.decorate(attributes);
119
+ // Amostragem: decidida uma vez por trace (raiz) e herdada pelos filhos.
120
+ const sampled = parentCtx ? parentCtx.sampled !== false : this.decideSampling({ kind, name, attributes: attrs });
121
+ const span = new ActiveSpanImpl(this, traceId, newSpanId(), parentSpanId, kind, name, attrs, sampled);
122
+ this.active.set(span.spanId, span);
123
+ return span;
124
+ }
125
+ decorate(attributes) {
126
+ const attrs = { ...attributes };
127
+ if (this.options.serviceName && attrs.serviceName === undefined)
128
+ attrs.serviceName = this.options.serviceName;
129
+ if (this.options.release && attrs.release === undefined)
130
+ attrs.release = this.options.release;
131
+ if (this.options.environment && attrs.environment === undefined)
132
+ attrs.environment = this.options.environment;
133
+ return attrs;
134
+ }
135
+ /** `ignoreTransactions` → nunca; `tracesSampler` → fração/boolean; senão `tracesSampleRate`. */
136
+ decideSampling(context) {
137
+ if (matchesAny(context.name, this.options.ignoreTransactions))
138
+ return false;
139
+ let rate = this.options.tracesSampleRate;
140
+ if (this.options.tracesSampler) {
141
+ try {
142
+ rate = this.options.tracesSampler(context);
143
+ }
144
+ catch {
145
+ rate = this.options.tracesSampleRate;
146
+ }
147
+ }
148
+ if (typeof rate === 'boolean')
149
+ return rate;
150
+ if (!Number.isFinite(rate) || rate <= 0)
151
+ return false;
152
+ if (rate >= 1)
153
+ return true;
154
+ return Math.random() < rate;
155
+ }
156
+ /**
157
+ * Continua um trace recebido de outro serviço: mesmo `traceId`, mas o span nasce como
158
+ * raiz local (`parentSpanId` null) e guarda o pai remoto em `attributes.remoteParentSpanId`,
159
+ * para as métricas por requisição continuarem contando este serviço.
160
+ */
161
+ startRemoteRoot(kind, name, attributes, remote) {
162
+ const attrs = this.decorate({ ...attributes, remoteParentSpanId: remote.spanId });
163
+ // A decisão do serviço a montante (flag do traceparent) vale aqui, salvo `ignoreTransactions`.
164
+ const sampled = remote.sampled === false ? false : this.decideSampling({ kind, name, attributes: attrs, parentSampled: remote.sampled });
165
+ const span = new ActiveSpanImpl(this, remote.traceId, newSpanId(), null, kind, name, attrs, sampled);
166
+ this.active.set(span.spanId, span);
167
+ return span;
168
+ }
169
+ /** Span aberto correspondente ao contexto assíncrono atual (se houver). */
170
+ currentSpan() {
171
+ const ctx = als.getStore();
172
+ return ctx ? this.active.get(ctx.spanId) : undefined;
173
+ }
174
+ /** Span raiz local do contexto atual (sobe pelos pais ainda abertos). */
175
+ rootSpan() {
176
+ let span = this.currentSpan();
177
+ let guard = 0;
178
+ while (span?.parentSpanId && guard < 64) {
179
+ const parent = this.active.get(span.parentSpanId);
180
+ if (!parent)
181
+ break;
182
+ span = parent;
183
+ guard += 1;
184
+ }
185
+ return span;
186
+ }
187
+ /** Headers de propagação para o contexto corrente. */
188
+ traceHeaders() {
189
+ const ctx = als.getStore();
190
+ return ctx ? { [TRACEPARENT_HEADER]: formatTraceparent(ctx) } : {};
191
+ }
192
+ /** Chamado por ActiveSpanImpl.end(): amostragem, ignoreErrors, scrubbing e beforeSend. */
193
+ finishSpan(span, payload) {
194
+ this.active.delete(span.spanId);
195
+ if (!span.sampled)
196
+ return;
197
+ let out = payload;
198
+ if (out.error && matchesAny(`${out.error.name}: ${out.error.message}`, this.options.ignoreErrors)) {
199
+ out = { ...out, error: null, attributes: { ...out.attributes, ignoredError: out.error.name } };
200
+ }
201
+ if (this.options.scrubFields.length > 0)
202
+ out = { ...out, attributes: scrubAttributes(out.attributes, this.options.scrubFields) };
203
+ if (this.options.beforeSend) {
204
+ try {
205
+ const result = this.options.beforeSend(out);
206
+ if (!result)
207
+ return;
208
+ out = result;
209
+ }
210
+ catch (err) {
211
+ this.warnOnce(`beforeSend lançou: ${err?.message ?? err}`);
212
+ }
213
+ }
214
+ this.enqueue(out);
215
+ }
216
+ /** Executa `fn` com `span` como contexto pai das operações internas. */
217
+ runInSpan(span, fn) {
218
+ return als.run({ traceId: span.traceId, spanId: span.spanId, sampled: span.sampled }, fn);
219
+ }
220
+ enqueue(span) {
221
+ if (!this.enabled)
222
+ return;
223
+ this.queue.push(span);
224
+ if (this.queue.length > this.options.maxQueueSize) {
225
+ // Descarta os mais antigos para não crescer sem limite.
226
+ this.queue.splice(0, this.queue.length - this.options.maxQueueSize);
227
+ }
228
+ if (this.queue.length >= this.options.maxBatchSize)
229
+ void this.flush();
230
+ }
231
+ async flush() {
232
+ if (!this.options.enabled)
233
+ return;
234
+ if (this.flushing)
235
+ return this.flushing;
236
+ if (this.queue.length === 0)
237
+ return;
238
+ this.flushing = this.doFlush().finally(() => {
239
+ this.flushing = null;
240
+ });
241
+ return this.flushing;
242
+ }
243
+ async doFlush() {
244
+ while (this.queue.length > 0) {
245
+ const batch = this.queue.splice(0, MAX_SPANS_PER_REQUEST);
246
+ const ok = await this.send(batch);
247
+ if (!ok) {
248
+ // Devolve para a frente da fila e tenta no próximo flush.
249
+ this.queue.unshift(...batch);
250
+ if (this.queue.length > this.options.maxQueueSize) {
251
+ this.queue.splice(0, this.queue.length - this.options.maxQueueSize);
252
+ }
253
+ return;
254
+ }
255
+ }
256
+ }
257
+ /** POST autenticado na API (ingest, check-ins, releases). Devolve a resposta ou `null` em falha de rede. */
258
+ async post(path, body, timeoutMs = 10_000) {
259
+ try {
260
+ return await this.options.fetch(`${this.options.endpoint}${path}`, {
261
+ method: 'POST',
262
+ headers: { 'content-type': 'application/json', [API_KEY_HEADER]: this.options.apiKey },
263
+ body: JSON.stringify(body),
264
+ signal: AbortSignal.timeout(timeoutMs),
265
+ });
266
+ }
267
+ catch (err) {
268
+ this.warnOnce(`falha ao enviar para ${this.options.endpoint}${path}: ${err?.message ?? err}`);
269
+ return null;
270
+ }
271
+ }
272
+ async send(spans) {
273
+ const byTrace = new Map();
274
+ for (const span of spans) {
275
+ const { traceId, ...rest } = span;
276
+ let list = byTrace.get(traceId);
277
+ if (!list) {
278
+ list = [];
279
+ byTrace.set(traceId, list);
280
+ }
281
+ list.push(rest);
282
+ }
283
+ const body = JSON.stringify({ traces: [...byTrace].map(([traceId, s]) => ({ traceId, spans: s })) });
284
+ try {
285
+ const res = await this.options.fetch(`${this.options.endpoint}/v1/ingest`, {
286
+ method: 'POST',
287
+ headers: { 'content-type': 'application/json', [API_KEY_HEADER]: this.options.apiKey },
288
+ body,
289
+ });
290
+ if (!res.ok) {
291
+ // 4xx = problema de configuração (chave inválida, payload rejeitado): não faz sentido reenviar.
292
+ const retry = res.status >= 500 || res.status === 429;
293
+ this.warnOnce(`ingest respondeu ${res.status}${retry ? ' (vai tentar de novo)' : ' (lote descartado)'}`);
294
+ return !retry;
295
+ }
296
+ if (this.warnedFailure) {
297
+ this.warnedFailure = false;
298
+ if (this.options.debug)
299
+ console.info('[fg-tracker] envio restabelecido.');
300
+ }
301
+ if (this.options.debug)
302
+ console.info(`[fg-tracker] enviados ${spans.length} spans em ${byTrace.size} traces.`);
303
+ return true;
304
+ }
305
+ catch (err) {
306
+ this.warnOnce(`falha ao enviar para ${this.options.endpoint}/v1/ingest: ${err?.message ?? err}`);
307
+ return false;
308
+ }
309
+ }
310
+ warnOnce(message) {
311
+ if (this.warnedFailure)
312
+ return;
313
+ this.warnedFailure = true;
314
+ console.warn(`[fg-tracker] ${message}`);
315
+ }
316
+ async shutdown() {
317
+ if (this.timer) {
318
+ clearInterval(this.timer);
319
+ this.timer = null;
320
+ }
321
+ await this.flush();
322
+ this.stopped = true;
323
+ }
324
+ }
325
+ export function userAttributes(user) {
326
+ if (!user)
327
+ return { 'user.id': undefined, 'user.email': undefined, 'user.name': undefined };
328
+ const attrs = { 'user.id': String(user.id) };
329
+ if (user.email)
330
+ attrs['user.email'] = user.email;
331
+ if (user.name)
332
+ attrs['user.name'] = user.name;
333
+ return attrs;
334
+ }
335
+ export class ActiveSpanImpl {
336
+ core;
337
+ traceId;
338
+ spanId;
339
+ parentSpanId;
340
+ kind;
341
+ sampled;
342
+ name;
343
+ method = null;
344
+ route = null;
345
+ statusCode = null;
346
+ attributes;
347
+ error = null;
348
+ startedAt;
349
+ startedPerf;
350
+ ended = false;
351
+ constructor(core, traceId, spanId, parentSpanId, kind, name, attributes, sampled = true) {
352
+ this.core = core;
353
+ this.traceId = traceId;
354
+ this.spanId = spanId;
355
+ this.parentSpanId = parentSpanId;
356
+ this.kind = kind;
357
+ this.sampled = sampled;
358
+ this.name = name;
359
+ this.attributes = attributes;
360
+ this.startedAt = new Date();
361
+ this.startedPerf = performance.now();
362
+ }
363
+ setAttribute(key, value) {
364
+ this.attributes[key] = value;
365
+ }
366
+ setError(err) {
367
+ this.error = toSpanError(err);
368
+ }
369
+ setUser(user) {
370
+ for (const [key, value] of Object.entries(userAttributes(user))) {
371
+ if (value === undefined)
372
+ delete this.attributes[key];
373
+ else
374
+ this.attributes[key] = value;
375
+ }
376
+ }
377
+ end() {
378
+ if (this.ended)
379
+ return;
380
+ this.ended = true;
381
+ const durationMs = Math.round((performance.now() - this.startedPerf) * 1000) / 1000;
382
+ const endedAt = new Date(this.startedAt.getTime() + durationMs);
383
+ this.core.finishSpan(this, {
384
+ traceId: this.traceId,
385
+ spanId: this.spanId,
386
+ parentSpanId: this.parentSpanId,
387
+ kind: this.kind,
388
+ name: this.name,
389
+ method: this.method,
390
+ route: this.route,
391
+ statusCode: this.statusCode,
392
+ startedAt: this.startedAt.toISOString(),
393
+ endedAt: endedAt.toISOString(),
394
+ durationMs,
395
+ attributes: this.attributes,
396
+ error: this.error,
397
+ });
398
+ }
399
+ }
400
+ //# sourceMappingURL=tracker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tracker.js","sourceRoot":"","sources":["../src/tracker.ts"],"names":[],"mappings":"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"}