使用可观测链路OpenTelemetry版实现网格内外应用的一体化追踪

ASM可以便捷地为部署在网格内的应用提供链路追踪能力,但要实现网格内和网格外应用的一体化追踪,需要使用可观测链路OpenTelemetry版以形成调用链。本文介绍如何通过阿里云可观测链路OpenTelemetry版,使网格外部应用调用网格内部应用并形成一个完整的链路追踪信息。

前提条件

使用说明

  • 本示例将部署一个用Python编写的应用ExternalProxy。该应用会启用一个HTTP Server,当ExternalProxy的根路径被访问时,会调用网格内应用BookInfo的Productpage应用。

  • 本示例将使用XTrace为追踪系统进行演示。若您使用自行部署的Zipkin兼容的追踪系统,可以将该系统上报地址暴露于网格外应用可以访问的地址,可以跳过步骤二:获取可观测链路OpenTelemetry版的接入点地址,直接参照步骤三:部署网格外应用ExternalProxy使用该地址作为上报地址即可。

步骤一:部署网格内应用BookInfo

  1. 执行以下命令,将Bookinfo应用部署到ASM实例的集群中。

    BookInfo应用的YAML文件,请从GitHub下载。

    kubectl --kubeconfig=${DATA_PLANE_KUBECONFIG} apply -f bookinfo.yaml
  2. 执行以下命令,部署Bookinfo应用的VirtualService。

    VirtualService的YAML文件,请从GitHub下载。

    kubectl --kubeconfig=${ASM_KUBECONFIG} apply -f virtual-service-all-v1.yaml
  3. 执行以下命令,部署Bookinfo应用的DestinationRule。

    DestinationRule的YAML文件,请从Github下载。

    kubectl --kubeconfig=${ASM_KUBECONFIG} apply -f destination-rule-all.yaml
  4. 执行以下命令,部署Bookinfo应用的Gateway。

    Gateway的YAML文件,请从GitHub下载。

    kubectl --kubeconfig=${ASM_KUBECONFIG} apply -f bookinfo-gateway.yaml

步骤二:获取可观测链路OpenTelemetry版的接入点地址

  1. 登录可观测链路OpenTelemetry版,在左侧导航栏,单击概览

  2. 概览页面,单击接入流程页签,然后单击查看接入点信息

  3. 查看接入点地址。

    1. 在页面上方,选择目标地域。

      请选择BookInfo应用部署的ACK集群所在地域来上报数据,否则追踪信息无法关联。

    2. 接入点信息页签,打开显示Token开关,并根据您的ExternalProxy部署位置决定选择公网或私网接入点地址。

      因为ExternalProxy通过Zipkin V1 API进行数据上报,因此选用V1版本的接入点地址。查看接入点地址

步骤三:部署网格外应用ExternalProxy

重要
  • Sidecar代理会将接收到的请求中的所有内容(包括HTTP头部、请求体等)转发给上游服务,因此链路追踪相关的Header也会被转发至上游。

  • 为了完成链路追踪信息的透传,应用需要按照社区规范将链路追踪相关的请求Header透传至上游的请求。

  1. 将下面的代码保存至网格外应用运行环境,命名为ExternalProxy.py

    • {XTRACE_ZIPKIN_V1_ENDPOINT}替换为上一步获取到的接入点地址。如果您希望上报于自行部署的追踪系统,这里请替换为其上报地址。

    • {INGRESS_GATE_WAY_IP}替换为ACK集群Ingress Gateway的地址。

      展开查看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)
  2. 执行下面的命令,启动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
  3. 执行以下命令,调用ExternalProxy。

    curl localhost:5000

    预期输出:

    OK

步骤四:查看链路追踪信息

  1. 登录可观测链路OpenTelemetry版

  2. 在左侧导航栏,单击应用列表,然后在上方选择地域,单击下方列表中的ExternalProxy。

  3. 在左侧导航栏,单击应用详情,单击调用链路页签,单击相应的traceId查看链路追踪信息。

    查看链路追踪

    可以看到,网格外部应用ExternalProxy与内部应用BookInfo之间已形成完整的调用链路。一体化链路