在 Zipkin 中命名一个外部依赖来绘制它

Name an external dependency in Zipkin to have it drawn

我正在使用 Zipkin 和 Spring Sleuth 来显示痕迹。当我在本地使用它时,http://localhost:9411/zipkin/dependency/ 显示了一个在生态系统内精心创建的依赖关系图。有时,该生态系统外部的后端会被调用,而这些后端不会显示在该图中。是否可以注释对此类外部系统的调用(让我们假设 RestTemplate 和 Feign 客户端),以便 Zipkin 实际上会绘制该依赖项?如果可能的话,我该怎么办?

这将是我的代码基准:

@Bean
RestTemplate restTemplate() {
    return new RestTemplate();
}

@RequestMapping("/")
public String callExternalBackend() {
    return restTemplate.getForObject("https://httpbin.org/get", String.class);
}

我想在某处键入 httpbin,以便在 Zipkin 的依赖关系图中绘制此调用。

谢谢!


// 根据当前解决方案编辑 我正在使用 Spring Cloud Finchley 并在 restTemplate 调用之前添加了以下行:

@RequestMapping("/")
public String callBackend() {
    spanCustomizer.tag("peer.service", "httpbin");
    return restTemplate.getForObject("https://httpbin.org/get", String.class);
}

我只是在这个class中注入了SpanCustomizer。 Span 被发送到 Zipkin,我看到标签已设置:

不幸的是,它没有在依赖项视图中绘制。还有什么我需要配置的吗,也许是在 Zipkin 而不是 Sleuth 中?

EDGWARE

你读过文档了吗?如果您在 Edgware 版本中使用 Spring Cloud Sleuth 如果您阅读了 Sleuth 部分,您会发现这篇文档 https://cloud.spring.io/spring-cloud-static/Edgware.SR3/single/spring-cloud.html#_custom_sa_tag_in_zipkin

让我复制给你

54.5 Custom SA tag in Zipkin Sometimes you want to create a manual Span that will wrap a call to an external service which is not instrumented. What you can do is to create a span with the peer.service tag that will contain a value of the service that you want to call. Below you can see an example of a call to Redis that is wrapped in such a span.

org.springframework.cloud.sleuth.Span newSpan = tracer.createSpan("redis");
try {
    newSpan.tag("redis.op", "get");
    newSpan.tag("lc", "redis");
    newSpan.logEvent(org.springframework.cloud.sleuth.Span.CLIENT_SEND);
    // call redis service e.g
    // return (SomeObj) redisTemplate.opsForHash().get("MYHASH", someObjKey);
} finally {
    newSpan.tag("peer.service", "redisService");
    newSpan.tag("peer.ipv4", "1.2.3.4");
    newSpan.tag("peer.port", "1234");
    newSpan.logEvent(org.springframework.cloud.sleuth.Span.CLIENT_RECV);
    tracer.close(newSpan);
}

[Important] Important Remember not to add both peer.service tag and the SA tag! You have to add only peer.service.

芬奇利

SA 标签对 Finchley 无效。您必须使用跨度上的 remoteEndpoint 按以下方式执行此操作。

    Span span = tracer.newTrace().name("redis"); 
    span.remoteEndpoint(Endpoint.newBuilder().serviceName("redis").build()); 
    span.kind(CLIENT);
    try(SpanInScope ws = tracer.withSpanInScope(span.start())) {
          // add any tags / annotations on the span
          // return (SomeObj) redisTemplate.opsForHash().get("MYHASH", someObjKey);
    } finally {
      span.finish();
    }