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.
- package/CHANGELOG.md +17 -0
- package/README.md +375 -0
- package/dist/cli/release.d.ts +3 -0
- package/dist/cli/release.d.ts.map +1 -0
- package/dist/cli/release.js +134 -0
- package/dist/cli/release.js.map +1 -0
- package/dist/cli/sourcemaps.d.ts +3 -0
- package/dist/cli/sourcemaps.d.ts.map +1 -0
- package/dist/cli/sourcemaps.js +98 -0
- package/dist/cli/sourcemaps.js.map +1 -0
- package/dist/constants.d.ts +28 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +35 -0
- package/dist/constants.js.map +1 -0
- package/dist/context.d.ts +22 -0
- package/dist/context.d.ts.map +1 -0
- package/dist/context.js +42 -0
- package/dist/context.js.map +1 -0
- package/dist/database.d.ts +29 -0
- package/dist/database.d.ts.map +1 -0
- package/dist/database.js +157 -0
- package/dist/database.js.map +1 -0
- package/dist/express.d.ts +17 -0
- package/dist/express.d.ts.map +1 -0
- package/dist/express.js +125 -0
- package/dist/express.js.map +1 -0
- package/dist/fetch.d.ts +9 -0
- package/dist/fetch.d.ts.map +1 -0
- package/dist/fetch.js +78 -0
- package/dist/fetch.js.map +1 -0
- package/dist/global-errors.d.ts +11 -0
- package/dist/global-errors.d.ts.map +1 -0
- package/dist/global-errors.js +35 -0
- package/dist/global-errors.js.map +1 -0
- package/dist/index.d.ts +29 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +154 -0
- package/dist/index.js.map +1 -0
- package/dist/logs/nest-logger.d.ts +40 -0
- package/dist/logs/nest-logger.d.ts.map +1 -0
- package/dist/logs/nest-logger.js +99 -0
- package/dist/logs/nest-logger.js.map +1 -0
- package/dist/logs/pino.d.ts +24 -0
- package/dist/logs/pino.d.ts.map +1 -0
- package/dist/logs/pino.js +62 -0
- package/dist/logs/pino.js.map +1 -0
- package/dist/logs/shipper.d.ts +18 -0
- package/dist/logs/shipper.d.ts.map +1 -0
- package/dist/logs/shipper.js +217 -0
- package/dist/logs/shipper.js.map +1 -0
- package/dist/logs/types.d.ts +84 -0
- package/dist/logs/types.d.ts.map +1 -0
- package/dist/logs/types.js +47 -0
- package/dist/logs/types.js.map +1 -0
- package/dist/logs/winston.d.ts +31 -0
- package/dist/logs/winston.d.ts.map +1 -0
- package/dist/logs/winston.js +57 -0
- package/dist/logs/winston.js.map +1 -0
- package/dist/monitors.d.ts +8 -0
- package/dist/monitors.d.ts.map +1 -0
- package/dist/monitors.js +69 -0
- package/dist/monitors.js.map +1 -0
- package/dist/next.d.ts +9 -0
- package/dist/next.d.ts.map +1 -0
- package/dist/next.js +55 -0
- package/dist/next.js.map +1 -0
- package/dist/normalize.d.ts +12 -0
- package/dist/normalize.d.ts.map +1 -0
- package/dist/normalize.js +113 -0
- package/dist/normalize.js.map +1 -0
- package/dist/pg.d.ts +9 -0
- package/dist/pg.d.ts.map +1 -0
- package/dist/pg.js +83 -0
- package/dist/pg.js.map +1 -0
- package/dist/releases.d.ts +5 -0
- package/dist/releases.d.ts.map +1 -0
- package/dist/releases.js +30 -0
- package/dist/releases.js.map +1 -0
- package/dist/scrub.d.ts +11 -0
- package/dist/scrub.d.ts.map +1 -0
- package/dist/scrub.js +34 -0
- package/dist/scrub.js.map +1 -0
- package/dist/tracker.d.ts +99 -0
- package/dist/tracker.d.ts.map +1 -0
- package/dist/tracker.js +400 -0
- package/dist/tracker.js.map +1 -0
- package/dist/types.d.ts +264 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/package.json +98 -0
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Normaliza um path HTTP para reduzir cardinalidade: remove query string e
|
|
3
|
+
* troca uuids, hex longos e segmentos numéricos por `:id`.
|
|
4
|
+
*/
|
|
5
|
+
export declare function normalizePath(input: string | undefined | null): string;
|
|
6
|
+
export declare function normalizeSql(sql: string): string;
|
|
7
|
+
export declare function toSpanError(err: unknown): {
|
|
8
|
+
name: string;
|
|
9
|
+
message: string;
|
|
10
|
+
stack?: string;
|
|
11
|
+
};
|
|
12
|
+
//# sourceMappingURL=normalize.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"normalize.d.ts","sourceRoot":"","sources":["../src/normalize.ts"],"names":[],"mappings":"AAIA;;;GAGG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,GAAG,MAAM,CAetE;AA0CD,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAQhD;AAED,wBAAgB,WAAW,CAAC,GAAG,EAAE,OAAO,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAW3F"}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
const UUID_RE = /[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}/gi;
|
|
2
|
+
const HEX_RE = /^[0-9a-f]{16,}$/i;
|
|
3
|
+
const NUM_RE = /^\d+$/;
|
|
4
|
+
/**
|
|
5
|
+
* Normaliza um path HTTP para reduzir cardinalidade: remove query string e
|
|
6
|
+
* troca uuids, hex longos e segmentos numéricos por `:id`.
|
|
7
|
+
*/
|
|
8
|
+
export function normalizePath(input) {
|
|
9
|
+
if (!input)
|
|
10
|
+
return '/';
|
|
11
|
+
let path = input;
|
|
12
|
+
const q = path.indexOf('?');
|
|
13
|
+
if (q >= 0)
|
|
14
|
+
path = path.slice(0, q);
|
|
15
|
+
const h = path.indexOf('#');
|
|
16
|
+
if (h >= 0)
|
|
17
|
+
path = path.slice(0, h);
|
|
18
|
+
path = path.replace(UUID_RE, ':id');
|
|
19
|
+
const segments = path.split('/').map((seg) => {
|
|
20
|
+
if (seg === '')
|
|
21
|
+
return seg;
|
|
22
|
+
if (NUM_RE.test(seg) || HEX_RE.test(seg))
|
|
23
|
+
return ':id';
|
|
24
|
+
return seg;
|
|
25
|
+
});
|
|
26
|
+
const out = segments.join('/') || '/';
|
|
27
|
+
return out.length > 1 && out.endsWith('/') ? out.slice(0, -1) : out;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Normaliza SQL para agrupar queries com o mesmo "shape":
|
|
31
|
+
* números → `?`, strings → `'?'`, `IN (...)` → `IN (?)`, espaços colapsados,
|
|
32
|
+
* minúsculas, no máximo 200 caracteres.
|
|
33
|
+
*/
|
|
34
|
+
function redactSqlLiterals(sql) {
|
|
35
|
+
let result = '';
|
|
36
|
+
let i = 0;
|
|
37
|
+
while (i < sql.length) {
|
|
38
|
+
if (sql.startsWith('--', i)) {
|
|
39
|
+
const end = sql.indexOf('\n', i);
|
|
40
|
+
i = end < 0 ? sql.length : end;
|
|
41
|
+
result += ' ';
|
|
42
|
+
continue;
|
|
43
|
+
}
|
|
44
|
+
if (sql.startsWith('/*', i)) {
|
|
45
|
+
let depth = 1;
|
|
46
|
+
i += 2;
|
|
47
|
+
while (i < sql.length && depth) {
|
|
48
|
+
if (sql.startsWith('/*', i)) {
|
|
49
|
+
depth++;
|
|
50
|
+
i += 2;
|
|
51
|
+
}
|
|
52
|
+
else if (sql.startsWith('*/', i)) {
|
|
53
|
+
depth--;
|
|
54
|
+
i += 2;
|
|
55
|
+
}
|
|
56
|
+
else
|
|
57
|
+
i++;
|
|
58
|
+
}
|
|
59
|
+
result += ' ';
|
|
60
|
+
continue;
|
|
61
|
+
}
|
|
62
|
+
if (sql[i] === "'") {
|
|
63
|
+
i++;
|
|
64
|
+
while (i < sql.length) {
|
|
65
|
+
if (sql[i] === '\\') {
|
|
66
|
+
i += 2;
|
|
67
|
+
continue;
|
|
68
|
+
}
|
|
69
|
+
if (sql[i] === "'" && sql[i + 1] === "'") {
|
|
70
|
+
i += 2;
|
|
71
|
+
continue;
|
|
72
|
+
}
|
|
73
|
+
if (sql[i++] === "'")
|
|
74
|
+
break;
|
|
75
|
+
}
|
|
76
|
+
result += "'?'";
|
|
77
|
+
continue;
|
|
78
|
+
}
|
|
79
|
+
const dollar = sql[i] === '$' ? /^(\$[a-zA-Z_][a-zA-Z_0-9]*\$|\$\$)/.exec(sql.slice(i))?.[0] : undefined;
|
|
80
|
+
if (dollar) {
|
|
81
|
+
const end = sql.indexOf(dollar, i + dollar.length);
|
|
82
|
+
i = end < 0 ? sql.length : end + dollar.length;
|
|
83
|
+
result += "'?'";
|
|
84
|
+
continue;
|
|
85
|
+
}
|
|
86
|
+
result += sql[i++];
|
|
87
|
+
}
|
|
88
|
+
return result;
|
|
89
|
+
}
|
|
90
|
+
export function normalizeSql(sql) {
|
|
91
|
+
let s = redactSqlLiterals(sql);
|
|
92
|
+
s = s.replace(/\$\d+/g, '?');
|
|
93
|
+
s = s.replace(/\b\d+(?:\.\d+)?\b/g, '?');
|
|
94
|
+
s = s.replace(/\bin\s*\((?:\s*(?:\?|'\?')\s*,?\s*)+\)/gi, 'IN (?)');
|
|
95
|
+
s = s.replace(/\s+/g, ' ').trim().toLowerCase();
|
|
96
|
+
if (s.length > 200)
|
|
97
|
+
s = s.slice(0, 200);
|
|
98
|
+
return s;
|
|
99
|
+
}
|
|
100
|
+
export function toSpanError(err) {
|
|
101
|
+
if (err instanceof Error) {
|
|
102
|
+
const out = { name: err.name || 'Error', message: err.message };
|
|
103
|
+
if (err.stack)
|
|
104
|
+
out.stack = err.stack.split('\n').slice(0, 10).join('\n');
|
|
105
|
+
return out;
|
|
106
|
+
}
|
|
107
|
+
if (typeof err === 'object' && err !== null && 'message' in err) {
|
|
108
|
+
const anyErr = err;
|
|
109
|
+
return { name: String(anyErr.name ?? 'Error'), message: String(anyErr.message ?? '') };
|
|
110
|
+
}
|
|
111
|
+
return { name: 'Error', message: String(err) };
|
|
112
|
+
}
|
|
113
|
+
//# sourceMappingURL=normalize.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"normalize.js","sourceRoot":"","sources":["../src/normalize.ts"],"names":[],"mappings":"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"}
|
package/dist/pg.d.ts
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { TrackerCore } from './tracker.js';
|
|
2
|
+
import type { PgPoolLike } from './types.js';
|
|
3
|
+
/**
|
|
4
|
+
* Monkey-patch de `pool.query` (pg.Pool ou compatível). Cada query vira um
|
|
5
|
+
* span `db.query` com o nome = SQL normalizado e `attributes.rows`.
|
|
6
|
+
* Suporta as assinaturas (text), (config), (text, values), (text, cb) e (text, values, cb).
|
|
7
|
+
*/
|
|
8
|
+
export declare function instrumentPgPool<T extends PgPoolLike>(core: TrackerCore, pool: T): T;
|
|
9
|
+
//# sourceMappingURL=pg.d.ts.map
|
package/dist/pg.d.ts.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pg.d.ts","sourceRoot":"","sources":["../src/pg.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAEhD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAuB7C;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,SAAS,UAAU,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,GAAG,CAAC,CAwDpF"}
|
package/dist/pg.js
ADDED
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import { normalizeSql } from './normalize.js';
|
|
2
|
+
const PATCHED = Symbol.for('fg-tracker.pg.patched');
|
|
3
|
+
/** Marca usada pelo `stread-track-sdk` ≤ 0.3: evita instrumentar duas vezes quando as duas versões convivem. */
|
|
4
|
+
const LEGACY_PATCHED = Symbol.for('stread-track.pg.patched');
|
|
5
|
+
function extractSql(arg) {
|
|
6
|
+
if (typeof arg === 'string')
|
|
7
|
+
return arg;
|
|
8
|
+
if (typeof arg === 'object' && arg !== null && typeof arg.text === 'string') {
|
|
9
|
+
return arg.text;
|
|
10
|
+
}
|
|
11
|
+
return null;
|
|
12
|
+
}
|
|
13
|
+
function rowCount(result) {
|
|
14
|
+
if (typeof result === 'object' && result !== null) {
|
|
15
|
+
const r = result;
|
|
16
|
+
if (typeof r.rowCount === 'number')
|
|
17
|
+
return r.rowCount;
|
|
18
|
+
if (Array.isArray(r.rows))
|
|
19
|
+
return r.rows.length;
|
|
20
|
+
}
|
|
21
|
+
return null;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Monkey-patch de `pool.query` (pg.Pool ou compatível). Cada query vira um
|
|
25
|
+
* span `db.query` com o nome = SQL normalizado e `attributes.rows`.
|
|
26
|
+
* Suporta as assinaturas (text), (config), (text, values), (text, cb) e (text, values, cb).
|
|
27
|
+
*/
|
|
28
|
+
export function instrumentPgPool(core, pool) {
|
|
29
|
+
const target = pool;
|
|
30
|
+
if (target[PATCHED] || target[LEGACY_PATCHED])
|
|
31
|
+
return pool;
|
|
32
|
+
if (typeof pool.query !== 'function') {
|
|
33
|
+
console.warn('[fg-tracker] instrumentPg: objeto sem método query(); ignorado.');
|
|
34
|
+
return pool;
|
|
35
|
+
}
|
|
36
|
+
const original = pool.query.bind(pool);
|
|
37
|
+
target.query = function fgTrackerQuery(...args) {
|
|
38
|
+
if (!core.enabled || !core.currentContext())
|
|
39
|
+
return original(...args);
|
|
40
|
+
const sql = extractSql(args[0]);
|
|
41
|
+
if (!sql)
|
|
42
|
+
return original(...args);
|
|
43
|
+
const span = core.startSpan('db.query', normalizeSql(sql), { rows: null, db: 'postgres' });
|
|
44
|
+
const last = args[args.length - 1];
|
|
45
|
+
if (typeof last === 'function') {
|
|
46
|
+
const cb = last;
|
|
47
|
+
args[args.length - 1] = (err, result) => {
|
|
48
|
+
if (err)
|
|
49
|
+
span.setError(err);
|
|
50
|
+
else
|
|
51
|
+
span.setAttribute('rows', rowCount(result));
|
|
52
|
+
span.end();
|
|
53
|
+
cb(err, result);
|
|
54
|
+
};
|
|
55
|
+
return core.runInSpan(span, () => original(...args));
|
|
56
|
+
}
|
|
57
|
+
let out;
|
|
58
|
+
try {
|
|
59
|
+
out = core.runInSpan(span, () => original(...args));
|
|
60
|
+
}
|
|
61
|
+
catch (err) {
|
|
62
|
+
span.setError(err);
|
|
63
|
+
span.end();
|
|
64
|
+
throw err;
|
|
65
|
+
}
|
|
66
|
+
if (out && typeof out.then === 'function') {
|
|
67
|
+
return out.then((result) => {
|
|
68
|
+
span.setAttribute('rows', rowCount(result));
|
|
69
|
+
span.end();
|
|
70
|
+
return result;
|
|
71
|
+
}, (err) => {
|
|
72
|
+
span.setError(err);
|
|
73
|
+
span.end();
|
|
74
|
+
throw err;
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
span.end();
|
|
78
|
+
return out;
|
|
79
|
+
};
|
|
80
|
+
target[PATCHED] = true;
|
|
81
|
+
return pool;
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=pg.js.map
|
package/dist/pg.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pg.js","sourceRoot":"","sources":["../src/pg.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { TrackerCore } from './tracker.js';
|
|
2
|
+
import type { RegisterReleaseInput } from './types.js';
|
|
3
|
+
/** `POST /v1/releases` com a chave do projeto (CONTRATO.md §15). Devolve `true` quando aceito. */
|
|
4
|
+
export declare function registerRelease(core: TrackerCore, input?: RegisterReleaseInput): Promise<boolean>;
|
|
5
|
+
//# sourceMappingURL=releases.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"releases.d.ts","sourceRoot":"","sources":["../src/releases.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAEvD,kGAAkG;AAClG,wBAAsB,eAAe,CAAC,IAAI,EAAE,WAAW,EAAE,KAAK,GAAE,oBAAyB,GAAG,OAAO,CAAC,OAAO,CAAC,CAyB3G"}
|
package/dist/releases.js
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/** `POST /v1/releases` com a chave do projeto (CONTRATO.md §15). Devolve `true` quando aceito. */
|
|
2
|
+
export async function registerRelease(core, input = {}) {
|
|
3
|
+
if (!core.enabled)
|
|
4
|
+
return false;
|
|
5
|
+
const version = input.version ?? core.options.release;
|
|
6
|
+
if (!version) {
|
|
7
|
+
core.warnOnce('registerRelease: informe `version` ou configure `release` no tracker.');
|
|
8
|
+
return false;
|
|
9
|
+
}
|
|
10
|
+
const body = {
|
|
11
|
+
version,
|
|
12
|
+
environment: input.environment ?? core.options.environment,
|
|
13
|
+
commitSha: input.commitSha,
|
|
14
|
+
previousVersion: input.previousVersion,
|
|
15
|
+
repository: input.repository,
|
|
16
|
+
url: input.url,
|
|
17
|
+
notes: input.notes,
|
|
18
|
+
deployedAt: input.deployedAt,
|
|
19
|
+
commits: input.commits,
|
|
20
|
+
};
|
|
21
|
+
const res = await core.post('/v1/releases', body, 15_000);
|
|
22
|
+
if (!res)
|
|
23
|
+
return false;
|
|
24
|
+
if (!res.ok) {
|
|
25
|
+
core.warnOnce(`registro da release ${version} respondeu ${res.status}`);
|
|
26
|
+
return false;
|
|
27
|
+
}
|
|
28
|
+
return true;
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=releases.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"releases.js","sourceRoot":"","sources":["../src/releases.ts"],"names":[],"mappings":"AAGA,kGAAkG;AAClG,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,IAAiB,EAAE,QAA8B,EAAE;IACvF,IAAI,CAAC,IAAI,CAAC,OAAO;QAAE,OAAO,KAAK,CAAC;IAChC,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,IAAI,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC;IACtD,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,IAAI,CAAC,QAAQ,CAAC,uEAAuE,CAAC,CAAC;QACvF,OAAO,KAAK,CAAC;IACf,CAAC;IACD,MAAM,IAAI,GAAG;QACX,OAAO;QACP,WAAW,EAAE,KAAK,CAAC,WAAW,IAAI,IAAI,CAAC,OAAO,CAAC,WAAW;QAC1D,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,eAAe,EAAE,KAAK,CAAC,eAAe;QACtC,UAAU,EAAE,KAAK,CAAC,UAAU;QAC5B,GAAG,EAAE,KAAK,CAAC,GAAG;QACd,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,UAAU,EAAE,KAAK,CAAC,UAAU;QAC5B,OAAO,EAAE,KAAK,CAAC,OAAO;KACvB,CAAC;IACF,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;IAC1D,IAAI,CAAC,GAAG;QAAE,OAAO,KAAK,CAAC;IACvB,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;QACZ,IAAI,CAAC,QAAQ,CAAC,uBAAuB,OAAO,cAAc,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;QACxE,OAAO,KAAK,CAAC;IACf,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
|
package/dist/scrub.d.ts
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Remoção de dados sensíveis antes do envio (CONTRATO.md §22): valores de chaves
|
|
3
|
+
* conhecidas viram `[Filtered]`, em qualquer profundidade dos `attributes`.
|
|
4
|
+
*/
|
|
5
|
+
export declare const DEFAULT_SCRUB_FIELDS: string[];
|
|
6
|
+
export declare const FILTERED = "[Filtered]";
|
|
7
|
+
export declare function shouldScrub(key: string, fields: string[]): boolean;
|
|
8
|
+
export declare function scrubValue(value: unknown, fields: string[], depth?: number): unknown;
|
|
9
|
+
export declare function scrubAttributes(attributes: Record<string, unknown>, fields: string[]): Record<string, unknown>;
|
|
10
|
+
export declare function matchesAny(value: string, patterns: (string | RegExp)[] | undefined): boolean;
|
|
11
|
+
//# sourceMappingURL=scrub.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scrub.d.ts","sourceRoot":"","sources":["../src/scrub.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,eAAO,MAAM,oBAAoB,UAGhC,CAAC;AAEF,eAAO,MAAM,QAAQ,eAAe,CAAC;AAGrC,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAGlE;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,KAAK,SAAI,GAAG,OAAO,CAQ/E;AAED,wBAAgB,eAAe,CAAC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAE9G;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,GAAG,SAAS,GAAG,OAAO,CAG5F"}
|
package/dist/scrub.js
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Remoção de dados sensíveis antes do envio (CONTRATO.md §22): valores de chaves
|
|
3
|
+
* conhecidas viram `[Filtered]`, em qualquer profundidade dos `attributes`.
|
|
4
|
+
*/
|
|
5
|
+
export const DEFAULT_SCRUB_FIELDS = [
|
|
6
|
+
'password', 'passwd', 'secret', 'token', 'authorization', 'cookie', 'set-cookie',
|
|
7
|
+
'api_key', 'apikey', 'api-key', 'access_token', 'refresh_token', 'credit_card', 'card_number', 'cvv', 'ssn', 'private_key',
|
|
8
|
+
];
|
|
9
|
+
export const FILTERED = '[Filtered]';
|
|
10
|
+
const MAX_DEPTH = 6;
|
|
11
|
+
export function shouldScrub(key, fields) {
|
|
12
|
+
const lower = key.toLowerCase();
|
|
13
|
+
return fields.some((field) => lower === field || lower.endsWith(`_${field}`) || lower.endsWith(`-${field}`) || lower.endsWith(`.${field}`) || lower.endsWith(field.replace(/[_-]/g, '')));
|
|
14
|
+
}
|
|
15
|
+
export function scrubValue(value, fields, depth = 0) {
|
|
16
|
+
if (depth > MAX_DEPTH || value === null || typeof value !== 'object')
|
|
17
|
+
return value;
|
|
18
|
+
if (Array.isArray(value))
|
|
19
|
+
return value.map((item) => scrubValue(item, fields, depth + 1));
|
|
20
|
+
const out = {};
|
|
21
|
+
for (const [key, item] of Object.entries(value)) {
|
|
22
|
+
out[key] = shouldScrub(key, fields) && item !== null && item !== undefined ? FILTERED : scrubValue(item, fields, depth + 1);
|
|
23
|
+
}
|
|
24
|
+
return out;
|
|
25
|
+
}
|
|
26
|
+
export function scrubAttributes(attributes, fields) {
|
|
27
|
+
return scrubValue(attributes, fields);
|
|
28
|
+
}
|
|
29
|
+
export function matchesAny(value, patterns) {
|
|
30
|
+
if (!patterns || patterns.length === 0)
|
|
31
|
+
return false;
|
|
32
|
+
return patterns.some((pattern) => (pattern instanceof RegExp ? pattern.test(value) : value.includes(pattern)));
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=scrub.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scrub.js","sourceRoot":"","sources":["../src/scrub.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG;IAClC,UAAU,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,YAAY;IAChF,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,cAAc,EAAE,eAAe,EAAE,aAAa,EAAE,aAAa,EAAE,KAAK,EAAE,KAAK,EAAE,aAAa;CAC3H,CAAC;AAEF,MAAM,CAAC,MAAM,QAAQ,GAAG,YAAY,CAAC;AACrC,MAAM,SAAS,GAAG,CAAC,CAAC;AAEpB,MAAM,UAAU,WAAW,CAAC,GAAW,EAAE,MAAgB;IACvD,MAAM,KAAK,GAAG,GAAG,CAAC,WAAW,EAAE,CAAC;IAChC,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,KAAK,KAAK,IAAI,KAAK,CAAC,QAAQ,CAAC,IAAI,KAAK,EAAE,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,IAAI,KAAK,EAAE,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,IAAI,KAAK,EAAE,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;AAC5L,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,KAAc,EAAE,MAAgB,EAAE,KAAK,GAAG,CAAC;IACpE,IAAI,KAAK,GAAG,SAAS,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IACnF,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC;IAC1F,MAAM,GAAG,GAA4B,EAAE,CAAC;IACxC,KAAK,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAgC,CAAC,EAAE,CAAC;QAC3E,GAAG,CAAC,GAAG,CAAC,GAAG,WAAW,CAAC,GAAG,EAAE,MAAM,CAAC,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;IAC9H,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,UAAmC,EAAE,MAAgB;IACnF,OAAO,UAAU,CAAC,UAAU,EAAE,MAAM,CAA4B,CAAC;AACnE,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,KAAa,EAAE,QAAyC;IACjF,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IACrD,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,OAAO,YAAY,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;AACjH,CAAC"}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import { type SpanContext } from './context.js';
|
|
2
|
+
import type { ActiveSpan, PropagationTargets, SamplingContext, Span, SpanError, SpanKind, TrackerOptions, UserRef } from './types.js';
|
|
3
|
+
export interface ResolvedOptions {
|
|
4
|
+
apiKey: string;
|
|
5
|
+
endpoint: string;
|
|
6
|
+
serviceName: string | undefined;
|
|
7
|
+
release: string | undefined;
|
|
8
|
+
environment: string | undefined;
|
|
9
|
+
propagateTraceTo: PropagationTargets;
|
|
10
|
+
tracesSampleRate: number;
|
|
11
|
+
tracesSampler: ((context: SamplingContext) => number | boolean) | undefined;
|
|
12
|
+
ignoreTransactions: (string | RegExp)[];
|
|
13
|
+
ignoreErrors: (string | RegExp)[];
|
|
14
|
+
beforeSend: ((span: Span) => Span | null) | undefined;
|
|
15
|
+
scrubFields: string[];
|
|
16
|
+
flushIntervalMs: number;
|
|
17
|
+
maxBatchSize: number;
|
|
18
|
+
maxQueueSize: number;
|
|
19
|
+
enabled: boolean;
|
|
20
|
+
debug: boolean;
|
|
21
|
+
fetch: typeof globalThis.fetch;
|
|
22
|
+
}
|
|
23
|
+
/** Release detectada do ambiente (CONTRATO.md §15): `${serviceName}@${sha}` para SHAs de CI/hosting. */
|
|
24
|
+
export declare function detectRelease(serviceName: string | undefined, env?: NodeJS.ProcessEnv): string | undefined;
|
|
25
|
+
export declare function detectEnvironment(env?: NodeJS.ProcessEnv): string | undefined;
|
|
26
|
+
export declare function resolveOptions(options: TrackerOptions): ResolvedOptions;
|
|
27
|
+
/** Decide se um destino recebe o `traceparent` (CONTRATO.md §16). */
|
|
28
|
+
export declare function shouldPropagate(targets: PropagationTargets, url: URL): boolean;
|
|
29
|
+
/**
|
|
30
|
+
* Núcleo do tracker: constrói spans, mantém a fila e faz o envio em lote.
|
|
31
|
+
* As integrações (express, pg, next, fetch) ficam em arquivos separados e só
|
|
32
|
+
* usam `startSpan` / `runInSpan`.
|
|
33
|
+
*/
|
|
34
|
+
export declare class TrackerCore {
|
|
35
|
+
readonly options: ResolvedOptions;
|
|
36
|
+
private queue;
|
|
37
|
+
private timer;
|
|
38
|
+
private flushing;
|
|
39
|
+
private warnedFailure;
|
|
40
|
+
private stopped;
|
|
41
|
+
/** Spans ainda abertos, por spanId — permite `currentSpan()` a partir do contexto assíncrono. */
|
|
42
|
+
private readonly active;
|
|
43
|
+
constructor(options: TrackerOptions);
|
|
44
|
+
get enabled(): boolean;
|
|
45
|
+
currentContext(): SpanContext | undefined;
|
|
46
|
+
/** Cria um span; o pai é o contexto assíncrono atual, salvo se `parent` for informado. */
|
|
47
|
+
startSpan(kind: SpanKind, name: string, attributes?: Record<string, unknown>, parent?: SpanContext | null): ActiveSpanImpl;
|
|
48
|
+
private decorate;
|
|
49
|
+
/** `ignoreTransactions` → nunca; `tracesSampler` → fração/boolean; senão `tracesSampleRate`. */
|
|
50
|
+
decideSampling(context: SamplingContext): boolean;
|
|
51
|
+
/**
|
|
52
|
+
* Continua um trace recebido de outro serviço: mesmo `traceId`, mas o span nasce como
|
|
53
|
+
* raiz local (`parentSpanId` null) e guarda o pai remoto em `attributes.remoteParentSpanId`,
|
|
54
|
+
* para as métricas por requisição continuarem contando este serviço.
|
|
55
|
+
*/
|
|
56
|
+
startRemoteRoot(kind: SpanKind, name: string, attributes: Record<string, unknown>, remote: SpanContext): ActiveSpanImpl;
|
|
57
|
+
/** Span aberto correspondente ao contexto assíncrono atual (se houver). */
|
|
58
|
+
currentSpan(): ActiveSpanImpl | undefined;
|
|
59
|
+
/** Span raiz local do contexto atual (sobe pelos pais ainda abertos). */
|
|
60
|
+
rootSpan(): ActiveSpanImpl | undefined;
|
|
61
|
+
/** Headers de propagação para o contexto corrente. */
|
|
62
|
+
traceHeaders(): Record<string, string>;
|
|
63
|
+
/** Chamado por ActiveSpanImpl.end(): amostragem, ignoreErrors, scrubbing e beforeSend. */
|
|
64
|
+
finishSpan(span: ActiveSpanImpl, payload: Span): void;
|
|
65
|
+
/** Executa `fn` com `span` como contexto pai das operações internas. */
|
|
66
|
+
runInSpan<T>(span: ActiveSpanImpl, fn: () => T): T;
|
|
67
|
+
enqueue(span: Span): void;
|
|
68
|
+
flush(): Promise<void>;
|
|
69
|
+
private doFlush;
|
|
70
|
+
/** POST autenticado na API (ingest, check-ins, releases). Devolve a resposta ou `null` em falha de rede. */
|
|
71
|
+
post(path: string, body: unknown, timeoutMs?: number): Promise<Response | null>;
|
|
72
|
+
private send;
|
|
73
|
+
warnOnce(message: string): void;
|
|
74
|
+
shutdown(): Promise<void>;
|
|
75
|
+
}
|
|
76
|
+
export declare function userAttributes(user: UserRef | null): Record<string, unknown>;
|
|
77
|
+
export declare class ActiveSpanImpl implements ActiveSpan {
|
|
78
|
+
private readonly core;
|
|
79
|
+
readonly traceId: string;
|
|
80
|
+
readonly spanId: string;
|
|
81
|
+
readonly parentSpanId: string | null;
|
|
82
|
+
readonly kind: SpanKind;
|
|
83
|
+
readonly sampled: boolean;
|
|
84
|
+
name: string;
|
|
85
|
+
method: string | null;
|
|
86
|
+
route: string | null;
|
|
87
|
+
statusCode: number | null;
|
|
88
|
+
attributes: Record<string, unknown>;
|
|
89
|
+
error: SpanError | null;
|
|
90
|
+
private readonly startedAt;
|
|
91
|
+
private readonly startedPerf;
|
|
92
|
+
private ended;
|
|
93
|
+
constructor(core: TrackerCore, traceId: string, spanId: string, parentSpanId: string | null, kind: SpanKind, name: string, attributes: Record<string, unknown>, sampled?: boolean);
|
|
94
|
+
setAttribute(key: string, value: unknown): void;
|
|
95
|
+
setError(err: unknown): void;
|
|
96
|
+
setUser(user: UserRef | null): void;
|
|
97
|
+
end(): void;
|
|
98
|
+
}
|
|
99
|
+
//# sourceMappingURL=tracker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tracker.d.ts","sourceRoot":"","sources":["../src/tracker.ts"],"names":[],"mappings":"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"}
|