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

wenming 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 f267291  feat(prometheus): allow customizing Prometheus export uri 
(#2826)
f267291 is described below

commit f267291f3a0c102c879b5c12d02e140ede0f5a4b
Author: 罗泽轩 <spacewander...@gmail.com>
AuthorDate: Mon Nov 30 14:35:06 2020 +0800

    feat(prometheus): allow customizing Prometheus export uri (#2826)
    
    * feat(prometheus): allow customizing Prometheus export uri
    
    Close #2296.
---
 apisix/api_router.lua           | 25 ++++++++++++++++++++
 apisix/init.lua                 |  4 +++-
 apisix/plugins/prometheus.lua   | 13 +++++++++--
 conf/config-default.yaml        |  2 ++
 doc/plugins/prometheus.md       | 15 ++++++++++++
 doc/zh-cn/plugins/prometheus.md | 15 ++++++++++++
 t/admin/plugins-reload.t        | 52 +++++++++++++++++++++++++++++++++++++++++
 t/plugin/prometheus.t           | 52 +++++++++++++++++++++++++++++++++++++++++
 8 files changed, 175 insertions(+), 3 deletions(-)

diff --git a/apisix/api_router.lua b/apisix/api_router.lua
index 264c478..3f1cebc 100644
--- a/apisix/api_router.lua
+++ b/apisix/api_router.lua
@@ -20,10 +20,12 @@ local plugin_mod = require("apisix.plugin")
 local ip_restriction = require("apisix.plugins.ip-restriction")
 local core = require("apisix.core")
 local ipairs = ipairs
+local type = type
 
 
 local _M = {}
 local match_opts = {}
+local has_route_not_under_apisix
 local interceptors = {
     ["ip-restriction"] = {
         run = function (conf, ctx)
@@ -76,6 +78,8 @@ do
 function fetch_api_router()
     core.table.clear(routes)
 
+    has_route_not_under_apisix = false
+
     for _, plugin in ipairs(plugin_mod.plugins) do
         local api_fun = plugin.api
         if api_fun then
@@ -84,6 +88,18 @@ function fetch_api_router()
             core.log.debug("fetched api routes: ",
                            core.json.delay_encode(api_routes, true))
             for _, route in ipairs(api_routes) do
+                local typ_uri = type(route.uri)
+                if typ_uri == "string" then
+                    has_route_not_under_apisix =
+                        not core.string.has_prefix(route.uri, "/apisix/")
+                else
+                    for _, uri in ipairs(route.uri) do
+                        if not core.string.has_prefix(route.uri, "/apisix/") 
then
+                            has_route_not_under_apisix = true
+                        end
+                    end
+                end
+
                 core.table.insert(routes, {
                         methods = route.methods,
                         paths = route.uri,
@@ -121,6 +137,15 @@ end
 end -- do
 
 
+function _M.has_route_not_under_apisix()
+    if has_route_not_under_apisix == nil then
+        return true
+    end
+
+    return has_route_not_under_apisix
+end
+
+
 function _M.match(api_ctx)
     local api_router = core.lrucache.global("api_router", 
plugin_mod.load_times, fetch_api_router)
     if not api_router then
diff --git a/apisix/init.lua b/apisix/init.lua
index 7333dd1..827a1fb 100644
--- a/apisix/init.lua
+++ b/apisix/init.lua
@@ -373,7 +373,9 @@ function _M.http_access_phase()
         end
     end
 
-    if core.string.has_prefix(uri, "/apisix/") then
+    if router.api.has_route_not_under_apisix() or
+        core.string.has_prefix(uri, "/apisix/")
+    then
         local matched = router.api.match(api_ctx)
         if matched then
             return
diff --git a/apisix/plugins/prometheus.lua b/apisix/plugins/prometheus.lua
index 8a0a340..54bdaad 100644
--- a/apisix/plugins/prometheus.lua
+++ b/apisix/plugins/prometheus.lua
@@ -16,9 +16,10 @@
 --
 local core = require("apisix.core")
 local exporter = require("apisix.plugins.prometheus.exporter")
-local plugin_name = "prometheus"
 
 
+local plugin_name = "prometheus"
+local default_export_uri = "/apisix/prometheus/metrics"
 local schema = {
     type = "object",
     additionalProperties = false,
@@ -45,10 +46,18 @@ end
 
 
 function _M.api()
+    local export_uri = default_export_uri
+    local local_conf = core.config.local_conf()
+    local attr = core.table.try_read_attr(local_conf, "plugin_attr",
+                                          plugin_name)
+    if attr and attr.export_uri then
+        export_uri = attr.export_uri
+    end
+
     return {
         {
             methods = {"GET"},
-            uri = "/apisix/prometheus/metrics",
+            uri = export_uri,
             handler = exporter.collect
         }
     }
diff --git a/conf/config-default.yaml b/conf/config-default.yaml
index ea4053a..d166e1f 100644
--- a/conf/config-default.yaml
+++ b/conf/config-default.yaml
@@ -249,3 +249,5 @@ plugin_attr:
     service_name: APISIX
     service_instance_name: "APISIX Instance Name"
     endpoint_addr: http://127.0.0.1:12800
+  prometheus:
+    export_uri: /apisix/prometheus/metrics
diff --git a/doc/plugins/prometheus.md b/doc/plugins/prometheus.md
index 1c1a7ab..68e900c 100644
--- a/doc/plugins/prometheus.md
+++ b/doc/plugins/prometheus.md
@@ -89,6 +89,21 @@ And we can check the status at prometheus console:
 
 ![](../../doc/images/plugin/prometheus02.png)
 
+## How to specify export uri
+
+We can change the default export uri in the `plugin_attr` section of 
`conf/config.yaml`.
+
+| Name         | Type   | Default  | Description                               
                           |
+| ------------ | ------ | -------- | 
-------------------------------------------------------------------- |
+| export_uri | string | "/apisix/prometheus/metrics" | uri to get the 
prometheus metrics                  |
+
+Here is an example:
+
+```yaml
+plugin_attr:
+  prometheus:
+    export_uri: /apisix/metrics
+```
 
 ### Grafana dashboard
 
diff --git a/doc/zh-cn/plugins/prometheus.md b/doc/zh-cn/plugins/prometheus.md
index 826e45a..a1c7c90 100644
--- a/doc/zh-cn/plugins/prometheus.md
+++ b/doc/zh-cn/plugins/prometheus.md
@@ -87,6 +87,21 @@ scrape_configs:
 
 ![](../../images/plugin/prometheus02.png)
 
+## 如何修改暴露指标的uri
+
+我们可以在 `conf/config.yaml` 的 `plugin_attr` 修改默认的uri
+
+| 名称         | 类型   | 默认值   | 描述                                               
   |
+| ------------ | ------ | -------- | 
-------------------------------------------------------------------- |
+| export_uri | string | "/apisix/prometheus/metrics" | 暴露指标的uri |
+
+配置示例:
+
+```yaml
+plugin_attr:
+  prometheus:
+    export_uri: /apisix/metrics
+```
 
 ### Grafana 面板
 
diff --git a/t/admin/plugins-reload.t b/t/admin/plugins-reload.t
index 667c9ad..c84c955 100644
--- a/t/admin/plugins-reload.t
+++ b/t/admin/plugins-reload.t
@@ -196,3 +196,55 @@ example-plugin get plugin attr val: 1
 --- error_log
 plugin_attr of example-plugin changed
 plugins not changed
+
+
+
+=== TEST 4: reload plugins to change prometheus' export uri
+--- yaml_config
+apisix:
+  node_listen: 1984
+  admin_key: null
+plugins:
+  - prometheus
+plugin_attr:
+  prometheus:
+    export_uri: /metrics
+--- config
+location /t {
+    content_by_lua_block {
+        local core = require "apisix.core"
+        ngx.sleep(0.1)
+        local t = require("lib.test_admin").test
+        local code, _, org_body = t('/apisix/metrics',
+                                    ngx.HTTP_GET)
+        ngx.say(code)
+
+        local data = [[
+apisix:
+  node_listen: 1984
+  admin_key: null
+plugins:
+  - prometheus
+plugin_attr:
+  prometheus:
+    export_uri: /apisix/metrics
+        ]]
+        require("lib.test_admin").set_config_yaml(data)
+
+        local code, _, org_body = t('/apisix/admin/plugins/reload',
+                                    ngx.HTTP_PUT)
+
+        ngx.say(org_body)
+
+        ngx.sleep(0.1)
+        local code, _, org_body = t('/apisix/metrics',
+                                    ngx.HTTP_GET)
+        ngx.say(code)
+    }
+}
+--- request
+GET /t
+--- response_body
+404
+done
+200
diff --git a/t/plugin/prometheus.t b/t/plugin/prometheus.t
index e9f0e0f..7122b6e 100644
--- a/t/plugin/prometheus.t
+++ b/t/plugin/prometheus.t
@@ -1036,3 +1036,55 @@ GET /apisix/prometheus/metrics
 
qr/apisix_http_status\{code="404",route="9",matched_uri="\/bar\*",matched_host="bar.com",service="",consumer="",node="127.0.0.1"\}
 \d+/
 --- no_error_log
 [error]
+
+
+
+=== TEST 58: customize export uri, not found
+--- yaml_config
+plugin_attr:
+    prometheus:
+        export_uri: /a
+--- request
+GET /apisix/prometheus/metrics
+--- error_code: 404
+--- no_error_log
+[error]
+
+
+
+=== TEST 59: customize export uri, found
+--- yaml_config
+plugin_attr:
+    prometheus:
+        export_uri: /a
+--- request
+GET /a
+--- error_code: 200
+--- no_error_log
+[error]
+
+
+
+=== TEST 60: customize export uri, missing plugin, use default
+--- yaml_config
+plugin_attr:
+    x:
+        y: z
+--- request
+GET /apisix/prometheus/metrics
+--- error_code: 200
+--- no_error_log
+[error]
+
+
+
+=== TEST 61: customize export uri, missing attr, use default
+--- yaml_config
+plugin_attr:
+    prometheus:
+        y: z
+--- request
+GET /apisix/prometheus/metrics
+--- error_code: 200
+--- no_error_log
+[error]

Reply via email to