ASM可以便捷地为部署在网格内的应用提供链路追踪能力,但要实现网格内和网格外应用的一体化追踪,需要使用链路追踪系统以形成调用链。本文将演示如何通过阿里云链路追踪让网格外部应用调用网格内部应用并形成一个完整的链路追踪信息。
步骤一:部署网格内应用BookInfo
- 通过kubectl执行以下命令,将Bookinfo应用部署到ASM实例的集群中。
BookInfo应用的YAML文件,请从
GitHub下载。
kubectl --kubeconfig=${DATA_PLANE_KUBECONFIG} apply -f bookinfo.yaml
- 部署Bookinfo应用的VirtualService。
VirtualService的YAML文件,请从
GitHub下载。
kubectl --kubeconfig=${ASM_KUBECONFIG} apply -f virtual-service-all-v1.yaml
- 部署Bookinfo应用的DestinationRule。
DestinationRule的YAML文件,请从
Github下载。
kubectl --kubeconfig=${ASM_KUBECONFIG} apply -f destination-rule-all.yaml
- 部署Bookinfo应用的Gateway。
Gateway的YAML文件,请从
GitHub下载。
kubectl --kubeconfig=${ASM_KUBECONFIG} apply -f bookinfo-gateway.yaml
步骤二:获取链路追踪Tracing Analysis的接入点地址
- 登录链路追踪Tracing Analysis控制台。
- 在左侧导航栏单击概览。
- 在右侧区域单击接入流程页签,然后单击查看接入点信息。
- 查看接入点地址。
- 选择地域。应此处您需要选择BookInfo应用部署的ACK集群所在地域来上报数据,否则追踪信息无法关联。
- 单击下方显示Token,并根据您的ExternalProxy部署位置决定选择公网或私网接入点地址。
因为ExternalProxy通过Zipkin V1 API进行数据上报,所以这里我们需用选用V1版本的接入点地址。

步骤三:部署网格外应用ExternalProxy
- 将下面的代码保存至网格外应用运行环境,命名为ExternalProxy.py。
import requests
from flask import Flask
from py_zipkin.zipkin import zipkin_span,create_http_headers_for_new_span
from py_zipkin.util import generate_random_64bit_string
from py_zipkin.util import ZipkinAttrs
import time
app = Flask(__name__)
def do_stuff(trace_id, span_id, parent_span_id):
time.sleep(2)
headers = create_http_headers_for_new_span()
headers["X-B3-TraceId"] = trace_id
headers["X-B3-SpanId"] = span_id
headers["X-B3-ParentSpanId"] = parent_span_id
print "SEND TO INGRESS HEADERS : {0}".format(headers)
r = requests.get('http://${INGRESS_GATE_WAY_IP}/productpage', headers=headers)
return 'OK'
def http_transport(encoded_span):
# encoding prefix explained in https://github.com/Yelp/py_zipkin#transport
body=encoded_span
zipkin_url="${XTRACE_ZIPKIN_V1_ENDPOINT}"
headers = {"Content-Type": "application/x-thrift"}
# You'd probably want to wrap this in a try/except in case POSTing fails
r=requests.post(zipkin_url, data=body, headers=headers)
print(body)
@app.route('/')
def index():
with zipkin_span(
service_name='external-proxy',
span_name='external-proxy/inbound',
transport_handler=http_transport,
port=5000,
sample_rate=100,
) as inbound_span:
do_stuff(inbound_span.zipkin_attrs.trace_id, inbound_span.zipkin_attrs.span_id, inbound_span.zipkin_attrs.parent_span_id)
return 'OK', 200
if __name__=='__main__':
app.run(host="0.0.0.0",port=5000,debug=True)
- 替换代码中的下述内容。
- 将{XTRACE_ZIPKIN_V1_ENDPOINT}替换为上一步获取到的接入点地址。如果您希望上报于自行部署的追踪系统,这里请替换为其上报地址。
- 将{INGRESS_GATE_WAY_IP}替换为ACK集群Ingress Gateway的地址。
- 执行下面的命令,启动ExternalProxy。
python ExternalProxy.py
* Serving Flask app "main" (lazy loading)
* Environment: production
WARNING: This is a development server. Do not use it in a production deployment.
Use a production WSGI server instead.
* Debug mode: on
* Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
* Restarting with stat
* Debugger is active!
* Debugger PIN: 317-792-686
- 调用ExternalProxy。
步骤四:查看链路追踪信息
- 登录链路追踪Tracing Analysis控制台。
- 在左侧导航栏单击应用列表,然后在上方选择地域,单击下方列表中的ExternalProxy。
- 在应用页面的左侧导航栏单击应用详情,然后单击调用链路页签,最后单击相应的traceid查看链路追踪信息。
执行结果
可以看到,网格外部应用ExternalProxy与内部应用BookInfo之间已形成完整的调用链路。