通過CEL編寫訪問日志過濾規(guī)則
訪問日志是了解業(yè)務和服務網(wǎng)格運行狀態(tài)的重要觀測渠道。在訪問量較大的業(yè)務場景中,按照特定條件過濾日志,可以節(jié)約Sidecar的性能開銷,并專注于關(guān)鍵日志內(nèi)容。ASM支持使用CEL(Common Expression Language)語言設置日志過濾規(guī)則。本文介紹ASM AccessLog CEL過濾的使用方法和CEL支持的字段,幫助您自定義配置過濾規(guī)則。
過濾規(guī)則
CEL表達式返回為真的訪問日志將被輸出,反之不會輸出。
場景示例
示例一:僅輸出響應狀態(tài)碼為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 | 收到請求的首個字節(jié)的時間戳。 |
request.id | string | 請求攜帶的x-request-id請求頭的值。 |
request.protocol | string | 請求協(xié)議,例如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狀態(tài)碼。 |
response.code_details | string | 響應狀態(tài)碼的描述信息。 |
response.flags | int | 除響應HTTP狀態(tài)碼之外的額外信息,以Bit Vector形式編碼。 |
response.grpc_status | int | 響應的GRPC狀態(tài)碼。 |
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。 |