Назовите внешнюю зависимость в Zipkin, чтобы нарисовать ее
Я использую Zipkin с Spring Sleuth для отображения следов. Когда я использую его локально, http://localhost:9411/zipkin/dependency/ отображает красиво созданный график зависимостей в экосистеме. Иногда бэкэнды извне этой экосистемы вызываются, и они не отображаются на этом графике. Можно ли аннотировать вызов (предположим, клиенты RestTemplate и Feign) к такой внешней системе, чтобы Зипкин действительно нарисовал эту зависимость? Если это возможно, что я должен сделать?
Это будет моя базовая линия кода:
@Bean
RestTemplate restTemplate() {
return new RestTemplate();
}
@RequestMapping("/")
public String callExternalBackend() {
return restTemplate.getForObject("https://httpbin.org/get", String.class);
}
Где-то я хотел бы напечатать httpbin
так что этот вызов обращается в граф зависимостей Зипкина.
Спасибо!
// Редактирование на основе текущего решения Я использую 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, а не в Sleuth?
1 ответ
Эджвар
Вы читали документацию? Если вы используете Spring Cloud Sleuth в версии Edgware, если вы читаете раздел Sleuth, вы найдете этот фрагмент документации https://cloud.spring.io/spring-cloud-static/Edgware.SR3/single/spring-cloud.html
Позвольте мне скопировать это для вас
54.5 Пользовательский тег SA в Zipkin Иногда вы хотите создать ручной Span, который обернет вызов во внешнюю службу, которая не оснащена инструментами. Что вы можете сделать, это создать диапазон с тегом 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
тег не будет работать для Финчли. Вы должны сделать это следующим образом, используя 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();
}