@brizz/sdk 0.1.22 → 0.1.26
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/README.md +30 -25
- package/dist/index.cjs +307 -348
- package/dist/index.d.cts +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +277 -318
- package/dist/preload.cjs +282 -330
- package/dist/preload.js +265 -313
- package/package.json +3 -3
- package/dist/index.cjs.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/preload.cjs.map +0 -1
- package/dist/preload.js.map +0 -1
package/dist/index.js
CHANGED
|
@@ -164,10 +164,134 @@ var init_logger = __esm({
|
|
|
164
164
|
}
|
|
165
165
|
});
|
|
166
166
|
|
|
167
|
+
// src/internal/instrumentation/mcp/semantic-conventions.ts
|
|
168
|
+
var MCP_TOOL_NAME, MCP_TOOL_ARGUMENTS, MCP_TOOL_RESULT, MCP_COMPONENT_TYPE, MCP_COMPONENT_TOOL, MCP_COMPONENT_TOOL_SCHEMA, MCP_TOOL_SCHEMA_PARAMETERS, MCP_TOOL_SCHEMA_OUTPUT, MCP_TOOL_DESCRIPTION, SPAN_NAME_TOOL_REGISTER, MCP_METHOD_NAME, MCP_REQUEST_ID, MCP_SESSION_ID, MCP_PROTOCOL_VERSION, MCP_RESOURCE_URI, RPC_SYSTEM, RPC_SYSTEM_MCP, RPC_RESPONSE_STATUS_CODE, GEN_AI_TOOL_NAME, GEN_AI_PROMPT_NAME, GEN_AI_OPERATION_NAME, GEN_AI_OPERATION_EXECUTE_TOOL, NETWORK_TRANSPORT, ERROR_TYPE, ERROR_TYPE_TOOL, JSONRPC_REQUEST_ID, SPAN_NAME_TOOLS_CALL, MAX_ATTRIBUTE_LENGTH, TRUNCATION_SUFFIX, METHOD_TOOLS_CALL, METHOD_TOOLS_LIST, METHOD_RESOURCES_READ, METHOD_PROMPTS_GET, METHOD_INITIALIZE;
|
|
169
|
+
var init_semantic_conventions = __esm({
|
|
170
|
+
"src/internal/instrumentation/mcp/semantic-conventions.ts"() {
|
|
171
|
+
"use strict";
|
|
172
|
+
MCP_TOOL_NAME = "mcp.tool.name";
|
|
173
|
+
MCP_TOOL_ARGUMENTS = "mcp.tool.arguments";
|
|
174
|
+
MCP_TOOL_RESULT = "mcp.tool.result";
|
|
175
|
+
MCP_COMPONENT_TYPE = "mcp.component.type";
|
|
176
|
+
MCP_COMPONENT_TOOL = "tool";
|
|
177
|
+
MCP_COMPONENT_TOOL_SCHEMA = "tool_schema";
|
|
178
|
+
MCP_TOOL_SCHEMA_PARAMETERS = "mcp.tool.schema.parameters";
|
|
179
|
+
MCP_TOOL_SCHEMA_OUTPUT = "mcp.tool.schema.output";
|
|
180
|
+
MCP_TOOL_DESCRIPTION = "mcp.tool.description";
|
|
181
|
+
SPAN_NAME_TOOL_REGISTER = "mcp.tool.register";
|
|
182
|
+
MCP_METHOD_NAME = "mcp.method.name";
|
|
183
|
+
MCP_REQUEST_ID = "mcp.request.id";
|
|
184
|
+
MCP_SESSION_ID = "mcp.session.id";
|
|
185
|
+
MCP_PROTOCOL_VERSION = "mcp.protocol.version";
|
|
186
|
+
MCP_RESOURCE_URI = "mcp.resource.uri";
|
|
187
|
+
RPC_SYSTEM = "rpc.system";
|
|
188
|
+
RPC_SYSTEM_MCP = "mcp";
|
|
189
|
+
RPC_RESPONSE_STATUS_CODE = "rpc.response.status_code";
|
|
190
|
+
GEN_AI_TOOL_NAME = "gen_ai.tool.name";
|
|
191
|
+
GEN_AI_PROMPT_NAME = "gen_ai.prompt.name";
|
|
192
|
+
GEN_AI_OPERATION_NAME = "gen_ai.operation.name";
|
|
193
|
+
GEN_AI_OPERATION_EXECUTE_TOOL = "execute_tool";
|
|
194
|
+
NETWORK_TRANSPORT = "network.transport";
|
|
195
|
+
ERROR_TYPE = "error.type";
|
|
196
|
+
ERROR_TYPE_TOOL = "tool_error";
|
|
197
|
+
JSONRPC_REQUEST_ID = "jsonrpc.request.id";
|
|
198
|
+
SPAN_NAME_TOOLS_CALL = "tools/call";
|
|
199
|
+
MAX_ATTRIBUTE_LENGTH = 32 * 1024;
|
|
200
|
+
TRUNCATION_SUFFIX = "\u2026(truncated)";
|
|
201
|
+
METHOD_TOOLS_CALL = "tools/call";
|
|
202
|
+
METHOD_TOOLS_LIST = "tools/list";
|
|
203
|
+
METHOD_RESOURCES_READ = "resources/read";
|
|
204
|
+
METHOD_PROMPTS_GET = "prompts/get";
|
|
205
|
+
METHOD_INITIALIZE = "initialize";
|
|
206
|
+
}
|
|
207
|
+
});
|
|
208
|
+
|
|
209
|
+
// src/internal/instrumentation/mcp/schemas.ts
|
|
210
|
+
import { SpanKind, SpanStatusCode } from "@opentelemetry/api";
|
|
211
|
+
function truncateSchemaAttr(value) {
|
|
212
|
+
if (value.length <= _MAX_SCHEMA_ATTR_BYTES) {
|
|
213
|
+
return value;
|
|
214
|
+
}
|
|
215
|
+
return `{"_truncated":true,"original_length":${value.length}}`;
|
|
216
|
+
}
|
|
217
|
+
function safeStringify(value) {
|
|
218
|
+
if (value === null || value === void 0) {
|
|
219
|
+
return "";
|
|
220
|
+
}
|
|
221
|
+
try {
|
|
222
|
+
return JSON.stringify(value);
|
|
223
|
+
} catch {
|
|
224
|
+
return "";
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
function emitSchemaSpansFromListResponse(result, transportSessionId, tracer) {
|
|
228
|
+
if (!transportSessionId) {
|
|
229
|
+
return;
|
|
230
|
+
}
|
|
231
|
+
const tools = extractTools(result);
|
|
232
|
+
if (tools === void 0) {
|
|
233
|
+
return;
|
|
234
|
+
}
|
|
235
|
+
for (const tool of tools) {
|
|
236
|
+
const name = typeof tool.name === "string" ? tool.name : void 0;
|
|
237
|
+
if (!name) {
|
|
238
|
+
continue;
|
|
239
|
+
}
|
|
240
|
+
const span = tracer.startSpan(`${SPAN_NAME_TOOL_REGISTER} ${name}`, {
|
|
241
|
+
kind: SpanKind.INTERNAL
|
|
242
|
+
});
|
|
243
|
+
try {
|
|
244
|
+
stampSchemaAttributes(span, name, transportSessionId, tool);
|
|
245
|
+
span.setStatus({ code: SpanStatusCode.OK });
|
|
246
|
+
} finally {
|
|
247
|
+
span.end();
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
function stampSchemaAttributes(span, toolName, transportSessionId, tool) {
|
|
252
|
+
if (!span.isRecording()) {
|
|
253
|
+
logger.warn(
|
|
254
|
+
`Brizz MCP: schema span is not recording; dropping attributes for ${toolName}`
|
|
255
|
+
);
|
|
256
|
+
return;
|
|
257
|
+
}
|
|
258
|
+
const description = typeof tool.description === "string" ? tool.description : "";
|
|
259
|
+
const parameters = truncateSchemaAttr(safeStringify(tool.inputSchema));
|
|
260
|
+
const outputSchema = tool.outputSchema !== void 0 && tool.outputSchema !== null ? truncateSchemaAttr(safeStringify(tool.outputSchema)) : "";
|
|
261
|
+
span.setAttribute(RPC_SYSTEM, RPC_SYSTEM_MCP);
|
|
262
|
+
span.setAttribute(MCP_COMPONENT_TYPE, MCP_COMPONENT_TOOL_SCHEMA);
|
|
263
|
+
span.setAttribute(MCP_SESSION_ID, transportSessionId);
|
|
264
|
+
span.setAttribute(MCP_TOOL_NAME, toolName);
|
|
265
|
+
span.setAttribute(MCP_TOOL_SCHEMA_PARAMETERS, parameters);
|
|
266
|
+
span.setAttribute(MCP_TOOL_SCHEMA_OUTPUT, outputSchema);
|
|
267
|
+
span.setAttribute(MCP_TOOL_DESCRIPTION, description);
|
|
268
|
+
}
|
|
269
|
+
function extractTools(result) {
|
|
270
|
+
if (!result || typeof result !== "object") {
|
|
271
|
+
return void 0;
|
|
272
|
+
}
|
|
273
|
+
const tools = result.tools;
|
|
274
|
+
if (!Array.isArray(tools)) {
|
|
275
|
+
return void 0;
|
|
276
|
+
}
|
|
277
|
+
return tools.filter(
|
|
278
|
+
(t) => t !== null && typeof t === "object"
|
|
279
|
+
);
|
|
280
|
+
}
|
|
281
|
+
var _MAX_SCHEMA_ATTR_BYTES;
|
|
282
|
+
var init_schemas = __esm({
|
|
283
|
+
"src/internal/instrumentation/mcp/schemas.ts"() {
|
|
284
|
+
"use strict";
|
|
285
|
+
init_logger();
|
|
286
|
+
init_semantic_conventions();
|
|
287
|
+
_MAX_SCHEMA_ATTR_BYTES = 4e3;
|
|
288
|
+
}
|
|
289
|
+
});
|
|
290
|
+
|
|
167
291
|
// src/internal/semantic-conventions.ts
|
|
168
292
|
import { createContextKey } from "@opentelemetry/api";
|
|
169
293
|
var BRIZZ, PROPERTIES, SESSION_ID, PROPERTIES_CONTEXT_KEY, SESSION_OBJECT_CONTEXT_KEY, SESSION_INPUT, SESSION_OUTPUT, SESSION_INPUT_CONTEXT, SESSION_OUTPUT_CONTEXT, SESSION_SPAN_NAME, SESSION_TITLE_SPAN_NAME, SESSION_TITLE_GENERATION, SESSION_TITLE;
|
|
170
|
-
var
|
|
294
|
+
var init_semantic_conventions2 = __esm({
|
|
171
295
|
"src/internal/semantic-conventions.ts"() {
|
|
172
296
|
"use strict";
|
|
173
297
|
BRIZZ = "brizz";
|
|
@@ -217,48 +341,12 @@ var init_session = __esm({
|
|
|
217
341
|
"src/internal/instrumentation/mcp/session.ts"() {
|
|
218
342
|
"use strict";
|
|
219
343
|
init_logger();
|
|
220
|
-
|
|
221
|
-
}
|
|
222
|
-
});
|
|
223
|
-
|
|
224
|
-
// src/internal/instrumentation/mcp/semantic-conventions.ts
|
|
225
|
-
var MCP_TOOL_NAME, MCP_TOOL_ARGUMENTS, MCP_TOOL_RESULT, MCP_COMPONENT_TYPE, MCP_COMPONENT_TOOL, MCP_METHOD_NAME, MCP_REQUEST_ID, MCP_SESSION_ID, MCP_PROTOCOL_VERSION, MCP_RESOURCE_URI, RPC_SYSTEM, RPC_SYSTEM_MCP, RPC_RESPONSE_STATUS_CODE, GEN_AI_TOOL_NAME, GEN_AI_PROMPT_NAME, GEN_AI_OPERATION_NAME, GEN_AI_OPERATION_EXECUTE_TOOL, NETWORK_TRANSPORT, ERROR_TYPE, ERROR_TYPE_TOOL, JSONRPC_REQUEST_ID, SPAN_NAME_TOOLS_CALL, MAX_ATTRIBUTE_LENGTH, TRUNCATION_SUFFIX, METHOD_TOOLS_CALL, METHOD_RESOURCES_READ, METHOD_PROMPTS_GET, METHOD_INITIALIZE;
|
|
226
|
-
var init_semantic_conventions2 = __esm({
|
|
227
|
-
"src/internal/instrumentation/mcp/semantic-conventions.ts"() {
|
|
228
|
-
"use strict";
|
|
229
|
-
MCP_TOOL_NAME = "mcp.tool.name";
|
|
230
|
-
MCP_TOOL_ARGUMENTS = "mcp.tool.arguments";
|
|
231
|
-
MCP_TOOL_RESULT = "mcp.tool.result";
|
|
232
|
-
MCP_COMPONENT_TYPE = "mcp.component.type";
|
|
233
|
-
MCP_COMPONENT_TOOL = "tool";
|
|
234
|
-
MCP_METHOD_NAME = "mcp.method.name";
|
|
235
|
-
MCP_REQUEST_ID = "mcp.request.id";
|
|
236
|
-
MCP_SESSION_ID = "mcp.session.id";
|
|
237
|
-
MCP_PROTOCOL_VERSION = "mcp.protocol.version";
|
|
238
|
-
MCP_RESOURCE_URI = "mcp.resource.uri";
|
|
239
|
-
RPC_SYSTEM = "rpc.system";
|
|
240
|
-
RPC_SYSTEM_MCP = "mcp";
|
|
241
|
-
RPC_RESPONSE_STATUS_CODE = "rpc.response.status_code";
|
|
242
|
-
GEN_AI_TOOL_NAME = "gen_ai.tool.name";
|
|
243
|
-
GEN_AI_PROMPT_NAME = "gen_ai.prompt.name";
|
|
244
|
-
GEN_AI_OPERATION_NAME = "gen_ai.operation.name";
|
|
245
|
-
GEN_AI_OPERATION_EXECUTE_TOOL = "execute_tool";
|
|
246
|
-
NETWORK_TRANSPORT = "network.transport";
|
|
247
|
-
ERROR_TYPE = "error.type";
|
|
248
|
-
ERROR_TYPE_TOOL = "tool_error";
|
|
249
|
-
JSONRPC_REQUEST_ID = "jsonrpc.request.id";
|
|
250
|
-
SPAN_NAME_TOOLS_CALL = "tools/call";
|
|
251
|
-
MAX_ATTRIBUTE_LENGTH = 32 * 1024;
|
|
252
|
-
TRUNCATION_SUFFIX = "\u2026(truncated)";
|
|
253
|
-
METHOD_TOOLS_CALL = "tools/call";
|
|
254
|
-
METHOD_RESOURCES_READ = "resources/read";
|
|
255
|
-
METHOD_PROMPTS_GET = "prompts/get";
|
|
256
|
-
METHOD_INITIALIZE = "initialize";
|
|
344
|
+
init_semantic_conventions2();
|
|
257
345
|
}
|
|
258
346
|
});
|
|
259
347
|
|
|
260
348
|
// src/internal/instrumentation/mcp/patches/attributes.ts
|
|
261
|
-
import { SpanStatusCode } from "@opentelemetry/api";
|
|
349
|
+
import { SpanStatusCode as SpanStatusCode2 } from "@opentelemetry/api";
|
|
262
350
|
function deriveSpanName(method, params) {
|
|
263
351
|
try {
|
|
264
352
|
if (method === METHOD_TOOLS_CALL) {
|
|
@@ -361,7 +449,7 @@ function applyResultAttributes(span, method, result) {
|
|
|
361
449
|
if (obj && obj["isError"] === true) {
|
|
362
450
|
span.setAttribute(ERROR_TYPE, ERROR_TYPE_TOOL);
|
|
363
451
|
const message = extractToolErrorMessage(obj);
|
|
364
|
-
span.setStatus({ code:
|
|
452
|
+
span.setStatus({ code: SpanStatusCode2.ERROR, message });
|
|
365
453
|
}
|
|
366
454
|
}
|
|
367
455
|
function applyErrorAttributes(span, err) {
|
|
@@ -385,7 +473,7 @@ function applyErrorAttributes(span, err) {
|
|
|
385
473
|
} catch {
|
|
386
474
|
}
|
|
387
475
|
span.setStatus({
|
|
388
|
-
code:
|
|
476
|
+
code: SpanStatusCode2.ERROR,
|
|
389
477
|
message: typeof error?.message === "string" ? error.message : void 0
|
|
390
478
|
});
|
|
391
479
|
}
|
|
@@ -450,12 +538,12 @@ function normalizeTransport(ctorName) {
|
|
|
450
538
|
var init_attributes = __esm({
|
|
451
539
|
"src/internal/instrumentation/mcp/patches/attributes.ts"() {
|
|
452
540
|
"use strict";
|
|
453
|
-
|
|
541
|
+
init_semantic_conventions();
|
|
454
542
|
}
|
|
455
543
|
});
|
|
456
544
|
|
|
457
545
|
// src/internal/instrumentation/mcp/patches/protocol.ts
|
|
458
|
-
import { context as context2, propagation, SpanKind, trace } from "@opentelemetry/api";
|
|
546
|
+
import { context as context2, propagation, SpanKind as SpanKind2, trace } from "@opentelemetry/api";
|
|
459
547
|
function patchProtocolPrototype(prototype, tracer) {
|
|
460
548
|
if (!prototype || typeof prototype !== "object") {
|
|
461
549
|
return false;
|
|
@@ -523,7 +611,20 @@ function wrapOnRequest(original, tracer) {
|
|
|
523
611
|
return original.apply(this, args);
|
|
524
612
|
}
|
|
525
613
|
const { span, spanCtx } = started;
|
|
526
|
-
const
|
|
614
|
+
const transportSessionId = this.sessionId ?? this._transport?.sessionId;
|
|
615
|
+
const postResult = method === METHOD_TOOLS_LIST ? (result) => {
|
|
616
|
+
try {
|
|
617
|
+
emitSchemaSpansFromListResponse(result, transportSessionId, tracer);
|
|
618
|
+
} catch (error) {
|
|
619
|
+
logger.warn(
|
|
620
|
+
`Brizz MCP: failed to emit tools/list schema spans: ${String(error)}`
|
|
621
|
+
);
|
|
622
|
+
}
|
|
623
|
+
} : void 0;
|
|
624
|
+
const wrappedHandler = (req, extra) => context2.with(
|
|
625
|
+
spanCtx,
|
|
626
|
+
() => executeHandler(span, method, handler, req, extra, postResult)
|
|
627
|
+
);
|
|
527
628
|
const hadEntry = handlers.has(method);
|
|
528
629
|
const prev = handlers.get(method);
|
|
529
630
|
handlers.set(method, wrappedHandler);
|
|
@@ -546,7 +647,7 @@ function wrapOnRequest(original, tracer) {
|
|
|
546
647
|
}
|
|
547
648
|
};
|
|
548
649
|
}
|
|
549
|
-
function executeAroundSpan(span, method, run) {
|
|
650
|
+
function executeAroundSpan(span, method, run, postResult) {
|
|
550
651
|
let result;
|
|
551
652
|
try {
|
|
552
653
|
result = run();
|
|
@@ -557,12 +658,18 @@ function executeAroundSpan(span, method, run) {
|
|
|
557
658
|
}
|
|
558
659
|
if (!isThenable(result)) {
|
|
559
660
|
safeApplyResultAttributes(span, method, result);
|
|
661
|
+
if (postResult) {
|
|
662
|
+
postResult(result);
|
|
663
|
+
}
|
|
560
664
|
safeEnd(span);
|
|
561
665
|
return result;
|
|
562
666
|
}
|
|
563
667
|
return result.then(
|
|
564
668
|
(value) => {
|
|
565
669
|
safeApplyResultAttributes(span, method, value);
|
|
670
|
+
if (postResult) {
|
|
671
|
+
postResult(value);
|
|
672
|
+
}
|
|
566
673
|
safeEnd(span);
|
|
567
674
|
return value;
|
|
568
675
|
},
|
|
@@ -573,13 +680,13 @@ function executeAroundSpan(span, method, run) {
|
|
|
573
680
|
}
|
|
574
681
|
);
|
|
575
682
|
}
|
|
576
|
-
function executeHandler(span, method, handler, req, extra) {
|
|
577
|
-
return executeAroundSpan(span, method, () => handler(req, extra));
|
|
683
|
+
function executeHandler(span, method, handler, req, extra, postResult) {
|
|
684
|
+
return executeAroundSpan(span, method, () => handler(req, extra), postResult);
|
|
578
685
|
}
|
|
579
686
|
function safeStartClientSpan(tracer, request, protocol) {
|
|
580
687
|
try {
|
|
581
688
|
const spanName = deriveSpanName(request.method, request.params);
|
|
582
|
-
const span = tracer.startSpan(spanName, { kind:
|
|
689
|
+
const span = tracer.startSpan(spanName, { kind: SpanKind2.CLIENT });
|
|
583
690
|
applyClientRequestAttributes(
|
|
584
691
|
span,
|
|
585
692
|
request,
|
|
@@ -597,7 +704,7 @@ function safeStartServerSpan(tracer, request, protocol) {
|
|
|
597
704
|
const spanName = deriveSpanName(request.method, request.params);
|
|
598
705
|
const span = tracer.startSpan(
|
|
599
706
|
spanName,
|
|
600
|
-
{ kind:
|
|
707
|
+
{ kind: SpanKind2.SERVER },
|
|
601
708
|
parentCtx
|
|
602
709
|
);
|
|
603
710
|
applyServerRequestAttributes(span, request, protocol);
|
|
@@ -655,6 +762,8 @@ var init_protocol = __esm({
|
|
|
655
762
|
"src/internal/instrumentation/mcp/patches/protocol.ts"() {
|
|
656
763
|
"use strict";
|
|
657
764
|
init_logger();
|
|
765
|
+
init_schemas();
|
|
766
|
+
init_semantic_conventions();
|
|
658
767
|
init_session();
|
|
659
768
|
init_attributes();
|
|
660
769
|
PATCHED_FLAG = /* @__PURE__ */ Symbol("brizz.mcp.protocol-patched");
|
|
@@ -663,7 +772,7 @@ var init_protocol = __esm({
|
|
|
663
772
|
|
|
664
773
|
// src/internal/version.ts
|
|
665
774
|
function getSDKVersion() {
|
|
666
|
-
return "0.1.
|
|
775
|
+
return "0.1.26";
|
|
667
776
|
}
|
|
668
777
|
var init_version = __esm({
|
|
669
778
|
"src/internal/version.ts"() {
|
|
@@ -948,6 +1057,38 @@ autoInitializeInstrumentations();
|
|
|
948
1057
|
import { resourceFromAttributes as resourceFromAttributes3 } from "@opentelemetry/resources";
|
|
949
1058
|
import { NodeSDK } from "@opentelemetry/sdk-node";
|
|
950
1059
|
|
|
1060
|
+
// src/internal/dsn.ts
|
|
1061
|
+
var PLACEHOLDER_SERVICE = "<service-name>";
|
|
1062
|
+
var SERVICE_NAME_HEADER = "X-Brizz-Service-Name";
|
|
1063
|
+
function parseDSN(dsn) {
|
|
1064
|
+
let parsed;
|
|
1065
|
+
try {
|
|
1066
|
+
parsed = new globalThis.URL(dsn);
|
|
1067
|
+
} catch {
|
|
1068
|
+
return null;
|
|
1069
|
+
}
|
|
1070
|
+
if (parsed.protocol !== "http:" && parsed.protocol !== "https:" || !parsed.username || !parsed.host) {
|
|
1071
|
+
return null;
|
|
1072
|
+
}
|
|
1073
|
+
const scheme = parsed.protocol === "https:" ? "https" : "http";
|
|
1074
|
+
let service;
|
|
1075
|
+
try {
|
|
1076
|
+
service = decodeURIComponent(parsed.pathname.replace(/^\//, ""));
|
|
1077
|
+
} catch {
|
|
1078
|
+
return null;
|
|
1079
|
+
}
|
|
1080
|
+
if (service === "" || service === PLACEHOLDER_SERVICE) {
|
|
1081
|
+
return null;
|
|
1082
|
+
}
|
|
1083
|
+
return {
|
|
1084
|
+
scheme,
|
|
1085
|
+
host: parsed.host,
|
|
1086
|
+
bearer: decodeURIComponent(parsed.username),
|
|
1087
|
+
service,
|
|
1088
|
+
baseUrl: `${scheme}://${parsed.host}`
|
|
1089
|
+
};
|
|
1090
|
+
}
|
|
1091
|
+
|
|
951
1092
|
// src/internal/config.ts
|
|
952
1093
|
init_logger();
|
|
953
1094
|
function resolveConfig(options) {
|
|
@@ -975,6 +1116,7 @@ function resolveConfig(options) {
|
|
|
975
1116
|
appName: options.appName,
|
|
976
1117
|
baseUrl: options.baseUrl,
|
|
977
1118
|
hasApiKey: !!options.apiKey,
|
|
1119
|
+
dsnProvided: !!(process.env["BRIZZ_DSN"] || options.dsn),
|
|
978
1120
|
disableBatch: options.disableBatch,
|
|
979
1121
|
logLevel: resolvedLogLevel,
|
|
980
1122
|
headersCount: Object.keys(options.headers || {}).length,
|
|
@@ -1002,7 +1144,42 @@ function resolveConfig(options) {
|
|
|
1002
1144
|
logLevel: resolvedLogLevel,
|
|
1003
1145
|
masking: resolvedMasking
|
|
1004
1146
|
};
|
|
1005
|
-
|
|
1147
|
+
const dsnInput = process.env["BRIZZ_DSN"] || options.dsn;
|
|
1148
|
+
let parsedDSN = null;
|
|
1149
|
+
if (dsnInput) {
|
|
1150
|
+
const kwargConflicts = [];
|
|
1151
|
+
if (options.apiKey !== void 0) {
|
|
1152
|
+
kwargConflicts.push("apiKey");
|
|
1153
|
+
}
|
|
1154
|
+
if (options.baseUrl !== void 0) {
|
|
1155
|
+
kwargConflicts.push("baseUrl");
|
|
1156
|
+
}
|
|
1157
|
+
if (options.appName !== void 0) {
|
|
1158
|
+
kwargConflicts.push("appName");
|
|
1159
|
+
}
|
|
1160
|
+
if (kwargConflicts.length > 0) {
|
|
1161
|
+
throw new Error(
|
|
1162
|
+
`dsn cannot be combined with kwargs ${kwargConflicts.join(", ")}. The DSN bundles bearer, gateway URL, and service name \u2014 choose one configuration style.`
|
|
1163
|
+
);
|
|
1164
|
+
}
|
|
1165
|
+
const envConflicts = ["BRIZZ_API_KEY", "BRIZZ_BASE_URL", "BRIZZ_APP_NAME"].filter(
|
|
1166
|
+
(name) => process.env[name] !== void 0
|
|
1167
|
+
);
|
|
1168
|
+
if (envConflicts.length > 0) {
|
|
1169
|
+
logger.warn(
|
|
1170
|
+
`Ignoring ${envConflicts.join(", ")} \u2014 dsn / BRIZZ_DSN takes precedence.`
|
|
1171
|
+
);
|
|
1172
|
+
}
|
|
1173
|
+
resolvedConfig.apiKey = void 0;
|
|
1174
|
+
resolvedConfig.baseUrl = "https://telemetry.brizz.dev";
|
|
1175
|
+
resolvedConfig.appName = "unknown-app";
|
|
1176
|
+
parsedDSN = parseDSN(dsnInput);
|
|
1177
|
+
if (parsedDSN) {
|
|
1178
|
+
resolvedConfig.appName = parsedDSN.service;
|
|
1179
|
+
resolvedConfig.baseUrl = parsedDSN.baseUrl;
|
|
1180
|
+
resolvedConfig.apiKey = parsedDSN.bearer;
|
|
1181
|
+
}
|
|
1182
|
+
} else if (resolvedConfig.apiKey) {
|
|
1006
1183
|
resolvedConfig.headers["Authorization"] = `Bearer ${resolvedConfig.apiKey}`;
|
|
1007
1184
|
}
|
|
1008
1185
|
if (process.env["BRIZZ_HEADERS"]) {
|
|
@@ -1017,14 +1194,28 @@ function resolveConfig(options) {
|
|
|
1017
1194
|
throw new Error("Invalid JSON in BRIZZ_HEADERS environment variable", { cause: error });
|
|
1018
1195
|
}
|
|
1019
1196
|
}
|
|
1197
|
+
if (dsnInput) {
|
|
1198
|
+
const authHeaderKeys = /* @__PURE__ */ new Set(["authorization", SERVICE_NAME_HEADER.toLowerCase()]);
|
|
1199
|
+
resolvedConfig.headers = Object.fromEntries(
|
|
1200
|
+
Object.entries(resolvedConfig.headers).filter(
|
|
1201
|
+
([key]) => !authHeaderKeys.has(key.toLowerCase())
|
|
1202
|
+
)
|
|
1203
|
+
);
|
|
1204
|
+
if (parsedDSN) {
|
|
1205
|
+
resolvedConfig.headers["Authorization"] = `Bearer ${parsedDSN.bearer}`;
|
|
1206
|
+
resolvedConfig.headers[SERVICE_NAME_HEADER] = parsedDSN.service;
|
|
1207
|
+
}
|
|
1208
|
+
}
|
|
1020
1209
|
logger.debug("Configuration resolved with environment variables", {
|
|
1021
1210
|
appName: resolvedConfig.appName,
|
|
1022
1211
|
baseUrl: resolvedConfig.baseUrl,
|
|
1023
1212
|
hasApiKey: !!resolvedConfig.apiKey,
|
|
1213
|
+
dsnProvided: !!dsnInput,
|
|
1024
1214
|
disableBatch: resolvedConfig.disableBatch,
|
|
1025
1215
|
envOverrides: {
|
|
1026
1216
|
hasEnvApiKey: !!process.env["BRIZZ_API_KEY"],
|
|
1027
1217
|
hasEnvBaseUrl: !!process.env["BRIZZ_BASE_URL"],
|
|
1218
|
+
hasEnvDsn: !!process.env["BRIZZ_DSN"],
|
|
1028
1219
|
hasEnvBatch: !!process.env["BRIZZ_DISABLE_BATCH"],
|
|
1029
1220
|
hasEnvHeaders: !!process.env["BRIZZ_HEADERS"]
|
|
1030
1221
|
}
|
|
@@ -1182,21 +1373,11 @@ import { BatchLogRecordProcessor, SimpleLogRecordProcessor } from "@opentelemetr
|
|
|
1182
1373
|
|
|
1183
1374
|
// src/internal/masking/patterns.ts
|
|
1184
1375
|
var DEFAULT_PII_PATTERNS = [
|
|
1185
|
-
// Email addresses
|
|
1186
|
-
{
|
|
1187
|
-
name: "email_addresses",
|
|
1188
|
-
pattern: String.raw`\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b`
|
|
1189
|
-
},
|
|
1190
1376
|
// Phone numbers (US format)
|
|
1191
1377
|
{
|
|
1192
1378
|
name: "us_phone_numbers",
|
|
1193
1379
|
pattern: String.raw`(?:^|[\s])(?:\+?1[-.\s]*)?(?:\([0-9]{3}\)\s?[0-9]{3}[-.\s]?[0-9]{4}|[0-9]{3}[-.\s]?[0-9]{3}[-.\s]?[0-9]{4}|[0-9]{10})(?=[\s]|$)`
|
|
1194
1380
|
},
|
|
1195
|
-
// Social Security Numbers
|
|
1196
|
-
{
|
|
1197
|
-
name: "ssn",
|
|
1198
|
-
pattern: String.raw`\b(?!000|666|9\d{2})\d{3}[-\s]?(?!00)\d{2}[-\s]?(?!0000)\d{4}\b`
|
|
1199
|
-
},
|
|
1200
1381
|
// Credit card numbers
|
|
1201
1382
|
{
|
|
1202
1383
|
name: "credit_cards",
|
|
@@ -1220,19 +1401,11 @@ var DEFAULT_PII_PATTERNS = [
|
|
|
1220
1401
|
name: "openai_keys",
|
|
1221
1402
|
pattern: String.raw`\bsk[-_][a-zA-Z0-9]{20,}\b`
|
|
1222
1403
|
},
|
|
1223
|
-
{
|
|
1224
|
-
name: "base64_secrets",
|
|
1225
|
-
pattern: String.raw`\b[A-Za-z0-9+/]{64,}={0,2}\b`
|
|
1226
|
-
},
|
|
1227
1404
|
// AWS Keys
|
|
1228
1405
|
{
|
|
1229
1406
|
name: "aws_access_keys",
|
|
1230
1407
|
pattern: String.raw`\b(?:AKIA|ABIA|ACCA|ASIA)[0-9A-Z]{16}\b`
|
|
1231
1408
|
},
|
|
1232
|
-
{
|
|
1233
|
-
name: "aws_secret_keys",
|
|
1234
|
-
pattern: String.raw`\b[A-Za-z0-9/+=]*[A-Z][A-Za-z0-9/+=]*[a-z][A-Za-z0-9/+=]*[/+=][A-Za-z0-9/+=]{30,}\b`
|
|
1235
|
-
},
|
|
1236
1409
|
// GitHub tokens
|
|
1237
1410
|
{
|
|
1238
1411
|
name: "github_tokens",
|
|
@@ -1263,11 +1436,6 @@ var DEFAULT_PII_PATTERNS = [
|
|
|
1263
1436
|
name: "ipv6_addresses",
|
|
1264
1437
|
pattern: String.raw`\b(?:[0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}\b`
|
|
1265
1438
|
},
|
|
1266
|
-
// Medical records
|
|
1267
|
-
{
|
|
1268
|
-
name: "medical_record_numbers",
|
|
1269
|
-
pattern: String.raw`\b(?:[Mm][Rr][Nn])[-\s]?\d{6,10}\b`
|
|
1270
|
-
},
|
|
1271
1439
|
// Bitcoin addresses
|
|
1272
1440
|
{
|
|
1273
1441
|
name: "bitcoin_addresses",
|
|
@@ -1278,11 +1446,6 @@ var DEFAULT_PII_PATTERNS = [
|
|
|
1278
1446
|
name: "ethereum_addresses",
|
|
1279
1447
|
pattern: String.raw`\b0x[a-fA-F0-9]{40}(?![a-fA-F0-9])\b`
|
|
1280
1448
|
},
|
|
1281
|
-
// UUIDs
|
|
1282
|
-
{
|
|
1283
|
-
name: "uuids",
|
|
1284
|
-
pattern: String.raw`\b[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}(?![0-9a-fA-F-])\b`
|
|
1285
|
-
},
|
|
1286
1449
|
// Database connection strings
|
|
1287
1450
|
{
|
|
1288
1451
|
name: "database_connections",
|
|
@@ -1301,90 +1464,6 @@ var DEFAULT_PII_PATTERNS = [
|
|
|
1301
1464
|
name: "certificates",
|
|
1302
1465
|
pattern: "-----BEGIN CERTIFICATE-----"
|
|
1303
1466
|
},
|
|
1304
|
-
// Date of birth patterns
|
|
1305
|
-
{
|
|
1306
|
-
name: "date_of_birth_us",
|
|
1307
|
-
pattern: String.raw`\b(?:0[1-9]|1[0-2])[-/](?:0[1-9]|[12]\\d|3[01])[-/](?:19|20)\\d{2}\b`
|
|
1308
|
-
},
|
|
1309
|
-
{
|
|
1310
|
-
name: "date_of_birth_iso",
|
|
1311
|
-
pattern: String.raw`\b(?:19|20)\\d{2}[-/](?:0[1-9]|1[0-2])[-/](?:0[1-9]|[12]\\d|3[01])\b`
|
|
1312
|
-
},
|
|
1313
|
-
// US Identification Numbers
|
|
1314
|
-
{
|
|
1315
|
-
name: "us_passport_numbers",
|
|
1316
|
-
pattern: String.raw`\b[A-Z]?\\d{6,9}\b`
|
|
1317
|
-
},
|
|
1318
|
-
{
|
|
1319
|
-
name: "drivers_license",
|
|
1320
|
-
pattern: String.raw`\b[A-Z]{1,2}\\d{3,8}[-\s]?\\d{2,5}[-\s]?\\d{2,5}[-\s]?\\d{1,5}[-\s]?\\d?\b`
|
|
1321
|
-
},
|
|
1322
|
-
{
|
|
1323
|
-
name: "bank_account_numbers",
|
|
1324
|
-
pattern: String.raw`\b\\d{10,17}\b`
|
|
1325
|
-
},
|
|
1326
|
-
{
|
|
1327
|
-
name: "aba_routing_numbers",
|
|
1328
|
-
pattern: String.raw`\b((0[0-9])|(1[0-2])|(2[1-9])|(3[0-2])|(6[1-9])|(7[0-2])|80)([0-9]{7})\b`
|
|
1329
|
-
},
|
|
1330
|
-
{
|
|
1331
|
-
name: "health_insurance_numbers",
|
|
1332
|
-
pattern: String.raw`\b\\d{10}[A-Z]\b`
|
|
1333
|
-
},
|
|
1334
|
-
{
|
|
1335
|
-
name: "employee_ids",
|
|
1336
|
-
pattern: String.raw`\b(?:[Ee][Mm][Pp]|[Ee][Mm][Pp][Ll][Oo][Yy][Ee][Ee]|[Ee])[-\s]?\\d{5,8}\b`
|
|
1337
|
-
},
|
|
1338
|
-
{
|
|
1339
|
-
name: "tax_ein",
|
|
1340
|
-
pattern: String.raw`\b\\d{2}-\\d{7}\b`
|
|
1341
|
-
},
|
|
1342
|
-
{
|
|
1343
|
-
name: "medicare_beneficiary_id",
|
|
1344
|
-
pattern: String.raw`\b[1-9][A-Z][A-Z0-9]\\d-[A-Z][A-Z0-9]\\d-[A-Z][A-Z0-9]\\d{2}\b`
|
|
1345
|
-
},
|
|
1346
|
-
{
|
|
1347
|
-
name: "national_provider_id",
|
|
1348
|
-
pattern: String.raw`\b1\\d{9}\b`
|
|
1349
|
-
},
|
|
1350
|
-
{
|
|
1351
|
-
name: "dea_numbers",
|
|
1352
|
-
pattern: String.raw`\b[A-Z]{2}\\d{7}\b`
|
|
1353
|
-
},
|
|
1354
|
-
{
|
|
1355
|
-
name: "itin",
|
|
1356
|
-
pattern: String.raw`\b9\\d{2}(?:[ \\-]?)[7,8]\\d(?:[ \\-]?)\\d{4}\b`
|
|
1357
|
-
},
|
|
1358
|
-
// Vehicle and Location
|
|
1359
|
-
{
|
|
1360
|
-
name: "vin_numbers",
|
|
1361
|
-
pattern: String.raw`\b[A-HJ-NPR-Z0-9]{17}\b`
|
|
1362
|
-
},
|
|
1363
|
-
{
|
|
1364
|
-
name: "coordinates",
|
|
1365
|
-
pattern: String.raw`\b[-+]?(?:[0-8]?\\d(?:\\.\\d+)?|90(?:\\.0+)?),\\s*[-+]?(?:1[0-7]\\d(?:\\.\\d+)?|180(?:\\.0+)?|[0-9]?\\d(?:\\.\\d+)?)\b`
|
|
1366
|
-
},
|
|
1367
|
-
{
|
|
1368
|
-
name: "us_license_plates",
|
|
1369
|
-
pattern: String.raw`\b[A-Z]{1,3}[-\s]\\d{1,4}[A-Z]?\b|\b\\d{1,2}[A-Z]{1,3}\\d{1,4}\b`
|
|
1370
|
-
},
|
|
1371
|
-
{
|
|
1372
|
-
name: "us_zip_codes",
|
|
1373
|
-
pattern: String.raw`\b(\\d{5}-\\d{4}|\\d{5})\b`
|
|
1374
|
-
},
|
|
1375
|
-
{
|
|
1376
|
-
name: "us_street_addresses",
|
|
1377
|
-
pattern: String.raw`\b\\d{1,8}\b[\\s\\S]{10,100}?\b(AK|AL|AR|AZ|CA|CO|CT|DC|DE|FL|GA|HI|IA|ID|IL|IN|KS|KY|LA|MA|MD|ME|MI|MN|MO|MS|MT|NC|ND|NE|NH|NJ|NM|NV|NY|OH|OK|OR|PA|RI|SC|SD|TN|TX|UT|VA|VT|WA|WI|WV|WY)\b\\s\\d{5}\b`
|
|
1378
|
-
},
|
|
1379
|
-
// International Banking
|
|
1380
|
-
{
|
|
1381
|
-
name: "iban",
|
|
1382
|
-
pattern: String.raw`\b[A-Z]{2}\d{2}[A-Z0-9]{4}\d{7}([A-Z0-9]?){0,16}\b`
|
|
1383
|
-
},
|
|
1384
|
-
{
|
|
1385
|
-
name: "swift_bic",
|
|
1386
|
-
pattern: String.raw`\b[A-Z]{4}[A-Z]{2}[A-Z0-9]{2}([A-Z0-9]{3})?\b`
|
|
1387
|
-
},
|
|
1388
1467
|
// Additional API Keys and Tokens
|
|
1389
1468
|
{
|
|
1390
1469
|
name: "google_oauth",
|
|
@@ -1447,73 +1526,6 @@ var DEFAULT_PII_PATTERNS = [
|
|
|
1447
1526
|
name: "putty_ssh_keys",
|
|
1448
1527
|
pattern: String.raw`PuTTY-User-Key-File-2: ssh-(?:rsa|dss)\s*Encryption: none(?:.|\s?)*?Private-MAC:`
|
|
1449
1528
|
},
|
|
1450
|
-
// International Phone Numbers
|
|
1451
|
-
{
|
|
1452
|
-
name: "france_phone_numbers",
|
|
1453
|
-
pattern: String.raw`\b([0O]?[1lI][1lI])?[3E][3E][0O]?[\\dOIlZEASB]{9}\b`
|
|
1454
|
-
},
|
|
1455
|
-
{
|
|
1456
|
-
name: "german_phone_numbers",
|
|
1457
|
-
pattern: String.raw`\b[\d\w]\d{2}[\d\w]{6}\d[\d\w]\b`
|
|
1458
|
-
},
|
|
1459
|
-
{
|
|
1460
|
-
name: "uk_phone_numbers",
|
|
1461
|
-
pattern: String.raw`\b([0O]?[1lI][1lI])?[4A][4A][\\dOIlZEASB]{10,11}\b`
|
|
1462
|
-
},
|
|
1463
|
-
// International IDs
|
|
1464
|
-
{
|
|
1465
|
-
name: "uk_drivers_license",
|
|
1466
|
-
pattern: String.raw`\b[A-Z]{5}\d{6}[A-Z]{2}\d{1}[A-Z]{2}\b`
|
|
1467
|
-
},
|
|
1468
|
-
{
|
|
1469
|
-
name: "uk_passport",
|
|
1470
|
-
pattern: String.raw`\b\\d{10}GB[RP]\\d{7}[UMF]{1}\\d{9}\b`
|
|
1471
|
-
},
|
|
1472
|
-
{
|
|
1473
|
-
name: "argentina_dni",
|
|
1474
|
-
pattern: String.raw`\b\\d{2}\\.\\d{3}\\.\\d{3}\b`
|
|
1475
|
-
},
|
|
1476
|
-
{
|
|
1477
|
-
name: "australia_tfn",
|
|
1478
|
-
pattern: String.raw`\b[Tt][Ff][Nn](:|:\\s|\\s|)(\\d{8,9})\b`
|
|
1479
|
-
},
|
|
1480
|
-
{
|
|
1481
|
-
name: "canada_passport",
|
|
1482
|
-
pattern: String.raw`\b[\\w]{2}[\\d]{6}\b`
|
|
1483
|
-
},
|
|
1484
|
-
{
|
|
1485
|
-
name: "croatia_vat",
|
|
1486
|
-
pattern: String.raw`\bHR\\d{11}\b`
|
|
1487
|
-
},
|
|
1488
|
-
{
|
|
1489
|
-
name: "czech_vat",
|
|
1490
|
-
pattern: String.raw`\bCZ\\d{8,10}\b`
|
|
1491
|
-
},
|
|
1492
|
-
{
|
|
1493
|
-
name: "denmark_personal_id",
|
|
1494
|
-
pattern: String.raw`\b(?:\\d{10}|\\d{6}[-\\s]\\d{4})\b`
|
|
1495
|
-
},
|
|
1496
|
-
{
|
|
1497
|
-
name: "france_national_id",
|
|
1498
|
-
pattern: String.raw`\b\\d{12}\b`
|
|
1499
|
-
},
|
|
1500
|
-
{
|
|
1501
|
-
name: "france_ssn",
|
|
1502
|
-
pattern: String.raw`\b(?:\\d{13}|\\d{13}\\s\\d{2})\b`
|
|
1503
|
-
},
|
|
1504
|
-
{
|
|
1505
|
-
name: "france_passport",
|
|
1506
|
-
pattern: String.raw`\b\\d{2}11\\d{5}\b`
|
|
1507
|
-
},
|
|
1508
|
-
{
|
|
1509
|
-
name: "california_drivers_license",
|
|
1510
|
-
pattern: String.raw`\b[A-Z]{1}\\d{7}\b`
|
|
1511
|
-
},
|
|
1512
|
-
// Medical and Healthcare
|
|
1513
|
-
{
|
|
1514
|
-
name: "hipaa_ndc",
|
|
1515
|
-
pattern: String.raw`\b\\d{4,5}-\\d{3,4}-\\d{1,2}\b`
|
|
1516
|
-
},
|
|
1517
1529
|
// Security and Network
|
|
1518
1530
|
{
|
|
1519
1531
|
name: "cve_numbers",
|
|
@@ -1547,44 +1559,6 @@ var DEFAULT_PII_PATTERNS = [
|
|
|
1547
1559
|
{
|
|
1548
1560
|
name: "discover_cards",
|
|
1549
1561
|
pattern: String.raw`\b65[4-9][0-9]{13}|64[4-9][0-9]{13}|6011[0-9]{12}\b`
|
|
1550
|
-
},
|
|
1551
|
-
{
|
|
1552
|
-
name: "enhanced_credit_cards",
|
|
1553
|
-
pattern: String.raw`\b((4\\d{3}|5[1-5]\\d{2}|2\\d{3}|3[47]\\d{1,2})[\\s\\-]?\\d{4,6}[\\s\\-]?\\d{4,6}?([\\s\\-]\\d{3,4})?(\\d{3})?)\b`
|
|
1554
|
-
},
|
|
1555
|
-
// Bank Routing Numbers (US specific)
|
|
1556
|
-
{
|
|
1557
|
-
name: "bbva_routing_ca",
|
|
1558
|
-
pattern: String.raw`\\b321170538\\b`
|
|
1559
|
-
},
|
|
1560
|
-
{
|
|
1561
|
-
name: "boa_routing_ca",
|
|
1562
|
-
pattern: String.raw`\\b(?:121|026)00(?:0|9)(?:358|593)\\b`
|
|
1563
|
-
},
|
|
1564
|
-
{
|
|
1565
|
-
name: "chase_routing_ca",
|
|
1566
|
-
pattern: String.raw`\\b322271627\\b`
|
|
1567
|
-
},
|
|
1568
|
-
{
|
|
1569
|
-
name: "citibank_routing_ca",
|
|
1570
|
-
pattern: String.raw`\\b32(?:11|22)71(?:18|72)4\\b`
|
|
1571
|
-
},
|
|
1572
|
-
{
|
|
1573
|
-
name: "usbank_routing_ca",
|
|
1574
|
-
pattern: String.raw`\\b12(?:1122676|2235821)\\b`
|
|
1575
|
-
},
|
|
1576
|
-
{
|
|
1577
|
-
name: "united_bank_routing_ca",
|
|
1578
|
-
pattern: String.raw`\\b122243350\\b`
|
|
1579
|
-
},
|
|
1580
|
-
{
|
|
1581
|
-
name: "wells_fargo_routing_ca",
|
|
1582
|
-
pattern: String.raw`\\b121042882\\b`
|
|
1583
|
-
},
|
|
1584
|
-
// Unrealistic alphanumeric identifiers
|
|
1585
|
-
{
|
|
1586
|
-
name: "generic_non_usual",
|
|
1587
|
-
pattern: String.raw`(?:^|\s)(?=[A-Za-z0-9_\)\*\=@]*[A-Za-z])(?=[A-Za-z0-9_\)\*\=@]*[0-9])([A-Za-z0-9_\)\*\=@]{5,})(?=\s|$)`
|
|
1588
1562
|
}
|
|
1589
1563
|
];
|
|
1590
1564
|
|
|
@@ -1806,7 +1780,7 @@ function maskAttributes(attributes, rules, outputOriginalValue = false) {
|
|
|
1806
1780
|
}
|
|
1807
1781
|
|
|
1808
1782
|
// src/internal/log/processors/log-processor.ts
|
|
1809
|
-
|
|
1783
|
+
init_semantic_conventions2();
|
|
1810
1784
|
var DEFAULT_LOG_MASKING_RULES = [
|
|
1811
1785
|
{
|
|
1812
1786
|
mode: "partial",
|
|
@@ -2251,7 +2225,7 @@ import {
|
|
|
2251
2225
|
BatchSpanProcessor,
|
|
2252
2226
|
SimpleSpanProcessor
|
|
2253
2227
|
} from "@opentelemetry/sdk-trace-base";
|
|
2254
|
-
|
|
2228
|
+
init_semantic_conventions2();
|
|
2255
2229
|
function applyContextAttributes(span) {
|
|
2256
2230
|
const sessionProperties = context4.active().getValue(PROPERTIES_CONTEXT_KEY);
|
|
2257
2231
|
if (sessionProperties) {
|
|
@@ -2263,12 +2237,6 @@ function applyContextAttributes(span) {
|
|
|
2263
2237
|
var DEFAULT_MASKING_RULES = [
|
|
2264
2238
|
{
|
|
2265
2239
|
mode: "partial",
|
|
2266
|
-
attributePattern: "gen_ai.prompt",
|
|
2267
|
-
patterns: DEFAULT_PII_PATTERNS
|
|
2268
|
-
},
|
|
2269
|
-
{
|
|
2270
|
-
mode: "partial",
|
|
2271
|
-
attributePattern: "gen_ai.completion",
|
|
2272
2240
|
patterns: DEFAULT_PII_PATTERNS
|
|
2273
2241
|
}
|
|
2274
2242
|
];
|
|
@@ -2278,24 +2246,16 @@ var BrizzSimpleSpanProcessor = class extends SimpleSpanProcessor {
|
|
|
2278
2246
|
super(spanExporter);
|
|
2279
2247
|
this.config = config;
|
|
2280
2248
|
}
|
|
2281
|
-
// Will work with the following code:
|
|
2282
|
-
// const span = tracer.startSpan('sensitive-operation',{attributes:{
|
|
2283
|
-
// 'user.password': 'secret123',
|
|
2284
|
-
// 'user.email': 'user@example.com',
|
|
2285
|
-
// }});
|
|
2286
|
-
//
|
|
2287
|
-
// Won't work because onStart is called before attributes are set:
|
|
2288
|
-
// span.setAttributes({
|
|
2289
|
-
// 'user.password': 'secret123',
|
|
2290
|
-
// 'user.email': 'user@example.com'
|
|
2291
|
-
// });
|
|
2292
2249
|
onStart(span, parentContext) {
|
|
2250
|
+
applyContextAttributes(span);
|
|
2251
|
+
super.onStart(span, parentContext);
|
|
2252
|
+
}
|
|
2253
|
+
onEnd(span) {
|
|
2293
2254
|
const maskingConfig = this.config.masking?.spanMasking;
|
|
2294
2255
|
if (maskingConfig) {
|
|
2295
|
-
|
|
2256
|
+
maskReadableSpan(span, maskingConfig);
|
|
2296
2257
|
}
|
|
2297
|
-
|
|
2298
|
-
super.onStart(span, parentContext);
|
|
2258
|
+
super.onEnd(span);
|
|
2299
2259
|
}
|
|
2300
2260
|
};
|
|
2301
2261
|
var BrizzBatchSpanProcessor = class extends BatchSpanProcessor {
|
|
@@ -2305,39 +2265,39 @@ var BrizzBatchSpanProcessor = class extends BatchSpanProcessor {
|
|
|
2305
2265
|
this.config = config;
|
|
2306
2266
|
}
|
|
2307
2267
|
onStart(span, parentContext) {
|
|
2268
|
+
applyContextAttributes(span);
|
|
2269
|
+
super.onStart(span, parentContext);
|
|
2270
|
+
}
|
|
2271
|
+
onEnd(span) {
|
|
2308
2272
|
const maskingConfig = this.config.masking?.spanMasking;
|
|
2309
2273
|
if (maskingConfig) {
|
|
2310
|
-
|
|
2274
|
+
maskReadableSpan(span, maskingConfig);
|
|
2311
2275
|
}
|
|
2312
|
-
|
|
2313
|
-
super.onStart(span, parentContext);
|
|
2276
|
+
super.onEnd(span);
|
|
2314
2277
|
}
|
|
2315
2278
|
};
|
|
2316
|
-
function
|
|
2317
|
-
|
|
2318
|
-
|
|
2279
|
+
function maskReadableSpan(span, config) {
|
|
2280
|
+
const attrs = span.attributes;
|
|
2281
|
+
if (!attrs || Object.keys(attrs).length === 0) {
|
|
2282
|
+
return;
|
|
2319
2283
|
}
|
|
2320
|
-
let rules = config.rules
|
|
2284
|
+
let rules = config.rules ? [...config.rules] : [];
|
|
2321
2285
|
if (!config.disableDefaultRules) {
|
|
2322
|
-
rules = [...
|
|
2286
|
+
rules = [...rules, ...DEFAULT_MASKING_RULES];
|
|
2323
2287
|
}
|
|
2324
2288
|
try {
|
|
2325
|
-
const
|
|
2326
|
-
for (const [
|
|
2327
|
-
|
|
2328
|
-
}
|
|
2329
|
-
const
|
|
2330
|
-
|
|
2331
|
-
|
|
2332
|
-
|
|
2333
|
-
merged[key] = value;
|
|
2289
|
+
const input = {};
|
|
2290
|
+
for (const [k, v] of Object.entries(attrs)) {
|
|
2291
|
+
input[k] = v;
|
|
2292
|
+
}
|
|
2293
|
+
const masked = maskAttributes(input, rules);
|
|
2294
|
+
for (const [k, v] of Object.entries(masked ?? {})) {
|
|
2295
|
+
if (attrs[k] !== v) {
|
|
2296
|
+
attrs[k] = v;
|
|
2334
2297
|
}
|
|
2335
|
-
span.setAttributes(merged);
|
|
2336
2298
|
}
|
|
2337
|
-
return span;
|
|
2338
2299
|
} catch (error) {
|
|
2339
|
-
logger.error("Error masking span
|
|
2340
|
-
return span;
|
|
2300
|
+
logger.error("Error masking span", { err: error });
|
|
2341
2301
|
}
|
|
2342
2302
|
}
|
|
2343
2303
|
|
|
@@ -2453,8 +2413,8 @@ function getSpanProcessor() {
|
|
|
2453
2413
|
}
|
|
2454
2414
|
|
|
2455
2415
|
// src/internal/trace/session.ts
|
|
2456
|
-
|
|
2457
|
-
import { context as context5, trace as trace3, SpanStatusCode as
|
|
2416
|
+
init_semantic_conventions2();
|
|
2417
|
+
import { context as context5, trace as trace3, SpanStatusCode as SpanStatusCode3 } from "@opentelemetry/api";
|
|
2458
2418
|
function setCurrentSpanCustomProperties(properties) {
|
|
2459
2419
|
const current = trace3.getActiveSpan();
|
|
2460
2420
|
if (!current || !current.isRecording()) {
|
|
@@ -2605,7 +2565,7 @@ function startSession(sessionId, callback, extraProperties, options) {
|
|
|
2605
2565
|
return value;
|
|
2606
2566
|
}).catch((error) => {
|
|
2607
2567
|
span.recordException(error);
|
|
2608
|
-
span.setStatus({ code:
|
|
2568
|
+
span.setStatus({ code: SpanStatusCode3.ERROR });
|
|
2609
2569
|
span.end();
|
|
2610
2570
|
throw error;
|
|
2611
2571
|
});
|
|
@@ -2614,7 +2574,7 @@ function startSession(sessionId, callback, extraProperties, options) {
|
|
|
2614
2574
|
return result;
|
|
2615
2575
|
} catch (error) {
|
|
2616
2576
|
span.recordException(error);
|
|
2617
|
-
span.setStatus({ code:
|
|
2577
|
+
span.setStatus({ code: SpanStatusCode3.ERROR });
|
|
2618
2578
|
span.end();
|
|
2619
2579
|
throw error;
|
|
2620
2580
|
}
|
|
@@ -2643,7 +2603,7 @@ function startSessionTitle(callback, options) {
|
|
|
2643
2603
|
return value;
|
|
2644
2604
|
}).catch((error) => {
|
|
2645
2605
|
span.recordException(error);
|
|
2646
|
-
span.setStatus({ code:
|
|
2606
|
+
span.setStatus({ code: SpanStatusCode3.ERROR });
|
|
2647
2607
|
span.end();
|
|
2648
2608
|
throw error;
|
|
2649
2609
|
});
|
|
@@ -2652,7 +2612,7 @@ function startSessionTitle(callback, options) {
|
|
|
2652
2612
|
return result;
|
|
2653
2613
|
} catch (error) {
|
|
2654
2614
|
span.recordException(error);
|
|
2655
|
-
span.setStatus({ code:
|
|
2615
|
+
span.setStatus({ code: SpanStatusCode3.ERROR });
|
|
2656
2616
|
span.end();
|
|
2657
2617
|
throw error;
|
|
2658
2618
|
}
|
|
@@ -2939,4 +2899,3 @@ export {
|
|
|
2939
2899
|
withProperties,
|
|
2940
2900
|
withSessionId
|
|
2941
2901
|
};
|
|
2942
|
-
//# sourceMappingURL=index.js.map
|