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