UNPKG

chargebee

Version:

A library for integrating with Chargebee.

146 lines (145 loc) 6.24 kB
"use strict"; /* * This file is auto-generated by Chargebee. * For more information on how to make changes to this file, please see the README. * Reach out to dx@chargebee.com for any questions. * Copyright 2026 Chargebee Inc. */ Object.defineProperty(exports, "__esModule", { value: true }); exports.NO_OP_TELEMETRY_ADAPTER = exports.NoOpTelemetryAdapter = void 0; exports.buildSpanName = buildSpanName; exports.resolveChargebeeApiVersion = resolveChargebeeApiVersion; exports.buildRequestHeaderSpanAttributes = buildRequestHeaderSpanAttributes; exports.buildRequestStartSpanAttributes = buildRequestStartSpanAttributes; exports.buildRequestEndSpanAttributes = buildRequestEndSpanAttributes; exports.buildRequestTelemetryContext = buildRequestTelemetryContext; exports.buildRequestTelemetryResult = buildRequestTelemetryResult; exports.extractRequestTelemetryError = extractRequestTelemetryError; exports.extractHttpStatusCode = extractHttpStatusCode; const types_js_1 = require("./types.js"); class NoOpTelemetryAdapter { onRequestStart() { return; } onRequestEnd() { return; } } exports.NoOpTelemetryAdapter = NoOpTelemetryAdapter; exports.NO_OP_TELEMETRY_ADAPTER = new NoOpTelemetryAdapter(); function buildSpanName(resource, operation) { return `${types_js_1.TELEMETRY_SPAN_NAME_PREFIX}.${resource}.${operation}`; } function resolveChargebeeApiVersion(apiPath) { return apiPath === '/api/v1' ? 'v1' : 'v2'; } /** * Captures Chargebee custom request headers as OTel span attributes. * * Headers whose (lowercased) name starts with `chargebee-` are recorded as * `http.request.header.<name>` with string[] values, per the OpenTelemetry HTTP semantic * conventions. The `chargebee-request-origin-*` family (origin IP, email, device) is skipped * because it carries end-user PII. Matching by prefix means new `chargebee-*` headers are * captured automatically without an SDK upgrade. */ function buildRequestHeaderSpanAttributes(requestHeaders) { const attributes = {}; if (!requestHeaders) { return attributes; } for (const [name, value] of Object.entries(requestHeaders)) { if (value === undefined || value === null) { continue; } const lowerName = name.toLowerCase(); if (!lowerName.startsWith(types_js_1.CHARGEBEE_TELEMETRY_HEADER_PREFIX) || lowerName.startsWith(types_js_1.CHARGEBEE_TELEMETRY_HEADER_EXCLUDE_PREFIX)) { continue; } attributes[`${types_js_1.HTTP_REQUEST_HEADER_ATTRIBUTE_PREFIX}${lowerName}`] = [ String(value), ]; } return attributes; } function buildRequestStartSpanAttributes(input) { return Object.assign({ [types_js_1.TelemetryAttributeKeys.URL_FULL]: input.httpUrl, [types_js_1.TelemetryAttributeKeys.HTTP_REQUEST_METHOD]: input.httpMethod, [types_js_1.TelemetryAttributeKeys.SERVER_ADDRESS]: input.serverAddress, [types_js_1.TelemetryAttributeKeys.CHARGEBEE_SITE]: input.chargebeeSite, [types_js_1.TelemetryAttributeKeys.CHARGEBEE_API_VERSION]: input.chargebeeApiVersion, [types_js_1.TelemetryAttributeKeys.CHARGEBEE_RESOURCE]: input.resource, [types_js_1.TelemetryAttributeKeys.CHARGEBEE_OPERATION]: input.operation, [types_js_1.TelemetryAttributeKeys.CHARGEBEE_SDK_NAME]: types_js_1.CHARGEBEE_SDK_NAME, [types_js_1.TelemetryAttributeKeys.CHARGEBEE_SDK_VERSION]: input.sdkVersion }, buildRequestHeaderSpanAttributes(input.requestHeaders)); } function buildRequestEndSpanAttributes(result) { const attributes = { [types_js_1.TelemetryAttributeKeys.HTTP_RESPONSE_STATUS_CODE]: result.httpStatusCode, }; if (result.error) { // error.type is the status code on failed requests attributes[types_js_1.TelemetryAttributeKeys.ERROR_TYPE] = String(result.httpStatusCode); if (result.error.chargebeeErrorCode) { attributes[types_js_1.TelemetryAttributeKeys.CHARGEBEE_ERROR_CODE] = result.error.chargebeeErrorCode; } if (result.error.chargebeeApiErrorType) { attributes[types_js_1.TelemetryAttributeKeys.CHARGEBEE_ERROR_TYPE] = result.error.chargebeeApiErrorType; } if (result.error.chargebeeErrorParam) { attributes[types_js_1.TelemetryAttributeKeys.CHARGEBEE_ERROR_PARAM] = result.error.chargebeeErrorParam; } } return attributes; } function buildRequestTelemetryContext(input) { return { spanName: buildSpanName(input.resource, input.operation), resource: input.resource, operation: input.operation, httpMethod: input.httpMethod, httpUrl: input.httpUrl, serverAddress: input.serverAddress, chargebeeSite: input.chargebeeSite, chargebeeApiVersion: input.chargebeeApiVersion, sdkName: types_js_1.CHARGEBEE_SDK_NAME, sdkVersion: input.sdkVersion, startAttributes: buildRequestStartSpanAttributes(input), }; } function buildRequestTelemetryResult(result) { return Object.assign(Object.assign({}, result), { endAttributes: buildRequestEndSpanAttributes(result) }); } function extractRequestTelemetryError(err) { if (err == null || typeof err !== 'object') { return undefined; } const errorObj = err; const message = typeof errorObj.message === 'string' ? errorObj.message : 'Chargebee API request failed'; const result = { message }; if (typeof errorObj.api_error_code === 'string') { result.chargebeeErrorCode = errorObj.api_error_code; } if (typeof errorObj.type === 'string') { result.chargebeeApiErrorType = errorObj.type; } if (typeof errorObj.param === 'string') { result.chargebeeErrorParam = errorObj.param; } return result; } function extractHttpStatusCode(err) { if (err == null || typeof err !== 'object') { return undefined; } const errorObj = err; for (const key of [ 'http_status_code', 'httpStatusCode', 'http_code', 'statusCode', ]) { const value = errorObj[key]; if (typeof value === 'number') { return value; } } return undefined; }