Skip to content

Commit

Permalink
Add semis
Browse files Browse the repository at this point in the history
  • Loading branch information
NPellet committed Dec 12, 2022
1 parent af5447c commit b1b0e1a
Show file tree
Hide file tree
Showing 3 changed files with 72 additions and 65 deletions.
6 changes: 6 additions & 0 deletions .prettierrc
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
{
"trailingComma": "es5",
"tabWidth": 2,
"semi": true,
"singleQuote": true
}
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
!build
130 changes: 65 additions & 65 deletions propagators/opentelemetry-propagator-aws-xray/src/AWSXRayPropagator.ts
Original file line number Diff line number Diff line change
Expand Up @@ -28,26 +28,26 @@ import {
INVALID_TRACEID,
INVALID_SPANID,
INVALID_SPAN_CONTEXT,
} from '@opentelemetry/api'
} from '@opentelemetry/api';

export const AWSXRAY_TRACE_ID_HEADER = 'x-amzn-trace-id'
export const AWSXRAY_TRACE_ID_HEADER = 'x-amzn-trace-id';

const TRACE_HEADER_DELIMITER = ';'
const KV_DELIMITER = '='
const TRACE_HEADER_DELIMITER = ';';
const KV_DELIMITER = '=';

const TRACE_ID_KEY = 'Root'
const TRACE_ID_LENGTH = 35
const TRACE_ID_VERSION = '1'
const TRACE_ID_DELIMITER = '-'
const TRACE_ID_DELIMITER_INDEX_1 = 1
const TRACE_ID_DELIMITER_INDEX_2 = 10
const TRACE_ID_FIRST_PART_LENGTH = 8
const TRACE_ID_KEY = 'Root';
const TRACE_ID_LENGTH = 35;
const TRACE_ID_VERSION = '1';
const TRACE_ID_DELIMITER = '-';
const TRACE_ID_DELIMITER_INDEX_1 = 1;
const TRACE_ID_DELIMITER_INDEX_2 = 10;
const TRACE_ID_FIRST_PART_LENGTH = 8;

const PARENT_ID_KEY = 'Parent'
const PARENT_ID_KEY = 'Parent';

const SAMPLED_FLAG_KEY = 'Sampled'
const IS_SAMPLED = '1'
const NOT_SAMPLED = '0'
const SAMPLED_FLAG_KEY = 'Sampled';
const IS_SAMPLED = '1';
const NOT_SAMPLED = '0';

/**
* Implementation of the AWS X-Ray Trace Header propagation protocol. See <a href=
Expand All @@ -59,142 +59,142 @@ const NOT_SAMPLED = '0'
*/
export class AWSXRayPropagator implements TextMapPropagator {
inject(context: Context, carrier: unknown, setter: TextMapSetter) {
const spanContext = trace.getSpan(context)?.spanContext()
if (!spanContext || !isSpanContextValid(spanContext)) return
const spanContext = trace.getSpan(context)?.spanContext();
if (!spanContext || !isSpanContextValid(spanContext)) return;

const otTraceId = spanContext.traceId
const timestamp = otTraceId.substring(0, TRACE_ID_FIRST_PART_LENGTH)
const randomNumber = otTraceId.substring(TRACE_ID_FIRST_PART_LENGTH)
const otTraceId = spanContext.traceId;
const timestamp = otTraceId.substring(0, TRACE_ID_FIRST_PART_LENGTH);
const randomNumber = otTraceId.substring(TRACE_ID_FIRST_PART_LENGTH);

const parentId = spanContext.spanId
const parentId = spanContext.spanId;
const samplingFlag =
(TraceFlags.SAMPLED & spanContext.traceFlags) === TraceFlags.SAMPLED
? IS_SAMPLED
: NOT_SAMPLED
: NOT_SAMPLED;
// TODO: Add OT trace state to the X-Ray trace header

const traceHeader = `Root=1-${timestamp}-${randomNumber};Parent=${parentId};Sampled=${samplingFlag}`
setter.set(carrier, AWSXRAY_TRACE_ID_HEADER, traceHeader)
const traceHeader = `Root=1-${timestamp}-${randomNumber};Parent=${parentId};Sampled=${samplingFlag}`;
setter.set(carrier, AWSXRAY_TRACE_ID_HEADER, traceHeader);
}

extract(context: Context, carrier: unknown, getter: TextMapGetter): Context {
const spanContext = this.getSpanContextFromHeader(carrier, getter)
if (!isSpanContextValid(spanContext)) return context
const spanContext = this.getSpanContextFromHeader(carrier, getter);
if (!isSpanContextValid(spanContext)) return context;

return trace.setSpan(context, trace.wrapSpanContext(spanContext))
return trace.setSpan(context, trace.wrapSpanContext(spanContext));
}

fields(): string[] {
return [AWSXRAY_TRACE_ID_HEADER]
return [AWSXRAY_TRACE_ID_HEADER];
}

private getSpanContextFromHeader(
carrier: unknown,
getter: TextMapGetter
): SpanContext {
const headerKeys = getter.keys(carrier)
const headerKeys = getter.keys(carrier);
const relevantHeaderKey = headerKeys.find((e) => {
return e.toLowerCase() === AWSXRAY_TRACE_ID_HEADER
})
return e.toLowerCase() === AWSXRAY_TRACE_ID_HEADER;
});
if (!relevantHeaderKey) {
return INVALID_SPAN_CONTEXT
return INVALID_SPAN_CONTEXT;
}
const traceHeader = getter.get(carrier, relevantHeaderKey)
const traceHeader = getter.get(carrier, relevantHeaderKey);

