in AutoCollection/HttpRequestParser.ts [267:319]
private parseHeaders(request: http.IncomingMessage | HttpRequest, requestId?: string) {
this.rawHeaders = request.headers || (<any>request).rawHeaders;
this.userAgent = request.headers && request.headers["user-agent"];
this.sourceCorrelationId = Util.getCorrelationContextTarget(request, RequestResponseHeaders.requestContextSourceKey);
if (request.headers) {
const tracestateHeader = request.headers[RequestResponseHeaders.traceStateHeader] ? request.headers[RequestResponseHeaders.traceStateHeader].toString() : null; // w3c header
const traceparentHeader = request.headers[RequestResponseHeaders.traceparentHeader] ? request.headers[RequestResponseHeaders.traceparentHeader].toString() : null; // w3c header
const requestIdHeader = request.headers[RequestResponseHeaders.requestIdHeader] ? request.headers[RequestResponseHeaders.requestIdHeader].toString() : null; // default AI header
const legacy_parentId = request.headers[RequestResponseHeaders.parentIdHeader] ? request.headers[RequestResponseHeaders.parentIdHeader].toString() : null; // legacy AI header
const legacy_rootId = request.headers[RequestResponseHeaders.rootIdHeader] ? request.headers[RequestResponseHeaders.rootIdHeader].toString() : null; // legacy AI header
this.correlationContextHeader = request.headers[RequestResponseHeaders.correlationContextHeader] ? request.headers[RequestResponseHeaders.correlationContextHeader].toString() : null;
if (CorrelationIdManager.w3cEnabled && (traceparentHeader || tracestateHeader)) {
// Parse W3C Trace Context headers
this.traceparent = new Traceparent(traceparentHeader ? traceparentHeader.toString() : null); // new traceparent is always created from this
this.tracestate = traceparentHeader && tracestateHeader && new Tracestate(tracestateHeader ? tracestateHeader.toString() : null); // discard tracestate if no traceparent is present
this.setBackCompatFromThisTraceContext();
} else if (requestIdHeader) {
// Parse AI headers
if (CorrelationIdManager.w3cEnabled) {
this.traceparent = new Traceparent(null, requestIdHeader);
this.setBackCompatFromThisTraceContext();
} else {
this.parentId = requestIdHeader;
this.requestId = CorrelationIdManager.generateRequestId(this.parentId);
this.operationId = CorrelationIdManager.getRootId(this.requestId);
}
} else {
// Legacy fallback
if (CorrelationIdManager.w3cEnabled) {
this.traceparent = new Traceparent();
this.traceparent.parentId = legacy_parentId;
this.traceparent.legacyRootId = legacy_rootId || legacy_parentId;
this.setBackCompatFromThisTraceContext();
} else {
this.parentId = legacy_parentId;
this.requestId = CorrelationIdManager.generateRequestId(legacy_rootId || this.parentId);
this.correlationContextHeader = null;
this.operationId = CorrelationIdManager.getRootId(this.requestId);
}
}
if (requestId) {
// For the scenarios that don't guarantee an AI-created context,
// override the requestId with the provided one.
this.requestId = requestId;
this.operationId = CorrelationIdManager.getRootId(this.requestId);
}
}
}