当前位置: 首页 > 知识库问答 >
问题:

在Zipkin中命名一个外部依赖项来绘制它

百里俭
2023-03-14

我正在使用Zipkin和Spring Sleuth来显示痕迹。当我在本地使用时,http://localhost:9411/zipkin/dependency/显示生态系统内创建的良好依赖关系图。有时,来自生态系统外部的后端会被调用,而这些后端不会显示在该图表中。有没有可能对这样一个外部系统的调用(假设RestTemplate和假客户机)进行注释,以便Zipkin能够实际绘制该依赖关系?如果可能的话,我该怎么办?

这将是我的代码基线:

@Bean
RestTemplate restTemplate() {
    return new RestTemplate();
}

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

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

非常感谢。

//基于当前解决方案进行编辑我正在使用Spring Cloud Finchley,并在restTemplate调用之前添加了以下行:

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

我只是在这个类中注入spanCustomzer。Span被发送到Zipkin,我看到标签已经设置:

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

共有1个答案

周阳波
2023-03-14

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 Zipkin中的自定义SA标记有时您希望创建一个手动范围,将对未检测的外部服务的调用封装起来。你能做的就是与同伴建立一个跨度。服务标签,它将包含您要调用的服务的值。下面你可以看到一个调用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);
}

[重要]重要记住不要同时添加两个对等项。服务标签和SA标签!只需添加对等项。服务

芬奇利

SA标签对Finchley不起作用。您必须使用span上的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();
    }
 类似资料:
  • 通常, 一个 Java 项目的依赖许多外部的 JAR 文件.为了在项目里引用这些 JAR 文件,你需要告诉 Gradle 去哪里找它们.在 Gradle 中,JAR 文件位于一个仓库中,这里的仓库类似于 MAVEN 的仓库,可以被用来提取依赖,或者放入依赖。 举个例子,我们将使用开放的 Maven 仓库: 例子 7.3. 加入 Maven 仓库 build.gradle repositories

  • 我试图用JUnit和SLF4J测试来测试记录器的行为,这是“SLF4J的一个测试实现,它将日志消息存储在内存中,并提供检索它们的方法”。 我有一些将SLF4J作为传递依赖项的依赖项。我试图将SLF4J从我的测试配置中的所有依赖项中排除,但我仍然需要它来进行SLF4J测试。 我可以通过下面的代码将SLF4J排除在所有内容之外,但这显然也将它排除在我需要的SLF4J测试之外。 由于SLF4J是我的许多

  • 我有一个图书馆项目。我想使用Android的新构建系统。目前我遇到了一个相当烦人的情况。 我在上定义了依赖项,但它们从未出现在Android Studio的外部库中。因此,对这些库的所有引用都被标记为错误。 更新 这个问题似乎在最新的Android Studio版本(0.2.5)上得到了修复

  • 我需要在我的maven项目中添加大约15个罐子,它在远程和中央存储库中都不可用。 然而,我实现了以下目标:, > 在我的项目路径中添加了jars(\src\lib) 将pom更改如下, 我的问题是: 我是否需要像上面那样分别对所有15个JAR重复它,或者我们有任何其他方法来绑定这些JAR并将其作为一个依赖路径? Maven在这里讨论了同样的事情:指向多个JAR的系统依赖性。但我想知道我是否能得到更

  • 问题内容: 关于添加库和依赖项有很多信息,但是我还没有找到关于能够实际编辑库的任何有用信息。 我在项目中添加了https://github.com/jdamcd/android- crop 作为依赖项,但我想编辑其某些功能,主要是与布局相关的内容。但是,当我浏览文件时,Android Studio会说“生成了构建文件夹下的文件,不应对其进行编辑”,当我对其进行编辑时,一旦系统构建,它们将返回到其预

  • 依赖关系会迅速变得复杂起来,并且很容易形成 循环依赖(circular dependency) (即 A 依赖 B,B 又依赖 A),这将导致 Puppet 发生错误并停止工作。 幸运的是, Puppet 的 --graph 选项可以很容易生成一个资源之间的依赖关系图, 它可以帮助我们解决循环依赖的问题。 准备工作 使用如下命令安装查看图片文件所需的 graphviz 软件包: # apt-get