/** * Generates child TraceParent by retrieving values from ThreadLocal. * @return Outbound Traceparent */ public static String generateChildDependencyTraceparent() { try { RequestTelemetryContext context = ThreadContext.getRequestTelemetryContext(); //check if context is null, no incoming request is present. // This is likely worker role scenario, where a worker is trying // to create a new outbound call, so generate a new traceparent. if (context == null) { return new Traceparent().toString(); } RequestTelemetry requestTelemetry = context.getHttpRequestTelemetry(); String traceId = requestTelemetry.getContext().getOperation().getId(); Traceparent tp = new Traceparent(0, traceId, null, context.getTraceflag()); // We need to propagate full blown traceparent header. return tp.toString(); } catch (Exception ex) { InternalLogger.INSTANCE.error("Failed to generate child ID. Exception information: %s", ex.toString()); InternalLogger.INSTANCE.trace("Stack trace generated is %s", ExceptionUtils.getStackTrace(ex)); } return null; }
/** * Generates child TraceParent by retrieving values from ThreadLocal. * @return Outbound Traceparent */ public static String generateChildDependencyTraceparent() { try { RequestTelemetryContext context = ThreadContext.getRequestTelemetryContext(); //check if context is null, no incoming request is present. // This is likely worker role scenario, where a worker is trying // to create a new outbound call, so generate a new traceparent. if (context == null) { return new Traceparent().toString(); } RequestTelemetry requestTelemetry = context.getHttpRequestTelemetry(); String traceId = requestTelemetry.getContext().getOperation().getId(); Traceparent tp = new Traceparent(0, traceId, null, context.getTraceflag()); // We need to propagate full blown traceparent header. return tp.toString(); } catch (Exception ex) { InternalLogger.INSTANCE.error("Failed to generate child ID. Exception information: %s", ex.toString()); InternalLogger.INSTANCE.trace("Stack trace generated is %s", ExceptionUtils.getStackTrace(ex)); } return null; }
@Test public void testTracestateIsPassedAsIsWhenAppIdResolutionIsFailed() { //turn on W3C defaultModule.isW3CEnabled = true; //setup: initialize a request context RequestTelemetryContext context = new RequestTelemetryContext(DateTimeUtils.getDateTimeNow().getTime()); ThreadContext.setRequestTelemetryContext(context); //mock a servlet request with cross-component correlation headers Map<String, String> headers = new HashMap<>(); Traceparent tp = new Traceparent(); headers.put(TraceContextCorrelation.TRACEPARENT_HEADER_NAME, tp.toString()); headers.put(TraceContextCorrelation.TRACESTATE_HEADER_NAME, TraceContextCorrelationTests.getTracestateHeaderValue("id1")); HttpServletRequest request = ServletUtils.createServletRequestWithHeaders(headers); HttpServletResponse response = (HttpServletResponse)ServletUtils.generateDummyServletResponse(); //configure mock appId fetcher to return different appId from what's on the request header mockProfileFetcher.setAppIdToReturn("id2"); mockProfileFetcher.setResultStatus(ProfileFetcherResultTaskStatus.FAILED); //run defaultModule.onBeginRequest(request, response); Assert.assertNotNull(ThreadContext.getRequestTelemetryContext().getTracestate()); Assert.assertEquals(TraceContextCorrelationTests.getTracestateHeaderValue("id1"), ThreadContext.getRequestTelemetryContext().getTracestate().toString()); }
@Test public void testTracestateIsPassedAsItIsWhenAppIdResolutionIsPending() { //turn on W3C defaultModule.isW3CEnabled = true; //setup: initialize a request context RequestTelemetryContext context = new RequestTelemetryContext(DateTimeUtils.getDateTimeNow().getTime()); ThreadContext.setRequestTelemetryContext(context); //mock a servlet request with cross-component correlation headers Map<String, String> headers = new HashMap<>(); Traceparent tp = new Traceparent(); headers.put(TraceContextCorrelation.TRACEPARENT_HEADER_NAME, tp.toString()); headers.put(TraceContextCorrelation.TRACESTATE_HEADER_NAME, TraceContextCorrelationTests.getTracestateHeaderValue("id1")); HttpServletRequest request = ServletUtils.createServletRequestWithHeaders(headers); HttpServletResponse response = (HttpServletResponse)ServletUtils.generateDummyServletResponse(); //configure mock appId fetcher to return different appId from what's on the request header mockProfileFetcher.setAppIdToReturn("id2"); mockProfileFetcher.setResultStatus(ProfileFetcherResultTaskStatus.PENDING); //run defaultModule.onBeginRequest(request, response); Assert.assertNotNull(ThreadContext.getRequestTelemetryContext().getTracestate()); Assert.assertEquals(TraceContextCorrelationTests.getTracestateHeaderValue("id1"), ThreadContext.getRequestTelemetryContext().getTracestate().toString()); }
@Test public void testTracestateIsSetWhenHeaderIsEmpty() { //turn on W3C defaultModule.isW3CEnabled = true; //setup: initialize a request context RequestTelemetryContext context = new RequestTelemetryContext(DateTimeUtils.getDateTimeNow().getTime()); ThreadContext.setRequestTelemetryContext(context); //mock a servlet request with cross-component correlation headers Map<String, String> headers = new HashMap<>(); Traceparent tp = new Traceparent(); headers.put(TraceContextCorrelation.TRACEPARENT_HEADER_NAME, tp.toString()); headers.put(TraceContextCorrelation.TRACESTATE_HEADER_NAME, ""); HttpServletRequest request = ServletUtils.createServletRequestWithHeaders(headers); HttpServletResponse response = (HttpServletResponse)ServletUtils.generateDummyServletResponse(); //configure mock appId fetcher to return different appId from what's on the request header mockProfileFetcher.setAppIdToReturn("id2"); mockProfileFetcher.setResultStatus(ProfileFetcherResultTaskStatus.COMPLETE); //run defaultModule.onBeginRequest(request, response); Assert.assertNotNull(ThreadContext.getRequestTelemetryContext().getTracestate()); Assert.assertEquals(TraceContextCorrelationTests.getTracestateHeaderValue("id2"), ThreadContext.getRequestTelemetryContext().getTracestate().toString()); }
@Test public void testNewTracestateIsCreatedWhenHeaderIsNotPresent() { //turn on W3C defaultModule.isW3CEnabled = true; //setup: initialize a request context RequestTelemetryContext context = new RequestTelemetryContext(DateTimeUtils.getDateTimeNow().getTime()); ThreadContext.setRequestTelemetryContext(context); //mock a servlet request with cross-component correlation headers Map<String, String> headers = new HashMap<>(); Traceparent tp = new Traceparent(); headers.put(TraceContextCorrelation.TRACEPARENT_HEADER_NAME, tp.toString()); HttpServletRequest request = ServletUtils.createServletRequestWithHeaders(headers); HttpServletResponse response = (HttpServletResponse)ServletUtils.generateDummyServletResponse(); //configure mock appId fetcher to return different appId from what's on the request header mockProfileFetcher.setAppIdToReturn("id2"); mockProfileFetcher.setResultStatus(ProfileFetcherResultTaskStatus.COMPLETE); //run defaultModule.onBeginRequest(request, response); Assert.assertNotNull(ThreadContext.getRequestTelemetryContext().getTracestate()); Assert.assertEquals(TraceContextCorrelationTests.getTracestateHeaderValue("id2"), ThreadContext.getRequestTelemetryContext().getTracestate().toString()); }
@Test public void canCreateTraceParentFromString() { String traceId = Traceparent.randomHex(16); String spanId = Traceparent.randomHex(8); Traceparent t1 = new Traceparent(0, traceId, spanId, 0); Traceparent t2 = Traceparent.fromString(t1.toString()); Assert.assertEquals(t1.version, t2.version); Assert.assertEquals(t1.traceId, t2.traceId); Assert.assertEquals(t1.spanId, t2.spanId); Assert.assertEquals(t1.traceFlags, t2.traceFlags); // memory reference should be different Assert.assertFalse(t1 == t2); }
@Test public void testTraceparentAreResolved() { //setup Map<String, String> headers = new HashMap<>(); Traceparent t = new Traceparent(); headers.put(TraceContextCorrelation.TRACEPARENT_HEADER_NAME, t.toString()); HttpServletRequest request = ServletUtils.createServletRequestWithHeaders(headers); HttpServletResponse response = (HttpServletResponse)ServletUtils.generateDummyServletResponse(); RequestTelemetry requestTelemetry = new RequestTelemetry(); //run TraceContextCorrelation.resolveCorrelation(request, response, requestTelemetry); //validate we have generated proper ID's Assert.assertNotNull(requestTelemetry.getId()); Assert.assertTrue(requestTelemetry.getId().startsWith(formatedID(t.getTraceId()))); //validate operation context ID's OperationContext operation = requestTelemetry.getContext().getOperation(); Assert.assertEquals(t.getTraceId(), operation.getId()); Assert.assertEquals(formatedID(t.getTraceId() + "." + t.getSpanId()), operation.getParentId()); }
headers.put(TraceContextCorrelation.TRACEPARENT_HEADER_NAME, tp.toString()); headers.put(TraceContextCorrelation.TRACESTATE_HEADER_NAME, TraceContextCorrelationTests.getTracestateHeaderValue("id1")); HttpServletRequest request = ServletUtils.createServletRequestWithHeaders(headers);
Traceparent tp = new Traceparent(); headers.put(TraceContextCorrelation.TRACEPARENT_HEADER_NAME, tp.toString()); headers.put(TraceContextCorrelation.TRACESTATE_HEADER_NAME, TraceContextCorrelationTests.getTracestateHeaderValue("id1")); HttpServletRequest request = ServletUtils.createServletRequestWithHeaders(headers);