/** * Converts Tracestate header to Object representation * * @return Tracestate */ public static Tracestate fromString(String s) { return new Tracestate(s); }
/** * Ctor that creates a tracestate object from a parent one */ public Tracestate(Tracestate parent, String key, String value) { if (key == null) { throw new IllegalArgumentException("key is null"); } if (!KEY_VALIDATION_RE.matcher(key).find()) { throw new IllegalArgumentException("invalid key format"); } if (value == null) { throw new IllegalArgumentException("value is null"); } if (!VALUE_VALIDATION_RE.matcher(value).find()) { throw new IllegalArgumentException("invalid value format"); } internalList.put(key, value); if (parent != null) { for (String k : parent.internalList.keySet()) { internalList.put(k, parent.internalList.get(k)); } internalList.put(key, value); } internalString = toInternalString(); }
@Test public void canCreateTraceStateWithString() { String tracestate = "az=cid-v1:120"; Tracestate t1 = new Tracestate(tracestate); Assert.assertEquals(tracestate, t1.toString()); } }
/** * Helper method to retrieve Tracestate from ThreadLocal * @return */ public static String retriveTracestate() { //check if context is null - no correlation will happen if (ThreadContext.getRequestTelemetryContext() == null || ThreadContext.getRequestTelemetryContext(). getTracestate() == null) { InternalLogger.INSTANCE.warn("No correlation wil happen, Thread context is null"); return null; } Tracestate tracestate = ThreadContext.getRequestTelemetryContext().getTracestate(); return tracestate.toString(); }
try { tracestate = Tracestate.fromString(StringUtils.join(tracestateList, ",")); tracestate = new Tracestate(tracestate, AZURE_TRACEPARENT_COMPONENT_INITIAL, appId); tracestate = new Tracestate(null, AZURE_TRACEPARENT_COMPONENT_INITIAL, appId); tracestate = new Tracestate(null, AZURE_TRACEPARENT_COMPONENT_INITIAL, appId);
Tracestate incomingTracestate = Tracestate.fromString(tracestate); incomingTracestate.get(AZURE_TRACEPARENT_COMPONENT_INITIAL));
/** * Helper method to retrieve Tracestate from ThreadLocal * @return */ public static String retriveTracestate() { //check if context is null - no correlation will happen if (ThreadContext.getRequestTelemetryContext() == null || ThreadContext.getRequestTelemetryContext(). getTracestate() == null) { InternalLogger.INSTANCE.warn("No correlation wil happen, Thread context is null"); return null; } Tracestate tracestate = ThreadContext.getRequestTelemetryContext().getTracestate(); return tracestate.toString(); }
try { tracestate = Tracestate.fromString(Joiner.on(",").join(tracestateList)); tracestate = new Tracestate(tracestate, AZURE_TRACEPARENT_COMPONENT_INITIAL, appId); tracestate = new Tracestate(null, AZURE_TRACEPARENT_COMPONENT_INITIAL, appId); tracestate = new Tracestate(null, AZURE_TRACEPARENT_COMPONENT_INITIAL, appId);
Tracestate incomingTracestate = Tracestate.fromString(tracestate); incomingTracestate.get(AZURE_TRACEPARENT_COMPONENT_INITIAL));
@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()); }
/** * Converts Tracestate header to Object representation * * @return Tracestate */ public static Tracestate fromString(String s) { return new Tracestate(s); }
/** * Ctor that creates tracestate object from given value */ public Tracestate(String input) { if (input == null) { throw new IllegalArgumentException("input is null"); } String[] values = DELIMITER_FORMAT_RE.split(input); for (String item : values) { Matcher m = MEMBER_FORMAT_RE.matcher(item); if (!m.find()) { throw new IllegalArgumentException(String.format("invalid string %s in tracestate", item)); } String key = m.group(1); String value = m.group(3); if (internalList.get(key) != null) { throw new IllegalArgumentException(String.format("duplicated keys %s in tracestate", key)); } internalList.put(key, value); } if (internalList.size() > MAX_KEY_VALUE_PAIRS) { throw new IllegalArgumentException(String.format("cannot have more than %d key-value pairs", MAX_KEY_VALUE_PAIRS)); } internalString = toInternalString(); }
@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(expected = IllegalArgumentException.class) public void throwsWhenTracestateIsEmpty() { new Tracestate(""); }
/** * Ctor that creates a tracestate object from a parent one */ public Tracestate(Tracestate parent, String key, String value) { if (key == null) { throw new IllegalArgumentException("key is null"); } if (!KEY_VALIDATION_RE.matcher(key).find()) { throw new IllegalArgumentException("invalid key format"); } if (value == null) { throw new IllegalArgumentException("value is null"); } if (!VALUE_VALIDATION_RE.matcher(value).find()) { throw new IllegalArgumentException("invalid value format"); } internalList.put(key, value); if (parent != null) { for (String k : parent.internalList.keySet()) { internalList.put(k, parent.internalList.get(k)); } internalList.put(key, value); } internalString = toInternalString(); }
@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(expected = IllegalArgumentException.class) public void throwsWhenTracestateIsNull() { new Tracestate(null); }
/** * Ctor that creates tracestate object from given value */ public Tracestate(String input) { if (input == null) { throw new IllegalArgumentException("input is null"); } String[] values = DELIMITER_FORMAT_RE.split(input); for (String item : values) { Matcher m = MEMBER_FORMAT_RE.matcher(item); if (!m.find()) { throw new IllegalArgumentException(String.format("invalid string %s in tracestate", item)); } String key = m.group(1); String value = m.group(3); if (internalList.get(key) != null) { throw new IllegalArgumentException(String.format("duplicated keys %s in tracestate", key)); } internalList.put(key, value); } if (internalList.size() > MAX_KEY_VALUE_PAIRS) { throw new IllegalArgumentException(String.format("cannot have more than %d key-value pairs", MAX_KEY_VALUE_PAIRS)); } internalString = toInternalString(); }
@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()); }
ThreadContext.getRequestTelemetryContext().getTracestate().toString());