全部產品
Search
文件中心

Alibaba Cloud Service Mesh:使用可觀測鏈路OpenTelemetry版實現網格內外應用的一體化追蹤

更新時間:Jun 30, 2024

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之間已形成完整的調用鏈路。一體化鏈路