Назовите внешнюю зависимость в 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();
    }
Другие вопросы по тегам