Java OpenCensus:通过POST请求进行跟踪传播
在Java中,我试图通过HttpPost请求(org.apache.HTTP.client.methods.HttpPost)传播TraceContext。我将上下文参数传递给标题,如下所示:Java OpenCensus:通过POST请求进行跟踪传播,java,servlets,propagation,opencensus,Java,Servlets,Propagation,Opencensus,在Java中,我试图通过HttpPost请求(org.apache.HTTP.client.methods.HttpPost)传播TraceContext。我将上下文参数传递给标题,如下所示: try (Scope scope = tracer.spanBuilder("firstSpan").startScopedSpan()) { SpanContext spanContext = tracer.getCurrentSpan().getConte
try (Scope scope = tracer.spanBuilder("firstSpan").startScopedSpan()) {
SpanContext spanContext = tracer.getCurrentSpan().getContext();
StringBuilder builder =
new StringBuilder()
.append(spanContext.getTraceId().toLowerBase16())
.append(SPAN_ID_DELIMITER)
.append(UnsignedLongs.toString(spanIdToLong(spanContext.getSpanId())))
.append(TRACE_OPTION_DELIMITER)
.append(spanContext.getTraceOptions().isSampled() ? SAMPLED : NOT_SAMPLED);
httpPost.addHeader(HEADER_NAME, builder.toString());
HttpResponse response = reportSession.getHttpClient().execute(httpPost,reportSession.getHttpContext());
请求由Servlet(在单独的JAR中)处理,我在其中检索参数并尝试打开一个新的范围:
String headerStr = req.getHeader(HEADER_NAME);
TraceId traceId = TraceId.fromLowerBase16(headerStr.subSequence(0, TRACE_ID_SIZE));
int traceOptionsPos = headerStr.indexOf(TRACE_OPTION_DELIMITER, TRACE_ID_SIZE);
CharSequence spanIdStr = headerStr.subSequence(SPAN_ID_START_POS, traceOptionsPos < 0 ? headerStr.length() : traceOptionsPos);
SpanId spanId = longToSpanId(UnsignedLongs.parseUnsignedLong(spanIdStr.toString(), 10));
TraceOptions traceOptions = OPTIONS_NOT_SAMPLED;
if (traceOptionsPos > 0) {
String traceOptionsStr = headerStr.substring(traceOptionsPos + TRACE_OPTION_DELIMITER_SIZE);
if ((UnsignedInts.parseUnsignedInt(traceOptionsStr, 10) & CLOUD_TRACE_IS_SAMPLED) != 0) {
traceOptions = OPTIONS_SAMPLED;
}
}
SpanContext context = SpanContext.create(traceId, spanId, traceOptions, TRACESTATE_DEFAULT);
try (Scope scope = tracer.spanBuilderWithRemoteParent("newSpan", context).setSpanKind(Kind.SERVER).startScopedSpan()) {
// execute Servlet code
}
String headerStr=req.getHeader(HEADER\u NAME);
TraceId TraceId=TraceId.fromLowerBase16(headerStr.子序列(0,TRACE_ID_SIZE));
int traceOptions spos=headerStr.indexOf(跟踪选项分隔符,跟踪ID大小);
CharSequence spanIdStr=headerStr.子序列(SPAN\u ID\u START\u POS,traceOptionsPos<0?headerStr.length():traceOptionsPos);
SpanId SpanId=longToSpanId(UnsignedLongs.parseUnsignedLong(spanIdStr.toString(),10));
TraceOptions TraceOptions=选项\u未\u采样;
如果(TraceOptions SPOS>0){
字符串traceOptionsStr=headerStr.substring(traceOptionsPos+TRACE\u选项\u分隔符\u大小);
if((unsignedits.parseunsignedits(traceOptionsStr,10)&CLOUD\u跟踪已采样)!=0){
traceOptions=选项\u采样;
}
}
SpanContext context=SpanContext.create(traceId、spanId、traceOptions、tracstate\u默认值);
try(Scope Scope=tracer.spanBuilderWithRemoteParent(“newSpan”,context).setSpanKind(Kind.SERVER).startScopedSpan()){
//执行Servlet代码
}
但在谷歌云平台上,我能看到的唯一跨度是“firstSpan”,而“newSpan”在监视器中不存在。。。有人能帮我吗
多谢各位