全部產品
Search
文件中心

Alibaba Cloud Service Mesh:自訂資料面訪問日誌

更新時間:Jun 30, 2024

部署在資料平面(即加入網格的Kubernetes叢集)的Envoy Proxy可以輸出所有訪問日誌。ASM支援自訂Envoy Proxy輸出的訪問日誌內容。本文介紹如何自訂Envoy Proxy輸出的訪問日誌內容。

前提條件

步驟一:啟用訪問日誌

ASM執行個體版本為1.17.2.35以下

  1. 登入ASM控制台,在左側導覽列,選擇服務網格 > 網格管理

  2. 網格管理頁面,單擊目標執行個體名稱,然後在左側導覽列,選擇網格執行個體 > 基本資料

  3. 基本資料頁面右上方,單擊功能設定

  4. 功能設定更新面板,選中開啟訪問日誌並將其列印到容器標準輸出,然後單擊確定

    istio-proxy容器預設輸出包含以下欄位的日誌。如果關閉訪問日誌,istio-proxy容器將不會產生JSON格式的訪問日誌。

    展開查看日誌詳情

    
        "authority_for":"%REQ(:AUTHORITY)%",
        "bytes_received":"%BYTES_RECEIVED%",
        "bytes_sent":"%BYTES_SENT%",
        "downstream_local_address":"%DOWNSTREAM_LOCAL_ADDRESS%",
        "downstream_remote_address":"%DOWNSTREAM_REMOTE_ADDRESS%",
        "duration":"%DURATION%",
        "istio_policy_status":"%DYNAMIC_METADATA(istio.mixer:status)%",
        "method":"%REQ(:METHOD)%",
        "path":"%REQ(X-ENVOY-ORIGINAL-PATH?:PATH)%",
        "protocol":"%PROTOCOL%",
        "request_id":"%REQ(X-REQUEST-ID)%",
        "requested_server_name":"%REQUESTED_SERVER_NAME%",
        "response_code":"%RESPONSE_CODE%",
        "response_flags":"%RESPONSE_FLAGS%",
        "route_name":"%ROUTE_NAME%",
        "start_time":"%START_TIME%",
        "trace_id":"%REQ(X-B3-TRACEID)%",
        "upstream_cluster":"%UPSTREAM_CLUSTER%",
        "upstream_host":"%UPSTREAM_HOST%",
        "upstream_local_address":"%UPSTREAM_LOCAL_ADDRESS%",
        "upstream_service_time":"%RESP(X-ENVOY-UPSTREAM-SERVICE-TIME)%",
        "upstream_transport_failure_reason":"%UPSTREAM_TRANSPORT_FAILURE_REASON%",
        "user_agent":"%REQ(USER-AGENT)%",
        "x_forwarded_for":"%REQ(X-FORWARDED-FOR)%"

ASM執行個體版本為1.17.2.35及以上

  1. 登入ASM控制台,在左側導覽列,選擇服務網格 > 網格管理

  2. 網格管理頁面,單擊目標執行個體名稱,然後在左側導覽列,選擇可觀測管理中心 > 可觀測配置

  3. 可觀測配置頁面,按需單擊全域命名空間自訂頁簽。

    • 若您選擇命名空間頁簽,請單擊建立,按需選擇命名空間

    • 若您選擇自訂頁簽,請單擊建立,按需選擇命名空間,輸入名稱匹配標籤

  4. 日誌設定地區,開啟啟用日誌輸出開關,然後單擊提交

    開啟開關後,服務網格資料平面Sidecar或網關會將訪問日誌輸出至容器標準輸出。ASM還支援日誌過濾功能,詳情請參見日誌過濾

  5. 在資料平面Sidecar容器的標準輸出查看日誌。

    下文以使用kubectl查看訪問日誌為例進行說明。

    1. 執行以下命令,查看Sidecar日誌。

      kubectl logs httpbin-5c5944c58c-w**** -c istio-proxy --tail 1

      展開查看樣本輸出

      {
          "authority_for":"47.110.XX.XXX",
          "bytes_received":"0",
          "bytes_sent":"22382",
          "downstream_local_address":"192.168.0.29:80",
          "downstream_remote_address":"221.220.XXX.XXX:0",
          "duration":"80",
          "istio_policy_status":"-",
          "method":"GET",
          "path":"/static/favicon.ico",
          "protocol":"HTTP/1.1",
          "request_id":"0f2cf829-3da5-4810-a618-08d9745d****",
          "requested_server_name":"outbound_.8000_._.httpbin.default.svc.cluster.local",
          "response_code":"200",
          "response_flags":"-",
          "route_name":"default",
          "start_time":"2023-06-30T04:00:36.841Z",
          "trace_id":"-",
          "upstream_cluster":"inbound|80||",
          "upstream_host":"192.168.0.29:80",
          "upstream_local_address":"127.0.X.X:55879",
          "upstream_response_time":"79",
          "upstream_service_time":"79",
          "upstream_transport_failure_reason":"-",
          "user_agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.X.X Safari/537.36",
          "x_forwarded_for":"221.220.XXX.XXX"
      }
    2. 執行以下命令,查看入口網關日誌。

      kubectl -n istio-system logs istio-ingressgateway-6cff9b6b58-r**** --tail 1

      展開查看樣本輸出

      {
          "authority_for":"47.110.XX.XXX",
          "bytes_received":"0",
          "bytes_sent":"22382",
          "downstream_local_address":"192.168.0.63:80",
          "downstream_remote_address":"221.220.XXX.XXX:64284",
          "duration":"81",
          "istio_policy_status":"-",
          "method":"GET",
          "path":"/static/favicon.ico",
          "protocol":"HTTP/1.1",
          "request_id":"0f2cf829-3da5-4810-a618-08d9745d****",
          "requested_server_name":"-",
          "response_code":"200",
          "response_flags":"-",
          "route_name":"httpbin",
          "start_time":"2023-06-30T04:00:36.841Z",
          "trace_id":"-",
          "upstream_cluster":"outbound|8000||httpbin.default.svc.cluster.local",
          "upstream_host":"192.168.0.29:80",
          "upstream_local_address":"192.168.0.63:36140",
          "upstream_response_time":"81",
          "upstream_service_time":"81",
          "upstream_transport_failure_reason":"-",
          "user_agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.X.X Safari/537.36",
          "x_forwarded_for":"221.220.XXX.XXX"
      }
  6. (可選)通過Container Service控制台查看訪問日誌。

    如果您使用阿里雲Container Service叢集,還可以通過Container Service控制台查看訪問日誌。

    1. 登入Container Service管理主控台,在左側導覽列選擇叢集

    2. 叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,選擇工作負載 > 容器組

    3. 容器組頁面,單擊目標Pod名稱,然後在頁面下方單擊日誌頁簽,查看訪問日誌。

