代码之家  ›  专栏  ›  技术社区  ›  user3105453

在Zipkin中命名一个外部依赖项以使其绘制

  •  0
  • user3105453  · 技术社区  · 6 年前

    我正在用Zipkin和Spring侦探来显示痕迹。当我在本地使用它时, http://localhost:9411/zipkin/dependency/ 显示一个在生态系统中创建的良好依赖关系图。有时,会调用该生态系统外部的后端,而这些后端不会显示在该图中。是否可以将调用(假设为resttemplate和假装客户机)注释到这样一个外部系统,以便zipkin实际绘制这种依赖关系?如果可能的话,我该怎么办?

    这将是我的代码基线:

    @bean
    resttemplate resttemplate()。{
    返回new resttemplate();
    }
    
    @请求映射(“/”)
    公共字符串CallExternalBackend()。{
    返回resttemplate.getforobject(“https://httpbin.org/get”,string.class);
    }
    
    
    

    我想在某个地方键入httpbin以便在zipkin的依赖关系图中绘制此调用。

    谢谢!


    //根据当前解决方案编辑 我正在使用SpringCloudFinchley,并在resttemplate调用之前添加了以下行:

    @requestmapping(“/”)
    公共字符串callbackend()。{
    spancustomizer.tag(“peer.service”,“httpbin”);
    返回resttemplate.getforobject(“https://httpbin.org/get”,string.class);
    }
    
    
    

    我只需在这个类中注入spancustomer跨度被发送到Zipkin,我看到标签被设置为:

    不幸的是,它没有在依赖关系视图中绘制。我还有什么需要配置的吗,也许是在Zipkin,而不是在Sleuth?显示生态系统中创建良好的依赖关系图。有时,会调用该生态系统外部的后端,而这些后端不会显示在该图中。是否可以将调用(假设为resttemplate和假装客户机)注释到这样一个外部系统,以便zipkin实际绘制这种依赖关系?如果可能的话,我该怎么办?

    这将是我的代码基线:

    @Bean
    RestTemplate restTemplate() {
        return new RestTemplate();
    }
    
    @RequestMapping("/")
    public String callExternalBackend() {
        return restTemplate.getForObject("https://httpbin.org/get", String.class);
    }
    

    我想打的地方httpbin所以这个调用被绘制在zipkin的依赖关系图中。

    谢谢您!


    //编辑基于当前解决方案 我正在使用SpringCloudFinchley,并在resttemplate调用之前添加了以下行:

    @RequestMapping("/")
    public String callBackend() {
        spanCustomizer.tag("peer.service", "httpbin");
        return restTemplate.getForObject("https://httpbin.org/get", String.class);
    }
    

    我只是注射SpanCustomizer在这节课上。跨度发送到Zipkin,我看到标签已设置:

    enter image description here

    不幸的是,它没有在依赖关系视图中绘制。我还有什么需要配置的吗,也许是在Zipkin,而不是在Sleuth?

    1 回复  |  直到 6 年前
        1
  •  1
  •   Marcin Grzejszczak    6 年前

    边角料

    你看过文件了吗?如果您在Edgware版本中使用SpringCloudSleuth,如果您阅读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();
        }
    
    推荐文章