fg-tracker-sdk 0.9.0 → 0.11.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 +36 -0
- package/README.md +83 -10
- package/dist/context.d.ts +16 -0
- package/dist/context.d.ts.map +1 -1
- package/dist/context.js +27 -0
- package/dist/context.js.map +1 -1
- package/dist/database.d.ts.map +1 -1
- package/dist/database.js +34 -5
- package/dist/database.js.map +1 -1
- package/dist/exit-hooks.d.ts +23 -0
- package/dist/exit-hooks.d.ts.map +1 -0
- package/dist/exit-hooks.js +88 -0
- package/dist/exit-hooks.js.map +1 -0
- package/dist/express.js +2 -2
- package/dist/express.js.map +1 -1
- package/dist/fetch.d.ts.map +1 -1
- package/dist/fetch.js +16 -8
- package/dist/fetch.js.map +1 -1
- package/dist/global-errors.d.ts +8 -5
- package/dist/global-errors.d.ts.map +1 -1
- package/dist/global-errors.js +59 -10
- package/dist/global-errors.js.map +1 -1
- package/dist/index.d.ts +4 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +14 -7
- package/dist/index.js.map +1 -1
- package/dist/infra/aggregator.d.ts +5 -0
- package/dist/infra/aggregator.d.ts.map +1 -1
- package/dist/infra/aggregator.js.map +1 -1
- package/dist/infra/aws.d.ts +45 -3
- package/dist/infra/aws.d.ts.map +1 -1
- package/dist/infra/aws.js +419 -29
- package/dist/infra/aws.js.map +1 -1
- package/dist/infra/lambda.d.ts +19 -0
- package/dist/infra/lambda.d.ts.map +1 -1
- package/dist/infra/lambda.js +63 -10
- package/dist/infra/lambda.js.map +1 -1
- package/dist/infra/messaging.d.ts +133 -0
- package/dist/infra/messaging.d.ts.map +1 -0
- package/dist/infra/messaging.js +366 -0
- package/dist/infra/messaging.js.map +1 -0
- package/dist/logs/shipper.d.ts +5 -4
- package/dist/logs/shipper.d.ts.map +1 -1
- package/dist/logs/shipper.js +170 -52
- package/dist/logs/shipper.js.map +1 -1
- package/dist/logs/types.d.ts +18 -2
- package/dist/logs/types.d.ts.map +1 -1
- package/dist/next.js +2 -2
- package/dist/next.js.map +1 -1
- package/dist/node-http.d.ts.map +1 -1
- package/dist/node-http.js +7 -3
- package/dist/node-http.js.map +1 -1
- package/dist/normalize.d.ts +32 -0
- package/dist/normalize.d.ts.map +1 -1
- package/dist/normalize.js +165 -10
- package/dist/normalize.js.map +1 -1
- package/dist/pg.d.ts +8 -3
- package/dist/pg.d.ts.map +1 -1
- package/dist/pg.js +512 -41
- package/dist/pg.js.map +1 -1
- package/dist/scrub.d.ts +5 -0
- package/dist/scrub.d.ts.map +1 -1
- package/dist/scrub.js +17 -1
- package/dist/scrub.js.map +1 -1
- package/dist/tracker.d.ts +109 -7
- package/dist/tracker.d.ts.map +1 -1
- package/dist/tracker.js +502 -95
- package/dist/tracker.js.map +1 -1
- package/dist/transport.d.ts +115 -0
- package/dist/transport.d.ts.map +1 -0
- package/dist/transport.js +323 -0
- package/dist/transport.js.map +1 -0
- package/dist/types.d.ts +61 -8
- package/dist/types.d.ts.map +1 -1
- package/package.json +4 -1
|
@@ -0,0 +1,366 @@
|
|
|
1
|
+
import { createHash } from 'node:crypto';
|
|
2
|
+
import { parseTraceContext, TRACEPARENT_HEADER, TRACESTATE_HEADER, traceContextHeaders } from '../context.js';
|
|
3
|
+
/**
|
|
4
|
+
* Propagação do contexto W3C por mensagens (CONTRATO.md §16.1): `traceparent`/`tracestate` em
|
|
5
|
+
* `MessageAttributes` do SQS e no `Detail` do EventBridge, dentro das cotas de cada serviço.
|
|
6
|
+
* A regra é sempre a mesma: se o contexto não cabe, a mensagem segue exatamente como o usuário a
|
|
7
|
+
* montou. A publicação nunca falha por causa da instrumentação.
|
|
8
|
+
*/
|
|
9
|
+
/** SQS: no máximo 10 atributos por mensagem. */
|
|
10
|
+
export const SQS_MAX_MESSAGE_ATTRIBUTES = 10;
|
|
11
|
+
/** SQS: 1 MiB por mensagem (corpo + nome, tipo e valor dos atributos) e por lote (soma das entradas). */
|
|
12
|
+
export const SQS_MAX_MESSAGE_BYTES = 1_048_576;
|
|
13
|
+
export const SQS_MAX_BATCH_BYTES = 1_048_576;
|
|
14
|
+
/** Menor `MaximumMessageSize` que uma fila aceita: abaixo disto nenhuma fila recusa por tamanho. */
|
|
15
|
+
export const SQS_MIN_MESSAGE_BYTES = 1024;
|
|
16
|
+
/** EventBridge `PutEvents`: a soma das entradas tem de ficar abaixo de 1 MiB. */
|
|
17
|
+
export const EVENTBRIDGE_MAX_REQUEST_BYTES = 1_048_576;
|
|
18
|
+
/** `Time` conta 14 bytes por entrada no cálculo do EventBridge. */
|
|
19
|
+
const EVENTBRIDGE_TIME_BYTES = 14;
|
|
20
|
+
/** Atributos de mensagem que a instrumentação lê (o SQS só os devolve quando pedidos). */
|
|
21
|
+
export const SQS_CONTEXT_ATTRIBUTES = [TRACEPARENT_HEADER, TRACESTATE_HEADER];
|
|
22
|
+
/** Atributos de sistema que dão o atraso de fila e as tentativas. */
|
|
23
|
+
export const SQS_SYSTEM_ATTRIBUTES = ['SentTimestamp', 'ApproximateReceiveCount'];
|
|
24
|
+
/** No máximo tantos links por span; o resto é contado em `links.dropped`. */
|
|
25
|
+
export const MAX_LINKS = 32;
|
|
26
|
+
function obj(value) {
|
|
27
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value) ? value : {};
|
|
28
|
+
}
|
|
29
|
+
function utf8(value) {
|
|
30
|
+
if (typeof value === 'string')
|
|
31
|
+
return Buffer.byteLength(value);
|
|
32
|
+
if (value instanceof Uint8Array)
|
|
33
|
+
return value.byteLength;
|
|
34
|
+
return 0;
|
|
35
|
+
}
|
|
36
|
+
/** Bytes de um atributo de mensagem como o SQS conta: nome + tipo + valor. */
|
|
37
|
+
export function sqsAttributeBytes(name, value) {
|
|
38
|
+
const attr = obj(value);
|
|
39
|
+
return utf8(name) + utf8(attr.DataType) + utf8(attr.StringValue) + utf8(attr.BinaryValue);
|
|
40
|
+
}
|
|
41
|
+
/** Tamanho de uma mensagem SQS como a cota conta: corpo + atributos de mensagem. */
|
|
42
|
+
export function sqsMessageBytes(body, attributes) {
|
|
43
|
+
let total = utf8(body);
|
|
44
|
+
for (const [name, value] of Object.entries(obj(attributes)))
|
|
45
|
+
total += sqsAttributeBytes(name, value);
|
|
46
|
+
return total;
|
|
47
|
+
}
|
|
48
|
+
function hasKey(record, key) {
|
|
49
|
+
const lower = key.toLowerCase();
|
|
50
|
+
return Object.keys(record).some((name) => name.toLowerCase() === lower);
|
|
51
|
+
}
|
|
52
|
+
/** Atributos SQS a acrescentar para um contexto (`tracestate` só quando houver). */
|
|
53
|
+
function sqsContextAttributes(ctx) {
|
|
54
|
+
return Object.entries(traceContextHeaders(ctx)).map(([name, value]) => [name, { DataType: 'String', StringValue: value }]);
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Acrescenta o contexto aos `MessageAttributes` de uma mensagem (`SendMessage` ou entrada de
|
|
58
|
+
* `SendMessageBatch`) quando cabe: atributo livre (máx. 10), bytes livres na mensagem e no
|
|
59
|
+
* orçamento do lote (`budgetBytes`). Sem espaço para os dois, vai só o `traceparent`. Contexto já
|
|
60
|
+
* presente fica como está. A entrada original nunca é alterada: a injetada é uma cópia.
|
|
61
|
+
*/
|
|
62
|
+
export function injectSqsContext(entry, ctx, limits) {
|
|
63
|
+
const attributes = obj(entry.MessageAttributes);
|
|
64
|
+
if (hasKey(attributes, TRACEPARENT_HEADER))
|
|
65
|
+
return { entry, injected: false, addedBytes: 0, skipped: 'present' };
|
|
66
|
+
let additions = sqsContextAttributes(ctx).filter(([name]) => !hasKey(attributes, name));
|
|
67
|
+
const used = Object.keys(attributes).length;
|
|
68
|
+
if (used + additions.length > SQS_MAX_MESSAGE_ATTRIBUTES)
|
|
69
|
+
additions = additions.slice(0, 1);
|
|
70
|
+
if (used + additions.length > SQS_MAX_MESSAGE_ATTRIBUTES)
|
|
71
|
+
return { entry, injected: false, addedBytes: 0, skipped: 'attribute_limit' };
|
|
72
|
+
const current = sqsMessageBytes(entry.MessageBody, attributes);
|
|
73
|
+
let added = additions.reduce((sum, [name, value]) => sum + sqsAttributeBytes(name, value), 0);
|
|
74
|
+
const fits = (bytes) => current + bytes <= limits.messageBytes && bytes <= limits.budgetBytes;
|
|
75
|
+
if (!fits(added) && additions.length > 1) {
|
|
76
|
+
additions = additions.slice(0, 1);
|
|
77
|
+
added = sqsAttributeBytes(additions[0][0], additions[0][1]);
|
|
78
|
+
}
|
|
79
|
+
if (!fits(added)) {
|
|
80
|
+
return { entry, injected: false, addedBytes: 0, skipped: current + added > limits.messageBytes ? 'size_limit' : 'batch_size_limit' };
|
|
81
|
+
}
|
|
82
|
+
return { entry: { ...entry, MessageAttributes: { ...attributes, ...Object.fromEntries(additions) } }, injected: true, addedBytes: added };
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* `MD5OfMessageAttributes` pelo algoritmo do SQS: atributos em ordem de nome; para cada um,
|
|
86
|
+
* tamanho (4 bytes, big-endian) + nome, tamanho + tipo, 1 byte de transporte (1 = String/Number,
|
|
87
|
+
* 2 = Binary) e tamanho + valor. `undefined` quando não há atributo.
|
|
88
|
+
*/
|
|
89
|
+
export function sqsAttributesMd5(attributes) {
|
|
90
|
+
const record = obj(attributes);
|
|
91
|
+
const names = Object.keys(record).sort();
|
|
92
|
+
if (names.length === 0)
|
|
93
|
+
return undefined;
|
|
94
|
+
const hash = createHash('md5');
|
|
95
|
+
const withLength = (bytes) => {
|
|
96
|
+
const length = Buffer.alloc(4);
|
|
97
|
+
length.writeUInt32BE(bytes.byteLength);
|
|
98
|
+
hash.update(length);
|
|
99
|
+
hash.update(bytes);
|
|
100
|
+
};
|
|
101
|
+
for (const name of names) {
|
|
102
|
+
const attr = obj(record[name]);
|
|
103
|
+
const dataType = typeof attr.DataType === 'string' ? attr.DataType : 'String';
|
|
104
|
+
withLength(Buffer.from(name, 'utf8'));
|
|
105
|
+
withLength(Buffer.from(dataType, 'utf8'));
|
|
106
|
+
if (dataType.startsWith('Binary')) {
|
|
107
|
+
hash.update(Buffer.from([2]));
|
|
108
|
+
const value = attr.BinaryValue;
|
|
109
|
+
withLength(value instanceof Uint8Array ? value : typeof value === 'string' ? Buffer.from(value, 'base64') : Buffer.alloc(0));
|
|
110
|
+
}
|
|
111
|
+
else {
|
|
112
|
+
hash.update(Buffer.from([1]));
|
|
113
|
+
withLength(Buffer.from(typeof attr.StringValue === 'string' ? attr.StringValue : '', 'utf8'));
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
return hash.digest('hex');
|
|
117
|
+
}
|
|
118
|
+
/** O seletor (`All`, `.*`, `prefixo.*` ou nome exato) já cobre o nome? */
|
|
119
|
+
function selectorCovers(selectors, name) {
|
|
120
|
+
return selectors.some((selector) => {
|
|
121
|
+
if (typeof selector !== 'string')
|
|
122
|
+
return false;
|
|
123
|
+
if (selector === 'All' || selector === '.*')
|
|
124
|
+
return true;
|
|
125
|
+
if (selector.endsWith('.*'))
|
|
126
|
+
return name.startsWith(selector.slice(0, -1));
|
|
127
|
+
return selector === name;
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* `ReceiveMessage`: acrescenta `traceparent`/`tracestate` a `MessageAttributeNames` e
|
|
132
|
+
* `SentTimestamp`/`ApproximateReceiveCount` aos atributos de sistema, preservando o que o chamador
|
|
133
|
+
* pediu (`All` fica como está). Quem usa o campo legado `AttributeNames` recebe os de sistema nele.
|
|
134
|
+
*/
|
|
135
|
+
export function planReceive(input) {
|
|
136
|
+
const messageSelectors = Array.isArray(input.MessageAttributeNames) ? input.MessageAttributeNames : [];
|
|
137
|
+
const extraMessageAttributes = SQS_CONTEXT_ATTRIBUTES.filter((name) => !selectorCovers(messageSelectors, name));
|
|
138
|
+
const legacy = Array.isArray(input.AttributeNames) ? input.AttributeNames : undefined;
|
|
139
|
+
const modern = Array.isArray(input.MessageSystemAttributeNames) ? input.MessageSystemAttributeNames : undefined;
|
|
140
|
+
const systemSelectors = [...(legacy ?? []), ...(modern ?? [])];
|
|
141
|
+
const extraSystemAttributes = SQS_SYSTEM_ATTRIBUTES.filter((name) => !selectorCovers(systemSelectors, name));
|
|
142
|
+
const next = { ...input };
|
|
143
|
+
if (extraMessageAttributes.length > 0)
|
|
144
|
+
next.MessageAttributeNames = [...messageSelectors, ...extraMessageAttributes];
|
|
145
|
+
if (extraSystemAttributes.length > 0) {
|
|
146
|
+
if (legacy && !modern)
|
|
147
|
+
next.AttributeNames = [...legacy, ...extraSystemAttributes];
|
|
148
|
+
else
|
|
149
|
+
next.MessageSystemAttributeNames = [...(modern ?? []), ...extraSystemAttributes];
|
|
150
|
+
}
|
|
151
|
+
return { input: next, extraMessageAttributes, extraSystemAttributes };
|
|
152
|
+
}
|
|
153
|
+
function stringAttribute(attributes, name) {
|
|
154
|
+
for (const [key, value] of Object.entries(attributes)) {
|
|
155
|
+
if (key.toLowerCase() !== name)
|
|
156
|
+
continue;
|
|
157
|
+
const attr = obj(value);
|
|
158
|
+
// SDK (`StringValue`) e evento da Lambda (`stringValue`).
|
|
159
|
+
const raw = attr.StringValue ?? attr.stringValue;
|
|
160
|
+
return typeof raw === 'string' ? raw : undefined;
|
|
161
|
+
}
|
|
162
|
+
return undefined;
|
|
163
|
+
}
|
|
164
|
+
function numeric(value) {
|
|
165
|
+
const parsed = typeof value === 'number' ? value : typeof value === 'string' && value.trim() ? Number(value) : NaN;
|
|
166
|
+
return Number.isFinite(parsed) ? parsed : undefined;
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* Lê o contexto e os atributos de sistema de uma mensagem SQS, no formato do AWS SDK v3
|
|
170
|
+
* (`MessageAttributes`/`Attributes`/`MessageId`) ou do evento da Lambda
|
|
171
|
+
* (`messageAttributes`/`attributes`/`messageId`).
|
|
172
|
+
*/
|
|
173
|
+
export function readSqsMessage(record) {
|
|
174
|
+
const message = obj(record);
|
|
175
|
+
const attributes = { ...obj(message.messageAttributes), ...obj(message.MessageAttributes) };
|
|
176
|
+
const system = { ...obj(message.attributes), ...obj(message.Attributes) };
|
|
177
|
+
const messageId = typeof message.MessageId === 'string' ? message.MessageId : typeof message.messageId === 'string' ? message.messageId : undefined;
|
|
178
|
+
return {
|
|
179
|
+
traceparent: stringAttribute(attributes, TRACEPARENT_HEADER),
|
|
180
|
+
tracestate: stringAttribute(attributes, TRACESTATE_HEADER),
|
|
181
|
+
sentTimestamp: numeric(system.SentTimestamp),
|
|
182
|
+
receiveCount: numeric(system.ApproximateReceiveCount),
|
|
183
|
+
messageId,
|
|
184
|
+
};
|
|
185
|
+
}
|
|
186
|
+
export function metaContext(meta) {
|
|
187
|
+
return meta ? parseTraceContext(meta.traceparent, meta.tracestate) : undefined;
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* Remove de uma mensagem recebida o que só a instrumentação pediu e recalcula o
|
|
191
|
+
* `MD5OfMessageAttributes` sobre o que sobra (ou remove o campo quando não sobra atributo).
|
|
192
|
+
* Sem nada removido, a mensagem volta a mesma.
|
|
193
|
+
*/
|
|
194
|
+
export function stripReceivedMessage(message, plan) {
|
|
195
|
+
let out = message;
|
|
196
|
+
const attributes = obj(message.MessageAttributes);
|
|
197
|
+
const removeMessage = Object.keys(attributes).filter((name) => plan.extraMessageAttributes.includes(name));
|
|
198
|
+
if (removeMessage.length > 0) {
|
|
199
|
+
const visible = Object.fromEntries(Object.entries(attributes).filter(([name]) => !removeMessage.includes(name)));
|
|
200
|
+
out = { ...out };
|
|
201
|
+
if (Object.keys(visible).length > 0) {
|
|
202
|
+
out.MessageAttributes = visible;
|
|
203
|
+
out.MD5OfMessageAttributes = sqsAttributesMd5(visible);
|
|
204
|
+
}
|
|
205
|
+
else {
|
|
206
|
+
delete out.MessageAttributes;
|
|
207
|
+
delete out.MD5OfMessageAttributes;
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
const system = obj(message.Attributes);
|
|
211
|
+
const removeSystem = Object.keys(system).filter((name) => plan.extraSystemAttributes.includes(name));
|
|
212
|
+
if (removeSystem.length > 0) {
|
|
213
|
+
const visible = Object.fromEntries(Object.entries(system).filter(([name]) => !removeSystem.includes(name)));
|
|
214
|
+
if (out === message)
|
|
215
|
+
out = { ...out };
|
|
216
|
+
if (Object.keys(visible).length > 0)
|
|
217
|
+
out.Attributes = visible;
|
|
218
|
+
else
|
|
219
|
+
delete out.Attributes;
|
|
220
|
+
}
|
|
221
|
+
return out;
|
|
222
|
+
}
|
|
223
|
+
/**
|
|
224
|
+
* Mensagens recebidas por `ReceiveMessage` instrumentado: o contexto fica aqui (por `MessageId` e
|
|
225
|
+
* `ReceiptHandle`) para o `trackMessage` encontrar depois que os atributos foram retirados da
|
|
226
|
+
* resposta. Limitado em tamanho e tempo; o mais antigo sai primeiro.
|
|
227
|
+
*/
|
|
228
|
+
export class ReceivedMessages {
|
|
229
|
+
maxEntries;
|
|
230
|
+
ttlMs;
|
|
231
|
+
entries = new Map();
|
|
232
|
+
constructor(maxEntries = 10_000, ttlMs = 15 * 60_000) {
|
|
233
|
+
this.maxEntries = maxEntries;
|
|
234
|
+
this.ttlMs = ttlMs;
|
|
235
|
+
}
|
|
236
|
+
remember(message, meta) {
|
|
237
|
+
const at = Date.now();
|
|
238
|
+
for (const key of [message.MessageId, message.ReceiptHandle]) {
|
|
239
|
+
if (typeof key !== 'string' || !key)
|
|
240
|
+
continue;
|
|
241
|
+
this.entries.delete(key);
|
|
242
|
+
this.entries.set(key, { meta, at });
|
|
243
|
+
}
|
|
244
|
+
while (this.entries.size > this.maxEntries) {
|
|
245
|
+
const oldest = this.entries.keys().next().value;
|
|
246
|
+
if (oldest === undefined)
|
|
247
|
+
break;
|
|
248
|
+
this.entries.delete(oldest);
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
lookup(record) {
|
|
252
|
+
const message = obj(record);
|
|
253
|
+
const now = Date.now();
|
|
254
|
+
// ReceiptHandle primeiro: é por entrega. O MessageId se repete numa reentrega, e a entrada dele
|
|
255
|
+
// pode já ser a da entrega seguinte (com outro ApproximateReceiveCount).
|
|
256
|
+
for (const key of [message.ReceiptHandle, message.receiptHandle, message.MessageId, message.messageId]) {
|
|
257
|
+
if (typeof key !== 'string')
|
|
258
|
+
continue;
|
|
259
|
+
const hit = this.entries.get(key);
|
|
260
|
+
if (!hit)
|
|
261
|
+
continue;
|
|
262
|
+
if (now - hit.at > this.ttlMs) {
|
|
263
|
+
this.entries.delete(key);
|
|
264
|
+
continue;
|
|
265
|
+
}
|
|
266
|
+
return hit.meta;
|
|
267
|
+
}
|
|
268
|
+
return undefined;
|
|
269
|
+
}
|
|
270
|
+
get size() {
|
|
271
|
+
return this.entries.size;
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
/* ------------------------------------------------------------------ */
|
|
275
|
+
/* EventBridge */
|
|
276
|
+
/* ------------------------------------------------------------------ */
|
|
277
|
+
/** Tamanho de uma entrada de `PutEvents` como o EventBridge conta. */
|
|
278
|
+
export function eventBridgeEntryBytes(entry) {
|
|
279
|
+
const e = obj(entry);
|
|
280
|
+
let total = utf8(e.Source) + utf8(e.DetailType) + utf8(e.Detail);
|
|
281
|
+
if (e.Time !== undefined && e.Time !== null)
|
|
282
|
+
total += EVENTBRIDGE_TIME_BYTES;
|
|
283
|
+
if (Array.isArray(e.Resources))
|
|
284
|
+
for (const resource of e.Resources)
|
|
285
|
+
total += utf8(resource);
|
|
286
|
+
return total;
|
|
287
|
+
}
|
|
288
|
+
/** Fragmento JSON com o contexto (`"traceparent":"…","tracestate":"…"`). */
|
|
289
|
+
function detailFragment(ctx) {
|
|
290
|
+
return Object.entries(traceContextHeaders(ctx))
|
|
291
|
+
.map(([key, value]) => `${JSON.stringify(key)}:${JSON.stringify(value)}`)
|
|
292
|
+
.join(',');
|
|
293
|
+
}
|
|
294
|
+
/**
|
|
295
|
+
* Acrescenta o contexto ao `Detail` de uma entrada de `PutEvents` quando ele é um objeto JSON,
|
|
296
|
+
* ainda não tem `traceparent` e o acréscimo cabe no orçamento que sobra do pedido. O texto do
|
|
297
|
+
* usuário é preservado byte a byte: o contexto entra logo depois do `{` inicial.
|
|
298
|
+
*/
|
|
299
|
+
export function injectEventBridgeContext(entry, ctx, budgetBytes) {
|
|
300
|
+
const detail = entry.Detail;
|
|
301
|
+
if (typeof detail !== 'string')
|
|
302
|
+
return { entry, injected: false, addedBytes: 0, skipped: 'not_json_object' };
|
|
303
|
+
let parsed;
|
|
304
|
+
try {
|
|
305
|
+
parsed = JSON.parse(detail);
|
|
306
|
+
}
|
|
307
|
+
catch {
|
|
308
|
+
return { entry, injected: false, addedBytes: 0, skipped: 'not_json_object' };
|
|
309
|
+
}
|
|
310
|
+
if (typeof parsed !== 'object' || parsed === null || Array.isArray(parsed))
|
|
311
|
+
return { entry, injected: false, addedBytes: 0, skipped: 'not_json_object' };
|
|
312
|
+
if (Object.hasOwn(parsed, TRACEPARENT_HEADER))
|
|
313
|
+
return { entry, injected: false, addedBytes: 0, skipped: 'present' };
|
|
314
|
+
const open = detail.indexOf('{');
|
|
315
|
+
const empty = Object.keys(parsed).length === 0;
|
|
316
|
+
const build = (fragment) => `${detail.slice(0, open + 1)}${fragment}${empty ? '' : ','}${detail.slice(open + 1)}`;
|
|
317
|
+
let fragment = detailFragment(ctx);
|
|
318
|
+
let added = utf8(build(fragment)) - utf8(detail);
|
|
319
|
+
if (added > budgetBytes && ctx.traceState) {
|
|
320
|
+
fragment = detailFragment({ ...ctx, traceState: undefined });
|
|
321
|
+
added = utf8(build(fragment)) - utf8(detail);
|
|
322
|
+
}
|
|
323
|
+
if (added > budgetBytes)
|
|
324
|
+
return { entry, injected: false, addedBytes: 0, skipped: 'batch_size_limit' };
|
|
325
|
+
return { entry: { ...entry, Detail: build(fragment) }, injected: true, addedBytes: added };
|
|
326
|
+
}
|
|
327
|
+
/** Contexto de um evento do EventBridge entregue à Lambda (`detail.traceparent`). */
|
|
328
|
+
export function readEventBridgeDetail(detail) {
|
|
329
|
+
const record = obj(detail);
|
|
330
|
+
const traceparent = typeof record.traceparent === 'string' ? record.traceparent : undefined;
|
|
331
|
+
const tracestate = typeof record.tracestate === 'string' ? record.tracestate : undefined;
|
|
332
|
+
return parseTraceContext(traceparent, tracestate);
|
|
333
|
+
}
|
|
334
|
+
/** Links únicos (por trace/span), no máximo `MAX_LINKS`; devolve também quantos ficaram de fora. */
|
|
335
|
+
export function uniqueLinks(contexts) {
|
|
336
|
+
const seen = new Set();
|
|
337
|
+
const links = [];
|
|
338
|
+
let dropped = 0;
|
|
339
|
+
for (const ctx of contexts) {
|
|
340
|
+
if (!ctx)
|
|
341
|
+
continue;
|
|
342
|
+
const key = `${ctx.traceId}:${ctx.spanId}`;
|
|
343
|
+
if (seen.has(key))
|
|
344
|
+
continue;
|
|
345
|
+
seen.add(key);
|
|
346
|
+
if (links.length >= MAX_LINKS)
|
|
347
|
+
dropped += 1;
|
|
348
|
+
else
|
|
349
|
+
links.push({ traceId: ctx.traceId, spanId: ctx.spanId });
|
|
350
|
+
}
|
|
351
|
+
return { links, dropped };
|
|
352
|
+
}
|
|
353
|
+
/** Erro de validação do serviço (nada foi publicado): a chamada pode ser repetida sem o contexto. */
|
|
354
|
+
export function isValidationError(error) {
|
|
355
|
+
const e = obj(error);
|
|
356
|
+
const status = obj(e.$metadata).httpStatusCode;
|
|
357
|
+
if (status !== undefined && status !== 400 && status !== 413)
|
|
358
|
+
return false;
|
|
359
|
+
const text = `${typeof e.name === 'string' ? e.name : ''} ${typeof e.Code === 'string' ? e.Code : ''} ${typeof e.code === 'string' ? e.code : ''}`;
|
|
360
|
+
return /InvalidParameterValue|InvalidAttribute|InvalidMessageContents|BatchRequestTooLong|MessageTooLong|ValidationException|RequestEntityTooLarge|TooManyAttributes/i.test(text);
|
|
361
|
+
}
|
|
362
|
+
/** Código de falha por entrada (lote) que indica limite ou atributo inválido. */
|
|
363
|
+
export function isValidationCode(code) {
|
|
364
|
+
return typeof code === 'string' && /InvalidParameterValue|InvalidAttribute|InvalidMessageContents|MessageTooLong|ValidationException|TooLarge|TooManyAttributes|InvalidArgument/i.test(code);
|
|
365
|
+
}
|
|
366
|
+
//# sourceMappingURL=messaging.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"messaging.js","sourceRoot":"","sources":["../../src/infra/messaging.ts"],"names":[],"mappings":"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"}
|
package/dist/logs/shipper.d.ts
CHANGED
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import { type LogShipper, type LogShipperOptions } from './types.js';
|
|
2
2
|
/**
|
|
3
|
-
* Fila + envio em lote para `POST /v1/logs
|
|
4
|
-
* timer com `unref()`, fila limitada (descarta as mais antigas),
|
|
5
|
-
* em
|
|
6
|
-
*
|
|
3
|
+
* Fila + envio em lote para `POST /v1/logs`, com o transporte do tracker (CONTRATO.md §4.3):
|
|
4
|
+
* timer com `unref()`, fila limitada em linhas e bytes (descarta as mais antigas), lotes
|
|
5
|
+
* limitados em bytes, timeout de 10 s, backoff com jitter e `Retry-After` em rede/408/429/5xx,
|
|
6
|
+
* 413 divide o lote, outro 4xx descarta. Cada linha leva um `eventId` gerado aqui: o reenvio
|
|
7
|
+
* de um lote que a API já gravou não duplica (dedupe no servidor).
|
|
7
8
|
*/
|
|
8
9
|
export declare function createLogShipper(options: LogShipperOptions): LogShipper;
|
|
9
10
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shipper.d.ts","sourceRoot":"","sources":["../../src/logs/shipper.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"shipper.d.ts","sourceRoot":"","sources":["../../src/logs/shipper.ts"],"names":[],"mappings":"AAeA,OAAO,EAA6E,KAAK,UAAU,EAAE,KAAK,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAgBhJ;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,iBAAiB,GAAG,UAAU,CAEvE;AAyRD;;;;;;;GAOG;AACH,wBAAgB,UAAU,CAAC,OAAO,CAAC,EAAE,iBAAiB,CAAC,SAAS,CAAC,GAAG,MAAM,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAM/F"}
|