Distributed Tracing

这个task向你展示如何在启用Istio的应用中配置 Zipkin or Jaeger 来收集trace spans。完成这个task后,你应该理解所有关于你的应用的假设,以及不管你用于构建应用的语言/框架/平台如何,都可以让它参与追踪。
在这个task中使用Bookinfo 示例。

Before you begin

  • 按照 Installation guide 中的指示安装Istio。

如果你在安装期间没有开启 Zipkin or Jaeger插件,那可以现在使用如下命令开启。
对于zipkin:

kubectl apply -f install/kubernetes/addons/zipkin.yaml

对于 Jaeger:

kubectl apply -n istio-system -f https://raw.githubusercontent.com/jaegertracing/jaeger-kubernetes/master/all-in-one/jaeger-all-in-one-template.yml
  • 部署 Bookinfo

Accessing the dashboard

Zipkin

使用端口转发开启访问Zipkin控制台的URL:

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

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

Jaeger

使用端口转发开启访问Jaeger控制台的URL:

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

Generating traces using the Bookinfo sample

启动并运行Bookinfo 应用,通过访问一次或多次 http://$GATEWAY_URL/productpage 来生成追踪信息。
如果你现在看着控制台,你应该能看到类似:
Distributed Tracing_第1张图片
Distributed Tracing_第2张图片
如果你点击最顶部(最近的)的trace,你应该能看到对应你最近一次刷新 /productpage 的细节。页面看起来类似:
Distributed Tracing_第3张图片
Distributed Tracing_第4张图片

如你所见,trace由spans组成,每个span对应着一次执行 /productpage 请求时对Bookinfo 应用的调用。尽管每个服务都有相同的标签 istio-proxy ,因为追踪是由对实际服务调用进行包装的Istio sidecar(Envoy proxy)完成的,目标标签(向右)标识的每条线代表着服务耗时。

第一条线代表对 productpage 服务的外部调用。标签 192.168.64.3:32000 是用于外部请求的主机值 (i.e., $GATEWAY_URL)。正如你在trace中看到的,请求完成共花了大概290ms。在它执行期间, productpage 调用了details 服务,耗时约24ms,然后调用 reviews 服务。 reviews 服务执行花费了大约243ms,包括对于ratings的15ms调用。

Understanding what happened

尽管Istio代理能自动发送spans,他们需要一些提示将整个追踪结合在一起。应用需要传播适当的HTTP请求头,这样当代理发送span信息给 Zipkin or Jaeger时,spans才能正确的关联到一个单一trace。
为了达到这一目的,一个应用需要从入站请求到任何出战请求都收集和传播如下请求头:

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

如果你观察示例服务,你将看到productpage 应用(Python) 从一个HTTP请求提取需要的请求头:

def getForwardHeaders(request):
    headers = {}

    user_cookie = request.cookies.get("user")
    if user_cookie:
        headers['Cookie'] = 'user=' + user_cookie

    incoming_headers = [ 'x-request-id',
                         'x-b3-traceid',
                         'x-b3-spanid',
                         'x-b3-parentspanid',
                         'x-b3-sampled',
                         'x-b3-flags',
                         'x-ot-span-context'
    ]

    for ihdr in incoming_headers:
        val = request.headers.get(ihdr)
        if val is not None:
            headers[ihdr] = val
            #print "incoming: "+ihdr+":"+val

    return headers

reviews 应用 (Java) 也类似:

@GET
@Path("/reviews")
public Response bookReviews(@CookieParam("user") Cookie user,
                            @HeaderParam("x-request-id") String xreq,
                            @HeaderParam("x-b3-traceid") String xtraceid,
                            @HeaderParam("x-b3-spanid") String xspanid,
                            @HeaderParam("x-b3-parentspanid") String xparentspanid,
                            @HeaderParam("x-b3-sampled") String xsampled,
                            @HeaderParam("x-b3-flags") String xflags,
                            @HeaderParam("x-ot-span-context") String xotspan) {
  String r1 = "";
  String r2 = "";

  if(ratings_enabled){
    JsonObject ratings = getRatings(user, xreq, xtraceid, xspanid, xparentspanid, xsampled, xflags, xotspan);

当你在应用中对下游进行调用时,确保包含这些请求头。

Cleanup

  • 移除插件追踪配置
    如果你运行Zipkin,使用:
kubectl delete -f install/kubernetes/addons/zipkin.yaml

如果你运行Jaeger,使用:

kubectl delete -f https://raw.githubusercontent.com/jaegertracing/jaeger-kubernetes/master/all-in-one/jaeger-all-in-one-template.yml
  • 如果你不打算探索接下来地任何课题,参考 Bookinfo cleanup 指南来关闭应用。

你可能感兴趣的:(翻译)