这个task向你展示如何在启用Istio的应用中配置 Zipkin or Jaeger 来收集trace spans。完成这个task后,你应该理解所有关于你的应用的假设,以及不管你用于构建应用的语言/框架/平台如何,都可以让它参与追踪。
在这个task中使用Bookinfo 示例。
如果你在安装期间没有开启 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
使用端口转发开启访问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控制台的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
启动并运行Bookinfo 应用,通过访问一次或多次 http://$GATEWAY_URL/productpage
来生成追踪信息。
如果你现在看着控制台,你应该能看到类似:
如果你点击最顶部(最近的)的trace,你应该能看到对应你最近一次刷新 /productpage
的细节。页面看起来类似:
如你所见,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调用。
尽管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);
当你在应用中对下游进行调用时,确保包含这些请求头。
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