在本文中,学习如何实现 Jaeger(基于 OpenTracing 和 Spring Boot 应用程序)以及如何应用 Jaeger UI 可视化跟踪。

介绍

在本文中,咱们将探讨如何应用 Jaeger 实现分布式跟踪以及如何应用 Jaeger UI 可视化跟踪。

Jaeger 是一种开源分布式跟踪机制,有助于跟踪分布式系统中的申请。它基于OpenTracing标准,是云原生计算基金会 (CNCF)的一部分。

有了这个,让咱们看一些代码。

施行 Jaeger 跟踪

咱们从https://start.spring.io创立一个只有一个“Spring Web”依赖项的应用程序。

生成并下载代码后,咱们会将以下 Jaeger 依赖项增加到 pom 文件中,这将有助于在服务之间生成和流传跟踪。

<dependency>   <groupId>io.opentracing.contrib</groupId>   <artifactId>opentracing-spring-jaeger-cloud-starter</artifactId>   <version>3.3.1</version></dependency>

有了这个,让咱们增加一个带有一些门路的控制器。

@RestController@RequestMapping("/service")public class Controller {    private static final Logger logger = LoggerFactory.getLogger(Controller.class);    private RestTemplate restTemplate;    @Value("${spring.application.name}")    private String applicationName;    public Controller(RestTemplate restTemplate) {        this.restTemplate = restTemplate;    }    @GetMapping("/path1")    public ResponseEntity path1() {        logger.info("Incoming request at {} for request /path1 ", applicationName);        String response = restTemplate.getForObject("http://localhost:8090/service/path2", String.class);        return ResponseEntity.ok("response from /path1 + " + response);    }    @GetMapping("/path2")    public ResponseEntity path2() {        logger.info("Incoming request at {} at /path2", applicationName);        return ResponseEntity.ok("response from /path2 ");    }}

在这里,咱们有两个端点:/path1和/path2。这里的想法是应用同一应用程序的两个实例,以便在固定端口 8090/path1调用另一个服务。/path2

为了使跨度连贯到雷同的跟踪 ID,咱们须要创立一个 RestTemplate bean 以容许 Jaeger 蕴含一个拦截器。而后,这有助于向传出申请增加跟踪,这将有助于跟踪整个申请。

@Bean   public RestTemplate restTemplate(RestTemplateBuilder builder) {      return builder.build();   }

实现后,让咱们应用 Docker 在本地启动 Jaeger 服务器。为此,我创立了一个带有端口映射的 Docker Compose 文件。

version: "3.3"services:  jaeger-allinone:    image: jaegertracing/all-in-one:1.25    ports:      - 6831:6831/udp      - 6832:6832/udp      - 16686:16686      - 14268:14268

咱们能够通过 UDP 或 TCP 与 Jaeger 进行通信。应用 启动 Docker 映像后docker-compose up,咱们能够应用 URL http://localhost:16686/拜访 UI 。

当初,让咱们增加一些属性以容许应用程序将跟踪发送到 Jaeger 服务器。咱们将通过 TCP 进行通信,因而请确保咱们将跟踪发送到另一个 TCP 端口,即 14268

opentracing:  jaeger:    http-sender:      url: http://localhost:14268/api/traces

让咱们应用以下命令启动“服务器 1”。

java -jartarget/Distributed-Service-0.0.1-SNAPSHOT.jar--spring.application.name=Service-1--server.port=8080

而后在不同的终端上,运行与“服务 2”雷同的应用程序的新实例,如下所示

java -jartarget/Distributed-Service-0.0.1-SNAPSHOT.jar--spring.application.name=Service-2--server.port=8090

应用程序启动后,调用“Service 1”,/path1如下所示

curl -i http://localhost:8080/service/path1

让咱们看一下“服务1”的日志。

INFO 69938 --- [nio-8080-exec-1] i.j.internal.reporters.LoggingReporter   : Span reported: ed70bbaa2bd5b42f:c7c94163fc95fc1e:ed70bbaa2bd5b42f:1 - GET

跟踪的格局为 [Root Span ID, Current Span ID, Parent Span ID]。在这种状况下,因为“服务 1”是发动服务,因而父跨度 IDed70bbaa2bd5b42f也是根跨度 ID。

当初,让咱们看一下“服务 2”的日志。

INFO 69885 --- [nio-8090-exec-1] i.j.internal.reporters.LoggingReporter   : Span reported: ed70bbaa2bd5b42f:e9060cb1d5336c55:c7c94163fc95fc1e:1 - path2

从这里咱们看到两头值是以后 span ID,父 span ID(即第三个值c7c94163fc95fc1e)是“Service 1”的 span ID。

当初,如果您关上 UI,您将看到以下内容:

当咱们深刻开掘时,咱们会看到每个跨度的更多细节。

在这里,根跨度 IDed70bbaa2bd5b42f逾越整个申请。其余两个跨度 ID 指的是单个服务。

论断

明天咱们探讨了如何将基于 OpenTracing 的 Jaeger 与 Spring Boot 应用程序集成。您能够点击这里更深刻地理解 OpenTracing 的标准。此外,应用 Spring Cloud Jaeger 的库源代码在这里。

我一直摸索和学习新事物。如果您想理解最新趋势并进步您的软件开发技能,请关注我。

祝您好运!!