分布式调用链跟踪

    完成本章后,你可以理解有关应用程序的所有假设以及如何使其参与跟踪,无论您使用何种语言/框架/平台构建应用程序。

    BookInfo示例用来作为此任务的示例应用程序。

    • 参照的说明安装Istio。

      如果您在安装过程中未启动Zipkin或Jaeger插件,则可以运行以下命令启动:

      启动Zipkin:

      启动Jaeger:

    • 部署BookInfo示例中的应用程序。

    访问仪表盘

    通过端口转发设置访问Zipkin dashboard URL:

    然后使用浏览器访问http://localhost:9411

    Jaeger

    1. kubectl port-forward -n istio-system $(kubectl get pod -n istio-system -l app=jaeger -o jsonpath='{.items[0].metadata.name}') 16686:16686 &

    然后使用浏览器访问http://localhost:16686

    BookInfo的应用程序启动和运行后,通过访问http://$GATEWAY_URL/productpage一次或多次生成调用链信息。

    如果你查看仪表板,会看到类似以下的内容:

    Jaeger Dashboard

    如果你点击调用链堆栈中(最近的)最近的一条,您应该看到刷新/ productpage后最新的详细信息。页面看起来像这样:

    Jaeger Trace View

    像您看到的,调用链由spans组成,其中每个span对应于使用/ productpage去调用BookInfo服务。 因为调用链堆栈是由Istio Sidecar(Envoy代理)包装实际的服务完成的,所以每个服务具有相同的标签istio-proxy。右侧的目的地标签每一行标识该服务的调用耗时。

    理解下发生了什么

    尽管Istio代理能够自动发送spans,但他们需要一些标识来将整个调用链关系联系起来。应用程序需要传入合适的HTTP header信息,便于代理发送span信息到Zipkin或Jaeger时,span可以准确地把每次调用关联起来。

    为此,应用程序需要从传入的请求中收集如下的header信息并将其传入到每个传出请求:

    • x-b3-traceid
    • x-b3-spanid
    • x-b3-parentspanid
    • x-b3-sampled
    • x-b3-flags
    • x-ot-span-context

    如果您细看示例的服务,可以看到productpage应用(Python应用)从HTTP请求中提取所需的header信息:

    示例中reviews应用(Java应用)也做了类似的事情:

    1. @GET
    2. @Path("/reviews")
    3. public Response bookReviews(@CookieParam("user") Cookie user,
    4. @HeaderParam("x-request-id") String xreq,
    5. @HeaderParam("x-b3-spanid") String xspanid,
    6. @HeaderParam("x-b3-sampled") String xsampled,
    7. @HeaderParam("x-b3-flags") String xflags,
    8. @HeaderParam("x-ot-span-context") String xotspan) {
    9. String r1 = "";
    10. String r2 = "";
    11. if(ratings_enabled){
    12. JsonObject ratings = getRatings(user, xreq, xtraceid, xspanid, xparentspanid, xsampled, xflags, xotspan);

    在应用程序中调用其他服务时,请确保包含这些header信息。

    • 删除调用链跟踪的配置:

      如果使用Zipkin,请运行以下命令进行清理

      如果使用Jaeger,请运行以下命令进行清理:

      1. kubectl delete -f https://raw.githubusercontent.com/jaegertracing/jaeger-kubernetes/master/all-in-one/jaeger-all-in-one-template.yml
    • 如果您不打算继续后面的章节,请参阅BookInfo cleanup说明关闭应用程序。

    进一步阅读