全部产品
Search
文档中心

服务网格 ASM:通过CEL编写访问日志过滤规则

更新时间:Dec 15, 2023

访问日志是了解业务和服务网格运行状态的重要观测渠道。在访问量较大的业务场景中,按照特定条件过滤日志,可以节约Sidecar的性能开销,并专注于关键日志内容。ASM支持使用CEL(Common Expression Language)语言设置日志过滤规则。本文介绍ASM AccessLog CEL过滤的使用方法和CEL支持的字段,帮助您自定义配置过滤规则。

过滤规则

CEL表达式返回为真的访问日志将被输出,反之不会输出。

场景示例

示例一:仅输出响应状态码为400以上的访问日志

response.code >= 400

response.code表示HTTP Response的HTTP Status。当HTTP Status≥400时,表达式为真,输出该请求的访问日志。

示例二:仅输出请求URI中包含login字样的访问日志

request.url_path.contains('login')
  • request.url_path表示HTTP Request的路径(不包含query串)。

  • contains是CEL标准的字符串方法,返回布尔值,用于判断字符串是否包含给定的子串。当request.url_path包含login子串时,表达式为真,输出该请求的访问日志。

示例三:使用逻辑与、逻辑或进行多个条件判断

  • 逻辑与(&&)

    request.url_path.contains('login') && request.headers['x-user-type'] == 'dev'
    • request.url_path表示HTTP Request的路径(不包含query串)。

    • request.headers表示请求中的请求头,类型为map<string, string>。

    • 当请求的url_path包含login,且请求携带了x-user-type请求头,且该请求头的value为dev时,输出该请求的访问日志。

  • 逻辑或(||)

    request.url_path.contains('login') || request.url_path.contains('logout')
    • request.url_path表示HTTP Request的路径(不包含query串)。

    • 当请求的url_path包含login或者logout时,输出该请求的访问日志。

CEL支持的字段说明

请求属性

属性

类型

说明

request.path

string

URL的路径部分。

request.url_path

string

URL的路径部分,但不包含query串。

request.host

string

URL的主机名部分。

request.scheme

string

URL中的Scheme部分,例如HTTP、HTTPS。

request.method

string

请求方法,例如GET、POST。

request.headers

map<string, string>

所有请求Header的map。

request.referer

string

请求中Refer头的值。

request.useragent

string

请求携带的User-Agent请求头的值。

request.time

timestamp

收到请求的首个字节的时间戳。

request.id

string

请求携带的x-request-id请求头的值。

request.protocol

string

请求协议,例如HTTP/1.0、HTTP/1、HTTP/2或HTTP/3。

request.query

string

URL中的query串部分,例如name1=value1&name2=value2。

request.duration

duration

请求花费的总时长。

request.size

int

请求体的大小,如果Content-Length请求头存在,则使用它的值。

request.total_size

int

包含请求头的完整请求大小。

响应属性

属性

类型

说明

response.code

int

请求响应的HTTP状态码。

response.code_details

string

响应状态码的描述信息。

response.flags

int

除响应HTTP状态码之外的额外信息,以Bit Vector形式编码。

response.grpc_status

int

响应的GRPC状态码。

response.headers

map<string, string>

所有响应Header的map。

response.trailers

map<string, string>

所有响应中携带的Trailer的map。

response.size

int

响应体大小。

response.total_size

int

包含响应头的完整响应大小。

下游属性

属性

类型

说明

source.address

string

下游连接客户端的地址。

source.port

int

下游连接客户端的端口。

destination.address

string

下游连接的目标地址。

destination.port

int

下游连接的目标端口。

connection.id

uint

下游连接的ID。

connection.mtls

bool

是否在下游连接上启用了TLS以及下游连接是否携带了证书。

connection.requested_server_name

string

下游TLS连接请求的服务器名称。

connection.tls_version

string

下游连接的TLS版本。

connection.subject_local_certificate

string

下游连接服务端证书的Subject字段。

connection.subject_peer_certificate

string

下游连接客户端证书的Subject字段。

connection.dns_san_local_certificate

string

下游TLS连接中服务端证书的SAN字段中的第一个DNS条目。

connection.dns_san_peer_certificate

string

下游TLS连接中客户端证书的SAN字段中的第一个DNS条目。

connection.uri_san_local_certificate

string

下游TLS连接中服务端证书的SAN字段中的第一个URI条目。

connection.uri_san_peer_certificate

string

下游TLS连接中客户端证书的SAN字段中的第一个URI条目。

connection.sha256_peer_certificate_digest

string

下游TLS连接中客户端证书的SHA256哈希串。

connection.transport_failure_reason

string

传输失败的原因,例如certificate validation failed。

上游属性

属性

类型

说明

upstream.address

string

上游连接的目标地址。

upstream.port

int

上游连接的目标端口。

upstream.tls_version

string

上游连接的TLS版本。

upstream.subject_local_certificate

string

上游连接使用的客户端证书的Subject字段的值。

upstream.subject_peer_certificate

string

上游连接使用的服务端证书的Subject字段的值。

upstream.dns_san_local_certificate

string

上游连接客户端证书中的SAN字段中的第一个DNS条目。

upstream.dns_san_peer_certificate

string

上游连接服务端证书中的SAN字段中的第一个DNS条目。

upstream.uri_san_local_certificate

string

上游连接客户端证书中的SAN字段中的第一个URI条目。

upstream.uri_san_peer_certificate

string

上游连接服务端证书中的SAN字段中的第一个URI条目。

upstream.sha256_peer_certificate_digest

string

下游TLS连接中服务端证书的SHA256哈希串。

upstream.local_address

string

上游连接的客户端本地地址。

upstream.transport_failure_reason

string

上游传输失败原因,例如certificate validation failed。