if (!traceHeader || typeof traceHeader !== 'string') {
return INVALID_SPAN_CONTEXT
return INVALID_SPAN_CONTEXT;
}

let pos = 0
let trimmedPart: string
let parsedTraceId = INVALID_TRACEID
let parsedSpanId = INVALID_SPANID
let parsedTraceFlags = null
let pos = 0;
let trimmedPart: string;
let parsedTraceId = INVALID_TRACEID;
let parsedSpanId = INVALID_SPANID;
let parsedTraceFlags = null;
while (pos < traceHeader.length) {
const delimiterIndex = traceHeader.indexOf(TRACE_HEADER_DELIMITER, pos)
const delimiterIndex = traceHeader.indexOf(TRACE_HEADER_DELIMITER, pos);
if (delimiterIndex >= 0) {
trimmedPart = traceHeader.substring(pos, delimiterIndex).trim()
pos = delimiterIndex + 1
trimmedPart = traceHeader.substring(pos, delimiterIndex).trim();
pos = delimiterIndex + 1;
} else {
//last part
trimmedPart = traceHeader.substring(pos).trim()
pos = traceHeader.length
trimmedPart = traceHeader.substring(pos).trim();
pos = traceHeader.length;
}
const equalsIndex = trimmedPart.indexOf(KV_DELIMITER)
const equalsIndex = trimmedPart.indexOf(KV_DELIMITER);

const value = trimmedPart.substring(equalsIndex + 1)
const value = trimmedPart.substring(equalsIndex + 1);

if (trimmedPart.startsWith(TRACE_ID_KEY)) {
parsedTraceId = AWSXRayPropagator._parseTraceId(value)
parsedTraceId = AWSXRayPropagator._parseTraceId(value);
} else if (trimmedPart.startsWith(PARENT_ID_KEY)) {
parsedSpanId = AWSXRayPropagator._parseSpanId(value)
parsedSpanId = AWSXRayPropagator._parseSpanId(value);
} else if (trimmedPart.startsWith(SAMPLED_FLAG_KEY)) {
parsedTraceFlags = AWSXRayPropagator._parseTraceFlag(value)
parsedTraceFlags = AWSXRayPropagator._parseTraceFlag(value);
}
}
if (parsedTraceFlags === null) {
return INVALID_SPAN_CONTEXT
return INVALID_SPAN_CONTEXT;
}
const resultSpanContext: SpanContext = {
traceId: parsedTraceId,
spanId: parsedSpanId,
traceFlags: parsedTraceFlags,
isRemote: true,
}
};
if (!isSpanContextValid(resultSpanContext)) {
return INVALID_SPAN_CONTEXT
return INVALID_SPAN_CONTEXT;
}
return resultSpanContext
return resultSpanContext;
}

private static _parseTraceId(xrayTraceId: string): string {
// Check length of trace id
if (xrayTraceId.length !== TRACE_ID_LENGTH) {
return INVALID_TRACEID
return INVALID_TRACEID;
}

// Check version trace id version
if (!xrayTraceId.startsWith(TRACE_ID_VERSION)) {
return INVALID_TRACEID
return INVALID_TRACEID;
}

// Check delimiters
if (
xrayTraceId.charAt(TRACE_ID_DELIMITER_INDEX_1) !== TRACE_ID_DELIMITER ||
xrayTraceId.charAt(TRACE_ID_DELIMITER_INDEX_2) !== TRACE_ID_DELIMITER
) {
return INVALID_TRACEID
return INVALID_TRACEID;
}

const epochPart = xrayTraceId.substring(
TRACE_ID_DELIMITER_INDEX_1 + 1,
TRACE_ID_DELIMITER_INDEX_2
)
);
const uniquePart = xrayTraceId.substring(
TRACE_ID_DELIMITER_INDEX_2 + 1,
TRACE_ID_LENGTH
)
const resTraceId = epochPart + uniquePart
);
const resTraceId = epochPart + uniquePart;

// Check the content of trace id
if (!isValidTraceId(resTraceId)) {
return INVALID_TRACEID
return INVALID_TRACEID;
}

return resTraceId
return resTraceId;
}

private static _parseSpanId(xrayParentId: string): string {
return isValidSpanId(xrayParentId) ? xrayParentId : INVALID_SPANID
return isValidSpanId(xrayParentId) ? xrayParentId : INVALID_SPANID;
}

private static _parseTraceFlag(xraySampledFlag: string): TraceFlags | null {
if (xraySampledFlag === NOT_SAMPLED) {
return TraceFlags.NONE
return TraceFlags.NONE;
}
if (xraySampledFlag === IS_SAMPLED) {
return TraceFlags.SAMPLED
return TraceFlags.SAMPLED;
}
return null
return null;
}
}

0 comments on commit b1b0e1a

Please sign in to comment.