Назовите внешнюю зависимость в Zipkin, чтобы нарисовать ее - PullRequest
0 голосов
/ 12 июня 2018

Я использую 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, чтобы этот вызов отображался в графе зависимостей 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, а не в Sleuth?

1 Ответ

0 голосов
/ 12 июня 2018

EDGWARE

Вы прочитали документацию?Если вы используете Spring Cloud Sleuth в версии Edgware, если вы читаете раздел Sleuth, вы найдете этот фрагмент документации https://cloud.spring.io/spring-cloud-static/Edgware.SR3/single/spring-cloud.html#_custom_sa_tag_in_zipkin

Позвольте мне скопировать его для вас

54.5 Custom SAtag в 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.

FINCHLEY

Тег 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();
    }
...