autotel
Version:
Write Once, Observe Anywhere
1 lines • 51.7 kB
Source Map (JSON)
{"version":3,"file":"attributes-PZ5doLgw.cjs","names":["UserAttributes","SessionAttributes","DeviceAttributes","HTTPAttributes","DBAttributes","ServiceAttributes","NetworkAttributes","ServerAddressAttributes","URLAttributes","ErrorAttributes","ExceptionAttributes","ProcessAttributes","ThreadAttributes","ContainerAttributes","K8sAttributes","CloudAttributes","FaaSAttributes","FeatureFlagAttributes","MessagingAttributes","RPCAttributes","GraphQLAttributes","OTelAttributes","CodeAttributes","TLSAttributes","REDACTOR_PATTERNS"],"sources":["../src/attributes/builders.ts","../src/attributes/validators.ts","../src/attributes/utils.ts","../src/attributes/attachers.ts","../src/attributes/domains.ts"],"sourcesContent":["/**\n * Attribute builders for constructing OpenTelemetry attributes\n * Provides both key builders (Pattern A) and object builders (Pattern B)\n *\n * @example Pattern A: Key builders\n * ```typescript\n * attrs.user.id('123') // { 'user.id': '123' }\n * attrs.user.email('user@example.com') // { 'user.email': 'user@example.com' }\n * attrs.http.request.method('GET') // { 'http.request.method': 'GET' }\n * attrs.http.response.statusCode(200) // { 'http.response.status_code': 200 }\n * ```\n *\n * @example Pattern B: Object builders\n * ```typescript\n * attrs.user({ id: '123', email: 'user@example.com' })\n * attrs.http.server({ method: 'GET', route: '/users/:id', statusCode: 200 })\n * attrs.db.client({ system: 'postgresql', operation: 'SELECT', collectionName: 'users' })\n * ```\n */\n\nimport {\n UserAttributes,\n SessionAttributes,\n DeviceAttributes,\n HTTPAttributes,\n DBAttributes,\n ServiceAttributes,\n NetworkAttributes,\n ServerAddressAttributes,\n URLAttributes,\n ErrorAttributes,\n ExceptionAttributes,\n ProcessAttributes,\n ThreadAttributes,\n ContainerAttributes,\n K8sAttributes,\n CloudAttributes,\n FaaSAttributes,\n FeatureFlagAttributes,\n MessagingAttributes,\n RPCAttributes,\n GraphQLAttributes,\n OTelAttributes,\n CodeAttributes,\n TLSAttributes,\n} from './registry';\n\nimport type {\n UserAttrs,\n SessionAttrs,\n DeviceAttrs,\n HTTPServerAttrs,\n HTTPClientAttrs,\n DBAttrs,\n ServiceAttrs,\n NetworkAttrs,\n ErrorAttrs,\n MessagingAttrs,\n CloudAttrs,\n ServerAddressAttrs,\n URLAttrs,\n ProcessAttrs,\n ContainerAttrs,\n ExceptionAttrs,\n} from './types';\n\nexport const attrs = {\n user: {\n id: (value: string) => ({ [UserAttributes.id]: value }),\n email: (value: string) => ({ [UserAttributes.email]: value }),\n name: (value: string) => ({ [UserAttributes.name]: value }),\n fullName: (value: string) => ({ [UserAttributes.fullName]: value }),\n hash: (value: string) => ({ [UserAttributes.hash]: value }),\n roles: (value: string[]) => ({ [UserAttributes.roles]: value }),\n\n data: (data: UserAttrs) => {\n const result: Record<string, unknown> = {};\n if (data.id !== undefined) result[UserAttributes.id] = data.id;\n if (data.email !== undefined) result[UserAttributes.email] = data.email;\n if (data.name !== undefined) result[UserAttributes.name] = data.name;\n if (data.fullName !== undefined)\n result[UserAttributes.fullName] = data.fullName;\n if (data.hash !== undefined) result[UserAttributes.hash] = data.hash;\n if (data.roles !== undefined) result[UserAttributes.roles] = data.roles;\n return result;\n },\n },\n\n session: {\n id: (value: string) => ({ [SessionAttributes.id]: value }),\n previousId: (value: string) => ({ [SessionAttributes.previousId]: value }),\n\n data: (data: SessionAttrs) => {\n const result: Record<string, unknown> = {};\n if (data.id !== undefined) result[SessionAttributes.id] = data.id;\n if (data.previousId !== undefined)\n result[SessionAttributes.previousId] = data.previousId;\n return result;\n },\n },\n\n device: {\n id: (value: string) => ({ [DeviceAttributes.id]: value }),\n manufacturer: (value: string) => ({\n [DeviceAttributes.manufacturer]: value,\n }),\n modelIdentifier: (value: string) => ({\n [DeviceAttributes.modelIdentifier]: value,\n }),\n modelName: (value: string) => ({ [DeviceAttributes.modelName]: value }),\n\n data: (data: DeviceAttrs) => {\n const result: Record<string, unknown> = {};\n if (data.id !== undefined) result[DeviceAttributes.id] = data.id;\n if (data.manufacturer !== undefined)\n result[DeviceAttributes.manufacturer] = data.manufacturer;\n if (data.modelIdentifier !== undefined)\n result[DeviceAttributes.modelIdentifier] = data.modelIdentifier;\n if (data.modelName !== undefined)\n result[DeviceAttributes.modelName] = data.modelName;\n return result;\n },\n },\n\n http: {\n request: {\n method: (value: string) => ({ [HTTPAttributes.requestMethod]: value }),\n methodOriginal: (value: string) => ({\n [HTTPAttributes.requestMethodOriginal]: value,\n }),\n resendCount: (value: number) => ({\n [HTTPAttributes.requestResendCount]: value,\n }),\n size: (value: number) => ({ [HTTPAttributes.requestSize]: value }),\n bodySize: (value: number) => ({\n [HTTPAttributes.requestBodySize]: value,\n }),\n },\n\n response: {\n statusCode: (value: number) => ({\n [HTTPAttributes.responseStatusCode]: value,\n }),\n size: (value: number) => ({ [HTTPAttributes.responseSize]: value }),\n bodySize: (value: number) => ({\n [HTTPAttributes.responseBodySize]: value,\n }),\n },\n\n route: (value: string) => ({ [HTTPAttributes.route]: value }),\n connectionState: (value: string) => ({\n [HTTPAttributes.connectionState]: value,\n }),\n\n server: (data: HTTPServerAttrs) => {\n const result: Record<string, unknown> = {};\n if (data.method !== undefined)\n result[HTTPAttributes.requestMethod] = data.method;\n if (data.route !== undefined) result[HTTPAttributes.route] = data.route;\n if (data.statusCode !== undefined)\n result[HTTPAttributes.responseStatusCode] = data.statusCode;\n if (data.bodySize !== undefined)\n result[HTTPAttributes.requestBodySize] = data.bodySize;\n if (data.requestSize !== undefined)\n result[HTTPAttributes.requestSize] = data.requestSize;\n if (data.responseSize !== undefined)\n result[HTTPAttributes.responseSize] = data.responseSize;\n if (data.resendCount !== undefined)\n result[HTTPAttributes.requestResendCount] = data.resendCount;\n return result;\n },\n\n client: (data: HTTPClientAttrs) => {\n const result: Record<string, unknown> = {};\n if (data.method !== undefined)\n result[HTTPAttributes.requestMethod] = data.method;\n if (data.url !== undefined) result[HTTPAttributes.route] = data.url;\n if (data.statusCode !== undefined)\n result[HTTPAttributes.responseStatusCode] = data.statusCode;\n return result;\n },\n },\n\n db: {\n client: {\n system: (value: string) => ({ [DBAttributes.systemName]: value }),\n operation: (value: string) => ({ [DBAttributes.operationName]: value }),\n collectionName: (value: string) => ({\n [DBAttributes.collectionName]: value,\n }),\n namespace: (value: string) => ({ [DBAttributes.namespace]: value }),\n statement: (value: string) => ({ [DBAttributes.statement]: value }),\n querySummary: (value: string) => ({ [DBAttributes.querySummary]: value }),\n queryText: (value: string) => ({ [DBAttributes.queryText]: value }),\n responseStatus: (value: string | number) => ({\n [DBAttributes.responseStatusCode]: value,\n }),\n rowsReturned: (value: number) => ({\n [DBAttributes.responseReturnedRows]: value,\n }),\n\n data: (data: DBAttrs) => {\n const result: Record<string, unknown> = {};\n if (data.system !== undefined)\n result[DBAttributes.systemName] = data.system;\n if (data.operation !== undefined)\n result[DBAttributes.operationName] = data.operation;\n if (data.collectionName !== undefined)\n result[DBAttributes.collectionName] = data.collectionName;\n // 'name' maps to db.namespace (db.name is deprecated per OTel semantic conventions)\n if (data.name !== undefined) result[DBAttributes.namespace] = data.name;\n // 'namespace' takes precedence over 'name' if both are provided\n if (data.namespace !== undefined)\n result[DBAttributes.namespace] = data.namespace;\n if (data.statement !== undefined)\n result[DBAttributes.statement] = data.statement;\n if (data.querySummary !== undefined)\n result[DBAttributes.querySummary] = data.querySummary;\n if (data.queryText !== undefined)\n result[DBAttributes.queryText] = data.queryText;\n if (data.responseStatus !== undefined)\n result[DBAttributes.responseStatusCode] = data.responseStatus;\n if (data.rowsReturned !== undefined)\n result[DBAttributes.responseReturnedRows] = data.rowsReturned;\n return result;\n },\n },\n },\n\n service: {\n name: (value: string) => ({ [ServiceAttributes.name]: value }),\n instance: (value: string) => ({ [ServiceAttributes.instance]: value }),\n version: (value: string) => ({ [ServiceAttributes.version]: value }),\n\n data: (data: ServiceAttrs) => {\n const result: Record<string, unknown> = {};\n if (data.name !== undefined) result[ServiceAttributes.name] = data.name;\n if (data.instance !== undefined)\n result[ServiceAttributes.instance] = data.instance;\n if (data.version !== undefined)\n result[ServiceAttributes.version] = data.version;\n return result;\n },\n },\n\n network: {\n peerAddress: (value: string) => ({\n [NetworkAttributes.peerAddress]: value,\n }),\n peerPort: (value: number) => ({ [NetworkAttributes.peerPort]: value }),\n transport: (value: string) => ({ [NetworkAttributes.transport]: value }),\n protocolName: (value: string) => ({\n [NetworkAttributes.protocolName]: value,\n }),\n protocolVersion: (value: string) => ({\n [NetworkAttributes.protocolVersion]: value,\n }),\n\n data: (data: NetworkAttrs) => {\n const result: Record<string, unknown> = {};\n if (data.peerAddress !== undefined)\n result[NetworkAttributes.peerAddress] = data.peerAddress;\n if (data.peerPort !== undefined)\n result[NetworkAttributes.peerPort] = data.peerPort;\n if (data.transport !== undefined)\n result[NetworkAttributes.transport] = data.transport;\n if (data.protocolName !== undefined)\n result[NetworkAttributes.protocolName] = data.protocolName;\n if (data.protocolVersion !== undefined)\n result[NetworkAttributes.protocolVersion] = data.protocolVersion;\n return result;\n },\n },\n\n server: {\n address: (value: string) => ({ [ServerAddressAttributes.address]: value }),\n port: (value: number) => ({ [ServerAddressAttributes.port]: value }),\n socketAddress: (value: string) => ({\n [ServerAddressAttributes.socketAddress]: value,\n }),\n\n data: (data: ServerAddressAttrs) => {\n const result: Record<string, unknown> = {};\n if (data.address !== undefined)\n result[ServerAddressAttributes.address] = data.address;\n if (data.port !== undefined)\n result[ServerAddressAttributes.port] = data.port;\n if (data.socketAddress !== undefined)\n result[ServerAddressAttributes.socketAddress] = data.socketAddress;\n return result;\n },\n },\n\n url: {\n scheme: (value: string) => ({ [URLAttributes.scheme]: value }),\n full: (value: string) => ({ [URLAttributes.full]: value }),\n path: (value: string) => ({ [URLAttributes.path]: value }),\n query: (value: string) => ({ [URLAttributes.query]: value }),\n fragment: (value: string) => ({ [URLAttributes.fragment]: value }),\n\n data: (data: URLAttrs) => {\n const result: Record<string, unknown> = {};\n if (data.scheme !== undefined) result[URLAttributes.scheme] = data.scheme;\n if (data.full !== undefined) result[URLAttributes.full] = data.full;\n if (data.path !== undefined) result[URLAttributes.path] = data.path;\n if (data.query !== undefined) result[URLAttributes.query] = data.query;\n if (data.fragment !== undefined)\n result[URLAttributes.fragment] = data.fragment;\n return result;\n },\n },\n\n error: {\n type: (value: string) => ({ [ErrorAttributes.type]: value }),\n message: (value: string) => ({ [ErrorAttributes.message]: value }),\n stackTrace: (value: string) => ({ [ErrorAttributes.stackTrace]: value }),\n code: (value: string | number) => ({ [ErrorAttributes.code]: value }),\n\n data: (data: ErrorAttrs) => {\n const result: Record<string, unknown> = {};\n if (data.type !== undefined) result[ErrorAttributes.type] = data.type;\n if (data.message !== undefined)\n result[ErrorAttributes.message] = data.message;\n if (data.stackTrace !== undefined)\n result[ErrorAttributes.stackTrace] = data.stackTrace;\n if (data.code !== undefined) result[ErrorAttributes.code] = data.code;\n return result;\n },\n },\n\n exception: {\n escaped: (value: boolean) => ({ [ExceptionAttributes.escaped]: value }),\n message: (value: string) => ({ [ExceptionAttributes.message]: value }),\n stackTrace: (value: string) => ({\n [ExceptionAttributes.stackTrace]: value,\n }),\n type: (value: string) => ({ [ExceptionAttributes.type]: value }),\n moduleName: (value: string) => ({\n [ExceptionAttributes.moduleName]: value,\n }),\n\n data: (data: ExceptionAttrs) => {\n const result: Record<string, unknown> = {};\n if (data.escaped !== undefined)\n result[ExceptionAttributes.escaped] = data.escaped;\n if (data.message !== undefined)\n result[ExceptionAttributes.message] = data.message;\n if (data.stackTrace !== undefined)\n result[ExceptionAttributes.stackTrace] = data.stackTrace;\n if (data.type !== undefined) result[ExceptionAttributes.type] = data.type;\n if (data.moduleName !== undefined)\n result[ExceptionAttributes.moduleName] = data.moduleName;\n return result;\n },\n },\n\n process: {\n pid: (value: number) => ({ [ProcessAttributes.pid]: value }),\n executablePath: (value: string) => ({\n [ProcessAttributes.executablePath]: value,\n }),\n command: (value: string) => ({ [ProcessAttributes.command]: value }),\n owner: (value: string) => ({ [ProcessAttributes.owner]: value }),\n\n data: (data: ProcessAttrs) => {\n const result: Record<string, unknown> = {};\n if (data.pid !== undefined) result[ProcessAttributes.pid] = data.pid;\n if (data.executablePath !== undefined)\n result[ProcessAttributes.executablePath] = data.executablePath;\n if (data.command !== undefined)\n result[ProcessAttributes.command] = data.command;\n if (data.owner !== undefined)\n result[ProcessAttributes.owner] = data.owner;\n return result;\n },\n },\n\n thread: {\n id: (value: number) => ({ [ThreadAttributes.id]: value }),\n name: (value: string) => ({ [ThreadAttributes.name]: value }),\n },\n\n container: {\n id: (value: string) => ({ [ContainerAttributes.id]: value }),\n name: (value: string) => ({ [ContainerAttributes.name]: value }),\n image: (value: string) => ({ [ContainerAttributes.image]: value }),\n tag: (value: string) => ({ [ContainerAttributes.tag]: value }),\n\n data: (data: ContainerAttrs) => {\n const result: Record<string, unknown> = {};\n if (data.id !== undefined) result[ContainerAttributes.id] = data.id;\n if (data.name !== undefined) result[ContainerAttributes.name] = data.name;\n if (data.image !== undefined)\n result[ContainerAttributes.image] = data.image;\n if (data.tag !== undefined) result[ContainerAttributes.tag] = data.tag;\n return result;\n },\n },\n\n k8s: {\n podName: (value: string) => ({ [K8sAttributes.podName]: value }),\n namespaceName: (value: string) => ({\n [K8sAttributes.namespaceName]: value,\n }),\n deploymentName: (value: string) => ({\n [K8sAttributes.deploymentName]: value,\n }),\n state: (value: string) => ({ [K8sAttributes.state]: value }),\n },\n\n cloud: {\n provider: (value: string) => ({ [CloudAttributes.provider]: value }),\n accountId: (value: string) => ({ [CloudAttributes.accountId]: value }),\n region: (value: string) => ({ [CloudAttributes.region]: value }),\n availabilityZone: (value: string) => ({\n [CloudAttributes.availabilityZone]: value,\n }),\n platform: (value: string) => ({ [CloudAttributes.platform]: value }),\n\n data: (data: CloudAttrs) => {\n const result: Record<string, unknown> = {};\n if (data.provider !== undefined)\n result[CloudAttributes.provider] = data.provider;\n if (data.accountId !== undefined)\n result[CloudAttributes.accountId] = data.accountId;\n if (data.region !== undefined)\n result[CloudAttributes.region] = data.region;\n if (data.availabilityZone !== undefined)\n result[CloudAttributes.availabilityZone] = data.availabilityZone;\n if (data.platform !== undefined)\n result[CloudAttributes.platform] = data.platform;\n return result;\n },\n },\n\n faas: {\n name: (value: string) => ({ [FaaSAttributes.name]: value }),\n version: (value: string) => ({ [FaaSAttributes.version]: value }),\n instance: (value: string) => ({ [FaaSAttributes.instance]: value }),\n execution: (value: string) => ({ [FaaSAttributes.execution]: value }),\n coldstart: (value: boolean) => ({ [FaaSAttributes.coldstart]: value }),\n },\n\n featureFlag: {\n key: (value: string) => ({ [FeatureFlagAttributes.key]: value }),\n provider: (value: string) => ({ [FeatureFlagAttributes.provider]: value }),\n variant: (value: string) => ({ [FeatureFlagAttributes.variant]: value }),\n },\n\n messaging: {\n system: (value: string) => ({ [MessagingAttributes.system]: value }),\n destination: (value: string) => ({\n [MessagingAttributes.destination]: value,\n }),\n operation: (value: 'publish' | 'receive' | 'process') => ({\n [MessagingAttributes.operation]: value,\n }),\n messageId: (value: string) => ({ [MessagingAttributes.messageId]: value }),\n conversationId: (value: string) => ({\n [MessagingAttributes.conversationId]: value,\n }),\n\n data: (data: MessagingAttrs) => {\n const result: Record<string, unknown> = {};\n if (data.system !== undefined)\n result[MessagingAttributes.system] = data.system;\n if (data.destination !== undefined)\n result[MessagingAttributes.destination] = data.destination;\n if (data.operation !== undefined)\n result[MessagingAttributes.operation] = data.operation;\n if (data.messageId !== undefined)\n result[MessagingAttributes.messageId] = data.messageId;\n if (data.conversationId !== undefined)\n result[MessagingAttributes.conversationId] = data.conversationId;\n return result;\n },\n },\n\n // GenAI/LLM attribute builders moved to the `autotel-genai` package\n // (canonical `gen_ai.*` semantic conventions).\n\n rpc: {\n system: (value: string) => ({ [RPCAttributes.system]: value }),\n service: (value: string) => ({ [RPCAttributes.service]: value }),\n method: (value: string) => ({ [RPCAttributes.method]: value }),\n grpcStatusCode: (value: number) => ({\n [RPCAttributes.grpcStatusCode]: value,\n }),\n },\n\n graphql: {\n document: (value: string) => ({ [GraphQLAttributes.document]: value }),\n operationName: (value: string) => ({\n [GraphQLAttributes.operationName]: value,\n }),\n operationType: (value: 'query' | 'mutation' | 'subscription') => ({\n [GraphQLAttributes.operationType]: value,\n }),\n },\n\n otel: {\n libraryName: (value: string) => ({ [OTelAttributes.libraryName]: value }),\n libraryVersion: (value: string) => ({\n [OTelAttributes.libraryVersion]: value,\n }),\n statusCode: (value: string) => ({ [OTelAttributes.statusCode]: value }),\n },\n\n code: {\n namespace: (value: string) => ({ [CodeAttributes.namespace]: value }),\n filepath: (value: string) => ({ [CodeAttributes.filepath]: value }),\n function: (value: string) => ({ [CodeAttributes.function]: value }),\n class: (value: string) => ({ [CodeAttributes.class]: value }),\n method: (value: string) => ({ [CodeAttributes.method]: value }),\n column: (value: string) => ({ [CodeAttributes.column]: value }),\n lineNumber: (value: number) => ({ [CodeAttributes.lineNumber]: value }),\n repository: (value: string) => ({ [CodeAttributes.repository]: value }),\n revision: (value: string) => ({ [CodeAttributes.revision]: value }),\n },\n\n tls: {\n protocolVersion: (value: string) => ({\n [TLSAttributes.protocolVersion]: value,\n }),\n cipher: (value: string) => ({ [TLSAttributes.cipher]: value }),\n curveName: (value: string) => ({ [TLSAttributes.curveName]: value }),\n resumed: (value: boolean) => ({ [TLSAttributes.resumed]: value }),\n },\n} as const;\n","/**\n * Attribute validation, PII detection, and guardrails\n * Provides safe-by-default attribute handling with configurable policies\n */\n\nimport { REDACTOR_PATTERNS } from '../attribute-redacting-processor';\n\nexport interface AttributeGuardrails {\n /** How to handle PII in attributes */\n pii?: 'allow' | 'redact' | 'hash' | 'block';\n\n /** Maximum length for attribute values */\n maxLength?: number;\n\n /** Validate enum values against known values */\n validateEnum?: boolean;\n\n /** Log warnings for deprecated attributes instead of throwing */\n warnDeprecated?: boolean;\n\n /** Custom deprecation warnings */\n deprecatedWarnings?: Record<string, string>;\n}\n\nexport interface AttributePolicy {\n guardrails?: AttributeGuardrails;\n /** Custom deprecation warnings for specific attributes */\n deprecatedWarnings?: Record<string, string>;\n}\n\nconst DEPRECATED_ATTRIBUTES = {\n 'enduser.id': 'user.id',\n 'enduser.role': 'user.roles',\n 'enduser.scope': undefined,\n 'http.method': 'http.request.method',\n 'http.host': 'server.address',\n 'http.status_code': 'http.response.status_code',\n 'http.target': 'url.path',\n 'http.url': 'url.full',\n 'http.user_agent': 'user_agent.original',\n 'http.flavor': 'network.protocol.name',\n 'http.scheme': 'url.scheme',\n 'http.server_name': 'server.address',\n 'db.name': 'db.namespace',\n 'db.operation': 'db.operation.name',\n 'db.statement': 'db.query.text',\n 'db.system': 'db.system.name',\n 'db.collection': 'db.collection.name',\n 'db.instance.id': undefined,\n 'db.jdbc.driver_classname': undefined,\n 'db.mssql.instance_name': 'mssql.instance.name',\n 'db.sql.table': 'db.collection.name',\n 'http.client_ip': 'client.address',\n 'user_agent.original': 'user_agent.original',\n} as const;\n\nconst HTTP_METHODS = new Set([\n 'GET',\n 'POST',\n 'PUT',\n 'DELETE',\n 'PATCH',\n 'HEAD',\n 'OPTIONS',\n 'TRACE',\n 'QUERY',\n '_OTHER',\n]);\n\nexport function validateAttribute(\n key: string,\n value: unknown,\n policy: AttributePolicy = {},\n): unknown {\n const { guardrails = {} } = policy;\n\n if (value === undefined || value === null) {\n return undefined;\n }\n\n // For non-string values that don't need transformation, preserve the original type\n if (typeof value !== 'string') {\n // PII checks only apply to strings\n // maxLength only applies to strings\n // validateEnum only applies to strings\n return value;\n }\n\n const stringValue = value;\n\n if (guardrails.pii) {\n const piiResult = applyPIIPolicy(key, stringValue, guardrails.pii);\n if (piiResult !== stringValue) {\n return piiResult;\n }\n }\n\n if (guardrails.maxLength && stringValue.length > guardrails.maxLength) {\n return truncateValue(key, stringValue, guardrails.maxLength);\n }\n\n if (guardrails.validateEnum && HTTP_METHODS.has(stringValue)) {\n const normalizedMethod = normalizeHTTPMethod(stringValue);\n if (normalizedMethod !== stringValue) {\n return normalizedMethod;\n }\n }\n\n return stringValue;\n}\n\nfunction applyPIIPolicy(\n key: string,\n value: string,\n pii: AttributeGuardrails['pii'],\n): string {\n if (pii === 'allow') {\n return value;\n }\n\n if (pii === 'redact') {\n return redactIfPII(key, value);\n }\n\n if (pii === 'hash') {\n return hashIfPII(key, value);\n }\n\n if (pii === 'block' && isPIIKey(key)) {\n throw new Error(\n `PII attribute \"${key}\" is blocked by guardrails. Use pii: \"allow\" to enable it.`,\n );\n }\n\n return value;\n}\n\nfunction isPIIKey(key: string): boolean {\n const piiKeyPatterns = [\n 'email',\n 'phone',\n 'ssn',\n 'credit_card',\n 'password',\n 'secret',\n 'token',\n 'api_key',\n 'authorization',\n ];\n const lowerKey = key.toLowerCase();\n return piiKeyPatterns.some((pattern) => lowerKey.includes(pattern));\n}\n\nfunction redactIfPII(key: string, value: string): string {\n if (isPIIKey(key)) {\n // REDACTOR_PATTERNS values are RegExp patterns\n for (const [, pattern] of Object.entries(REDACTOR_PATTERNS)) {\n if (pattern instanceof RegExp && pattern.test(value)) {\n return '[REDACTED]';\n }\n }\n // If no pattern matched but key is PII, still redact\n return '[REDACTED]';\n }\n return value;\n}\n\nfunction hashIfPII(key: string, value: string): string {\n if (!isPIIKey(key)) {\n return value;\n }\n\n // Use a simple but consistent hash that produces 32-char hex\n // FNV-1a hash variant producing 128-bit output (32 hex chars)\n const FNV_PRIME = 0x01_00_01_93;\n const FNV_OFFSET = 0x81_1c_9d_c5;\n\n // Generate 4 32-bit hashes to produce 32 hex chars\n const hashes: number[] = [];\n for (let round = 0; round < 4; round++) {\n let hash = FNV_OFFSET;\n for (let i = 0; i < value.length; i++) {\n hash ^= (value.codePointAt(i) ?? 0) + round;\n hash = Math.imul(hash, FNV_PRIME);\n }\n hashes.push(hash >>> 0); // Convert to unsigned\n }\n\n return `hash_${hashes.map((h) => h.toString(16).padStart(8, '0')).join('')}`;\n}\n\nfunction truncateValue(key: string, value: string, maxLength: number): string {\n if (value.length <= maxLength) {\n return value;\n }\n return value.slice(0, maxLength - 3) + '...';\n}\n\nfunction normalizeHTTPMethod(method: string): string {\n const upper = method.toUpperCase();\n if (HTTP_METHODS.has(upper)) {\n return upper;\n }\n return upper;\n}\n\nexport function checkDeprecatedAttribute(\n key: string,\n policy: AttributePolicy = {},\n): string | null {\n const { guardrails = {}, deprecatedWarnings = {} } = policy;\n const { warnDeprecated = true } = guardrails;\n\n if (!warnDeprecated) {\n return null;\n }\n\n // Check if the key exists in the deprecated attributes map\n const isDeprecated = key in DEPRECATED_ATTRIBUTES;\n if (isDeprecated) {\n const replacement =\n DEPRECATED_ATTRIBUTES[key as keyof typeof DEPRECATED_ATTRIBUTES];\n if (replacement === undefined) {\n // Deprecated with no replacement (e.g., enduser.scope)\n console.warn(\n `[autotel/attributes] Attribute \"${key}\" is deprecated and has no replacement. ` +\n `Remove or find a replacement in OpenTelemetry semantic conventions.`,\n );\n } else {\n // Deprecated with a known replacement\n console.warn(\n `[autotel/attributes] Attribute \"${key}\" is deprecated. Use \"${replacement}\" instead.`,\n );\n }\n }\n\n if (deprecatedWarnings[key]) {\n console.warn(`[autotel/attributes] ${deprecatedWarnings[key]}`);\n }\n\n const replacement =\n DEPRECATED_ATTRIBUTES[key as keyof typeof DEPRECATED_ATTRIBUTES];\n return replacement ?? null;\n}\n\nexport function autoRedactPII(\n attributes: Record<string, unknown>,\n policy: AttributePolicy = {},\n): Record<string, unknown> {\n const { guardrails = { pii: 'redact' } } = policy;\n\n const redacted: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(attributes)) {\n redacted[key] = validateAttribute(key, value, { guardrails });\n }\n return redacted;\n}\n\nexport function defaultGuardrails(): AttributeGuardrails {\n return {\n pii: 'redact',\n maxLength: 255,\n validateEnum: true,\n warnDeprecated: true,\n };\n}\n","/**\n * Attribute utility functions\n */\n\nimport type { AttributeValue } from '../trace-context';\nimport {\n validateAttribute,\n autoRedactPII,\n defaultGuardrails,\n checkDeprecatedAttribute,\n type AttributePolicy,\n} from './validators';\n\n// Type for objects that have setAttributes method (spans or contexts)\n// Using a generic parameter to accommodate different AttributeValue types\ntype AttributeSetter = {\n setAttributes: (attrs: Record<string, AttributeValue>) => void;\n};\n\nexport function mergeAttrs(\n ...attrSets: Array<Record<string, unknown> | undefined>\n): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n for (const attrSet of attrSets) {\n if (attrSet) {\n Object.assign(result, attrSet);\n }\n }\n return result;\n}\n\nexport function safeSetAttributes(\n span: AttributeSetter,\n attrs: Record<string, unknown>,\n policy?: AttributePolicy,\n): void {\n // Merge user-supplied guardrails with defaults so callers can tweak\n // a single option without opting out of the rest\n const mergedGuardrails = {\n ...defaultGuardrails(),\n ...policy?.guardrails,\n };\n const effectivePolicy: AttributePolicy = {\n ...policy,\n guardrails: mergedGuardrails,\n };\n\n const validated = autoRedactPII(attrs, effectivePolicy);\n\n const sanitizedAttrs: Record<string, AttributeValue> = {};\n for (const [key, value] of Object.entries(validated)) {\n if (value !== undefined) {\n // Check for deprecated attributes and log warnings\n checkDeprecatedAttribute(key, effectivePolicy);\n const validatedValue = validateAttribute(key, value, effectivePolicy);\n if (validatedValue !== undefined) {\n // Cast to AttributeValue since validateAttribute ensures valid types\n sanitizedAttrs[key] = validatedValue as AttributeValue;\n }\n }\n }\n\n span.setAttributes(sanitizedAttrs);\n}\n","/**\n * Signal attachment helpers\n * These functions know WHERE to attach attributes automatically\n * They handle span, resource, and log signals correctly\n */\n\nimport type { Span, Attributes } from '@opentelemetry/api';\nimport {\n resourceFromAttributes,\n type Resource,\n} from '@opentelemetry/resources';\nimport type { TraceContext } from '../trace-context';\nimport { attrs } from './builders';\nimport { safeSetAttributes } from './utils';\n\nexport function setUser(\n spanOrContext: Span | TraceContext,\n data: import('./types').UserAttrs,\n guardrails?: import('./validators').AttributePolicy,\n): void {\n const attributes = attrs.user.data(data);\n safeSetAttributes(spanOrContext, attributes, guardrails);\n}\n\nexport function setSession(\n spanOrContext: Span | TraceContext,\n data: import('./types').SessionAttrs,\n guardrails?: import('./validators').AttributePolicy,\n): void {\n const attributes = attrs.session.data(data);\n safeSetAttributes(spanOrContext, attributes, guardrails);\n}\n\nexport function setDevice(\n spanOrContext: Span | TraceContext,\n data: import('./types').DeviceAttrs,\n guardrails?: import('./validators').AttributePolicy,\n): void {\n const attributes = attrs.device.data(data);\n safeSetAttributes(spanOrContext, attributes, guardrails);\n}\n\nexport function httpServer(\n spanOrContext: Span | TraceContext,\n data: import('./types').HTTPServerAttrs,\n guardrails?: import('./validators').AttributePolicy,\n): void {\n const attributes = attrs.http.server(data);\n\n if ('updateName' in spanOrContext && data.method && data.route) {\n const span = spanOrContext as Span;\n span.updateName(`HTTP ${data.method} ${data.route}`);\n }\n\n safeSetAttributes(spanOrContext, attributes, guardrails);\n}\n\nexport function httpClient(\n spanOrContext: Span | TraceContext,\n data: import('./types').HTTPClientAttrs,\n guardrails?: import('./validators').AttributePolicy,\n): void {\n const attributes = attrs.http.client(data);\n safeSetAttributes(spanOrContext, attributes, guardrails);\n}\n\nexport function dbClient(\n spanOrContext: Span | TraceContext,\n data: import('./types').DBAttrs,\n guardrails?: import('./validators').AttributePolicy,\n): void {\n const attributes = attrs.db.client.data(data);\n safeSetAttributes(spanOrContext, attributes, guardrails);\n}\n\n/**\n * Merge service attributes into a Resource and return a new Resource.\n *\n * Resource.attributes is readonly, so this function returns a new merged\n * Resource rather than mutating the input.\n *\n * @param resource - The existing resource to merge with\n * @param data - Service attributes to add\n * @returns A new Resource with the merged attributes\n *\n * @example\n * ```typescript\n * const baseResource = Resource.default();\n * const enrichedResource = mergeServiceResource(baseResource, {\n * name: 'my-service',\n * version: '1.0.0',\n * });\n * ```\n */\nexport function mergeServiceResource(\n resource: Resource,\n data: import('./types').ServiceAttrs,\n): Resource {\n const attributes = attrs.service.data(data);\n return resource.merge(resourceFromAttributes(attributes as Attributes));\n}\n\nexport function identify(\n spanOrContext: Span | TraceContext,\n data: {\n user?: import('./types').UserAttrs;\n session?: import('./types').SessionAttrs;\n device?: import('./types').DeviceAttrs;\n },\n guardrails?: import('./validators').AttributePolicy,\n): void {\n const allAttrs = [];\n\n if (data.user) {\n allAttrs.push(attrs.user.data(data.user));\n }\n if (data.session) {\n allAttrs.push(attrs.session.data(data.session));\n }\n if (data.device) {\n allAttrs.push(attrs.device.data(data.device));\n }\n\n const merged: Record<string, unknown> = {};\n for (const attrSet of allAttrs) {\n Object.assign(merged, attrSet);\n }\n\n safeSetAttributes(spanOrContext, merged, guardrails);\n}\n\nexport function request(\n spanOrContext: Span | TraceContext,\n data: import('./types').HTTPServerAttrs & {\n clientIp?: string;\n },\n guardrails?: import('./validators').AttributePolicy,\n): void {\n const httpAttrs = attrs.http.server(data);\n const networkAttrs = attrs.network.peerAddress(data.clientIp || '');\n const merged = { ...httpAttrs, ...networkAttrs };\n safeSetAttributes(spanOrContext, merged, guardrails);\n}\n\nexport function setError(\n spanOrContext: Span | TraceContext,\n data: import('./types').ErrorAttrs,\n guardrails?: import('./validators').AttributePolicy,\n): void {\n const attributes = attrs.error.data(data);\n safeSetAttributes(spanOrContext, attributes, guardrails);\n}\n\nexport function setException(\n spanOrContext: Span | TraceContext,\n data: import('./types').ExceptionAttrs,\n guardrails?: import('./validators').AttributePolicy,\n): void {\n const attributes = attrs.exception.data(data);\n safeSetAttributes(spanOrContext, attributes, guardrails);\n}\n","/**\n * Domain helpers for common attribute patterns\n * These bundle multiple attribute groups into semantic helpers\n */\n\nimport { attrs } from './builders';\nimport { safeSetAttributes } from './utils';\n\nexport function transaction(\n spanOrContext: import('../trace-context').TraceContext,\n config: {\n user?: import('./types').UserAttrs;\n session?: import('./types').SessionAttrs;\n method?: string;\n route?: string;\n statusCode?: number;\n clientIp?: string;\n },\n guardrails?: import('./validators').AttributePolicy,\n): void {\n const userAttrs = attrs.user.data(config.user || {});\n const sessionAttrs = attrs.session.data(config.session || {});\n const httpAttrs = attrs.http.server({\n method: config.method,\n route: config.route,\n statusCode: config.statusCode,\n });\n const networkAttrs = attrs.network.peerAddress(config.clientIp || '');\n\n const merged = {\n ...userAttrs,\n ...sessionAttrs,\n ...httpAttrs,\n ...networkAttrs,\n };\n\n if (config.method && config.route && 'updateName' in spanOrContext) {\n spanOrContext.updateName(`HTTP ${config.method} ${config.route}`);\n }\n\n safeSetAttributes(spanOrContext, merged, guardrails);\n}\n"],"mappings":"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