關於日誌的更多資訊,請參見可觀測配置啟用控制平面日誌採集和日誌警示(新版)

步驟二:自訂資料面訪問日誌內容

ASM執行個體版本為1.17.2.35以下

  1. 登入ASM控制台,在左側導覽列,選擇服務網格 > 網格管理

  2. 網格管理頁面,單擊目標執行個體名稱,然後在左側導覽列,選擇網格執行個體 > 基本資料

  3. 基本資料頁面的配置資訊地區,單擊開啟訪問日誌並將其列印到容器標準輸出右側的自訂訪問日誌格式

  4. 自訂訪問日誌格式對話方塊下方,新增自訂訪問日誌格式,設定變數名稱my_custom_key變數值%REQ(end-user)%,然後單擊確認

    本文以擷取Bookinfo樣本中HTTP請求的Header欄位end-user為例。如下圖所示,自訂訪問日誌格式時,您可以選擇ASM提供的可選欄位,也可以新增自訂欄位。選中目標欄位後,將按照自訂的訪問日誌格式輸出訪問日誌。可選欄位

ASM執行個體版本為1.17.2.35及以上

  1. 登入ASM控制台,在左側導覽列,選擇服務網格 > 網格管理

  2. 網格管理頁面,單擊目標執行個體名稱,然後在左側導覽列,選擇可觀測管理中心 > 可觀測配置

  3. 可觀測配置頁面,按需單擊全域命名空間自訂頁簽。

    • 若您選擇命名空間頁簽,請單擊建立,按需選擇命名空間

    • 若您選擇自訂頁簽,請單擊建立,按需選擇命名空間,輸入名稱匹配標籤

  4. 日誌設定地區,按需選中欄位、修改目標欄位資訊或在最下方日誌指標右側單擊增加.png表徵圖,新增日誌欄位,然後單擊提交

    只有開啟啟用日誌輸出開關,才能自訂日誌格式。在日誌格式地區,預設選中的日誌欄位為預設必選欄位,不支援修改。日誌欄位支援從請求Header、響應Header、Envoy內建值中取值。

    下文以列印請求中的accept-coding Header為例,配置變數名稱accept-encoding類型請求屬性變數值Accept-Encoding日誌格式.png

  5. 執行以下命令,查看服務網格資料平面組件日誌。

    kubectl logs httpbin-5c5944c58c-w**** -c istio-proxy --tail 1|grep accept-encoding --color=auto

    展開查看樣本輸出

    {
        "bytes_received":"0",
        "bytes_sent":"9593",
        "downstream_local_address":"192.168.0.29:80",
        "downstream_remote_address":"69.164.XXX.XX:0",
        "duration":"2",
        "istio_policy_status":"-",
        "method":"GET",
        "path":"/",
        "protocol":"HTTP/1.1",
        "request_id":"29939dc9-62be-4ddf-acf6-32cb098d****",
        "requested_server_name":"outbound_.8000_._.httpbin.default.svc.cluster.local",
        "response_code":"200",
        "response_flags":"-",
        "route_name":"default",
        "start_time":"2023-06-30T04:18:19.734Z",
        "trace_id":"-",
        "upstream_cluster":"inbound|80||",
        "upstream_host":"192.168.0.29:80",
        "upstream_local_address":"127.0.X.X:34723",
        "upstream_service_time":"2",
        "upstream_transport_failure_reason":"-",
        "user_agent":"Mozilla/5.0 zgrab/0.x",
        "x_forwarded_for":"69.164.XXX.XX",
        "authority_for":"47.110.XX.XXX",
        "upstream_response_time":"2",
        "accept-encoding":"gzip"
    }

    可以看到步驟4新增的Accept-Encoding Header的值,已被輸出至訪問日誌。關於日誌的更多資訊,請參見可觀測配置啟用控制平面日誌採集和日誌警示(新版)

