autotel
Version:
Write Once, Observe Anywhere
95 lines (93 loc) • 3.51 kB
JavaScript
;
// src/span-name-normalizer.ts
var NORMALIZER_PATTERNS = {
// Numeric IDs: /users/123 → /users/:id
numericId: /\/\d+(?=\/|$)/g,
// UUIDs: /users/550e8400-e29b-41d4-a716-446655440000 → /users/:uuid
uuid: /\/[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}(?=\/|$)/gi,
// Short UUIDs (without dashes): /users/550e8400e29b41d4a716446655440000 → /users/:uuid
shortUuid: /\/[0-9a-f]{32}(?=\/|$)/gi,
// MongoDB ObjectIds: /docs/507f1f77bcf86cd799439011 → /docs/:objectId
objectId: /\/[0-9a-f]{24}(?=\/|$)/gi,
// Hashes (6+ hex chars): /assets/abc123def.js → /assets/:hash.js
hash: /\/[0-9a-f]{6,}(?=\.[a-z]+$)/gi,
// ISO dates: /logs/2024-01-15 → /logs/:date
isoDate: /\/\d{4}-\d{2}-\d{2}(?=\/|$)/g,
// Timestamps: /events/1705334400 → /events/:timestamp
timestamp: /\/1[0-9]{9}(?=\/|$)/g,
// Email-like segments: /users/john@example.com → /users/:email
email: /\/[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}(?=\/|$)/g
};
var NORMALIZER_PRESETS = {
/**
* REST API preset - normalizes common REST path patterns
* Handles: numeric IDs, UUIDs, ObjectIds, dates, timestamps, emails
*/
"rest-api": (name) => {
return name.replaceAll(NORMALIZER_PATTERNS.uuid, "/:uuid").replaceAll(NORMALIZER_PATTERNS.shortUuid, "/:uuid").replaceAll(NORMALIZER_PATTERNS.objectId, "/:objectId").replaceAll(NORMALIZER_PATTERNS.isoDate, "/:date").replaceAll(NORMALIZER_PATTERNS.timestamp, "/:timestamp").replaceAll(NORMALIZER_PATTERNS.email, "/:email").replaceAll(NORMALIZER_PATTERNS.numericId, "/:id");
},
/**
* GraphQL preset - normalizes GraphQL operation names and paths
* Keeps query/mutation names but normalizes embedded IDs
*/
graphql: (name) => {
return name.replaceAll(NORMALIZER_PATTERNS.uuid, "/:uuid").replaceAll(NORMALIZER_PATTERNS.numericId, "/:id");
},
/**
* Minimal preset - only normalizes numeric IDs and UUIDs
*/
minimal: (name) => {
return name.replaceAll(NORMALIZER_PATTERNS.uuid, "/:uuid").replaceAll(NORMALIZER_PATTERNS.numericId, "/:id");
}
};
function resolveNormalizer(config) {
if (typeof config === "function") {
return config;
}
const preset = NORMALIZER_PRESETS[config];
if (!preset) {
throw new Error(
`Unknown span name normalizer preset: "${config}". Available presets: ${Object.keys(NORMALIZER_PRESETS).join(", ")}`
);
}
return preset;
}
var SpanNameNormalizingProcessor = class {
wrappedProcessor;
normalizer;
constructor(wrappedProcessor, options) {
this.wrappedProcessor = wrappedProcessor;
this.normalizer = resolveNormalizer(options.normalizer);
}
/**
* Normalize span name on start (when Span is mutable)
*/
onStart(span, parentContext) {
try {
const originalName = span.name;
const normalizedName = this.normalizer(originalName);
if (normalizedName !== originalName) {
span.updateName(normalizedName);
}
} catch {
}
this.wrappedProcessor.onStart(span, parentContext);
}
/**
* Pass through onEnd unchanged
*/
onEnd(span) {
this.wrappedProcessor.onEnd(span);
}
forceFlush() {
return this.wrappedProcessor.forceFlush();
}
shutdown() {
return this.wrappedProcessor.shutdown();
}
};
exports.NORMALIZER_PATTERNS = NORMALIZER_PATTERNS;
exports.NORMALIZER_PRESETS = NORMALIZER_PRESETS;
exports.SpanNameNormalizingProcessor = SpanNameNormalizingProcessor;
//# sourceMappingURL=chunk-IOYFAFHJ.cjs.map
//# sourceMappingURL=chunk-IOYFAFHJ.cjs.map