Istio 日志
Istio网格访问日志
-
网格中的访问日志来主要由数据平面的中代理程序Envoy负责生成
- Envoy的TCP Proxy和HTTP Connection Manager过滤器可通过特定的extension支持访问日志 ,在功能上,它具有如下特性:
-
支持任意数量的访问日志
-
访问日志过滤器支持自定义日志格式
-
允许将不同类型的请求和响应写入不同的访问日志中
-
- Envoy的TCP Proxy和HTTP Connection Manager过滤器可通过特定的extension支持访问日志 ,在功能上,它具有如下特性:
-
访问日志支持将数据保存于相应的后端存储系统(Sink)中,目前支持以下几种Sink
-
文件
-
异步IO架构,访问日志记录不会阻塞主线程;
-
可自定义的访问日志格式,使用预定义字段以及HTTP请求和响应报文的任意标头;
-
-
gRPC
-
将访问日志发送到gRPC访问日志记录服务中;
-
-
Stdout
-
将日志发送到进程的标准输出上;
-
-
Stderr
- 将日志发送到进程的错误输出上
-
启用网格访问日志
在安装时启用
# istioctl install <flags-you-used-to-install-Istio> --set meshConfig.accessLogFile=/dev/stdout
在IstioOperator中,通过MeshConfig启用
spec:
meshConfig:
accessLogFile: /dev/stdout
通过Telemetry API启用
apiVersion: telemetry.istio.io/v1alpha1
kind: Telemetry
metadata:
name: mesh-default
namespace: istio-system
spec:
accessLogging:
- providers:
- name: envoy
Envoy访问日志格式
-
格式规则
-
访问日志格式包含提取并相关数据并插入到格式指定处的命令运算符,目前支持两种格式
-
format strings:格式字符串
-
format dictionaries:格式字典
-
-
-
命令操作符
-
用于提取数据并插入到日志中
-
有些操作符对于TCP和HTTP来说其含义有所不同
-
几个操作符示例
- %REQ(X?Y):Z%:记录HTTP请求报文的指定标头(X)的值,Y是备用标头,Z是可选参数,表示字符串截断并保留最多Z个字符;X和Y标头均不存在时记录为“-”;TCP不支持;
-
%RESP(X?Y):Z%:记录HTTP响应报文的指定标头的值;TCP不支持;
- %DURATION%:
- HTTP:从开始时间到最后一个字节输出的请求的总持续时长(以毫秒为单位);
-
TCP:下游连接的总持续时长(以毫秒为单位);
-
-
格式字符串
- 所谓格式化字符串即文本字串,由format参数指定,含有命令操作符或直接文本字串,且必须显式指定换行符;
默认访问日志格式
默认格式
[%START_TIME%] \"%REQ(:METHOD)% %REQ(X-ENVOY-ORIGINAL-PATH?:PATH)% %PROTOCOL%\" %RESPONSE_CODE% %RESPONSE_FLAGS% %RESPONSE_CODE_DETAILS% %CONNECTION_TERMINATION_DETAILS%
\"%UPSTREAM_TRANSPORT_FAILURE_REASON%\" %BYTES_RECEIVED% %BYTES_SENT% %DURATION% %RESP(X-ENVOY-UPSTREAM-SERVICE-TIME)% \"%REQ(X-FORWARDED-FOR)%\" \"%REQ(USER-AGENT)%\" \"%REQ(X-REQUEST-ID)%\"
\"%REQ(:AUTHORITY)%\" \"%UPSTREAM_HOST%\" %UPSTREAM_CLUSTER% %UPSTREAM_LOCAL_ADDRESS% %DOWNSTREAM_LOCAL_ADDRESS% %DOWNSTREAM_REMOTE_ADDRESS% %REQUESTED_SERVER_NAME% %ROUTE_NAME%\n
字串的简要说明
- %START_TIME%:请求开始的时间戳
- %REQ(X?Y):Z%:请求报文中指定标头X的值,X不存在时则取标头Y的值;相应值的会截取最多不超过Z个字符;
- %RESP(X?Y):Z%:功能类似于“%REQ(X?Y):Z%”,但用于响应报文
- %PROTOCOL%:HTTP协议的版本,支持http/1.1、http/2和http/3;TCP代理因不支持而显示为“-”;
- %RESPONSE_CODE%:HTTP响应码; TCP代理因不支持而显示为“-”;
- %RESPONSE_FLAGS% :响应标志,用于进一步说明响应或连接的详细信息;
- %RESPONSE_CODE_DETAILS% :响应码相关的额外信息,例如谁(upstream或者envoy)设置该响应码及相关的原因;
- %CONNECTION_TERMINATION_DETAILS% :连接被终止的进一步详情;
- %UPSTREAM_TRANSPORT_FAILURE_REASON%:用于记录因传输层套接字错误(例如TLS)而终止时的错误原因;
- %BYTES_RECEIVED%:接收的报文中body部分的大小;TCP代理中意味着下游接收到的字节数;
- %BYTES_SENT% :发送的报文中body部分的大小;TCP代理中意味着下游发送的字节数;
- %DURATION%:从接收到请求至发送完响应报文的最后一个字节所经历的时长;对TCP代理来说,则是指下游连接的维持时长;
- %UPSTREAM_HOST%:上游的URL,TCP代理中格式为“tcp://ip:port”;
- %UPSTREAM_CLUSTER% :UPSTREAM_HOST所属的上淳集群;
- %UPSTREAM_LOCAL_ADDRESS% :同上游建立连接时,本地使用的IP地址及端口;
- %DOWNSTREAM_LOCAL_ADDRESS% :同下游建立连接时,本地使用的IP地址及端口;
- %DOWNSTREAM_REMOTE_ADDRESS% :同下游建立连接时,远端使用的IP地址及端口;
- %REQUESTED_SERVER_NAME% :SSL连接中,服务端的SNI;
- %ROUTE_NAME%:路由(配置信息中)的名称
日志样例
Log operator | access log in sleep | access log in httpbin |
---|---|---|
[%START_TIME%] |
[2020-11-25T21:26:18.409Z] |
[2020-11-25T21:26:18.409Z] |
\"%REQ(:METHOD)% %REQ(X-ENVOY-ORIGINAL-PATH?:PATH)% %PROTOCOL%\" |
"GET /status/418 HTTP/1.1" |
"GET /status/418 HTTP/1.1" |
%RESPONSE_CODE% |
418 |
418 |
%RESPONSE_FLAGS% |
- |
- |
%RESPONSE_CODE_DETAILS% |
via_upstream |
via_upstream |
%CONNECTION_TERMINATION_DETAILS% |
- |
- |
\"%UPSTREAM_TRANSPORT_FAILURE_REASON%\" |
"-" |
"-" |
%BYTES_RECEIVED% |
0 |
0 |
%BYTES_SENT% |
135 |
135 |
%DURATION% |
4 |
3 |
%RESP(X-ENVOY-UPSTREAM-SERVICE-TIME)% |
4 |
1 |
\"%REQ(X-FORWARDED-FOR)%\" |
"-" |
"-" |
\"%REQ(USER-AGENT)%\" |
"curl/7.73.0-DEV" |
"curl/7.73.0-DEV" |
\"%REQ(X-REQUEST-ID)%\" |
"84961386-6d84-929d-98bd-c5aee93b5c88" |
"84961386-6d84-929d-98bd-c5aee93b5c88" |
\"%REQ(:AUTHORITY)%\" |
"httpbin:8000" |
"httpbin:8000" |
\"%UPSTREAM_HOST%\" |
"10.44.1.27:80" |
"127.0.0.1:80" |
%UPSTREAM_CLUSTER% |
outbound|8000||httpbin.foo.svc.cluster.local |
inbound|8000|| |
%UPSTREAM_LOCAL_ADDRESS% |
10.44.1.23:37652 |
127.0.0.1:41854 |
%DOWNSTREAM_LOCAL_ADDRESS% |
10.0.45.184:8000 |
10.44.1.27:80 |
%DOWNSTREAM_REMOTE_ADDRESS% |
10.44.1.23:46520 |
10.44.1.23:37652 |
%REQUESTED_SERVER_NAME% |
- |
outbound_.8000_._.httpbin.foo.svc.cluster.local |
%ROUTE_NAME% |
default |
default |
[2022-12-01T09:53:13.026Z] "GET / HTTP/1.1" 200 - via_upstream - "-" 0 116 3 2 "-" "-" "fcd5a5d3-f233-9e49-a629-8ce31a2f4c5e" "demoapp:8080" "172.20.154.196:8080" outbound|8080||demoapp.default.svc.cluster.local 172.20.89.134:42756 10.100.248.56:8080 172.20.89.134:46248 - default
访问日志
~# kubectl logs -l app=proxy -c istio-proxy
[2022-12-01T09:53:13.026Z] "GET / HTTP/1.1" 200 - via_upstream - "-" 0 116 3 2 "-" "-" "fcd5a5d3-f233-9e49-a629-8ce31a2f4c5e" "demoapp:8080" "172.20.154.196:8080" outbound|8080||demoapp.default.svc.cluster.local 172.20.89.134:42756 10.100.248.56:8080 172.20.89.134:46248 - default
[2022-12-01T09:53:13.024Z] "GET / HTTP/1.1" 200 - via_upstream - "-" 0 156 5 5 "-" "curl/7.81.0" "fffef3ce-b2c4-9c09-8384-b056f1569493" "10.100.224.239" "172.20.89.134:8080" inbound|8080|| 127.0.0.6:43283 172.20.89.134:8080 172.20.151.128:58773 - default
[2022-12-01T09:53:13.316Z] "GET / HTTP/1.1" 200 - via_upstream - "-" 0 115 1 1 "-" "-" "8f0c002d-6b80-954f-9af4-393e03a29a61" "demoapp:8080" "172.20.89.139:8080" outbound|8080||demoapp.default.svc.cluster.local 172.20.89.134:39880 10.100.248.56:8080 172.20.89.134:46252 - default
参考文档
https://istio.io/latest/zh/docs/tasks/observability/logs/access-log/
https://istio.io/latest/zh/docs/reference/config/telemetry/