自定義數(shù)據(jù)面訪問日志
部署在數(shù)據(jù)平面(即加入網(wǎng)格的Kubernetes集群)的Envoy Proxy可以輸出所有訪問日志。ASM支持自定義Envoy Proxy輸出的訪問日志內(nèi)容。本文介紹如何自定義Envoy Proxy輸出的訪問日志內(nèi)容。
前提條件
步驟一:啟用訪問日志
ASM實例版本為1.17.2.35以下
登錄ASM控制臺,在左側(cè)導(dǎo)航欄,選擇 。
在網(wǎng)格管理頁面,單擊目標實例名稱,然后在左側(cè)導(dǎo)航欄,選擇 。
在基本信息頁面右上角,單擊功能設(shè)置。
在功能設(shè)置更新面板,選中開啟訪問日志并將其打印到容器標準輸出,然后單擊確定。
istio-proxy容器默認輸出包含以下字段的日志。如果關(guān)閉訪問日志,istio-proxy容器將不會產(chǎn)生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及以上
登錄ASM控制臺,在左側(cè)導(dǎo)航欄,選擇 。
在網(wǎng)格管理頁面,單擊目標實例名稱,然后在左側(cè)導(dǎo)航欄,選擇 。
在可觀測配置頁面,按需單擊全局、命名空間或自定義頁簽。
若您選擇命名空間頁簽,請單擊創(chuàng)建,按需選擇命名空間。
若您選擇自定義頁簽,請單擊創(chuàng)建,按需選擇命名空間,輸入名稱和匹配標簽。
在日志設(shè)置區(qū)域,打開啟用日志輸出開關(guān),然后單擊提交。
打開開關(guān)后,服務(wù)網(wǎng)格數(shù)據(jù)平面Sidecar或網(wǎng)關(guān)會將訪問日志輸出至容器標準輸出。ASM還支持日志過濾功能,詳情請參見日志過濾。
在數(shù)據(jù)平面Sidecar容器的標準輸出查看日志。
下文以使用kubectl查看訪問日志為例進行說明。
執(zhí)行以下命令,查看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" }
執(zhí)行以下命令,查看入口網(wǎng)關(guān)日志。
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" }
(可選)通過容器服務(wù)控制臺查看訪問日志。
如果您使用阿里云容器服務(wù)集群,還可以通過容器服務(wù)控制臺查看訪問日志。
登錄容器服務(wù)管理控制臺,在左側(cè)導(dǎo)航欄選擇集群。
在集群列表頁面,單擊目標集群名稱,然后在左側(cè)導(dǎo)航欄,選擇 。
在容器組頁面,單擊目標Pod名稱,然后在頁面下方單擊日志頁簽,查看訪問日志。
關(guān)于日志的更多信息,請參見可觀測配置和啟用控制平面日志采集和日志告警(新版)。
步驟二:自定義數(shù)據(jù)面訪問日志內(nèi)容
ASM實例版本為1.17.2.35以下
登錄ASM控制臺,在左側(cè)導(dǎo)航欄,選擇 。
在網(wǎng)格管理頁面,單擊目標實例名稱,然后在左側(cè)導(dǎo)航欄,選擇 。
在基本信息頁面的配置信息區(qū)域,單擊開啟訪問日志并將其打印到容器標準輸出右側(cè)的自定義訪問日志格式。
在自定義訪問日志格式對話框下方,新增自定義訪問日志格式,設(shè)置變量名稱為my_custom_key,變量值為%REQ(end-user)%,然后單擊確認。
本文以獲取Bookinfo示例中HTTP請求的Header字段end-user為例。如下圖所示,自定義訪問日志格式時,您可以選擇ASM提供的可選字段,也可以新增自定義字段。選中目標字段后,將按照自定義的訪問日志格式輸出訪問日志。
ASM實例版本為1.17.2.35及以上
登錄ASM控制臺,在左側(cè)導(dǎo)航欄,選擇 。
在網(wǎng)格管理頁面,單擊目標實例名稱,然后在左側(cè)導(dǎo)航欄,選擇 。
在可觀測配置頁面,按需單擊全局、命名空間或自定義頁簽。
若您選擇命名空間頁簽,請單擊創(chuàng)建,按需選擇命名空間。
若您選擇自定義頁簽,請單擊創(chuàng)建,按需選擇命名空間,輸入名稱和匹配標簽。
在日志設(shè)置區(qū)域,按需選中字段、修改目標字段信息或在最下方日志指標右側(cè)單擊圖標,新增日志字段,然后單擊提交。
只有打開啟用日志輸出開關(guān),才能自定義日志格式。在日志格式區(qū)域,默認選中的日志字段為默認必選字段,不支持修改。日志字段支持從請求Header、響應(yīng)Header、Envoy內(nèi)置值中取值。
下文以打印請求中的accept-encoding Header為例,配置變量名稱為accept-encoding,類型為請求屬性,變量值為Accept-Encoding。
執(zhí)行以下命令,查看服務(wù)網(wǎng)格數(shù)據(jù)平面組件日志。
kubectl logs httpbin-5c5944c58c-w**** -c istio-proxy --tail 1|grep accept-encoding --color=auto
可以看到步驟4新增的Accept-Encoding Header的值,已被輸出至訪問日志。關(guān)于日志的更多信息,請參見可觀測配置和啟用控制平面日志采集和日志告警(新版)。
步驟三:查看訪問日志
啟用訪問日志后,發(fā)起請求的Sidecar容器將按照自定義的訪問日志格式輸出訪問日志。
在瀏覽器地址欄輸入入口網(wǎng)關(guān)地址:productpage,訪問Productpage應(yīng)用。
登錄容器服務(wù)管理控制臺,在左側(cè)導(dǎo)航欄選擇集群。
在集群列表頁面,單擊目標集群名稱,然后在左側(cè)導(dǎo)航欄,選擇 。
在無狀態(tài)頁面頂部,設(shè)置命名空間為default,然后在productpage-v1應(yīng)用右側(cè),單擊操作列下的詳情。
在應(yīng)用詳情頁面,單擊日志頁簽,設(shè)置Container為istio-proxy。
在日志輸出框中可以看到如下日志。日志中包含名為jason的end-user,表明自定義日志內(nèi)容成功。
請求耗時相關(guān)字段說明
在服務(wù)網(wǎng)格ASM中,“上游(upstream)”表示調(diào)用鏈中請求的接收方,“下游(downstream)”表示請求的發(fā)起方。例如,服務(wù)A向服務(wù)B發(fā)起請求時,服務(wù)A為“下游(downstream)”,服務(wù)B為“上游(upstream)”。
變量名稱 | 變量值 | 說明 |
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訪問日志或網(wǎng)關(guān)日志中,該字段表示上游的處理時間及與上游進行網(wǎng)絡(luò)通信消耗的時間。若該時間較長,請檢查:
|
upstream_response_time(gateway) |
對于帶有Body(Content-Length > 0)的HTTP請求,Envoy是邊接收邊發(fā)給上游(而非全部接受后發(fā)送)。如果下游的讀取速度緩慢,將會增加上游的讀取時間,以及上游發(fā)送給它的上游的時間(上游為邊讀邊發(fā)送的方式)。
相關(guān)操作
您還可以使用日志服務(wù)采集數(shù)據(jù)平面的AccessLog。具體操作,請參見生成和采集ASM網(wǎng)關(guān)訪問日志。