Envoy 訪問日誌記錄了通過 Envoy 進行請求 / 響應交互的相關記錄,可以方便地瞭解具體通信過程和調試定位問題。
環境準備
部署 httpbin
服務:
kubectl apply -f samples/httpbin/httpbin.yaml
部署 sleep
服務:
kubectl apply -f samples/sleep/sleep.yaml
httpbin
服務作爲接收請求的服務端, sleep
服務作爲發送請求的客戶端。
還需要開啓 Envoy 訪問日誌,執行以下命令修改 istio 配置:
kubectl -n istio-system edit configmap istio
編輯yaml文件的對應配置:
data:
mesh: |-
accessLogEncoding: JSON
accessLogFile: /dev/stdout
其中,accessLogEncoding
表示 accesslog 輸出格式,Istio 預定義了 TEXT
和 JSON
兩種日誌輸出格式。默認使用 TEXT
,通常改成 JSON
以提升可讀性;accessLogFile
:表示 accesslog 輸出位置,通常指定到 /dev/stdout (標準輸出),以便使用 kubectl logs 來查看日誌。
保證yaml文件後,配置隨即生效。
文章持續更新,微信搜索「萬貓學社」第一時間閱讀,關注後回覆「電子書」,免費獲取12本Java必讀技術書籍。
測試訪問日誌
在 sleep
服務中向 httpbin
服務發出請求:
export SLEEP_POD=$(kubectl get pods -l app=sleep -o 'jsonpath={.items[0].metadata.name}')
kubectl exec "$SLEEP_POD" -c sleep -- curl -sS http://httpbin:8000/headers
返回結果如下:
{
"headers": {
"Accept": "*/*",
"Host": "httpbin:8000",
"User-Agent": "curl/7.81.0-DEV",
"X-B3-Parentspanid": "ed0178f3e1f48dd1",
"X-B3-Sampled": "0",
"X-B3-Spanid": "6c38b689ee5ab0c8",
"X-B3-Traceid": "f17ce19c174cae85ed0178f3e1f48dd1",
"X-Envoy-Attempt-Count": "1",
"X-Forwarded-Client-Cert": "......"
}
}
執行以下命令,查看sleep
服務的Envoy日誌:
kubectl logs -l app=sleep -c istio-proxy
可以看到sleep
服務對httpbin
服務的調用的日誌:
{
"authority": "httpbin:8000",
"bytes_received": 0,
"bytes_sent": 533,
"connection_termination_details": null,
"downstream_local_address": "172.24.146.239:8000",
"downstream_remote_address": "172.24.158.25:49350",
"duration": 3,
"method": "GET",
"path": "/headers",
"protocol": "HTTP/1.1",
"request_id": "ea40d320-348f-4f58-86d4-da157b0e0cca",
"requested_server_name": null,
"response_code": 200,
"response_code_details": "via_upstream",
"response_flags": "-",
"route_name": "default",
"start_time": "2022-07-04T10:00:09.401Z",
"upstream_cluster": "outbound|8000||httpbin.istio-demo.svc.cluster.local",
"upstream_host": "172.24.158.96:80",
"upstream_local_address": "172.24.158.25:41812",
"upstream_service_time": "2",
"upstream_transport_failure_reason": null,
"user_agent": "curl/7.81.0-DEV",
"x_forwarded_for": null
}
執行以下命令,查看httpbin
服務的Envoy日誌:
kubectl logs -l app=httpbin -c istio-proxy
可以看到httpbin
服務被sleep
服務調用的Envoy日誌:
{
"authority": "httpbin:8000",
"bytes_received": 0,
"bytes_sent": 533,
"connection_termination_details": null,
"downstream_local_address": "172.24.158.96:80",
"downstream_remote_address": "172.24.158.25:41812",
"duration": 2,
"method": "GET",
"path": "/headers",
"protocol": "HTTP/1.1",
"request_id": "ea40d320-348f-4f58-86d4-da157b0e0cca",
"requested_server_name": "outbound_.8000_._.httpbin.istio-demo.svc.cluster.local",
"response_code": 200,
"response_code_details": "via_upstream",
"response_flags": "-",
"route_name": "default",
"start_time": "2022-07-04T10:00:09.401Z",
"upstream_cluster": "inbound|80||",
"upstream_host": "172.24.158.96:80",
"upstream_local_address": "127.0.0.6:33665",
"upstream_service_time": "1",
"upstream_transport_failure_reason": null,
"user_agent": "curl/7.81.0-DEV",
"x_forwarded_for": null
}
看到這麼多參數,是不是有點懵逼?沒關係接下來,我們詳細看看!
文章持續更新,微信搜索「萬貓學社」第一時間閱讀,關注後回覆「電子書」,免費獲取12本Java必讀技術書籍。
刨析Envoy日誌
名稱 | HTTP | TCP |
---|---|---|
authority | 請求授權頭 | 未實現(“-”) |
bytes_received | 接收到消息體字節數 | 在連接上從下游接收的字節數 |
bytes_sent | 發送的包體字節數 | 在連接上發送給下游的字節數 |
connection_termination_details | 連接中斷詳情 | 連接中斷詳情 |
downstream_local_address | 下游連接的本地地址 | 下游連接的本地地址 |
downstream_remote_address | 下游連接的遠程地址 | 下游連接的遠程地址 |
duration | 請求從起始時間到最後一個字節發出的持續總時長(以毫秒爲單位) | 下游連接的持續總時長(以毫秒爲單位) |
method | HTTP請求方法 | 未實現(“-”) |
path | HTTP請求路徑 | 未實現(“-”) |
protocol | 協議,目前不是 HTTP/1.1 就是 HTTP/2 | 未實現(“-”) |
request_id | 由envoy創建的 X-REQUEST-ID 請求頭的值 |
未實現(“-”) |
requested_server_name | 設置在 ssl 連接套接字上表示服務器名稱指示 (SNI) 的字符值 | 未實現(“-”) |
response_code | HTTP 響應碼 | 未實現(“-”) |
response_code_details | TTP 響應狀態碼詳情提供關於響應狀態碼的附加信息。 | 未實現(“-”) |
response_flags | 響應或者連接的附加詳情 | 響應或者連接的附加詳情 |
route_name | 路由名 | 路由名 |
start_time | 請求開始時間(包括毫秒) | 下游連接開始時間(包括毫秒) |
upstream_cluster | 上游主機所屬的上游集羣 | 上游主機所屬的上游集羣 |
upstream_host | 上游主機 URL | 上游主機 URL |
upstream_local_address | 上游連接的本地地址 | 上游連接的本地地址 |
upstream_transport_failure_reason | 如果上游因傳輸套接字而連接失敗,從傳輸套接字中提供失敗原因。 | 未實現(“-”) |
user_agent | User-Agent 請求頭的值 |
未實現(“-”) |
x_forwarded_for | X-Forwarded-For 請求頭的值 |
未實現(“-”) |
清理
刪除 httpbin
和 sleep
服務:
kubectl delete -f samples/httpbin/httpbin.yaml
kubectl delete -f samples/sleep/sleep.yaml
微信公衆號:萬貓學社
微信掃描二維碼
關注後回覆「電子書」
獲取12本Java必讀技術書籍