Repository URL to install this package:
|
Version:
0.7.10 ▾
|
// (c) Copyright 2023 Supertenant Ltd. - all rights reserved.
// See LICENSE file in project root for license terms.
"use strict";const constants=require("../constants"),leftPad=require("../leftPad"),W3cTraceContext=require("./W3cTraceContext");let logger;logger=require("../../logger").getLogger("tracing/W3C trace context parser",newLogger=>{logger=newLogger});const versionRegex=/^([0-9a-f]{2})-.*$/,regexVersion00=/^[0-9a-f]{2}-([0-9a-f]{32})-([0-9a-f]{16})-([0-9a-f]{2})$/,regexUnknownVersion=/^[0-9a-f]{2}-([0-9a-f]{32})-([0-9a-f]{16})-([0-9a-f]{2}).*$/,instanaVendorKeyOffset=constants.w3cInstanaEquals.length;function parseTraceParent(traceParentRaw,parsed){var versionMatch;"string"==typeof traceParentRaw&&(versionMatch=versionRegex.exec(traceParentRaw))&&"ff"!==versionMatch[1]&&(parsed.version=versionMatch[1],versionMatch=(parsed.version===W3cTraceContext.VERSION00?regexVersion00:regexUnknownVersion).exec(traceParentRaw))&&(parsed.traceParentTraceId=versionMatch[1],parsed.traceParentParentId=versionMatch[2],traceParentRaw=parseInt(versionMatch[3],16),parsed.sampled=(traceParentRaw&W3cTraceContext.SAMPLED_BITMASK)===W3cTraceContext.SAMPLED_BITMASK,"00000000000000000000000000000000"!==parsed.traceParentTraceId)&&"0000000000000000"!==parsed.traceParentParentId&&(parsed.traceParentValid=!0)}function parseTraceState(traceStateRaw,parsed){var indexOfInstanaKeyValuePair;"string"==typeof traceStateRaw&&0!==(traceStateRaw=traceStateRaw.split(",").map(kv=>kv.trim()).filter(kv=>kv&&0<=kv.indexOf("="))).length&&(0<=(indexOfInstanaKeyValuePair=traceStateRaw.findIndex(kv=>0===kv.toLowerCase().indexOf(constants.w3cInstanaEquals)))?(parsed.traceStateHead=traceStateRaw.slice(0,Math.min(indexOfInstanaKeyValuePair,31)),0===parsed.traceStateHead.length&&(parsed.traceStateHead=null),parseInstanaTraceStateKeyValuePair(parsed,traceStateRaw[indexOfInstanaKeyValuePair]),parsed.traceStateTail=traceStateRaw.slice(indexOfInstanaKeyValuePair+1,32).filter(kv=>kv.toLowerCase().indexOf(constants.w3cInstanaEquals)<0),0===parsed.traceStateTail.length&&(parsed.traceStateTail=null)):(parsed.traceStateHead=traceStateRaw.slice(0,32),parsed.traceStateTail=null),parsed.traceStateValid=!0)}function parseInstanaTraceStateKeyValuePair(parsed,instanaKeyValuePair){instanaKeyValuePair=instanaKeyValuePair.substring(instanaVendorKeyOffset).split(";");parsed.instanaTraceId=normalizeId(instanaKeyValuePair[0],!0),parsed.instanaParentId=normalizeId(instanaKeyValuePair[1],!1)}function normalizeId(id,isTraceId){return id&&"string"==typeof id&&""!==id.trim()?16===id.length||32===id.length&&isTraceId?id:id.length<16?leftPad(id,16):id.length<32&&isTraceId?leftPad(id,32):16<id.length&&!isTraceId?(logger.warn("Received an invalid (too long) span ID: "+id),null):32<id.length?(logger.warn("Received an invalid (too long) trace ID: "+id),null):id:(logger.warn(`Received an invalid ${isTraceId?"trace":"span"} ID: "${id}"`),null)}module.exports=function(traceParentRaw,traceStateRaw){var parsed=new W3cTraceContext;return parseTraceParent(traceParentRaw,parsed),parsed.traceParentValid&&parseTraceState(traceStateRaw,parsed),parsed};