This is an automated email from the ASF dual-hosted git repository.

spacewander pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/apisix.git


The following commit(s) were added to refs/heads/master by this push:
     new f0a835573 feat(clickhouse-logger): support multi clickhouse endpoints 
(#7517)
f0a835573 is described below

commit f0a8355739db474dae5a150c7d195e0a4a5dbfa9
Author: Zhendong Qi <[email protected]>
AuthorDate: Thu Jul 28 13:43:38 2022 +0800

    feat(clickhouse-logger): support multi clickhouse endpoints (#7517)
---
 apisix/plugins/clickhouse-logger.lua        | 18 +++++++--
 docs/en/latest/plugins/clickhouse-logger.md |  6 ++-
 docs/zh/latest/plugins/clickhouse-logger.md | 24 ++++++------
 t/plugin/clickhouse-logger.t                | 58 ++++++++++++++++++++++++++++-
 4 files changed, 88 insertions(+), 18 deletions(-)

diff --git a/apisix/plugins/clickhouse-logger.lua 
b/apisix/plugins/clickhouse-logger.lua
index f7b734645..026f0cfa9 100644
--- a/apisix/plugins/clickhouse-logger.lua
+++ b/apisix/plugins/clickhouse-logger.lua
@@ -21,6 +21,7 @@ local core            = require("apisix.core")
 local http            = require("resty.http")
 local url             = require("net.url")
 local plugin          = require("apisix.plugin")
+local math_random     = math.random
 
 local ngx      = ngx
 local tostring = tostring
@@ -31,7 +32,9 @@ local batch_processor_manager = 
bp_manager_mod.new(plugin_name)
 local schema = {
     type = "object",
     properties = {
+        -- deprecated, use "endpoint_addrs" instead
         endpoint_addr = core.schema.uri_def,
+        endpoint_addrs = {items = core.schema.uri_def, type = "array", 
minItems = 1},
         user = {type = "string", default = ""},
         password = {type = "string", default = ""},
         database = {type = "string", default = ""},
@@ -40,7 +43,10 @@ local schema = {
         name = {type = "string", default = "clickhouse logger"},
         ssl_verify = {type = "boolean", default = true},
     },
-    required = {"endpoint_addr", "user", "password", "database", "logtable"}
+    oneOf = {
+        {required = {"endpoint_addr", "user", "password", "database", 
"logtable"}},
+        {required = {"endpoint_addrs", "user", "password", "database", 
"logtable"}}
+    },
 }
 
 
@@ -72,11 +78,17 @@ end
 local function send_http_data(conf, log_message)
     local err_msg
     local res = true
-    local url_decoded = url.parse(conf.endpoint_addr)
+    local selected_endpoint_addr
+    if conf.endpoint_addr then
+        selected_endpoint_addr = conf.endpoint_addr
+    else
+        selected_endpoint_addr = 
conf.endpoint_addrs[math_random(#conf.endpoint_addrs)]
+    end
+    local url_decoded = url.parse(selected_endpoint_addr)
     local host = url_decoded.host
     local port = url_decoded.port
 
-    core.log.info("sending a batch logs to ", conf.endpoint_addr)
+    core.log.info("sending a batch logs to ", selected_endpoint_addr)
 
     if not port then
         if url_decoded.scheme == "https" then
diff --git a/docs/en/latest/plugins/clickhouse-logger.md 
b/docs/en/latest/plugins/clickhouse-logger.md
index 5eb8f77f9..f0808b19b 100644
--- a/docs/en/latest/plugins/clickhouse-logger.md
+++ b/docs/en/latest/plugins/clickhouse-logger.md
@@ -35,7 +35,8 @@ The `clickhouse-logger` Plugin is used to push logs to 
[ClickHouse](https://clic
 
 | Name          | Type    | Required | Default             | Valid values | 
Description                                                    |
 
|---------------|---------|----------|---------------------|--------------|----------------------------------------------------------------|
-| endpoint_addr | string  | True     |                     |              | 
ClickHouse endpoint.                                           |
+| endpoint_addr | Deprecated   | True     |                |              | 
Use `endpoint_addrs` instead. ClickHouse endpoints.            |
+| endpoint_addrs | array  | True     |                     |              | 
ClickHouse endpoints.                                          |
 | database      | string  | True     |                     |              | 
Name of the database to store the logs.                        |
 | logtable      | string  | True     |                     |              | 
Table name to store the logs.                                  |
 | user          | string  | True     |                     |              | 
ClickHouse username.                                           |
@@ -96,6 +97,7 @@ Now, if you run `select * from default.test;`, you will get 
the following row:
 
 ## Enabling the Plugin
 
+If multiple endpoints are configured, they will be written randomly.
 The example below shows how you can enable the Plugin on a specific Route:
 
 ```shell
@@ -107,7 +109,7 @@ curl http://127.0.0.1:9080/apisix/admin/routes/1 -H 
'X-API-KEY: edd1c9f034335f13
                 "password": "a",
                 "database": "default",
                 "logtable": "test",
-                "endpoint_addr": "http://127.0.0.1:8123";
+                "endpoint_addrs": ["http://127.0.0.1:8123";]
             }
        },
       "upstream": {
diff --git a/docs/zh/latest/plugins/clickhouse-logger.md 
b/docs/zh/latest/plugins/clickhouse-logger.md
index c704893b1..c967b3d6e 100644
--- a/docs/zh/latest/plugins/clickhouse-logger.md
+++ b/docs/zh/latest/plugins/clickhouse-logger.md
@@ -27,21 +27,23 @@ title: clickhouse-logger
 
 ## 属性
 
-| 名称             | 类型    | 必选项 | 默认值        | 有效值  | 描述                        
                     |
-| ---------------- | ------- | ------ | ------------- | ------- | 
------------------------------------------------ |
-| endpoint_addr    | string  | 必须   |               |         | `clickhouse` 
服务器的 endpoint。                   |
-| database         | string  | 必须   |               |         | 使用的数据库。        
                            |
-| logtable         | string  | 必须   |               |         | 写入的表名 。    |
-| user             | string  | 必须   |               |         | clickhouse 
的用户。 |
-| password         | string  | 必须   |               |         | clickhouse 的密码 
。  |
-| timeout          | integer | 可选   | 3             | [1,...] | 
发送请求后保持连接活动的时间。                   |
-| name             | string  | 可选   | "clickhouse logger" |         | 标识 
logger 的唯一标识符。                     |
-| ssl_verify       | boolean | 可选   | true          | [true,false] | 验证证书。     
        |
+| 名称             | 类型    | 必选项 | 默认值        | 有效值  | 描述                        
                         |
+| ---------------- | ------- | ------ | ------------- | ------- | 
------------------------------------------------  |
+| endpoint_addr    | 废弃    | 必须   |               |         | 推荐使用 
`endpoint_addrs` 代替。`clickhouse` 服务器的 endpoints。|
+| endpoint_addrs   | array    | 必须   |               |         | `clickhouse` 
服务器的 endpoints。|
+| database         | string  | 必须   |               |         | 使用的数据库。        
                              |
+| logtable         | string  | 必须   |               |         | 写入的表名 。        
                               |
+| user             | string  | 必须   |               |         | clickhouse 
的用户。                                |
+| password         | string  | 必须   |               |         | clickhouse 的密码 
。                               |
+| timeout          | integer | 可选   | 3             | [1,...] | 
发送请求后保持连接活动的时间。                       |
+| name             | string  | 可选   | "clickhouse logger" |         | 标识 
logger 的唯一标识符。                    |
+| ssl_verify       | boolean | 可选   | true          | [true,false] | 验证证书。     
                               |
 
 本插件支持使用批处理器来聚合并批量处理条目(日志/数据)。这样可以避免插件频繁地提交数据,默认设置情况下批处理器会每 `5` 秒钟或队列中的数据达到 
`1000` 条时提交数据,如需了解或自定义批处理器相关参数设置,请参考 
[Batch-Processor](../batch-processor.md#配置) 配置部分。
 
 ## 如何开启
 
+如果配置多个 endpoints 将随机写入。
 这是有关如何为特定路由启用 `clickhouse-logger` 插件的示例。
 
 ```shell
@@ -53,7 +55,7 @@ curl http://127.0.0.1:9080/apisix/admin/routes/1 -H 
'X-API-KEY: edd1c9f034335f13
                 "password": "a",
                 "database": "default",
                 "logtable": "test",
-                "endpoint_addr": "http://127.0.0.1:8123";
+                "endpoint_addrs": ["http://127.0.0.1:8123";]
             }
        },
       "upstream": {
diff --git a/t/plugin/clickhouse-logger.t b/t/plugin/clickhouse-logger.t
index 5426ce028..ccb0be11a 100644
--- a/t/plugin/clickhouse-logger.t
+++ b/t/plugin/clickhouse-logger.t
@@ -48,6 +48,18 @@ add_block_preprocessor(sub {
                 ngx.say("ok")
             }
         }
+        location /clickhouse-logger/test1 {
+            content_by_lua_block {
+                ngx.req.read_body()
+                local data = ngx.req.get_body_data()
+                local headers = ngx.req.get_headers()
+                ngx.log(ngx.WARN, "clickhouse body: ", data)
+                for k, v in pairs(headers) do
+                    ngx.log(ngx.WARN, "clickhouse headers: " .. k .. ":" .. v)
+                end
+                ngx.say("ok")
+            }
+        }
     }
 _EOC_
 
@@ -131,7 +143,7 @@ passed
         }
     }
 --- response_body
-property "endpoint_addr" is required
+value should match only one schema, but matches none
 
 
 
@@ -175,7 +187,49 @@ passed
 
 
 
-=== TEST 5: access local server
+=== TEST 5: add plugin on routes using multi clickhouse-logger
+--- config
+    location /t {
+        content_by_lua_block {
+            local t = require("lib.test_admin").test
+            local code, body = t('/apisix/admin/routes/1',
+                 ngx.HTTP_PUT,
+                 [[{
+                        "plugins": {
+                            "clickhouse-logger": {
+                                "user": "default",
+                                "password": "a",
+                                "database": "default",
+                                "logtable": "t",
+                                "endpoint_addrs": 
["http://127.0.0.1:10420/clickhouse-logger/test";,
+                                                  
"http://127.0.0.1:10420/clickhouse-logger/test1";],
+                                "batch_max_size":1,
+                                "inactive_timeout":1
+                            }
+                        },
+                        "upstream": {
+                            "nodes": {
+                                "127.0.0.1:1982": 1
+                            },
+                            "type": "roundrobin"
+                        },
+                        "uri": "/opentracing"
+                }]]
+                )
+
+            if code >= 300 then
+                ngx.status = code
+            end
+            ngx.say(body)
+        }
+    }
+--- error_code: 200
+--- response_body
+passed
+
+
+
+=== TEST 6: access local server
 --- request
 GET /opentracing
 --- response_body

Reply via email to