我有微服务,支持开放跟踪,并将跟踪id和span id注入到标头.其他微业务支持开放遥测。如何在第二个微服务中使用跟踪id和span-id创建父span?
谢谢,
发布于 2022-05-07 02:27:13
您可以使用W3C跟踪上下文规范来实现这一点。我们需要通过HTTP从生产者发送示踪亲本(Ex:示踪亲本)(或者您可以使用使用者中的跟踪id和span-id创建它)。然后,我们可以提取远程上下文并使用traceparent创建span。
这是消费者控制器。TextMapGetter用于将跟踪父数据映射到上下文。ExtractModel只是一个自定义类。
@GetMapping(value = "/second")
public String sencondTest(@RequestHeader(value = "traceparent") String traceparent){
try {
Tracer tracer = openTelemetry.getTracer("cloud.events.second");
TextMapGetter<ExtractModel> getter = new TextMapGetter<>() {
@Override
public String get(ExtractModel carrier, String key) {
if (carrier.getHeaders().containsKey(key)) {
return carrier.getHeaders().get(key);
}
return null;
}
@Override
public Iterable<String> keys(ExtractModel carrier) {
return carrier.getHeaders().keySet();
}
};
ExtractModel model = new ExtractModel();
model.addHeader("traceparent", traceparent);
Context extractedContext = openTelemetry.getPropagators().getTextMapPropagator()
.extract(Context.current(), model, getter);
try (Scope scope = extractedContext.makeCurrent()) {
// Automatically use the extracted SpanContext as parent.
Span serverSpan = tracer.spanBuilder("CloudEvents Server")
.setSpanKind(SpanKind.SERVER)
.startSpan();
try {
Thread.sleep(150);
} finally {
serverSpan.end();
}
}
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
return "Server Received!";
}
然后,当我们配置OpenTelemetrySdk时,需要在上下文传播程序中设置W3CTraceContextPropagator。
// Use W3C Propagator(to extract span from HTTP headers) since we use the W3C specifications
TextMapPropagator textMapPropagator = W3CTraceContextPropagator.getInstance();
OpenTelemetrySdk openTelemetrySdk = OpenTelemetrySdk.builder()
.setTracerProvider(tracerProvider)
.setPropagators(ContextPropagators.create(textMapPropagator))
.buildAndRegisterGlobal();
这是我的客户ExtractModel课程
public class ExtractModel {
private Map<String, String> headers;
public void addHeader(String key, String value) {
if (this.headers == null){
headers = new HashMap<>();
}
headers.put(key, value);
}
public Map<String, String> getHeaders() {
return headers;
}
public void setHeaders(Map<String, String> headers) {
this.headers = headers;
}
}
您可以在手工仪表的正式文件中找到更多细节。
发布于 2022-04-20 06:32:53
通常,如果在标头中可用,则必须将span-id和跟踪id传递。在您的微服务中获得的任何请求,检查标头中是否包含span-id和跟踪id。如果是,请提取它们并在您的服务中使用它们。如果它不存在,那么您将创建一个新的,并在您的服务中使用它,并将它添加到您的微服务之外的请求中。
https://stackoverflow.com/questions/71935070
复制相似问题