我正在使用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,我看到标签已设置:
不幸的是,它没有在依赖项视图中绘制。还有什么我需要配置,可能在Zipkin而不是在侦探?
答案 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();
}