Jaeger 原生追踪

Jaeger 追踪沙盒使用 Jaeger 作为追踪提供程序,并使用 Jaeger 的原生 C++ 客户端 作为插件,演示了 Envoy 的 请求追踪 功能。 使用 Jaeger 及其原生客户端而不是 Envoy 内置的 Zipkin 客户端具有以下优点:

  • 追踪传播将与 Jaeger 的其他服务一起使用,而无需进行配置 更改

  • 可以使用各种不同的 采样策略 ,包括概率采样或可以从 Jaeger 的后端集中控制的远程采样。

  • 跨度以更有效的二进制编码发送到收集器。

该沙盒与前面描述的前端代理体系结构非常相似,但有一个区别: service1 在返回响应之前对 service2 进行 API 调用。 这三个容器将部署在称为 envoymesh 的虚拟网络中。

Note

Jaeger 原生追踪只能工作在 x86-64 架构。

所有的传入请求都通过前端 Envoy 路由,该前端 Envoy 是作为位于 envoymesh 网络边缘的反向代理。8000 端口由 docker compose 公开(请参阅 /examples/jaeger-native-tracing/docker-compose.yaml)。请注意,所有 Envoy 都进行了配置,用来收集请求的追踪(例如, /examples/jaeger-native-tracing/front-envoy-jaeger.yaml 中的 http_connection_manager/config/tracing 设置)并进行设置以传播 Jaeger 所生成的跨度(spans),并将 Jaeger 追踪器生成的 span 传播到 Jaeger 集群中(追踪驱动在 /examples/jaeger-native-tracing/front-envoy-jaeger.yaml 中设置)。

在将请求路由到适当的服务 Envoy 或应用程序之前,Envoy 将负责生成用于追踪的适当跨度(父/子上下文跨度)。在较高层级上,每个跨度都记录上游 API 调用的延迟以及将跨度与其他相关跨度关联的所需信息(例如,追踪 ID)。

从 Envoy 进行追踪的最重要好处之一是,它将负责将追踪信息传播到 Jaeger 服务集群。但是,为了充分利用追踪的优势,应用程序必须传播 Envoy 生成的追踪头部信息,同时调用其他服务。在我们提供的沙盒当中,有个简单 flask 应用程序(请参阅 /examples/front-proxy/service.py 中的追踪功能 )在对 service2 进行出站调用时作为 service1 传播追踪标头。

运行沙盒

以下文档说明了上述对于 Envoy 容器编译环境进行设置的过程。

步骤 1:安装 Docker

确保你已安装较新版本的 dockerdocker-compose

一个最简单的方法来完成此事就是使用 Docker Desktop

步骤 2:克隆 Envoy 仓库

如果你还没有克隆 Envoy 仓库,用如下方式进行克隆:

git clone [email protected]:envoyproxy/envoy
git clone https://github.com/envoyproxy/envoy.git

步骤 3: 构建沙盒

要构建这个沙盒示例,并启动示例应用程序,请运行以下命令:

$ pwd
envoy/examples/jaeger-native-tracing
$ docker-compose pull
$ docker-compose up --build -d
$ docker-compose ps

            Name                              Command                State                                                      Ports
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
jaeger-native-tracing_front-envoy_1   /start-front.sh                Up      10000/tcp, 0.0.0.0:8000->8000/tcp, 0.0.0.0:8001->8001/tcp
jaeger-native-tracing_jaeger_1        /go/bin/all-in-one-linux - ... Up      14250/tcp, 14268/tcp, 0.0.0.0:16686->16686/tcp, 5775/udp, 5778/tcp, 6831/udp, 6832/udp, 0.0.0.0:9411->9411/tcp
jaeger-native-tracing_service1_1      /start-service.sh              Up      10000/tcp, 8000/tcp
jaeger-native-tracing_service2_1      /start-service.sh              Up      10000/tcp, 8000/tcp

步骤 4: 生成一些负载

你现在可以通过 front-envoy 向 service1 发送以下请求:

$ curl -v localhost:8000/trace/1
*   Trying 192.168.99.100...
* Connected to 192.168.99.100 (192.168.99.100) port 8000 (#0)
> GET /trace/1 HTTP/1.1
> Host: 192.168.99.100:8000
> User-Agent: curl/7.54.0
> Accept: */*
>
< HTTP/1.1 200 OK
< content-type: text/html; charset=utf-8
< content-length: 89
< x-envoy-upstream-service-time: 9
< server: envoy
< date: Fri, 26 Aug 2018 19:39:19 GMT
<
Hello from behind Envoy (service 1)! hostname: f26027f1ce28 resolvedhostname: 172.19.0.6
* Connection #0 to host 192.168.99.100 left intact

步骤 5: 在 Jaeger 图形界面中查看追踪

用浏览器打开 http://localhost:16686。你应该可以看到 Jaeger 仪表盘。将服务设置为 “front-proxy” 然后点击 ‘Find Traces’。你应该看到 front-proxy 的追踪信息。单击追踪,来查看从 front-proxy 到 service1 再到 service2 的请求路径,以及每一跳产生的延迟。