feat(kafka-logger): supports logging request body#5501
Conversation
| inactive_timeout = {type = "integer", minimum = 1, default = 5}, | ||
| batch_max_size = {type = "integer", minimum = 1, default = 1000}, | ||
| include_req_body = {type = "boolean", default = false}, | ||
| request_body_expr = { |
There was a problem hiding this comment.
Would be better to name it as include_req_body_expr?
| --- error_log_like eval | ||
| qr/send data to kafka: \{.*"body":"abcdef"/ | ||
| --- wait: 2 | ||
| --- wait: 2 |
| local log_request_body = true | ||
|
|
||
| if conf.request_body_expr then | ||
| local request_expr, err = expr.new(conf.request_body_expr) |
There was a problem hiding this comment.
We can check conf.request_expr before new?
| if conf.request_body_expr then | ||
| local request_expr, err = expr.new(conf.request_body_expr) | ||
| if not request_expr then | ||
| core.log.error('generate log expr err ' .. err) |
There was a problem hiding this comment.
Need to skip the remaining logic. We should not use a nil request_expr.
| "include_req_body": true, | ||
| "request_body_expr": [ | ||
| [ | ||
| "remote_addr", |
There was a problem hiding this comment.
Better to use a test case that can eval to false.
|
|
||
|
|
||
|
|
||
| === TEST 27: hit route, report log to kafka |
There was a problem hiding this comment.
Let's add a test that expr is evaluated to false
| | retry_delay | integer | optional | 1 | [0,...] | Number of seconds the process execution should be delayed if the execution fails. | | ||
| | include_req_body | boolean | optional | false | [false, true] | Whether to include the request body. false: indicates that the requested body is not included; true: indicates that the requested body is included. | | ||
| | cluster_name | integer | optional | 1 | [0,...] | the name of the cluster. When there are two or more kafka clusters, you can specify different names. And this only works with async producer_type.| | ||
| | request_body_expr | object | optional | | | Whether to logging request body,based on [lua-resty-expr](https://github.com/api7/lua-resty-expr). | |
There was a problem hiding this comment.
Better to move it under include_req_body and explain its relation to include_req_body.
| "request_body_expr": [ | ||
| "include_req_body_expr": [ | ||
| [ | ||
| "remote_addr", |
There was a problem hiding this comment.
We can do it with arg_xx. There is no need to use a separate rule.
There was a problem hiding this comment.
I'm not understand what this means, please be more specific?, thank you. 😁
There was a problem hiding this comment.
Use arg_blah == 1 in the expression, and hit it with "POST /hello?blah=1" and "POST /hello?blah=2".
There was a problem hiding this comment.
I'm using ctx.var to eval the expr and ctx.var doesn't directly hold args. it only has args table. If you want to achieve this, i need to eval the expr by ctx.var.args
There was a problem hiding this comment.
I mean to use $arg_ variable. You can refer to
apisix/t/plugin/traffic-split4.t
Line 110 in cc43b9f
There was a problem hiding this comment.
I mean to use
$arg_variable. You can refer toapisix/t/plugin/traffic-split4.t
Line 110 in cc43b9f
done ,thank you very much
|
|
||
| === TEST 28: hit route, not trigger request_body_expr rule | ||
| --- request | ||
| GET /hello |
There was a problem hiding this comment.
The test will pass whether the request_body_expr is correct or not
There was a problem hiding this comment.
Ok, i just want to prove that if there was no request body, it still work normally. There is already has a eval false case below and i'm delete this case for good
| }, | ||
| "uri": "/hello" | ||
| }]], | ||
| [[{ |
There was a problem hiding this comment.
Please remove the part which is not relative to the test, from L1156 to L1182
| | max_retry_count | integer | 可选 | 0 | [0,...] | 从处理管道中移除之前的最大重试次数。 | | ||
| | retry_delay | integer | 可选 | 1 | [0,...] | 如果执行失败,则应延迟执行流程的秒数。 | | ||
| | include_req_body | boolean | 可选 | false | [false, true] | 是否包括请求 body。false: 表示不包含请求的 body ; true: 表示包含请求的 body 。| | ||
| | include_req_body_expr | array | 可选 | | | 是否采集请求body,基于[lua-resty-expr](https://github.com/api7/lua-resty-expr)。 该选项需要开启 `include_req_body`| |
There was a problem hiding this comment.
| | include_req_body_expr | array | 可选 | | | 是否采集请求body,基于[lua-resty-expr](https://github.com/api7/lua-resty-expr)。 该选项需要开启 `include_req_body`| | |
| | include_req_body_expr | array | 可选 | | | 是否采集请求body,基于 [lua-resty-expr](https://github.com/api7/lua-resty-expr)。 该选项需要开启 `include_req_body`| |
| | max_retry_count | integer | optional | 0 | [0,...] | Maximum number of retries before removing from the processing pipe line. | | ||
| | retry_delay | integer | optional | 1 | [0,...] | Number of seconds the process execution should be delayed if the execution fails. | | ||
| | include_req_body | boolean | optional | false | [false, true] | Whether to include the request body. false: indicates that the requested body is not included; true: indicates that the requested body is included. | | ||
| | include_req_body_expr | array | optional | | | Whether to logging request body,based on [lua-resty-expr](https://github.com/api7/lua-resty-expr), this option require to turn on `include_req_body` option. | |
There was a problem hiding this comment.
| | include_req_body_expr | array | optional | | | Whether to logging request body,based on [lua-resty-expr](https://github.com/api7/lua-resty-expr), this option require to turn on `include_req_body` option. | | |
| | include_req_body_expr | array | optional | | | Whether to logging request body, based on [lua-resty-expr](https://github.com/api7/lua-resty-expr), this option require to turn on `include_req_body` option. | |
| --- wait: 2 | ||
|
|
||
|
|
||
| === TEST 28: hit route,expr eval fail |
There was a problem hiding this comment.
| --- wait: 2 | |
| === TEST 28: hit route,expr eval fail | |
| --- wait: 2 | |
| === TEST 28: hit route,expr eval fail |
| [error] | ||
|
|
||
|
|
||
| === TEST 27: hit route, expr eval success |
There was a problem hiding this comment.
| [error] | |
| === TEST 27: hit route, expr eval success | |
| [error] | |
| === TEST 27: hit route, expr eval success |
There was a problem hiding this comment.
i forgot lint before push, sorry~
| include_req_body_expr = { | ||
| type = "array", | ||
| items = { | ||
| type = "array", | ||
| items = { | ||
| type = "string" | ||
| } | ||
| } | ||
| }, |
There was a problem hiding this comment.
| include_req_body_expr = { | |
| type = "array", | |
| items = { | |
| type = "array", | |
| items = { | |
| type = "string" | |
| } | |
| } | |
| }, | |
| include_req_body_expr = { | |
| type = "array", | |
| minItems = 1, | |
| items = { | |
| type = "array", | |
| items = { | |
| type = "string" | |
| } | |
| } | |
| }, |
| local t = require("lib.test_admin").test | ||
| local code, body = t('/apisix/admin/routes/1', | ||
| ngx.HTTP_PUT, | ||
| [[{ |
| "type": "roundrobin" | ||
| }, | ||
| "uri": "/hello" | ||
| }]] |
| inactive_timeout = {type = "integer", minimum = 1, default = 5}, | ||
| batch_max_size = {type = "integer", minimum = 1, default = 1000}, | ||
| include_req_body = {type = "boolean", default = false}, | ||
| include_req_body_expr = { |
There was a problem hiding this comment.
Before we can merge it, could you add a check for the expr in the check_schema? Like:
apisix/apisix/plugins/response-rewrite.lua
Line 111 in 9b355c6
|
|
||
| function _M.check_schema(conf, schema_type) | ||
|
|
||
| if conf.vars then |
There was a problem hiding this comment.
Should be include_req_body_expr
What this PR does / why we need it:
kafka logger supports logging request body
fix #5343
Pre-submission checklist: