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,11 @@
1
+ import type { TrackerCore } from './tracker.js';
2
+ /**
3
+ * Captura global de erros do processo (opcional, `captureGlobalErrors: true`):
4
+ * - `uncaughtExceptionMonitor` observa sem alterar o comportamento padrão (o processo
5
+ * continua encerrando);
6
+ * - `unhandledRejection` é registrado e, se este for o único listener, o erro é
7
+ * relançado no próximo tick para preservar o comportamento padrão do Node.
8
+ * Cada erro vira um span `custom` (`process.uncaughtException` / `process.unhandledRejection`).
9
+ */
10
+ export declare function installGlobalErrorCapture(core: TrackerCore): () => void;
11
+ //# sourceMappingURL=global-errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"global-errors.d.ts","sourceRoot":"","sources":["../src/global-errors.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAEhD;;;;;;;GAOG;AACH,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,WAAW,GAAG,MAAM,IAAI,CAuBvE"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * Captura global de erros do processo (opcional, `captureGlobalErrors: true`):
3
+ * - `uncaughtExceptionMonitor` observa sem alterar o comportamento padrão (o processo
4
+ * continua encerrando);
5
+ * - `unhandledRejection` é registrado e, se este for o único listener, o erro é
6
+ * relançado no próximo tick para preservar o comportamento padrão do Node.
7
+ * Cada erro vira um span `custom` (`process.uncaughtException` / `process.unhandledRejection`).
8
+ */
9
+ export function installGlobalErrorCapture(core) {
10
+ const record = (name, err) => {
11
+ if (!core.enabled)
12
+ return;
13
+ const span = core.rootSpan() ?? core.startSpan('custom', name, { fatal: name === 'process.uncaughtException' }, null);
14
+ span.setError(err);
15
+ if (!core.rootSpan())
16
+ span.end();
17
+ void core.flush();
18
+ };
19
+ const onException = (err) => record('process.uncaughtException', err);
20
+ const onRejection = (reason) => {
21
+ record('process.unhandledRejection', reason);
22
+ if (process.listenerCount('unhandledRejection') === 1) {
23
+ process.nextTick(() => {
24
+ throw reason;
25
+ });
26
+ }
27
+ };
28
+ process.on('uncaughtExceptionMonitor', onException);
29
+ process.on('unhandledRejection', onRejection);
30
+ return () => {
31
+ process.off('uncaughtExceptionMonitor', onException);
32
+ process.off('unhandledRejection', onRejection);
33
+ };
34
+ }
35
+ //# sourceMappingURL=global-errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"global-errors.js","sourceRoot":"","sources":["../src/global-errors.ts"],"names":[],"mappings":"AAEA;;;;;;;GAOG;AACH,MAAM,UAAU,yBAAyB,CAAC,IAAiB;IACzD,MAAM,MAAM,GAAG,CAAC,IAAY,EAAE,GAAY,EAAE,EAAE;QAC5C,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE,OAAO;QAC1B,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,EAAE,IAAI,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,IAAI,KAAK,2BAA2B,EAAE,EAAE,IAAI,CAAC,CAAC;QACtH,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QACnB,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE;YAAE,IAAI,CAAC,GAAG,EAAE,CAAC;QACjC,KAAK,IAAI,CAAC,KAAK,EAAE,CAAC;IACpB,CAAC,CAAC;IACF,MAAM,WAAW,GAAG,CAAC,GAAY,EAAE,EAAE,CAAC,MAAM,CAAC,2BAA2B,EAAE,GAAG,CAAC,CAAC;IAC/E,MAAM,WAAW,GAAG,CAAC,MAAe,EAAE,EAAE;QACtC,MAAM,CAAC,4BAA4B,EAAE,MAAM,CAAC,CAAC;QAC7C,IAAI,OAAO,CAAC,aAAa,CAAC,oBAAoB,CAAC,KAAK,CAAC,EAAE,CAAC;YACtD,OAAO,CAAC,QAAQ,CAAC,GAAG,EAAE;gBACpB,MAAM,MAAM,CAAC;YACf,CAAC,CAAC,CAAC;QACL,CAAC;IACH,CAAC,CAAC;IACF,OAAO,CAAC,EAAE,CAAC,0BAA0B,EAAE,WAAW,CAAC,CAAC;IACpD,OAAO,CAAC,EAAE,CAAC,oBAAoB,EAAE,WAAW,CAAC,CAAC;IAC9C,OAAO,GAAG,EAAE;QACV,OAAO,CAAC,GAAG,CAAC,0BAA0B,EAAE,WAAW,CAAC,CAAC;QACrD,OAAO,CAAC,GAAG,CAAC,oBAAoB,EAAE,WAAW,CAAC,CAAC;IACjD,CAAC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,29 @@
1
+ export type { DatabaseInstrumentationOptions, DatabaseOperation, PostgresSqlLike } from "./database.js";
2
+ import type { Tracker, TrackerOptions } from './types.js';
3
+ export type { ActiveSpan, CheckInHandle, CheckInOptions, ExpressErrorMiddleware, ExpressLikeRequest, ExpressLikeResponse, ExpressMiddleware, ExpressOptions, NextRouteHandler, PgPoolLike, PropagationTargets, RegisterReleaseInput, ReleaseCommitInput, SamplingContext, Span, SpanError, SpanKind, Tracker, TrackerOptions, UserRef, } from './types.js';
4
+ export { normalizePath, normalizeSql } from './normalize.js';
5
+ export { detectEnvironment, detectRelease, shouldPropagate } from './tracker.js';
6
+ export { formatTraceparent, parseTraceparent, TRACEPARENT_HEADER } from './context.js';
7
+ export { DEFAULT_SCRUB_FIELDS, scrubAttributes } from './scrub.js';
8
+ export { API_KEY_HEADER, DEFAULT_ENDPOINT, readEnv } from './constants.js';
9
+ /**
10
+ * Cria um tracker do FG Tracker.
11
+ *
12
+ * ```ts
13
+ * const tracker = createTracker({ apiKey: process.env.FG_TRACKER_KEY!, endpoint: 'http://localhost:4050', serviceName: 'minha-app' });
14
+ * app.use(tracker.express());
15
+ * tracker.instrumentPg(pool);
16
+ * ```
17
+ */
18
+ export declare function createTracker(options: TrackerOptions): Tracker;
19
+ export { currentSpanContext } from './context.js';
20
+ export type { SpanContext } from './context.js';
21
+ export { createLogShipper, traceMixin } from './logs/shipper.js';
22
+ export { pinoTransport, fromPino } from './logs/pino.js';
23
+ export type { PinoTransportOptions } from './logs/pino.js';
24
+ export { nestLogger } from './logs/nest-logger.js';
25
+ export type { FgTrackerNestLogger, NestLoggerOptions, NestLoggerService, NestLogLevel, StreadTrackNestLogger } from './logs/nest-logger.js';
26
+ export { LOG_LEVEL_NUMBER, toLogLevel } from './logs/types.js';
27
+ export type { LogEntry, LogInput, LogLevel, LogShipper, LogShipperOptions, SpanContextSource } from './logs/types.js';
28
+ export type { WinstonTransportOptions } from './logs/winston.js';
29
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +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;AASxG,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,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;AAE3E;;;;;;;;GAQG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAiG9D;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 ADDED
@@ -0,0 +1,154 @@
1
+ import { instrumentPostgresClient, instrumentDatabaseClient, startDatabaseSpan, databaseError } from "./database.js";
2
+ import { createExpressErrorHandler, createExpressMiddleware } from './express.js';
3
+ import { createInstrumentedFetch } from './fetch.js';
4
+ import { installGlobalErrorCapture } from './global-errors.js';
5
+ import { createMonitor, runCheckIn } from './monitors.js';
6
+ import { wrapNextRouteHandler } from './next.js';
7
+ import { instrumentPgPool } from './pg.js';
8
+ import { registerRelease } from './releases.js';
9
+ import { TrackerCore } from './tracker.js';
10
+ export { normalizePath, normalizeSql } from './normalize.js';
11
+ export { detectEnvironment, detectRelease, shouldPropagate } from './tracker.js';
12
+ export { formatTraceparent, parseTraceparent, TRACEPARENT_HEADER } from './context.js';
13
+ export { DEFAULT_SCRUB_FIELDS, scrubAttributes } from './scrub.js';
14
+ export { API_KEY_HEADER, DEFAULT_ENDPOINT, readEnv } from './constants.js';
15
+ /**
16
+ * Cria um tracker do FG Tracker.
17
+ *
18
+ * ```ts
19
+ * const tracker = createTracker({ apiKey: process.env.FG_TRACKER_KEY!, endpoint: 'http://localhost:4050', serviceName: 'minha-app' });
20
+ * app.use(tracker.express());
21
+ * tracker.instrumentPg(pool);
22
+ * ```
23
+ */
24
+ export function createTracker(options) {
25
+ const core = new TrackerCore(options);
26
+ let originalFetch = null;
27
+ const instrumentGlobalFetch = () => {
28
+ if (originalFetch)
29
+ return originalFetch;
30
+ originalFetch = globalThis.fetch;
31
+ globalThis.fetch = createInstrumentedFetch(core, originalFetch);
32
+ return originalFetch;
33
+ };
34
+ if (options.instrumentGlobalFetch && core.enabled)
35
+ instrumentGlobalFetch();
36
+ if (options.captureGlobalErrors && core.enabled)
37
+ installGlobalErrorCapture(core);
38
+ const tracker = {
39
+ express: (expressOptions) => createExpressMiddleware(core, expressOptions),
40
+ expressErrorHandler: () => createExpressErrorHandler(core),
41
+ instrumentPostgres: (client) => instrumentPostgresClient(core, client),
42
+ instrumentDatabase: (client, options) => instrumentDatabaseClient(core, client, options),
43
+ async traceDatabase(operation, fn) {
44
+ const span = startDatabaseSpan(core, operation);
45
+ try {
46
+ return await fn();
47
+ }
48
+ catch (error) {
49
+ databaseError(span, error);
50
+ throw error;
51
+ }
52
+ finally {
53
+ span?.end();
54
+ }
55
+ },
56
+ traceDatabaseSync(operation, fn) {
57
+ const span = startDatabaseSpan(core, operation);
58
+ try {
59
+ return fn();
60
+ }
61
+ catch (error) {
62
+ databaseError(span, error);
63
+ throw error;
64
+ }
65
+ finally {
66
+ span?.end();
67
+ }
68
+ },
69
+ instrumentPg: (pool) => instrumentPgPool(core, pool),
70
+ async span(kind, name, fn, attributes = {}) {
71
+ if (!core.enabled)
72
+ return fn(noopSpan(kind, name, attributes));
73
+ const span = core.startSpan(kind, name, attributes);
74
+ try {
75
+ const result = await core.runInSpan(span, () => fn(span));
76
+ return result;
77
+ }
78
+ catch (err) {
79
+ if (!span.error)
80
+ span.setError(err);
81
+ throw err;
82
+ }
83
+ finally {
84
+ span.end();
85
+ }
86
+ },
87
+ wrapNextRoute: (handler) => wrapNextRouteHandler(core, handler),
88
+ wrapFetch: (fetchImpl) => createInstrumentedFetch(core, fetchImpl),
89
+ instrumentGlobalFetch,
90
+ currentSpan: () => core.currentSpan(),
91
+ rootSpan: () => core.rootSpan(),
92
+ currentTraceId: () => core.currentContext()?.traceId,
93
+ traceHeaders: () => core.traceHeaders(),
94
+ setUser(user) {
95
+ (core.rootSpan() ?? core.currentSpan())?.setUser(user);
96
+ },
97
+ captureException(err, attributes = {}) {
98
+ if (!core.enabled)
99
+ return;
100
+ const root = core.rootSpan() ?? core.currentSpan();
101
+ if (root) {
102
+ if (!root.error)
103
+ root.setError(err);
104
+ for (const [key, value] of Object.entries(attributes))
105
+ root.setAttribute(key, value);
106
+ return;
107
+ }
108
+ const span = core.startSpan('custom', 'exception', attributes, null);
109
+ span.setError(err);
110
+ span.end();
111
+ },
112
+ startSpan: (kind, name, attributes = {}) => core.enabled ? core.startSpan(kind, name, attributes) : noopSpan(kind, name, attributes),
113
+ checkIn: (slug, fn, checkInOptions) => runCheckIn(core, slug, fn, checkInOptions),
114
+ monitor: (slug, checkInOptions) => createMonitor(core, slug, checkInOptions),
115
+ registerRelease: (input) => registerRelease(core, input),
116
+ get release() {
117
+ return core.options.release;
118
+ },
119
+ get environment() {
120
+ return core.options.environment;
121
+ },
122
+ flush: () => core.flush(),
123
+ shutdown: () => core.shutdown(),
124
+ };
125
+ return tracker;
126
+ }
127
+ function noopSpan(kind, name, attributes) {
128
+ return {
129
+ traceId: '',
130
+ spanId: '',
131
+ parentSpanId: null,
132
+ kind,
133
+ name,
134
+ method: null,
135
+ route: null,
136
+ statusCode: null,
137
+ attributes,
138
+ error: null,
139
+ sampled: false,
140
+ setAttribute() { },
141
+ setError() { },
142
+ setUser() { },
143
+ end() { },
144
+ };
145
+ }
146
+ /* ------------------------------------------------------------------ */
147
+ /* Logs (CONTRATO.md §11) */
148
+ /* ------------------------------------------------------------------ */
149
+ export { currentSpanContext } from './context.js';
150
+ export { createLogShipper, traceMixin } from './logs/shipper.js';
151
+ export { pinoTransport, fromPino } from './logs/pino.js';
152
+ export { nestLogger } from './logs/nest-logger.js';
153
+ export { LOG_LEVEL_NUMBER, toLogLevel } from './logs/types.js';
154
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ import type { LogShipper, LogShipperOptions } from './types.js';
2
+ /** Forma estrutural do `LoggerService` do NestJS (sem depender de `@nestjs/common`). */
3
+ export interface NestLoggerService {
4
+ log(message: unknown, ...optionalParams: unknown[]): void;
5
+ error(message: unknown, ...optionalParams: unknown[]): void;
6
+ warn(message: unknown, ...optionalParams: unknown[]): void;
7
+ debug?(message: unknown, ...optionalParams: unknown[]): void;
8
+ verbose?(message: unknown, ...optionalParams: unknown[]): void;
9
+ fatal?(message: unknown, ...optionalParams: unknown[]): void;
10
+ setLogLevels?(levels: string[]): void;
11
+ }
12
+ export type NestLogLevel = 'log' | 'error' | 'warn' | 'debug' | 'verbose' | 'fatal';
13
+ export type NestLoggerOptions = LogShipperOptions & {
14
+ /** Espelha no console (formato compacto). Default `true`. */
15
+ console?: boolean;
16
+ /** Níveis do Nest habilitados. Default todos. */
17
+ logLevels?: NestLogLevel[];
18
+ };
19
+ export interface FgTrackerNestLogger extends NestLoggerService {
20
+ readonly shipper: LogShipper;
21
+ debug(message: unknown, ...optionalParams: unknown[]): void;
22
+ verbose(message: unknown, ...optionalParams: unknown[]): void;
23
+ fatal(message: unknown, ...optionalParams: unknown[]): void;
24
+ setLogLevels(levels: string[]): void;
25
+ flush(): Promise<void>;
26
+ shutdown(): Promise<void>;
27
+ }
28
+ /** @deprecated use `FgTrackerNestLogger` (nome antigo do `stread-track-sdk`; removido na 1.0). */
29
+ export type StreadTrackNestLogger = FgTrackerNestLogger;
30
+ /**
31
+ * `LoggerService` do Nest que espelha no console e envia para o FG Tracker:
32
+ *
33
+ * ```ts
34
+ * const app = await NestFactory.create(AppModule, { logger: nestLogger({ apiKey, service: 'minha-api', tracker }) });
35
+ * ```
36
+ * Convenção do Nest: o último parâmetro string é o `context` (nome da classe);
37
+ * em `error(message, stack, context)` o penúltimo é o stack.
38
+ */
39
+ export declare function nestLogger(options: NestLoggerOptions): FgTrackerNestLogger;
40
+ //# sourceMappingURL=nest-logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nest-logger.d.ts","sourceRoot":"","sources":["../../src/logs/nest-logger.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAY,UAAU,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAE1E,wFAAwF;AACxF,MAAM,WAAW,iBAAiB;IAChC,GAAG,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,cAAc,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;IAC1D,KAAK,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,cAAc,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;IAC5D,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,cAAc,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;IAC3D,KAAK,CAAC,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,cAAc,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;IAC7D,OAAO,CAAC,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,cAAc,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;IAC/D,KAAK,CAAC,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,cAAc,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;IAC7D,YAAY,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;CACvC;AAED,MAAM,MAAM,YAAY,GAAG,KAAK,GAAG,OAAO,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,GAAG,OAAO,CAAC;AAEpF,MAAM,MAAM,iBAAiB,GAAG,iBAAiB,GAAG;IAClD,6DAA6D;IAC7D,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,iDAAiD;IACjD,SAAS,CAAC,EAAE,YAAY,EAAE,CAAC;CAC5B,CAAC;AAEF,MAAM,WAAW,mBAAoB,SAAQ,iBAAiB;IAC5D,QAAQ,CAAC,OAAO,EAAE,UAAU,CAAC;IAC7B,KAAK,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,cAAc,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;IAC5D,OAAO,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,cAAc,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;IAC9D,KAAK,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,cAAc,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;IAC5D,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IACrC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACvB,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC3B;AAED,kGAAkG;AAClG,MAAM,MAAM,qBAAqB,GAAG,mBAAmB,CAAC;AAWxD;;;;;;;;GAQG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,iBAAiB,GAAG,mBAAmB,CA6B1E"}
@@ -0,0 +1,99 @@
1
+ import { createLogShipper } from './shipper.js';
2
+ const NEST_TO_LEVEL = {
3
+ verbose: 'trace',
4
+ debug: 'debug',
5
+ log: 'info',
6
+ warn: 'warn',
7
+ error: 'error',
8
+ fatal: 'fatal',
9
+ };
10
+ /**
11
+ * `LoggerService` do Nest que espelha no console e envia para o FG Tracker:
12
+ *
13
+ * ```ts
14
+ * const app = await NestFactory.create(AppModule, { logger: nestLogger({ apiKey, service: 'minha-api', tracker }) });
15
+ * ```
16
+ * Convenção do Nest: o último parâmetro string é o `context` (nome da classe);
17
+ * em `error(message, stack, context)` o penúltimo é o stack.
18
+ */
19
+ export function nestLogger(options) {
20
+ const { console: mirror = true, logLevels, ...shipperOptions } = options;
21
+ const shipper = createLogShipper(shipperOptions);
22
+ let enabled = new Set(logLevels ?? ['log', 'error', 'warn', 'debug', 'verbose', 'fatal']);
23
+ const emit = (nestLevel, message, params) => {
24
+ if (!enabled.has(nestLevel))
25
+ return;
26
+ const { text, context, stack, name } = splitParams(nestLevel, message, params);
27
+ if (mirror)
28
+ mirrorToConsole(nestLevel, text, name, stack);
29
+ const extra = { ...context };
30
+ if (name)
31
+ extra.context = name;
32
+ if (stack)
33
+ extra.stack = stack;
34
+ shipper.push({ level: NEST_TO_LEVEL[nestLevel], message: text, context: extra });
35
+ };
36
+ return {
37
+ shipper,
38
+ log: (message, ...params) => emit('log', message, params),
39
+ error: (message, ...params) => emit('error', message, params),
40
+ warn: (message, ...params) => emit('warn', message, params),
41
+ debug: (message, ...params) => emit('debug', message, params),
42
+ verbose: (message, ...params) => emit('verbose', message, params),
43
+ fatal: (message, ...params) => emit('fatal', message, params),
44
+ setLogLevels(levels) {
45
+ enabled = new Set(levels);
46
+ },
47
+ flush: () => shipper.flush(),
48
+ shutdown: () => shipper.shutdown(),
49
+ };
50
+ }
51
+ function splitParams(nestLevel, message, params) {
52
+ const rest = [...params];
53
+ let name;
54
+ let stack;
55
+ if (rest.length > 0 && typeof rest[rest.length - 1] === 'string')
56
+ name = rest.pop();
57
+ if (nestLevel === 'error' && rest.length > 0 && typeof rest[rest.length - 1] === 'string')
58
+ stack = rest.pop();
59
+ const context = {};
60
+ let text;
61
+ if (message instanceof Error) {
62
+ text = message.message;
63
+ stack = stack ?? message.stack;
64
+ context.errorName = message.name;
65
+ }
66
+ else if (typeof message === 'string') {
67
+ text = message;
68
+ }
69
+ else if (message && typeof message === 'object') {
70
+ text = message.message?.toString() ?? JSON.stringify(message);
71
+ Object.assign(context, message);
72
+ }
73
+ else {
74
+ text = String(message);
75
+ }
76
+ if (rest.length > 0)
77
+ context.params = rest;
78
+ return { text, context, stack, name };
79
+ }
80
+ function mirrorToConsole(nestLevel, text, name, stack) {
81
+ const prefix = `${new Date().toISOString()} ${nestLevel.toUpperCase().padEnd(7)}${name ? ` [${name}]` : ''}`;
82
+ const line = `${prefix} ${text}`;
83
+ switch (nestLevel) {
84
+ case 'error':
85
+ case 'fatal':
86
+ console.error(stack ? `${line}\n${stack}` : line);
87
+ break;
88
+ case 'warn':
89
+ console.warn(line);
90
+ break;
91
+ case 'debug':
92
+ case 'verbose':
93
+ console.debug(line);
94
+ break;
95
+ default:
96
+ console.log(line);
97
+ }
98
+ }
99
+ //# sourceMappingURL=nest-logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nest-logger.js","sourceRoot":"","sources":["../../src/logs/nest-logger.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ import build from 'pino-abstract-transport';
2
+ import type { LogInput, LogShipperOptions } from './types.js';
3
+ /** Opções aceitas em `transport.options` (serializadas para o worker: nada de funções/tracker). */
4
+ export type PinoTransportOptions = Omit<LogShipperOptions, 'tracker' | 'fetch'> & {
5
+ /** Chaves do objeto do pino que NÃO devem ir para `context`. */
6
+ ignoreKeys?: string[];
7
+ };
8
+ /**
9
+ * Transport do pino v7+ (roda em worker thread via `thread-stream`):
10
+ *
11
+ * ```ts
12
+ * import pino from 'pino';
13
+ * const logger = pino({ transport: { target: 'fg-tracker-sdk/pino', options: { apiKey, service: 'minha-api' } } });
14
+ * ```
15
+ */
16
+ export default function fgTrackerPinoTransport(options: PinoTransportOptions): import("stream").Transform & build.OnUnknown;
17
+ /** Config pronta para `pino({ transport })`. */
18
+ export declare function pinoTransport(options: PinoTransportOptions): {
19
+ target: string;
20
+ options: PinoTransportOptions;
21
+ };
22
+ /** Mapeia a linha do pino para o contrato: `msg` → message, `name` → service, resto → context. */
23
+ export declare function fromPino(obj: Record<string, unknown>, ignored?: Set<string>, defaultService?: string): LogInput;
24
+ //# sourceMappingURL=pino.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pino.d.ts","sourceRoot":"","sources":["../../src/logs/pino.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,yBAAyB,CAAC;AAE5C,OAAO,KAAK,EAAE,QAAQ,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAE9D,mGAAmG;AACnG,MAAM,MAAM,oBAAoB,GAAG,IAAI,CAAC,iBAAiB,EAAE,SAAS,GAAG,OAAO,CAAC,GAAG;IAChF,gEAAgE;IAChE,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;CACvB,CAAC;AAIF;;;;;;;GAOG;AACH,MAAM,CAAC,OAAO,UAAU,sBAAsB,CAAC,OAAO,EAAE,oBAAoB,gDAiB3E;AAED,gDAAgD;AAChD,wBAAgB,aAAa,CAAC,OAAO,EAAE,oBAAoB,GAAG;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,oBAAoB,CAAA;CAAE,CAE9G;AAED,kGAAkG;AAClG,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,GAAE,GAAG,CAAC,MAAM,CAAiB,EAAE,cAAc,CAAC,EAAE,MAAM,GAAG,QAAQ,CAoB9H"}
@@ -0,0 +1,62 @@
1
+ import build from 'pino-abstract-transport';
2
+ import { createLogShipper } from './shipper.js';
3
+ const PINO_RESERVED = new Set(['level', 'time', 'msg', 'pid', 'hostname', 'name', 'v', 'traceId', 'spanId', 'requestId', 'reqId', 'env']);
4
+ /**
5
+ * Transport do pino v7+ (roda em worker thread via `thread-stream`):
6
+ *
7
+ * ```ts
8
+ * import pino from 'pino';
9
+ * const logger = pino({ transport: { target: 'fg-tracker-sdk/pino', options: { apiKey, service: 'minha-api' } } });
10
+ * ```
11
+ */
12
+ export default function fgTrackerPinoTransport(options) {
13
+ const { ignoreKeys = [], ...shipperOptions } = options;
14
+ const shipper = createLogShipper(shipperOptions);
15
+ const ignored = new Set([...PINO_RESERVED, ...ignoreKeys]);
16
+ return build(async (source) => {
17
+ for await (const obj of source) {
18
+ shipper.push(fromPino(obj, ignored, options.service));
19
+ }
20
+ }, {
21
+ async close() {
22
+ await shipper.shutdown();
23
+ },
24
+ });
25
+ }
26
+ /** Config pronta para `pino({ transport })`. */
27
+ export function pinoTransport(options) {
28
+ return { target: 'fg-tracker-sdk/pino', options };
29
+ }
30
+ /** Mapeia a linha do pino para o contrato: `msg` → message, `name` → service, resto → context. */
31
+ export function fromPino(obj, ignored = PINO_RESERVED, defaultService) {
32
+ const context = {};
33
+ for (const [key, value] of Object.entries(obj)) {
34
+ if (ignored.has(key) || value === undefined)
35
+ continue;
36
+ context[key] = value;
37
+ }
38
+ const req = obj.req;
39
+ const requestId = firstString(obj.requestId, obj.reqId, req?.id);
40
+ return {
41
+ ts: typeof obj.time === 'number' || typeof obj.time === 'string' ? obj.time : undefined,
42
+ level: obj.level,
43
+ service: defaultService ?? (typeof obj.name === 'string' ? obj.name : undefined),
44
+ message: typeof obj.msg === 'string' ? obj.msg : obj.msg === undefined ? '' : String(obj.msg),
45
+ context,
46
+ traceId: firstString(obj.traceId),
47
+ spanId: firstString(obj.spanId),
48
+ requestId,
49
+ env: firstString(obj.env),
50
+ host: firstString(obj.hostname),
51
+ };
52
+ }
53
+ function firstString(...values) {
54
+ for (const value of values) {
55
+ if (typeof value === 'string' && value)
56
+ return value;
57
+ if (typeof value === 'number')
58
+ return String(value);
59
+ }
60
+ return undefined;
61
+ }
62
+ //# sourceMappingURL=pino.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pino.js","sourceRoot":"","sources":["../../src/logs/pino.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,yBAAyB,CAAC;AAC5C,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAShD,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,EAAE,SAAS,EAAE,QAAQ,EAAE,WAAW,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC;AAE1I;;;;;;;GAOG;AACH,MAAM,CAAC,OAAO,UAAU,sBAAsB,CAAC,OAA6B;IAC1E,MAAM,EAAE,UAAU,GAAG,EAAE,EAAE,GAAG,cAAc,EAAE,GAAG,OAAO,CAAC;IACvD,MAAM,OAAO,GAAG,gBAAgB,CAAC,cAAc,CAAC,CAAC;IACjD,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,aAAa,EAAE,GAAG,UAAU,CAAC,CAAC,CAAC;IAE3D,OAAO,KAAK,CACV,KAAK,EAAE,MAAM,EAAE,EAAE;QACf,IAAI,KAAK,EAAE,MAAM,GAAG,IAAI,MAAM,EAAE,CAAC;YAC/B,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,GAA8B,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC;QACnF,CAAC;IACH,CAAC,EACD;QACE,KAAK,CAAC,KAAK;YACT,MAAM,OAAO,CAAC,QAAQ,EAAE,CAAC;QAC3B,CAAC;KACF,CACF,CAAC;AACJ,CAAC;AAED,gDAAgD;AAChD,MAAM,UAAU,aAAa,CAAC,OAA6B;IACzD,OAAO,EAAE,MAAM,EAAE,qBAAqB,EAAE,OAAO,EAAE,CAAC;AACpD,CAAC;AAED,kGAAkG;AAClG,MAAM,UAAU,QAAQ,CAAC,GAA4B,EAAE,UAAuB,aAAa,EAAE,cAAuB;IAClH,MAAM,OAAO,GAA4B,EAAE,CAAC;IAC5C,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QAC/C,IAAI,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,KAAK,KAAK,SAAS;YAAE,SAAS;QACtD,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;IACvB,CAAC;IACD,MAAM,GAAG,GAAG,GAAG,CAAC,GAAmC,CAAC;IACpD,MAAM,SAAS,GAAG,WAAW,CAAC,GAAG,CAAC,SAAS,EAAE,GAAG,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC;IACjE,OAAO;QACL,EAAE,EAAE,OAAO,GAAG,CAAC,IAAI,KAAK,QAAQ,IAAI,OAAO,GAAG,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS;QACvF,KAAK,EAAE,GAAG,CAAC,KAAoC;QAC/C,OAAO,EAAE,cAAc,IAAI,CAAC,OAAO,GAAG,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;QAChF,OAAO,EAAE,OAAO,GAAG,CAAC,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC;QAC7F,OAAO;QACP,OAAO,EAAE,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC;QACjC,MAAM,EAAE,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC;QAC/B,SAAS;QACT,GAAG,EAAE,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC;QACzB,IAAI,EAAE,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAC;KAChC,CAAC;AACJ,CAAC;AAED,SAAS,WAAW,CAAC,GAAG,MAAiB;IACvC,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK;YAAE,OAAO,KAAK,CAAC;QACrD,IAAI,OAAO,KAAK,KAAK,QAAQ;YAAE,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;IACtD,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC"}
@@ -0,0 +1,18 @@
1
+ import { type LogShipper, type LogShipperOptions } from './types.js';
2
+ /**
3
+ * Fila + envio em lote para `POST /v1/logs`. Mesma política do tracker:
4
+ * timer com `unref()`, fila limitada (descarta as mais antigas), aviso único
5
+ * em falha, 4xx descarta o lote, 5xx/rede tenta de novo uma vez e depois
6
+ * devolve o lote para o próximo flush.
7
+ */
8
+ export declare function createLogShipper(options: LogShipperOptions): LogShipper;
9
+ /**
10
+ * `mixin` para o pino: injeta `traceId`/`spanId` do span corrente em cada linha.
11
+ * Necessário porque o transport roda em worker thread, sem acesso ao AsyncLocalStorage da app.
12
+ *
13
+ * ```ts
14
+ * const logger = pino({ mixin: traceMixin(tracker), transport: pinoTransport({ ... }) });
15
+ * ```
16
+ */
17
+ export declare function traceMixin(tracker?: LogShipperOptions['tracker']): () => Record<string, string>;
18
+ //# sourceMappingURL=shipper.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shipper.d.ts","sourceRoot":"","sources":["../../src/logs/shipper.ts"],"names":[],"mappings":"AAGA,OAAO,EAA6E,KAAK,UAAU,EAAE,KAAK,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAShJ;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,iBAAiB,GAAG,UAAU,CAEvE;AAiLD;;;;;;;GAOG;AACH,wBAAgB,UAAU,CAAC,OAAO,CAAC,EAAE,iBAAiB,CAAC,SAAS,CAAC,GAAG,MAAM,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAM/F"}