开发者社区> 万猫学社> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

在Istio中,到底怎么获取 Envoy 访问日志?

简介: Envoy 访问日志记录了通过 Envoy 进行请求 / 响应交互的相关记录,可以方便地了解具体通信过程和调试定位问题。
+关注继续查看

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 预定义了 TEXTJSON 两种日志输出格式。默认使用 TEXT,通常改成 JSON 以提升可读性;accessLogFile:表示 accesslog 输出位置,通常指定到 /dev/stdout (标准输出),以便使用 kubectl logs 来查看日志。

保证yaml文件后,配置随即生效。

测试访问日志

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
}

看到这么多参数,是不是有点懵逼?没关系接下来,我们详细看看!

刨析Envoy日志

名称HTTPTCP
authority请求授权头未实现(“-”)
bytes_received接收到消息体字节数在连接上从下游接收的字节数
bytes_sent发送的包体字节数在连接上发送给下游的字节数
connection_termination_details连接中断详情连接中断详情
downstream_local_address下游连接的本地地址下游连接的本地地址
downstream_remote_address下游连接的远程地址下游连接的远程地址
duration请求从起始时间到最后一个字节发出的持续总时长(以毫秒为单位)下游连接的持续总时长(以毫秒为单位)
methodHTTP请求方法未实现(“-”)
pathHTTP请求路径未实现(“-”)
protocol协议,目前不是 HTTP/1.1 就是 HTTP/2未实现(“-”)
request_id由envoy创建的 X-REQUEST-ID 请求头的值未实现(“-”)
requested_server_name设置在 ssl 连接套接字上表示服务器名称指示 (SNI) 的字符值未实现(“-”)
response_codeHTTP 响应码未实现(“-”)
response_code_detailsTTP 响应状态码详情提供关于响应状态码的附加信息。未实现(“-”)
response_flags响应或者连接的附加详情响应或者连接的附加详情
route_name路由名路由名
start_time请求开始时间(包括毫秒)下游连接开始时间(包括毫秒)
upstream_cluster上游主机所属的上游集群上游主机所属的上游集群
upstream_host上游主机 URL上游主机 URL
upstream_local_address上游连接的本地地址上游连接的本地地址
upstream_transport_failure_reason如果上游因传输套接字而连接失败,从传输套接字中提供失败原因。未实现(“-”)
user_agentUser-Agent请求头的值未实现(“-”)
x_forwarded_forX-Forwarded-For请求头的值未实现(“-”)

清理

删除 httpbinsleep 服务:

kubectl delete -f samples/httpbin/httpbin.yaml
kubectl delete -f samples/sleep/sleep.yaml 

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
Win系统 - Win10 竟自带 10 种小广告!不关后果很严重?(一)
Win系统 - Win10 竟自带 10 种小广告!不关后果很严重?(一)
30 0
日志系统
日志门面+日志框架
118 0
走进JavaWeb技术世界9:Java日志系统的诞生与发展
本文出自我的公众号:程序员江湖。 满满干货,关注就送。   一个著名的日志系统是怎么设计出来的? 1前言 Java帝国在诞生之初就提供了集合、线程、IO、网络等常用功能,从C和C++领地那里吸引了大量程序员过来加盟,但是却有意无意地忽略了一个重要的功能: 输出日志。
2574 0
实战使用Axure设计App,使用WebStorm开发(6) – 迈向后端
系列文章 实战使用Axure设计App,使用WebStorm开发(1) – 用Axure描述需求  实战使用Axure设计App,使用WebStorm开发(2) – 创建 Ionic 项目   实战使用Axure设计App,使用WebStorm开发(3) – 构建页面架构  实战使用Axu...
1195 0
+关注
万猫学社
微信搜索「万猫学社」关注后回复「电子书」,免费获取12本Java必读技术书籍。
141
文章
4
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载