步驟三:查看訪問日誌

啟用訪問日誌後,發起請求的Sidecar容器將按照自訂的訪問日誌格式輸出訪問日誌。

  1. 在瀏覽器地址欄輸入入口網關地址:productpage,訪問Productpage應用。

  2. 登入Container Service管理主控台,在左側導覽列選擇叢集

  3. 叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,選擇工作負載 > 無狀態

  4. 無狀態頁面頂部,設定命名空間default,然後在productpage-v1應用右側,單擊操作列下的詳情

  5. 在應用詳情頁面,單擊日誌頁簽,設定Containeristio-proxy

    在日誌輸出框中可以看到如下日誌。日誌中包含名為jason的end-user,表明自訂日誌內容成功。日誌

請求耗時相關欄位說明

Service MeshASM中,“上遊(upstream)”表示調用鏈中請求的接收方,“下遊(downstream)”表示請求的發起方。例如,服務A向服務B發起請求時,服務A為“下遊(downstream)”,服務B為“上遊(upstream)”。

變數名稱

變數值

說明

duration

$DURATION%

  • 對於HTTP請求,該欄位的值表示從該請求開始讀取到返回給下遊響應的最後一個位元組被發送的時間,即Sidecar或網關處理一個請求所經過的完整時間長度。

  • 對於TCP請求,該欄位表示下遊串連的建立期間的總時間長度。

request_duration

%REQUEST_DURATION%

  • 對於HTTP請求,該欄位的值表示從下遊讀取整個請求(Header + Body)所消耗的時間。如果這部分耗時較長,您可以按照以下方面進行排查:

    • 網路品質是否良好,頻寬是否充足。

    • 上遊或下遊應用在同量級I/O下是否存在瓶頸。

  • 對於TCP請求,該欄位未實現(在日誌中顯示為“-”)。

request_tx_duration

%REQUEST_TX_DURATION%

  • 對於HTTP請求,該欄位表示從該請求發生開始,到其最後一個位元組被發送至上遊所經歷的時間。如果這部分耗時較長,您可以按照以下方面進行排查:

    • 網路品質是否良好,頻寬是否充足。

    • 上遊或下遊應用在同量級I/O下是否存在瓶頸。

  • 對於TCP請求,該欄位未實現(在日誌中顯示為“-”)。

response_duration

%RESPONSE_DURATION%

  • 對於HTTP請求,該欄位表示從該請求發生開始,到讀取到上遊返回的該請求Response的首個位元組所經歷的時間。如果這部分耗時較長,而request_tx_duration耗時較短,請檢查上遊應用是否存在效能瓶頸。

  • 對於TCP請求,該欄位未實現(在日誌中顯示為“-”)。

response_tx_duration

%RESPONSE_TX_DURATION%

  • 對於HTTP請求,該欄位表示從讀取到上遊Response的第一個位元組開始,到最後一個位元組被發送至下遊所經歷的時間。如果這部分耗時較長,您可以按照以下方面進行排查:

    • 網路品質是否良好,頻寬是否充足。

    • 上遊或下遊應用在同量級I/O下是否存在瓶頸。

  • 對於TCP請求,該欄位未實現(在日誌中顯示為“-”)。

upstream_service_time(sidecar)

%RESP(X-ENVOY-UPSTREAM-SERVICE-TIME)%

在Sidecar訪問日誌或網關日誌中,該欄位表示上遊的處理時間及與上遊進行網路通訊消耗的時間。若該時間較長,請檢查:

  • 上遊應用的處理效能是否符合預期。

  • 與上遊通訊的網路延遲、頻寬是否符合預期。

upstream_response_time(gateway)

說明

對於帶有Body(Content-Length > 0)的HTTP請求,Envoy是邊接收邊發給上遊(而非全部接受後發送)。如果下遊的讀取速度緩慢,將會增加上遊的讀取時間,以及上遊發送給它的上遊的時間(上遊為邊讀邊發送的方式)。

相關操作

您還可以使用Log Service採集資料平面的AccessLog。具體操作,請參見產生和採集ASM網關訪問日誌