This is an automated email from the ASF dual-hosted git repository. membphis 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 c3d61fc feat: add control api for plugin server-info (#3088) c3d61fc is described below commit c3d61fcfa371e4ca23e73af832141f84e53d6435 Author: Alex Zhang <zchao1...@gmail.com> AuthorDate: Tue Dec 22 11:04:56 2020 +0800 feat: add control api for plugin server-info (#3088) * feat: add control api for plugin server-info Previously we added plugin server-info without exposing API since the same port problem of admin api and proxy. Now we have Control API support so we expose server-info API through Control API. People now can insight the server info about APISIX instance easily. --- apisix/plugins/server-info.lua | 45 ++++++++++++++++++++++++++++++++++++- doc/plugins/server-info.md | 19 ++++++++++++++-- doc/zh-cn/plugins/server-info.md | 19 ++++++++++++++-- t/plugin/server-info.t | 48 ++++++++++++++++++++++++++++++++++++++++ 4 files changed, 126 insertions(+), 5 deletions(-) diff --git a/apisix/plugins/server-info.lua b/apisix/plugins/server-info.lua index 4c90682..5038eae 100644 --- a/apisix/plugins/server-info.lua +++ b/apisix/plugins/server-info.lua @@ -23,7 +23,7 @@ local ngx_timer_at = ngx.timer.at local ngx_worker_id = ngx.worker.id local type = type -local boot_time = os.time() +local load_time = os.time() local plugin_name = "server-info" local default_report_interval = 60 local default_report_ttl = 7200 @@ -66,7 +66,28 @@ local _M = { } +local function get_boot_time() + local time, err = internal_status:get("server_info:boot_time") + if err ~= nil then + core.log.error("failed to get boot_time from shdict: ", err) + return load_time + end + + if time ~= nil then + return time + end + + local _, err = internal_status:set("server_info:boot_time", load_time) + if err ~= nil then + core.log.error("failed to save boot_time to shdict: ", err) + end + + return load_time +end + + local function uninitialized_server_info() + local boot_time = get_boot_time() return { etcd_version = "unknown", hostname = core.utils.gethostname(), @@ -99,6 +120,17 @@ local function get() end +local function get_server_info() + local info, err = get() + if not info then + core.log.error("failed to get server_info: ", err) + return 500 + end + + return 200, info +end + + local function report(premature, report_ttl) if premature then return @@ -158,6 +190,17 @@ function _M.check_schema(conf) end +function _M.control_api() + return { + { + methods = {"GET"}, + uris ={"/v1/server_info"}, + handler = get_server_info, + } + } +end + + function _M.init() core.log.info("server info: ", core.json.delay_encode(get())) diff --git a/doc/plugins/server-info.md b/doc/plugins/server-info.md index bcd2a09..cee2cae 100644 --- a/doc/plugins/server-info.md +++ b/doc/plugins/server-info.md @@ -50,7 +50,7 @@ None ## API -None +This plugin exposes one API `/v1/server_info` to [Control API](../control-api.md). ## How to Enable @@ -87,7 +87,22 @@ plugin_attr: ## Test Plugin -The APISIX Dashboard will collects server info in etcd, after enabling this plugin, you may try to check them through Dashboard. +After enabling this plugin, you can access these data through the plugin Control API: + +```shell +$ curl http://127.0.0.1:9090/v1/server_info -s | jq . +{ + "etcd_version": "3.5.0", + "up_time": 9460, + "last_report_time": 1608531519, + "id": "b7ce1c5c-b1aa-4df7-888a-cbe403f3e948", + "hostname": "fedora32", + "version": "2.1", + "boot_time": 1608522102 +} +``` + +The APISIX Dashboard will collects server info in etcd, so you may also try to check them through Dashboard. ## Disable Plugin diff --git a/doc/zh-cn/plugins/server-info.md b/doc/zh-cn/plugins/server-info.md index 375ac77..59bede4 100644 --- a/doc/zh-cn/plugins/server-info.md +++ b/doc/zh-cn/plugins/server-info.md @@ -51,7 +51,7 @@ ## 插件接口 -无 +该插件在 [Control API](../../control-api.md) 下暴露了一个 API 接口 `/v1/server_info`。 ## 启用插件 @@ -89,7 +89,22 @@ plugin_attr: ## 测试插件 -Apache APISIX Dashboard 会收集上报到 etcd 中的服务信息,在启用这个插件后,你可以通过 APISIX Dashboard 来查看这些数据。 +在启用该插件后,你可以通过插件的 Control API 来访问到这些数据: + +```shell +$ curl http://127.0.0.1:9090/v1/server_info -s | jq . +{ + "etcd_version": "3.5.0", + "up_time": 9460, + "last_report_time": 1608531519, + "id": "b7ce1c5c-b1aa-4df7-888a-cbe403f3e948", + "hostname": "fedora32", + "version": "2.1", + "boot_time": 1608522102 +} +``` + +Apache APISIX Dashboard 会收集上报到 etcd 中的服务信息,因此你也可以通过 APISIX Dashboard 来查看这些数据。 ## 禁用插件 diff --git a/t/plugin/server-info.t b/t/plugin/server-info.t index ae8306c..7ee7eb0 100644 --- a/t/plugin/server-info.t +++ b/t/plugin/server-info.t @@ -133,3 +133,51 @@ integral [error] --- error_log timer created to report server info, interval: 60 + + + +=== TEST 3: get server_info from plugin control API +--- yaml_config +apisix: + id: 123456 +plugins: + - server-info +--- config +location /t { + content_by_lua_block { + local json_decode = require("apisix.core").json.decode + local t = require("lib.test_admin").test + local code, _, body = t("/v1/server_info") + if code >= 300 then + ngx.status = code + end + + local keys = {} + local value, err = json_decode(body) + if not value then + ngx.say(err) + return + end + for k in pairs(value) do + keys[#keys + 1] = k + end + + table.sort(keys) + for i = 1, #keys do + ngx.say(keys[i], ": ", value[keys[i]]) + end + } +} +--- request +GET /t +--- response_body eval +qr{^boot_time: \d+ +etcd_version: [\d\.]+ +hostname: [a-zA-Z\-0-9\.]+ +id: [a-zA-Z\-0-9]+ +last_report_time: \d+ +up_time: \d+ +version: [\d\.]+ +$} +--- no_error_log +[error]