@opentelemetry/core
Advanced tools
Comparing version 0.10.2 to 0.10.3-canary.0
@@ -5,2 +5,6 @@ import { Context, GetterFunction, HttpTextPropagator, SetterFunction } from '@opentelemetry/api'; | ||
export declare const X_B3_SAMPLED = "x-b3-sampled"; | ||
export declare const X_B3_PARENT_SPAN_ID = "x-b3-parentspanid"; | ||
export declare const X_B3_FLAGS = "x-b3-flags"; | ||
export declare const PARENT_SPAN_ID_KEY: symbol; | ||
export declare const DEBUG_FLAG_KEY: symbol; | ||
/** | ||
@@ -7,0 +11,0 @@ * Propagator for the B3 HTTP header format. |
@@ -18,3 +18,3 @@ "use strict"; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
exports.B3Propagator = exports.X_B3_SAMPLED = exports.X_B3_SPAN_ID = exports.X_B3_TRACE_ID = void 0; | ||
exports.B3Propagator = exports.DEBUG_FLAG_KEY = exports.PARENT_SPAN_ID_KEY = exports.X_B3_FLAGS = exports.X_B3_PARENT_SPAN_ID = exports.X_B3_SAMPLED = exports.X_B3_SPAN_ID = exports.X_B3_TRACE_ID = void 0; | ||
const api_1 = require("@opentelemetry/api"); | ||
@@ -25,5 +25,11 @@ const context_1 = require("../context"); | ||
exports.X_B3_SAMPLED = 'x-b3-sampled'; | ||
exports.X_B3_PARENT_SPAN_ID = 'x-b3-parentspanid'; | ||
exports.X_B3_FLAGS = 'x-b3-flags'; | ||
exports.PARENT_SPAN_ID_KEY = api_1.Context.createKey('OpenTelemetry Context Key B3 Parent Span Id'); | ||
exports.DEBUG_FLAG_KEY = api_1.Context.createKey('OpenTelemetry Context Key B3 Debug Flag'); | ||
const VALID_TRACEID_REGEX = /^([0-9a-f]{16}){1,2}$/i; | ||
const VALID_SPANID_REGEX = /^[0-9a-f]{16}$/i; | ||
const INVALID_ID_REGEX = /^0+$/i; | ||
const VALID_SAMPLED_VALUES = new Set([true, 'true', 'True', '1', 1]); | ||
const VALID_UNSAMPLED_VALUES = new Set([false, 'false', 'False', '0', 0]); | ||
function isValidTraceId(traceId) { | ||
@@ -35,2 +41,52 @@ return VALID_TRACEID_REGEX.test(traceId) && !INVALID_ID_REGEX.test(traceId); | ||
} | ||
function isValidParentSpanID(spanId) { | ||
return spanId === undefined || isValidSpanId(spanId); | ||
} | ||
function isValidSampledValue(sampled) { | ||
return sampled === api_1.TraceFlags.SAMPLED || sampled === api_1.TraceFlags.NONE; | ||
} | ||
function parseHeader(header) { | ||
return Array.isArray(header) ? header[0] : header; | ||
} | ||
function getHeaderValue(carrier, getter, key) { | ||
const header = getter(carrier, key); | ||
return parseHeader(header); | ||
} | ||
function getTraceId(carrier, getter) { | ||
const traceId = getHeaderValue(carrier, getter, exports.X_B3_TRACE_ID); | ||
if (typeof traceId === 'string') { | ||
return traceId.padStart(32, '0'); | ||
} | ||
return ''; | ||
} | ||
function getSpanId(carrier, getter) { | ||
const spanId = getHeaderValue(carrier, getter, exports.X_B3_SPAN_ID); | ||
if (typeof spanId === 'string') { | ||
return spanId; | ||
} | ||
return ''; | ||
} | ||
function getParentSpanId(carrier, getter) { | ||
const spanId = getHeaderValue(carrier, getter, exports.X_B3_PARENT_SPAN_ID); | ||
if (typeof spanId === 'string') { | ||
return spanId; | ||
} | ||
return; | ||
} | ||
function getDebug(carrier, getter) { | ||
const debug = getHeaderValue(carrier, getter, exports.X_B3_FLAGS); | ||
return debug === '1' ? '1' : undefined; | ||
} | ||
function getTraceFlags(carrier, getter) { | ||
const traceFlags = getHeaderValue(carrier, getter, exports.X_B3_SAMPLED); | ||
const debug = getDebug(carrier, getter); | ||
if (debug === '1' || VALID_SAMPLED_VALUES.has(traceFlags)) { | ||
return api_1.TraceFlags.SAMPLED; | ||
} | ||
if (traceFlags === undefined || VALID_UNSAMPLED_VALUES.has(traceFlags)) { | ||
return api_1.TraceFlags.NONE; | ||
} | ||
// This indicates to isValidSampledValue that this is not valid | ||
return; | ||
} | ||
/** | ||
@@ -45,9 +101,20 @@ * Propagator for the B3 HTTP header format. | ||
return; | ||
const parentSpanId = context.getValue(exports.PARENT_SPAN_ID_KEY); | ||
if (isValidTraceId(spanContext.traceId) && | ||
isValidSpanId(spanContext.spanId)) { | ||
isValidSpanId(spanContext.spanId) && | ||
isValidParentSpanID(parentSpanId)) { | ||
const debug = context.getValue(exports.DEBUG_FLAG_KEY); | ||
setter(carrier, exports.X_B3_TRACE_ID, spanContext.traceId); | ||
setter(carrier, exports.X_B3_SPAN_ID, spanContext.spanId); | ||
// We set the header only if there is an existing sampling decision. | ||
// Otherwise we will omit it => Absent. | ||
if (spanContext.traceFlags !== undefined) { | ||
if (parentSpanId) { | ||
setter(carrier, exports.X_B3_PARENT_SPAN_ID, parentSpanId); | ||
} | ||
// According to the B3 spec, if the debug flag is set, | ||
// the sampled flag shouldn't be propagated as well. | ||
if (debug === '1') { | ||
setter(carrier, exports.X_B3_FLAGS, debug); | ||
} | ||
else if (spanContext.traceFlags !== undefined) { | ||
// We set the header only if there is an existing sampling decision. | ||
// Otherwise we will omit it => Absent. | ||
setter(carrier, exports.X_B3_SAMPLED, (api_1.TraceFlags.SAMPLED & spanContext.traceFlags) === api_1.TraceFlags.SAMPLED | ||
@@ -60,17 +127,13 @@ ? '1' | ||
extract(context, carrier, getter) { | ||
const traceIdHeader = getter(carrier, exports.X_B3_TRACE_ID); | ||
const spanIdHeader = getter(carrier, exports.X_B3_SPAN_ID); | ||
const sampledHeader = getter(carrier, exports.X_B3_SAMPLED); | ||
const traceIdHeaderValue = Array.isArray(traceIdHeader) | ||
? traceIdHeader[0] | ||
: traceIdHeader; | ||
const spanId = Array.isArray(spanIdHeader) ? spanIdHeader[0] : spanIdHeader; | ||
const options = Array.isArray(sampledHeader) | ||
? sampledHeader[0] | ||
: sampledHeader; | ||
if (typeof traceIdHeaderValue !== 'string' || typeof spanId !== 'string') { | ||
return context; | ||
} | ||
const traceId = traceIdHeaderValue.padStart(32, '0'); | ||
if (isValidTraceId(traceId) && isValidSpanId(spanId)) { | ||
const traceId = getTraceId(carrier, getter); | ||
const spanId = getSpanId(carrier, getter); | ||
const parentSpanId = getParentSpanId(carrier, getter); | ||
const traceFlags = getTraceFlags(carrier, getter); | ||
const debug = getDebug(carrier, getter); | ||
if (isValidTraceId(traceId) && | ||
isValidSpanId(spanId) && | ||
isValidParentSpanID(parentSpanId) && | ||
isValidSampledValue(traceFlags)) { | ||
context = context.setValue(exports.PARENT_SPAN_ID_KEY, parentSpanId); | ||
context = context.setValue(exports.DEBUG_FLAG_KEY, debug); | ||
return context_1.setExtractedSpanContext(context, { | ||
@@ -80,3 +143,3 @@ traceId, | ||
isRemote: true, | ||
traceFlags: isNaN(Number(options)) ? api_1.TraceFlags.NONE : Number(options), | ||
traceFlags, | ||
}); | ||
@@ -83,0 +146,0 @@ } |
@@ -1,2 +0,2 @@ | ||
export declare const VERSION = "0.10.2"; | ||
export declare const VERSION = "0.10.3-canary.0+f4f2f84"; | ||
//# sourceMappingURL=version.d.ts.map |
@@ -20,3 +20,3 @@ "use strict"; | ||
// this is autogenerated file, see scripts/version-update.js | ||
exports.VERSION = '0.10.2'; | ||
exports.VERSION = '0.10.3-canary.0+f4f2f84'; | ||
//# sourceMappingURL=version.js.map |
{ | ||
"name": "@opentelemetry/core", | ||
"version": "0.10.2", | ||
"version": "0.10.3-canary.0+f4f2f84", | ||
"description": "OpenTelemetry Core provides default and no-op implementations of the OpenTelemetry types for trace and metrics", | ||
@@ -80,7 +80,7 @@ "main": "build/src/index.js", | ||
"dependencies": { | ||
"@opentelemetry/api": "^0.10.2", | ||
"@opentelemetry/context-base": "^0.10.2", | ||
"@opentelemetry/api": "^0.10.3-canary.0+f4f2f84", | ||
"@opentelemetry/context-base": "^0.10.3-canary.0+f4f2f84", | ||
"semver": "^7.1.3" | ||
}, | ||
"gitHead": "b247e69034a7888a842fe75e0a5ff06f8bea44a8" | ||
"gitHead": "f4f2f84bc087389b3206a2e17837b7b0b95fb2f2" | ||
} |
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
Manifest confusion
Supply chain riskThis package has inconsistent metadata. This could be malicious or caused by an error when publishing the package.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
159155
2554
1
+ Added@opentelemetry/api@0.10.3-canary.0(transitive)
+ Added@opentelemetry/context-base@0.10.3-canary.0(transitive)
- Removed@opentelemetry/api@0.10.2(transitive)
- Removed@opentelemetry/context-base@0.10.2(transitive)