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

时间:2018-06-12 09:27:46

标签: zipkin spring-cloud-sleuth

我正在使用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);
}

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

enter image description here

不幸的是,它没有在依赖项视图中绘制。还有什么我需要配置,可能在Zipkin而不是在侦探?

1 个答案:

答案 0 :(得分:1)

<强>埃奇韦尔

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

让我为你复制

  

54.5 Zipkin中的自定义SA标记有时您想创建一个手动跨度,它将对外部服务进行包装,而不是   仪表。你可以做的是创建一个跨度   peer.service标记,它将包含您的服务值   想打电话。下面你可以看到一个调用Redis的例子   包裹在这样的范围内。

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);
}
  

[重要]重要提示请记住不要同时添加peer.service标记和   SA标签!您只需要添加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();
    }