部署在資料平面(即加入網格的Kubernetes叢集)的Envoy Proxy可以輸出所有訪問日誌。ASM支援自訂Envoy Proxy輸出的訪問日誌內容。本文介紹如何自訂Envoy Proxy輸出的訪問日誌內容。
前提條件
步驟一:啟用訪問日誌
ASM執行個體版本為1.17.2.35以下
-
登入ASM控制台,在左側導覽列,選擇。
-
在網格管理頁面,單擊目標執行個體名稱,然後在左側導覽列,選擇。
-
在基本資料頁面右上方,單擊功能設定。
-
在功能設定更新面板,選中開啟訪問日誌並將其列印到容器標準輸出,然後單擊確定。
istio-proxy容器預設輸出包含以下欄位的日誌。如果關閉訪問日誌,istio-proxy容器將不會產生JSON格式的訪問日誌。
ASM執行個體版本為1.17.2.35及以上
-
登入ASM控制台,在左側導覽列,選擇。
-
在網格管理頁面,單擊目標執行個體名稱,然後在左側導覽列,選擇。
-
在可觀測配置頁面,按需單擊全域、命名空間或自訂頁簽。
-
若您選擇命名空間頁簽,請單擊建立,按需選擇命名空間。
-
若您選擇自訂頁簽,請單擊建立,按需選擇命名空間,輸入名稱和匹配標籤。
-
-
在日誌設定地區,開啟啟用日誌輸出開關,然後單擊提交。
開啟開關後,服務網格資料平面Sidecar或網關會將訪問日誌輸出至容器標準輸出。ASM還支援日誌過濾功能,詳情請參見日誌過濾。
-
在資料平面Sidecar容器的標準輸出查看日誌。
下文以使用kubectl查看訪問日誌為例進行說明。
-
執行以下命令,查看Sidecar日誌。
kubectl logs httpbin-5c5944c58c-w**** -c istio-proxy --tail 1 -
執行以下命令,查看入口網關日誌。
kubectl -n istio-system logs istio-ingressgateway-6cff9b6b58-r**** --tail 1
-
-
(可選)通過Container Service控制台查看訪問日誌。
如果您使用阿里雲Container Service叢集,還可以通過Container Service控制台查看訪問日誌。
-
登入Container Service管理主控台,在左側導覽列選擇叢集列表。
-
在叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,選擇。
-
在容器組頁面,單擊目標Pod名稱,然後在頁面下方單擊日誌頁簽,查看訪問日誌。
-
關於日誌的更多資訊,請參見可觀測配置和啟用控制平面日誌採集和日誌警示(新版)。
步驟二:自訂資料面訪問日誌內容
ASM執行個體版本為1.17.2.35以下
-
登入ASM控制台,在左側導覽列,選擇。
-
在網格管理頁面,單擊目標執行個體名稱,然後在左側導覽列,選擇。
-
在基本資料頁面的配置資訊地區,單擊開啟訪問日誌並將其列印到容器標準輸出右側的自定義訪問日誌格式。
-
在自定義訪問日誌格式對話方塊下方,新增自訂訪問日誌格式,設定變數名稱為my_custom_key,變數值為%REQ(end-user)%,然後單擊確認。
本文以擷取Bookinfo樣本中HTTP請求的Header欄位end-user為例。自訂訪問日誌格式時,您可以選擇ASM提供的可選欄位,也可以新增自訂欄位。選中目標欄位後,將按照自訂的訪問日誌格式輸出訪問日誌。其中,request_duration(
%REQUEST_DURATION%)、request_tx_duration(%REQUEST_TX_DURATION%)、response_duration(%RESPONSE_DURATION%)、response_tx_duration(%RESPONSE_TX_DURATION%)四個欄位無需勾選。
ASM執行個體版本為1.17.2.35及以上
-
登入ASM控制台,在左側導覽列,選擇。
-
在網格管理頁面,單擊目標執行個體名稱,然後在左側導覽列,選擇。
-
在可觀測配置頁面,按需單擊全域、命名空間或自訂頁簽。
-
若您選擇命名空間頁簽,請單擊建立,按需選擇命名空間。
-
若您選擇自訂頁簽,請單擊建立,按需選擇命名空間,輸入名稱和匹配標籤。
-
-
在日誌設定地區,按需選中欄位、修改目標欄位資訊或在最下方日誌指標右側單擊
表徵圖,新增日誌欄位,然後單擊提交。只有開啟啟用日誌輸出開關,才能自訂日誌格式。在日誌格式地區,預設選中的日誌欄位為預設必選欄位,不支援修改。日誌欄位支援從請求Header、響應Header、Envoy內建值中取值。
下文以列印請求中的accept-encoding Header為例,配置變數名稱為accept-encoding,類型為請求屬性,變數值為Accept-Encoding。例如,請求屬性欄位 authority_for 的格式運算式為
%REQ(:AUTHORITY)%,響應屬性欄位 upstream_response_time 的格式運算式為%RESP(X-ENVOY-UPSTREAM-SERVICE-TIME)%,Envoy 內建屬性包括 request_duration、response_duration 等欄位。 -
執行以下命令,查看服務網格資料平面組件日誌。
kubectl logs httpbin-5c5944c58c-w**** -c istio-proxy --tail 1|grep accept-encoding --color=auto可以看到步驟4新增的Accept-Encoding Header的值,已被輸出至訪問日誌。關於日誌的更多資訊,請參見可觀測配置和啟用控制平面日誌採集和日誌警示(新版)。
步驟三:查看訪問日誌
啟用訪問日誌後,發起請求的Sidecar容器將按照自訂的訪問日誌格式輸出訪問日誌。
-
在瀏覽器地址欄輸入入口網關地址:productpage,訪問Productpage應用。
-
登入Container Service管理主控台,在左側導覽列選擇叢集列表。
-
在叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,選擇。
-
在無狀態頁面頂部,設定命名空間為default,然後在productpage-v1應用右側,單擊操作列下的詳情。
-
在應用詳情頁面,單擊日誌頁簽,設定Container為istio-proxy。
在日誌輸出框中可以看到如下日誌。日誌中包含名為jason的end-user,表明自訂日誌內容成功。
{"method":"GET","x_forwarded_for":null,"upstream_host":"172.19.16.90:9080","protocol":"HTTP/1.1","my_custom_key":"jason","authority_for":"addedvalues:9080","response_code":200,"start_time":"2021-10-21T11:40:12.0552","request_id":"5222b7fb-05a6-4fae-8e13-xxx","bytes_sent":883,"downstream_remote_address":"172.19.16.11:33752","upstream_transport_failure_reason":null,"downstream_local_address":"192.168.237.140:9080","requested_server_name":null,"response_flags":"-","duration":4,"user_agent":"python-requests/2.18.4","route_name":"default","trace_id":null,"istio_policy_status":null,"path":"/addedvalues/0","upstream_cluster":"outbound|9080||addedvalues.default.svc.cluster.local","bytes_received":0,"upstream_service_time":"3","authority":"addedvalues:9080","upstream_local_address":"172.19.16.11:52430"}
訪問日誌欄位說明
在Service MeshASM中,“上遊(upstream)”表示調用鏈中請求的接收方,“下遊(downstream)”表示請求的發起方。例如,服務A向服務B發起請求時,服務A為“下遊(downstream)”,服務B為“上遊(upstream)”。
|
變數名稱 |
變數值 |
說明 |
|
authority_for |
%REQ(:AUTHORITY)% |
請求中攜帶的目標主機名稱,對於HTTP 1.1請求,其對應 |
|
bytes_received |
%BYTES_RECEIVED% |
|
|
bytes_sent |
%BYTES_SENT% |
|
|
downstream_local_address |
%DOWNSTREAM_LOCAL_ADDRESS% |
下遊串連的目標地址和連接埠(可以理解為下遊串連的原始目標地址)。 |
|
downstream_remote_address |
%DOWNSTREAM_REMOTE_ADDRESS% |
下遊串連的用戶端地址和連接埠。 |
|
method |
%REQ(:METHOD)% |
請求的方法(該欄位僅HTTP有效)。 |
|
path |
%REQ(X-ENVOY-ORIGINAL-PATH?:PATH)% |
請求的路徑。 |
|
protocol |
%PROTOCOL% |
請求的協議。 |
|
request_id |
%REQ(X-REQUEST-ID)% |
本次請求的唯一ID。 |
|
requested_server_name |
%REQUESTED_SERVER_NAME% |
SSL串連中設定的服務端名稱(SNI)。 |
|
response_code |
%RESPONSE_CODE% |
HTTP請求返回碼。 |
|
response_flags |
%RESPONSE_FLAGS% |
關於響應或者串連的額外資訊,取值和對應含義,請參考response_flag說明。 |
|
route_name |
%ROUTE_NAME% |
命中的路由名稱,與虛擬服務中定義的路由名稱一致,若該值為空白("-"),則說明沒有命中任何路由。 |
|
start_time |
%START_TIME% |
開始處理該請求的時間(精確到毫秒)。 |
|
trace_id |
%TRACE_ID% |
鏈路追蹤的traceid |
|
upstream_cluster |
%UPSTREAM_CLUSTER% |
上遊目標服務和子集。 |
|
upstream_host |
%UPSTREAM_HOST% |
上遊目標主機,通常是Pod IP和連接埠。 |
|
upstream_local_address |
%UPSTREAM_LOCAL_ADDRESS% |
與上遊建立串連時使用的本地地址。 |
|
duration |
$DURATION% |
|
|
request_duration |
%REQUEST_DURATION% |
|
|
request_tx_duration |
%REQUEST_TX_DURATION% |
|
|
response_duration |
%RESPONSE_DURATION% |
|
|
response_tx_duration |
%RESPONSE_TX_DURATION% |
|
|
upstream_service_time(sidecar) |
%RESP(X-ENVOY-UPSTREAM-SERVICE-TIME)% |
在Sidecar訪問日誌或網關日誌中,該欄位表示上遊的處理時間及與上遊進行網路通訊消耗的時間。若該時間較長,請檢查:
|
|
upstream_response_time(gateway) |
對於帶有Body(Content-Length > 0)的HTTP請求,Envoy是邊接收邊發給上遊(而非全部接受後發送)。如果下遊的讀取速度緩慢,將會增加上遊的讀取時間,以及上遊發送給它的上遊的時間(上遊為邊讀邊發送的方式)。
response_flag說明
訪問日誌的response_flag欄位的值可以對請求/串連的情況進行進一步說明,您可以參考下方表格中對response_flag不同取值的說明,獲得更多資訊。
|
值 |
說明 |
|
UH |
沒有找到健康的上遊主機,通常是由於目標服務沒有可用端點造成。 |
|
UF |
串連到上遊主機失敗,通常是由於上遊應用沒有監聽,或配置了錯誤的連接埠造成。 |
|
UO |
上遊被熔斷 |
|
NR |
沒有找到針對對應請求的路由規則 |
|
NC |
無法找到目標服務,這通常意味著配置的路由規則中主機名稱或子集名稱沒有正確配置。 |
|
URX |
請求被限流 |
|
DC |
下遊斷開了串連 |
|
UR |
上遊重設了串連 |
|
UAEX |
請求被外部授權服務拒絕,這意味著ASM網格代理遵從外部授權服務的返回而拒絕了該請求。 |
|
DPE |
處理下遊請求時協議錯誤,這表明下遊應用發送的請求使用了非預期的協議,請檢查您叢集中服務的連接埠名稱(name)是否以正確的協議作為首碼,例如:http-80,http,grpc等。 |
|
UPE |
向上遊發起請求時協議錯誤,這表明ASM網格代理嘗試向上遊轉寄的請求使用了非預期的協議,請檢查您叢集中服務的連接埠名稱(name)是否以正確的協議作為首碼,例如:http-80,http,grpc等。 |
相關操作
您還可以使用Log Service採集資料平面的AccessLog。具體操作,請參見產生和採集ASM網關訪問日誌。