Zipkin 追踪(trace)

Zipkin 追踪沙盒使用 Zipkin <https://zipkin.io/> 作为追踪提供程序来实现 Envoy 的 :ref:请求追踪功能。 这个沙盒与前面所讲的前端代理架构非常的相似,但有一点不同的是:在返回响应之前,service1 会对 service2 进行 API 调用。 这三个容器将被部署在名为 envoymesh 的虚拟网络中。

所有传入的请求都通过前端 envoy 进行路由,envoy 充当位于 envoymesh 网络边缘的反向代理。 端口 8000 由 docker compose 暴露(参见 /examples/zipkin-tracing/docker-compose.yaml)。 请注意,所有 envoy 都配置为收集请求跟踪 (例如 /examples/zipkin-tracing/front-envoy-zipkin.yaml`中的 http_connection_manager/config/tracing 配置) 并设置为传递 Zipkin 追踪器生成的 span 到 Zipkin 集群中 (追踪驱动设置在 :repo:/examples/zipkin-tracing/front-envoy-zipkin.yaml`)。

在将请求路由到合适的 envoy 或应用程序之前,Envoy 会生成合适的用于追踪的 span(父子共享的上下文 span)。 在高层次上,每个 span 记录上游API调用的延迟以及将 span 与其他相关 span(例如跟踪ID)关联所需的信息。

从 Envoy 进行跟踪的最重要的好处之一是,它会保证将跟踪信息传播到 Zipkin 服务群集。 但是,为了充分利用跟踪,应用端必须在调用其他服务的时候传递 Envoy 生成的追踪的请求头信息。 在我们提供的沙箱例子中,作为 service1 的简单 flask 应用(参见 /examples/front-proxy/service.py 中的跟踪函数)在访问 service2 的时候传递了追踪的请求头信息。

运行沙盒

以下文档说明了上述对于 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/zipkin-tracing
$ docker-compose pull
$ docker-compose up --build -d
$ docker-compose ps

            Name                          Command             State                            Ports
-----------------------------------------------------------------------------------------------------------------------------
zipkin-tracing_front-envoy_1   /docker-entrypoint.sh /bin ... Up      10000/tcp, 0.0.0.0:8000->8000/tcp, 0.0.0.0:8001->8001/tcp
zipkin-tracing_service1_1      /bin/sh -c /usr/local/bin/ ... Up      10000/tcp, 8000/tcp
zipkin-tracing_service2_1      /bin/sh -c /usr/local/bin/ ... Up      10000/tcp, 8000/tcp
zipkin-tracing_zipkin_1        /busybox/sh run.sh             Up      9410/tcp, 0.0.0.0:9411->9411/tcp

步骤 4: 发送请求

你现在可以通过 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.43.0
> Accept: */*
>
< HTTP/1.1 200 OK
< content-type: text/html; charset=utf-8
< content-length: 89
< x-envoy-upstream-service-time: 1
< 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: 在 Zipkin UI 中查看追踪

使用你的浏览器访问 http://localhost:9411。 你应该看到 Zipkin 仪表板。 将服务设置为 “front-proxy”,并将开始时间设置为在测试(步骤 2)开始前几分钟并按回车。 你应该能看到来自 front-proxy 的跟踪信息。 单击一个追踪来显示从 front-proxy 到 service1 再到 service2 的路径信息,以及每个跳跃点所产生的延迟。