Просмотр исходного кода

Merge pull request #6811 from HJianBo/acl-metrics-fixes

 refactor(metrics): more clear for acl metrics
JianBo He 4 лет назад
Родитель
Сommit
c5f9bfc305
40 измененных файлов с 229 добавлено и 247 удалено
  1. 0 9
      apps/emqx_auth_http/include/emqx_auth_http.hrl
  2. 3 22
      apps/emqx_auth_http/src/emqx_acl_http.erl
  3. 1 1
      apps/emqx_auth_http/src/emqx_auth_http.app.src
  4. 10 2
      apps/emqx_auth_http/src/emqx_auth_http.appup.src
  5. 0 1
      apps/emqx_auth_http/src/emqx_auth_http_app.erl
  6. 0 9
      apps/emqx_auth_ldap/include/emqx_auth_ldap.hrl
  7. 4 9
      apps/emqx_auth_ldap/src/emqx_acl_ldap.erl
  8. 1 1
      apps/emqx_auth_ldap/src/emqx_auth_ldap.app.src
  9. 14 0
      apps/emqx_auth_ldap/src/emqx_auth_ldap.appup.src
  10. 0 1
      apps/emqx_auth_ldap/src/emqx_auth_ldap_app.erl
  11. 0 9
      apps/emqx_auth_mnesia/include/emqx_auth_mnesia.hrl
  12. 0 8
      apps/emqx_auth_mnesia/src/emqx_acl_mnesia.erl
  13. 8 2
      apps/emqx_auth_mnesia/src/emqx_auth_mnesia.appup.src
  14. 0 1
      apps/emqx_auth_mnesia/src/emqx_auth_mnesia_app.erl
  15. 0 9
      apps/emqx_auth_mongo/include/emqx_auth_mongo.hrl
  16. 3 12
      apps/emqx_auth_mongo/src/emqx_acl_mongo.erl
  17. 1 1
      apps/emqx_auth_mongo/src/emqx_auth_mongo.app.src
  18. 11 0
      apps/emqx_auth_mongo/src/emqx_auth_mongo.appup.src
  19. 0 1
      apps/emqx_auth_mongo/src/emqx_auth_mongo_app.erl
  20. 0 9
      apps/emqx_auth_mysql/include/emqx_auth_mysql.hrl
  21. 4 9
      apps/emqx_auth_mysql/src/emqx_acl_mysql.erl
  22. 1 1
      apps/emqx_auth_mysql/src/emqx_auth_mysql.app.src
  23. 11 0
      apps/emqx_auth_mysql/src/emqx_auth_mysql.appup.src
  24. 0 1
      apps/emqx_auth_mysql/src/emqx_auth_mysql_app.erl
  25. 0 10
      apps/emqx_auth_pgsql/include/emqx_auth_pgsql.hrl
  26. 2 11
      apps/emqx_auth_pgsql/src/emqx_acl_pgsql.erl
  27. 1 1
      apps/emqx_auth_pgsql/src/emqx_auth_pgsql.app.src
  28. 11 0
      apps/emqx_auth_pgsql/src/emqx_auth_pgsql.appup.src
  29. 0 1
      apps/emqx_auth_pgsql/src/emqx_auth_pgsql_app.erl
  30. 0 9
      apps/emqx_auth_redis/include/emqx_auth_redis.hrl
  31. 4 16
      apps/emqx_auth_redis/src/emqx_acl_redis.erl
  32. 1 1
      apps/emqx_auth_redis/src/emqx_auth_redis.app.src
  33. 11 0
      apps/emqx_auth_redis/src/emqx_auth_redis.appup.src
  34. 0 1
      apps/emqx_auth_redis/src/emqx_auth_redis_app.erl
  35. 4 26
      lib-ce/emqx_modules/src/emqx_mod_acl_internal.erl
  36. 1 1
      lib-ce/emqx_modules/src/emqx_modules.app.src
  37. 6 19
      lib-ce/emqx_modules/src/emqx_modules.appup.src
  38. 66 27
      src/emqx.appup.src
  39. 14 3
      src/emqx_access_control.erl
  40. 36 3
      src/emqx_metrics.erl

+ 0 - 9
apps/emqx_auth_http/include/emqx_auth_http.hrl

@@ -7,17 +7,8 @@
         ignore = 'client.auth.ignore'
         ignore = 'client.auth.ignore'
     }).
     }).
 
 
--record(acl_metrics, {
-        allow = 'client.acl.allow',
-        deny = 'client.acl.deny',
-        ignore = 'client.acl.ignore'
-    }).
-
 -define(METRICS(Type), tl(tuple_to_list(#Type{}))).
 -define(METRICS(Type), tl(tuple_to_list(#Type{}))).
 -define(METRICS(Type, K), #Type{}#Type.K).
 -define(METRICS(Type, K), #Type{}#Type.K).
 
 
 -define(AUTH_METRICS, ?METRICS(auth_metrics)).
 -define(AUTH_METRICS, ?METRICS(auth_metrics)).
 -define(AUTH_METRICS(K), ?METRICS(auth_metrics, K)).
 -define(AUTH_METRICS(K), ?METRICS(auth_metrics, K)).
-
--define(ACL_METRICS, ?METRICS(acl_metrics)).
--define(ACL_METRICS(K), ?METRICS(acl_metrics, K)).

+ 3 - 22
apps/emqx_auth_http/src/emqx_acl_http.erl

@@ -29,26 +29,17 @@
         ]).
         ]).
 
 
 %% ACL callbacks
 %% ACL callbacks
--export([ register_metrics/0
-        , check_acl/5
+-export([ check_acl/5
         , description/0
         , description/0
         ]).
         ]).
 
 
--spec(register_metrics() -> ok).
-register_metrics() ->
-    lists:foreach(fun emqx_metrics:ensure/1, ?ACL_METRICS).
-
 %%--------------------------------------------------------------------
 %%--------------------------------------------------------------------
 %% ACL callbacks
 %% ACL callbacks
 %%--------------------------------------------------------------------
 %%--------------------------------------------------------------------
 
 
-check_acl(ClientInfo, PubSub, Topic, AclResult, Params) ->
-    return_with(fun inc_metrics/1,
-                do_check_acl(ClientInfo, PubSub, Topic, AclResult, Params)).
-
-do_check_acl(#{username := <<$$, _/binary>>}, _PubSub, _Topic, _AclResult, _Params) ->
+check_acl(#{username := <<$$, _/binary>>}, _PubSub, _Topic, _AclResult, _Params) ->
     ok;
     ok;
-do_check_acl(ClientInfo, PubSub, Topic, _AclResult, #{acl := ACLParams = #{path := Path}}) ->
+check_acl(ClientInfo, PubSub, Topic, _AclResult, #{acl := ACLParams = #{path := Path}}) ->
     ClientInfo1 = ClientInfo#{access => access(PubSub), topic => Topic},
     ClientInfo1 = ClientInfo#{access => access(PubSub), topic => Topic},
     case check_acl_request(ACLParams, ClientInfo1) of
     case check_acl_request(ACLParams, ClientInfo1) of
         {ok, 200, <<"ignore">>} -> ok;
         {ok, 200, <<"ignore">>} -> ok;
@@ -65,16 +56,6 @@ description() -> "ACL with HTTP API".
 %% Internal functions
 %% Internal functions
 %%--------------------------------------------------------------------
 %%--------------------------------------------------------------------
 
 
-inc_metrics(ok) ->
-    emqx_metrics:inc(?ACL_METRICS(ignore));
-inc_metrics({stop, allow}) ->
-    emqx_metrics:inc(?ACL_METRICS(allow));
-inc_metrics({stop, deny}) ->
-    emqx_metrics:inc(?ACL_METRICS(deny)).
-
-return_with(Fun, Result) ->
-    Fun(Result), Result.
-
 check_acl_request(#{pool_name := PoolName,
 check_acl_request(#{pool_name := PoolName,
                     path := Path,
                     path := Path,
                     method := Method,
                     method := Method,

+ 1 - 1
apps/emqx_auth_http/src/emqx_auth_http.app.src

@@ -1,6 +1,6 @@
 {application, emqx_auth_http,
 {application, emqx_auth_http,
  [{description, "EMQ X Authentication/ACL with HTTP API"},
  [{description, "EMQ X Authentication/ACL with HTTP API"},
-  {vsn, "4.3.3"}, % strict semver, bump manually!
+  {vsn, "4.3.4"}, % strict semver, bump manually!
   {modules, []},
   {modules, []},
   {registered, [emqx_auth_http_sup]},
   {registered, [emqx_auth_http_sup]},
   {applications, [kernel,stdlib,ehttpc]},
   {applications, [kernel,stdlib,ehttpc]},

+ 10 - 2
apps/emqx_auth_http/src/emqx_auth_http.appup.src

@@ -1,15 +1,23 @@
 %% -*- mode: erlang -*-
 %% -*- mode: erlang -*-
 {VSN,
 {VSN,
-  [{"4.3.2",
+  [{"4.3.3",
+    [{load_module,emqx_auth_http_app,brutal_purge,soft_purge,[]},
+     {load_module,emqx_acl_http,brutal_purge,soft_purge,[]}]},
+   {"4.3.2",
     [{apply,{application,stop,[emqx_auth_http]}},
     [{apply,{application,stop,[emqx_auth_http]}},
      {load_module,emqx_auth_http_app,brutal_purge,soft_purge,[]},
      {load_module,emqx_auth_http_app,brutal_purge,soft_purge,[]},
+     {load_module,emqx_acl_http,brutal_purge,soft_purge,[]},
      {load_module,emqx_auth_http_cli,brutal_purge,soft_purge,[]}]},
      {load_module,emqx_auth_http_cli,brutal_purge,soft_purge,[]}]},
    {<<"4.3.[0-1]">>,
    {<<"4.3.[0-1]">>,
     [{restart_application,emqx_auth_http}]},
     [{restart_application,emqx_auth_http}]},
    {<<".*">>,[]}],
    {<<".*">>,[]}],
-  [{"4.3.2",
+  [{"4.3.3",
+    [{load_module,emqx_auth_http_app,brutal_purge,soft_purge,[]},
+     {load_module,emqx_acl_http,brutal_purge,soft_purge,[]}]},
+   {"4.3.2",
     [{apply,{application,stop,[emqx_auth_http]}},
     [{apply,{application,stop,[emqx_auth_http]}},
      {load_module,emqx_auth_http_app,brutal_purge,soft_purge,[]},
      {load_module,emqx_auth_http_app,brutal_purge,soft_purge,[]},
+     {load_module,emqx_acl_http,brutal_purge,soft_purge,[]},
      {load_module,emqx_auth_http_cli,brutal_purge,soft_purge,[]}]},
      {load_module,emqx_auth_http_cli,brutal_purge,soft_purge,[]}]},
    {<<"4.3.[0-1]">>,
    {<<"4.3.[0-1]">>,
     [{restart_application,emqx_auth_http}]},
     [{restart_application,emqx_auth_http}]},

+ 0 - 1
apps/emqx_auth_http/src/emqx_auth_http_app.erl

@@ -130,7 +130,6 @@ load_hooks() ->
     case application:get_env(?APP, acl_req) of
     case application:get_env(?APP, acl_req) of
         undefined -> ok;
         undefined -> ok;
         {ok, ACLReq} ->
         {ok, ACLReq} ->
-            ok = emqx_acl_http:register_metrics(),
             PoolOpts2 = proplists:get_value(pool_opts, ACLReq),
             PoolOpts2 = proplists:get_value(pool_opts, ACLReq),
             PoolName2 = proplists:get_value(pool_name, ACLReq),
             PoolName2 = proplists:get_value(pool_name, ACLReq),
             {ok, _} = ehttpc_sup:start_pool(PoolName2, PoolOpts2),
             {ok, _} = ehttpc_sup:start_pool(PoolName2, PoolOpts2),

+ 0 - 9
apps/emqx_auth_ldap/include/emqx_auth_ldap.hrl

@@ -7,17 +7,8 @@
         ignore = 'client.auth.ignore'
         ignore = 'client.auth.ignore'
     }).
     }).
 
 
--record(acl_metrics, {
-        allow = 'client.acl.allow',
-        deny = 'client.acl.deny',
-        ignore = 'client.acl.ignore'
-    }).
-
 -define(METRICS(Type), tl(tuple_to_list(#Type{}))).
 -define(METRICS(Type), tl(tuple_to_list(#Type{}))).
 -define(METRICS(Type, K), #Type{}#Type.K).
 -define(METRICS(Type, K), #Type{}#Type.K).
 
 
 -define(AUTH_METRICS, ?METRICS(auth_metrics)).
 -define(AUTH_METRICS, ?METRICS(auth_metrics)).
 -define(AUTH_METRICS(K), ?METRICS(auth_metrics, K)).
 -define(AUTH_METRICS(K), ?METRICS(auth_metrics, K)).
-
--define(ACL_METRICS, ?METRICS(acl_metrics)).
--define(ACL_METRICS(K), ?METRICS(acl_metrics, K)).

+ 4 - 9
apps/emqx_auth_ldap/src/emqx_acl_ldap.erl

@@ -22,20 +22,15 @@
 -include_lib("eldap/include/eldap.hrl").
 -include_lib("eldap/include/eldap.hrl").
 -include_lib("emqx/include/logger.hrl").
 -include_lib("emqx/include/logger.hrl").
 
 
--export([ register_metrics/0
-        , check_acl/5
+-export([ check_acl/5
         , description/0
         , description/0
         ]).
         ]).
 
 
--spec(register_metrics() -> ok).
-register_metrics() ->
-    lists:foreach(fun emqx_metrics:ensure/1, ?ACL_METRICS).
-
 check_acl(ClientInfo, PubSub, Topic, NoMatchAction, State) ->
 check_acl(ClientInfo, PubSub, Topic, NoMatchAction, State) ->
     case do_check_acl(ClientInfo, PubSub, Topic, NoMatchAction, State) of
     case do_check_acl(ClientInfo, PubSub, Topic, NoMatchAction, State) of
-        ok -> emqx_metrics:inc(?ACL_METRICS(ignore)), ok;
-        {stop, allow} -> emqx_metrics:inc(?ACL_METRICS(allow)), {stop, allow};
-        {stop, deny} -> emqx_metrics:inc(?ACL_METRICS(deny)), {stop, deny}
+        ok -> ok;
+        {stop, allow} -> {stop, allow};
+        {stop, deny} -> {stop, deny}
     end.
     end.
 
 
 do_check_acl(#{username := <<$$, _/binary>>}, _PubSub, _Topic, _NoMatchAction, _State) ->
 do_check_acl(#{username := <<$$, _/binary>>}, _PubSub, _Topic, _NoMatchAction, _State) ->

+ 1 - 1
apps/emqx_auth_ldap/src/emqx_auth_ldap.app.src

@@ -1,6 +1,6 @@
 {application, emqx_auth_ldap,
 {application, emqx_auth_ldap,
  [{description, "EMQ X Authentication/ACL with LDAP"},
  [{description, "EMQ X Authentication/ACL with LDAP"},
-  {vsn, "4.3.2"}, % strict semver, bump manually!
+  {vsn, "4.3.3"}, % strict semver, bump manually!
   {modules, []},
   {modules, []},
   {registered, [emqx_auth_ldap_sup]},
   {registered, [emqx_auth_ldap_sup]},
   {applications, [kernel,stdlib,eldap2,ecpool]},
   {applications, [kernel,stdlib,eldap2,ecpool]},

+ 14 - 0
apps/emqx_auth_ldap/src/emqx_auth_ldap.appup.src

@@ -3,9 +3,16 @@
  [ {"4.3.0",
  [ {"4.3.0",
     [ {load_module, emqx_acl_ldap, brutal_purge, soft_purge, []}
     [ {load_module, emqx_acl_ldap, brutal_purge, soft_purge, []}
     , {load_module, emqx_auth_ldap_cli, brutal_purge, soft_purge, []}
     , {load_module, emqx_auth_ldap_cli, brutal_purge, soft_purge, []}
+    , {load_module, emqx_auth_ldap_app, brutal_purge, soft_purge, []}
     ]},
     ]},
    {"4.3.1",
    {"4.3.1",
     [ {load_module, emqx_auth_ldap_cli, brutal_purge, soft_purge, []}
     [ {load_module, emqx_auth_ldap_cli, brutal_purge, soft_purge, []}
+    , {load_module, emqx_acl_ldap, brutal_purge, soft_purge, []}
+    , {load_module, emqx_auth_ldap_app, brutal_purge, soft_purge, []}
+    ]},
+   {"4.3.2",
+    [ {load_module, emqx_acl_ldap, brutal_purge, soft_purge, []}
+    , {load_module, emqx_auth_ldap_app, brutal_purge, soft_purge, []}
     ]},
     ]},
    {<<".*">>, []}
    {<<".*">>, []}
  ],
  ],
@@ -13,9 +20,16 @@
    {"4.3.0",
    {"4.3.0",
     [ {load_module, emqx_acl_ldap, brutal_purge, soft_purge, []}
     [ {load_module, emqx_acl_ldap, brutal_purge, soft_purge, []}
     , {load_module, emqx_auth_ldap_cli, brutal_purge, soft_purge, []}
     , {load_module, emqx_auth_ldap_cli, brutal_purge, soft_purge, []}
+    , {load_module, emqx_auth_ldap_app, brutal_purge, soft_purge, []}
     ]},
     ]},
    {"4.3.1",
    {"4.3.1",
     [ {load_module, emqx_auth_ldap_cli, brutal_purge, soft_purge, []}
     [ {load_module, emqx_auth_ldap_cli, brutal_purge, soft_purge, []}
+    , {load_module, emqx_acl_ldap, brutal_purge, soft_purge, []}
+    , {load_module, emqx_auth_ldap_app, brutal_purge, soft_purge, []}
+    ]},
+   {"4.3.2",
+    [ {load_module, emqx_acl_ldap, brutal_purge, soft_purge, []}
+    , {load_module, emqx_auth_ldap_app, brutal_purge, soft_purge, []}
     ]},
     ]},
    {<<".*">>, []}
    {<<".*">>, []}
  ]
  ]

+ 0 - 1
apps/emqx_auth_ldap/src/emqx_auth_ldap_app.erl

@@ -54,7 +54,6 @@ load_auth_hook(DeviceDn) ->
     emqx:hook('client.authenticate', fun emqx_auth_ldap:check/3, [Params#{pool => ?APP}]).
     emqx:hook('client.authenticate', fun emqx_auth_ldap:check/3, [Params#{pool => ?APP}]).
 
 
 load_acl_hook(DeviceDn) ->
 load_acl_hook(DeviceDn) ->
-    ok = emqx_acl_ldap:register_metrics(),
     Params = maps:from_list(DeviceDn),
     Params = maps:from_list(DeviceDn),
     emqx:hook('client.check_acl', fun emqx_acl_ldap:check_acl/5 , [Params#{pool => ?APP}]).
     emqx:hook('client.check_acl', fun emqx_acl_ldap:check_acl/5 , [Params#{pool => ?APP}]).
 
 

+ 0 - 9
apps/emqx_auth_mnesia/include/emqx_auth_mnesia.hrl

@@ -48,17 +48,8 @@
         ignore = 'client.auth.ignore'
         ignore = 'client.auth.ignore'
     }).
     }).
 
 
--record(acl_metrics, {
-        allow = 'client.acl.allow',
-        deny = 'client.acl.deny',
-        ignore = 'client.acl.ignore'
-    }).
-
 -define(METRICS(Type), tl(tuple_to_list(#Type{}))).
 -define(METRICS(Type), tl(tuple_to_list(#Type{}))).
 -define(METRICS(Type, K), #Type{}#Type.K).
 -define(METRICS(Type, K), #Type{}#Type.K).
 
 
 -define(AUTH_METRICS, ?METRICS(auth_metrics)).
 -define(AUTH_METRICS, ?METRICS(auth_metrics)).
 -define(AUTH_METRICS(K), ?METRICS(auth_metrics, K)).
 -define(AUTH_METRICS(K), ?METRICS(auth_metrics, K)).
-
--define(ACL_METRICS, ?METRICS(acl_metrics)).
--define(ACL_METRICS(K), ?METRICS(acl_metrics, K)).

+ 0 - 8
apps/emqx_auth_mnesia/src/emqx_acl_mnesia.erl

@@ -20,7 +20,6 @@
 
 
 %% ACL Callbacks
 %% ACL Callbacks
 -export([ init/0
 -export([ init/0
-        , register_metrics/0
         , check_acl/5
         , check_acl/5
         , description/0
         , description/0
        ]).
        ]).
@@ -29,10 +28,6 @@ init() ->
     ok = emqx_acl_mnesia_db:create_table(),
     ok = emqx_acl_mnesia_db:create_table(),
     ok = emqx_acl_mnesia_db:create_table2().
     ok = emqx_acl_mnesia_db:create_table2().
 
 
--spec(register_metrics() -> ok).
-register_metrics() ->
-    lists:foreach(fun emqx_metrics:ensure/1, ?ACL_METRICS).
-
 check_acl(ClientInfo = #{ clientid := Clientid }, PubSub, Topic, _NoMatchAction, _Params) ->
 check_acl(ClientInfo = #{ clientid := Clientid }, PubSub, Topic, _NoMatchAction, _Params) ->
     Username = maps:get(username, ClientInfo, undefined),
     Username = maps:get(username, ClientInfo, undefined),
 
 
@@ -48,13 +43,10 @@ check_acl(ClientInfo = #{ clientid := Clientid }, PubSub, Topic, _NoMatchAction,
 
 
     case match(ClientInfo, PubSub, Topic, Acls) of
     case match(ClientInfo, PubSub, Topic, Acls) of
         allow ->
         allow ->
-            emqx_metrics:inc(?ACL_METRICS(allow)),
             {stop, allow};
             {stop, allow};
         deny ->
         deny ->
-            emqx_metrics:inc(?ACL_METRICS(deny)),
             {stop, deny};
             {stop, deny};
         _ ->
         _ ->
-            emqx_metrics:inc(?ACL_METRICS(ignore)),
             ok
             ok
     end.
     end.
 
 

+ 8 - 2
apps/emqx_auth_mnesia/src/emqx_auth_mnesia.appup.src

@@ -8,12 +8,15 @@
       {apply, {emqx_acl_mnesia_migrator, start_supervised, []}},
       {apply, {emqx_acl_mnesia_migrator, start_supervised, []}},
       {load_module,emqx_auth_mnesia_api, brutal_purge,soft_purge,[]},
       {load_module,emqx_auth_mnesia_api, brutal_purge,soft_purge,[]},
       {load_module,emqx_acl_mnesia, brutal_purge,soft_purge,[]},
       {load_module,emqx_acl_mnesia, brutal_purge,soft_purge,[]},
+      {load_module,emqx_auth_mnesia_app, brutal_purge,soft_purge,[]},
       {load_module,emqx_acl_mnesia_api, brutal_purge,soft_purge,[]},
       {load_module,emqx_acl_mnesia_api, brutal_purge,soft_purge,[]},
       {load_module,emqx_acl_mnesia_cli, brutal_purge,soft_purge,[]}
       {load_module,emqx_acl_mnesia_cli, brutal_purge,soft_purge,[]}
     ]},
     ]},
     {<<"4.3.4">>, [
     {<<"4.3.4">>, [
       {load_module,emqx_auth_mnesia, brutal_purge,soft_purge,[]},
       {load_module,emqx_auth_mnesia, brutal_purge,soft_purge,[]},
-      {load_module,emqx_auth_mnesia_cli, brutal_purge,soft_purge,[]}
+      {load_module,emqx_auth_mnesia_cli, brutal_purge,soft_purge,[]},
+      {load_module,emqx_acl_mnesia, brutal_purge,soft_purge,[]},
+      {load_module,emqx_auth_mnesia_app, brutal_purge,soft_purge,[]}
     ]},
     ]},
     {<<".*">>, [
     {<<".*">>, [
     ]}
     ]}
@@ -26,12 +29,15 @@
       {load_module,emqx_acl_mnesia_api, brutal_purge,soft_purge,[]},
       {load_module,emqx_acl_mnesia_api, brutal_purge,soft_purge,[]},
       {load_module,emqx_auth_mnesia_api, brutal_purge,soft_purge,[]},
       {load_module,emqx_auth_mnesia_api, brutal_purge,soft_purge,[]},
       {load_module,emqx_acl_mnesia, brutal_purge,soft_purge,[]},
       {load_module,emqx_acl_mnesia, brutal_purge,soft_purge,[]},
+      {load_module,emqx_auth_mnesia_app, brutal_purge,soft_purge,[]},
       {delete_module,emqx_acl_mnesia_migrator},
       {delete_module,emqx_acl_mnesia_migrator},
       {delete_module,emqx_acl_mnesia_db}
       {delete_module,emqx_acl_mnesia_db}
     ]},
     ]},
     {<<"4.3.4">>, [
     {<<"4.3.4">>, [
       {load_module,emqx_auth_mnesia, brutal_purge,soft_purge,[]},
       {load_module,emqx_auth_mnesia, brutal_purge,soft_purge,[]},
-      {load_module,emqx_auth_mnesia_cli, brutal_purge,soft_purge,[]}
+      {load_module,emqx_auth_mnesia_cli, brutal_purge,soft_purge,[]},
+      {load_module,emqx_acl_mnesia, brutal_purge,soft_purge,[]},
+      {load_module,emqx_auth_mnesia_app, brutal_purge,soft_purge,[]}
     ]},
     ]},
     {<<".*">>, [
     {<<".*">>, [
     ]}
     ]}

+ 0 - 1
apps/emqx_auth_mnesia/src/emqx_auth_mnesia_app.erl

@@ -64,5 +64,4 @@ load_auth_hook() ->
 
 
 load_acl_hook() ->
 load_acl_hook() ->
     ok = emqx_acl_mnesia:init(),
     ok = emqx_acl_mnesia:init(),
-    ok = emqx_acl_mnesia:register_metrics(),
     emqx:hook('client.check_acl', fun emqx_acl_mnesia:check_acl/5, [#{}]).
     emqx:hook('client.check_acl', fun emqx_acl_mnesia:check_acl/5, [#{}]).

+ 0 - 9
apps/emqx_auth_mongo/include/emqx_auth_mongo.hrl

@@ -21,17 +21,8 @@
         ignore  = 'client.auth.ignore'
         ignore  = 'client.auth.ignore'
     }).
     }).
 
 
--record(acl_metrics, {
-        allow = 'client.acl.allow',
-        deny = 'client.acl.deny',
-        ignore = 'client.acl.ignore'
-    }).
-
 -define(METRICS(Type), tl(tuple_to_list(#Type{}))).
 -define(METRICS(Type), tl(tuple_to_list(#Type{}))).
 -define(METRICS(Type, K), #Type{}#Type.K).
 -define(METRICS(Type, K), #Type{}#Type.K).
 
 
 -define(AUTH_METRICS, ?METRICS(auth_metrics)).
 -define(AUTH_METRICS, ?METRICS(auth_metrics)).
 -define(AUTH_METRICS(K), ?METRICS(auth_metrics, K)).
 -define(AUTH_METRICS(K), ?METRICS(auth_metrics, K)).
-
--define(ACL_METRICS, ?METRICS(acl_metrics)).
--define(ACL_METRICS(K), ?METRICS(acl_metrics, K)).

+ 3 - 12
apps/emqx_auth_mongo/src/emqx_acl_mongo.erl

@@ -21,17 +21,12 @@
 -include_lib("emqx/include/logger.hrl").
 -include_lib("emqx/include/logger.hrl").
 
 
 %% ACL callbacks
 %% ACL callbacks
--export([ register_metrics/0
-        , check_acl/5
+-export([ check_acl/5
         , description/0
         , description/0
         ]).
         ]).
--spec(register_metrics() -> ok).
-register_metrics() ->
-    lists:foreach(fun emqx_metrics:ensure/1, ?ACL_METRICS).
 
 
 check_acl(#{username := <<$$, _/binary>>}, _PubSub, _Topic, _AclResult, _State) ->
 check_acl(#{username := <<$$, _/binary>>}, _PubSub, _Topic, _AclResult, _State) ->
     ok;
     ok;
-
 check_acl(ClientInfo, PubSub, Topic, _AclResult, Env = #{aclquery := AclQuery}) ->
 check_acl(ClientInfo, PubSub, Topic, _AclResult, Env = #{aclquery := AclQuery}) ->
     #aclquery{collection = Coll, selector = SelectorList} = AclQuery,
     #aclquery{collection = Coll, selector = SelectorList} = AclQuery,
     Pool = maps:get(pool, Env, ?APP),
     Pool = maps:get(pool, Env, ?APP),
@@ -43,20 +38,16 @@ check_acl(ClientInfo, PubSub, Topic, _AclResult, Env = #{aclquery := AclQuery})
         [] -> ok;
         [] -> ok;
         Rows ->
         Rows ->
             try match(ClientInfo, Topic, topics(PubSub, Rows)) of
             try match(ClientInfo, Topic, topics(PubSub, Rows)) of
-                matched -> emqx_metrics:inc(?ACL_METRICS(allow)),
-                           {stop, allow};
-                nomatch -> emqx_metrics:inc(?ACL_METRICS(deny)),
-                           {stop, deny}
+                matched -> {stop, allow};
+                nomatch -> {stop, deny}
             catch
             catch
                 _Err:Reason->
                 _Err:Reason->
                     ?LOG(error, "[MongoDB] Check mongo ~p ACL failed, got ACL config: ~p, error: :~p",
                     ?LOG(error, "[MongoDB] Check mongo ~p ACL failed, got ACL config: ~p, error: :~p",
                                 [PubSub, Rows, Reason]),
                                 [PubSub, Rows, Reason]),
-                    emqx_metrics:inc(?ACL_METRICS(ignore)),
                     ignore
                     ignore
             end
             end
     end.
     end.
 
 
-
 match(_ClientInfo, _Topic, []) ->
 match(_ClientInfo, _Topic, []) ->
     nomatch;
     nomatch;
 match(ClientInfo, Topic, [TopicFilter|More]) ->
 match(ClientInfo, Topic, [TopicFilter|More]) ->

+ 1 - 1
apps/emqx_auth_mongo/src/emqx_auth_mongo.app.src

@@ -1,6 +1,6 @@
 {application, emqx_auth_mongo,
 {application, emqx_auth_mongo,
  [{description, "EMQ X Authentication/ACL with MongoDB"},
  [{description, "EMQ X Authentication/ACL with MongoDB"},
-  {vsn, "4.3.0"}, % strict semver, bump manually!
+  {vsn, "4.3.1"}, % strict semver, bump manually!
   {modules, []},
   {modules, []},
   {registered, [emqx_auth_mongo_sup]},
   {registered, [emqx_auth_mongo_sup]},
   {applications, [kernel,stdlib,mongodb,ecpool]},
   {applications, [kernel,stdlib,mongodb,ecpool]},

+ 11 - 0
apps/emqx_auth_mongo/src/emqx_auth_mongo.appup.src

@@ -0,0 +1,11 @@
+%% -*- mode: erlang -*-
+{VSN,
+  [{"4.3.0",
+    [{load_module,emqx_auth_mongo_app,brutal_purge,soft_purge,[]},
+     {load_module,emqx_acl_mongo,brutal_purge,soft_purge,[]}]},
+   {<<".*">>,[]}],
+  [{"4.3.0",
+    [{load_module,emqx_auth_mongo_app,brutal_purge,soft_purge,[]},
+     {load_module,emqx_acl_mongo,brutal_purge,soft_purge,[]}]},
+   {<<".*">>,[]}]
+}.

+ 0 - 1
apps/emqx_auth_mongo/src/emqx_auth_mongo_app.erl

@@ -55,7 +55,6 @@ reg_authmod(AuthQuery) ->
                    [#{authquery => AuthQuery, superquery => SuperQuery, pool => ?APP}]).
                    [#{authquery => AuthQuery, superquery => SuperQuery, pool => ?APP}]).
 
 
 reg_aclmod(AclQuery) ->
 reg_aclmod(AclQuery) ->
-    emqx_acl_mongo:register_metrics(),
     ok = emqx:hook('client.check_acl', fun emqx_acl_mongo:check_acl/5, [#{aclquery => AclQuery, pool => ?APP}]).
     ok = emqx:hook('client.check_acl', fun emqx_acl_mongo:check_acl/5, [#{aclquery => AclQuery, pool => ?APP}]).
 
 
 %%--------------------------------------------------------------------
 %%--------------------------------------------------------------------

+ 0 - 9
apps/emqx_auth_mysql/include/emqx_auth_mysql.hrl

@@ -7,17 +7,8 @@
         ignore = 'client.auth.ignore'
         ignore = 'client.auth.ignore'
     }).
     }).
 
 
--record(acl_metrics, {
-        allow = 'client.acl.allow',
-        deny = 'client.acl.deny',
-        ignore = 'client.acl.ignore'
-    }).
-
 -define(METRICS(Type), tl(tuple_to_list(#Type{}))).
 -define(METRICS(Type), tl(tuple_to_list(#Type{}))).
 -define(METRICS(Type, K), #Type{}#Type.K).
 -define(METRICS(Type, K), #Type{}#Type.K).
 
 
 -define(AUTH_METRICS, ?METRICS(auth_metrics)).
 -define(AUTH_METRICS, ?METRICS(auth_metrics)).
 -define(AUTH_METRICS(K), ?METRICS(auth_metrics, K)).
 -define(AUTH_METRICS(K), ?METRICS(auth_metrics, K)).
-
--define(ACL_METRICS, ?METRICS(acl_metrics)).
--define(ACL_METRICS(K), ?METRICS(acl_metrics, K)).

+ 4 - 9
apps/emqx_auth_mysql/src/emqx_acl_mysql.erl

@@ -22,20 +22,15 @@
 -include_lib("emqx/include/logger.hrl").
 -include_lib("emqx/include/logger.hrl").
 
 
 %% ACL Callbacks
 %% ACL Callbacks
--export([ register_metrics/0
-        , check_acl/5
+-export([ check_acl/5
         , description/0
         , description/0
         ]).
         ]).
 
 
--spec(register_metrics() -> ok).
-register_metrics() ->
-    lists:foreach(fun emqx_metrics:ensure/1, ?ACL_METRICS).
-
 check_acl(ClientInfo, PubSub, Topic, NoMatchAction, #{pool := Pool} = State) ->
 check_acl(ClientInfo, PubSub, Topic, NoMatchAction, #{pool := Pool} = State) ->
     case do_check_acl(Pool, ClientInfo, PubSub, Topic, NoMatchAction, State) of
     case do_check_acl(Pool, ClientInfo, PubSub, Topic, NoMatchAction, State) of
-        ok -> emqx_metrics:inc(?ACL_METRICS(ignore)), ok;
-        {stop, allow} -> emqx_metrics:inc(?ACL_METRICS(allow)), {stop, allow};
-        {stop, deny} -> emqx_metrics:inc(?ACL_METRICS(deny)), {stop, deny}
+        ok -> ok;
+        {stop, allow} -> {stop, allow};
+        {stop, deny} -> {stop, deny}
     end.
     end.
 
 
 do_check_acl(_Pool, #{username := <<$$, _/binary>>}, _PubSub, _Topic, _NoMatchAction, _State) ->
 do_check_acl(_Pool, #{username := <<$$, _/binary>>}, _PubSub, _Topic, _NoMatchAction, _State) ->

+ 1 - 1
apps/emqx_auth_mysql/src/emqx_auth_mysql.app.src

@@ -1,6 +1,6 @@
 {application, emqx_auth_mysql,
 {application, emqx_auth_mysql,
  [{description, "EMQ X Authentication/ACL with MySQL"},
  [{description, "EMQ X Authentication/ACL with MySQL"},
-  {vsn, "4.3.0"}, % strict semver, bump manually!
+  {vsn, "4.3.1"}, % strict semver, bump manually!
   {modules, []},
   {modules, []},
   {registered, [emqx_auth_mysql_sup]},
   {registered, [emqx_auth_mysql_sup]},
   {applications, [kernel,stdlib,mysql,ecpool]},
   {applications, [kernel,stdlib,mysql,ecpool]},

+ 11 - 0
apps/emqx_auth_mysql/src/emqx_auth_mysql.appup.src

@@ -0,0 +1,11 @@
+%% -*- mode: erlang -*-
+{VSN,
+  [{"4.3.0",
+    [{load_module,emqx_auth_mysql_app,brutal_purge,soft_purge,[]},
+     {load_module,emqx_acl_mysql,brutal_purge,soft_purge,[]}]},
+   {<<".*">>,[]}],
+  [{"4.3.0",
+    [{load_module,emqx_auth_mysql_app,brutal_purge,soft_purge,[]},
+     {load_module,emqx_acl_mysql,brutal_purge,soft_purge,[]}]},
+   {<<".*">>,[]}]
+}.

+ 0 - 1
apps/emqx_auth_mysql/src/emqx_auth_mysql_app.erl

@@ -60,7 +60,6 @@ load_auth_hook(AuthQuery) ->
     emqx:hook('client.authenticate', fun emqx_auth_mysql:check/3, [Params]).
     emqx:hook('client.authenticate', fun emqx_auth_mysql:check/3, [Params]).
 
 
 load_acl_hook(AclQuery) ->
 load_acl_hook(AclQuery) ->
-    ok = emqx_acl_mysql:register_metrics(),
     emqx:hook('client.check_acl', fun emqx_acl_mysql:check_acl/5, [#{acl_query => AclQuery, pool =>?APP}]).
     emqx:hook('client.check_acl', fun emqx_acl_mysql:check_acl/5, [#{acl_query => AclQuery, pool =>?APP}]).
 
 
 %%--------------------------------------------------------------------
 %%--------------------------------------------------------------------

+ 0 - 10
apps/emqx_auth_pgsql/include/emqx_auth_pgsql.hrl

@@ -6,18 +6,8 @@
         ignore  = 'client.auth.ignore'
         ignore  = 'client.auth.ignore'
     }).
     }).
 
 
--record(acl_metrics, {
-        allow = 'client.acl.allow',
-        deny = 'client.acl.deny',
-        ignore = 'client.acl.ignore'
-    }).
-
 -define(METRICS(Type), tl(tuple_to_list(#Type{}))).
 -define(METRICS(Type), tl(tuple_to_list(#Type{}))).
 -define(METRICS(Type, K), #Type{}#Type.K).
 -define(METRICS(Type, K), #Type{}#Type.K).
 
 
 -define(AUTH_METRICS, ?METRICS(auth_metrics)).
 -define(AUTH_METRICS, ?METRICS(auth_metrics)).
 -define(AUTH_METRICS(K), ?METRICS(auth_metrics, K)).
 -define(AUTH_METRICS(K), ?METRICS(auth_metrics, K)).
-
--define(ACL_METRICS, ?METRICS(acl_metrics)).
--define(ACL_METRICS(K), ?METRICS(acl_metrics, K)).
-

+ 2 - 11
apps/emqx_auth_pgsql/src/emqx_acl_pgsql.erl

@@ -21,21 +21,12 @@
 -include_lib("emqx/include/logger.hrl").
 -include_lib("emqx/include/logger.hrl").
 
 
 %% ACL callbacks
 %% ACL callbacks
--export([ register_metrics/0
-        , check_acl/5
+-export([ check_acl/5
         , description/0
         , description/0
         ]).
         ]).
 
 
--spec(register_metrics() -> ok).
-register_metrics() ->
-    lists:foreach(fun emqx_metrics:ensure/1, ?ACL_METRICS).
-
 check_acl(ClientInfo, PubSub, Topic, NoMatchAction, #{pool := Pool} = State) ->
 check_acl(ClientInfo, PubSub, Topic, NoMatchAction, #{pool := Pool} = State) ->
-    case do_check_acl(Pool, ClientInfo, PubSub, Topic, NoMatchAction, State) of
-        ok -> emqx_metrics:inc(?ACL_METRICS(ignore)), ok;
-        {stop, allow} -> emqx_metrics:inc(?ACL_METRICS(allow)), {stop, allow};
-        {stop, deny} -> emqx_metrics:inc(?ACL_METRICS(deny)), {stop, deny}
-    end.
+    do_check_acl(Pool, ClientInfo, PubSub, Topic, NoMatchAction, State).
 
 
 do_check_acl(_Pool, #{username := <<$$, _/binary>>}, _PubSub, _Topic, _NoMatchAction, _State) ->
 do_check_acl(_Pool, #{username := <<$$, _/binary>>}, _PubSub, _Topic, _NoMatchAction, _State) ->
     ok;
     ok;

+ 1 - 1
apps/emqx_auth_pgsql/src/emqx_auth_pgsql.app.src

@@ -1,6 +1,6 @@
 {application, emqx_auth_pgsql,
 {application, emqx_auth_pgsql,
  [{description, "EMQ X Authentication/ACL with PostgreSQL"},
  [{description, "EMQ X Authentication/ACL with PostgreSQL"},
-  {vsn, "4.3.0"}, % strict semver, bump manually!
+  {vsn, "4.3.1"}, % strict semver, bump manually!
   {modules, []},
   {modules, []},
   {registered, [emqx_auth_pgsql_sup]},
   {registered, [emqx_auth_pgsql_sup]},
   {applications, [kernel,stdlib,epgsql,ecpool]},
   {applications, [kernel,stdlib,epgsql,ecpool]},

+ 11 - 0
apps/emqx_auth_pgsql/src/emqx_auth_pgsql.appup.src

@@ -0,0 +1,11 @@
+%% -*- mode: erlang -*-
+{VSN,
+  [{"4.3.0",
+    [{load_module,emqx_auth_pgsql_app,brutal_purge,soft_purge,[]},
+     {load_module,emqx_acl_pgsql,brutal_purge,soft_purge,[]}]},
+   {<<".*">>,[]}],
+  [{"4.3.0",
+    [{load_module,emqx_auth_pgsql_app,brutal_purge,soft_purge,[]},
+     {load_module,emqx_acl_pgsql,brutal_purge,soft_purge,[]}]},
+   {<<".*">>,[]}]
+}.

+ 0 - 1
apps/emqx_auth_pgsql/src/emqx_auth_pgsql_app.erl

@@ -46,7 +46,6 @@ start(_StartType, _StartArgs) ->
         ok = emqx:hook('client.authenticate', fun emqx_auth_pgsql:check/3, [AuthEnv])
         ok = emqx:hook('client.authenticate', fun emqx_auth_pgsql:check/3, [AuthEnv])
     end),
     end),
     if_enabled(acl_query, fun(AclQuery) ->
     if_enabled(acl_query, fun(AclQuery) ->
-        ok = emqx_acl_pgsql:register_metrics(),
         ok = emqx:hook('client.check_acl', fun emqx_acl_pgsql:check_acl/5, [#{acl_query => AclQuery, pool => ?APP}])
         ok = emqx:hook('client.check_acl', fun emqx_acl_pgsql:check_acl/5, [#{acl_query => AclQuery, pool => ?APP}])
     end),
     end),
     {ok, Sup}.
     {ok, Sup}.

+ 0 - 9
apps/emqx_auth_redis/include/emqx_auth_redis.hrl

@@ -7,17 +7,8 @@
         ignore = 'client.auth.ignore'
         ignore = 'client.auth.ignore'
     }).
     }).
 
 
--record(acl_metrics, {
-        allow = 'client.acl.allow',
-        deny = 'client.acl.deny',
-        ignore = 'client.acl.ignore'
-    }).
-
 -define(METRICS(Type), tl(tuple_to_list(#Type{}))).
 -define(METRICS(Type), tl(tuple_to_list(#Type{}))).
 -define(METRICS(Type, K), #Type{}#Type.K).
 -define(METRICS(Type, K), #Type{}#Type.K).
 
 
 -define(AUTH_METRICS, ?METRICS(auth_metrics)).
 -define(AUTH_METRICS, ?METRICS(auth_metrics)).
 -define(AUTH_METRICS(K), ?METRICS(auth_metrics, K)).
 -define(AUTH_METRICS(K), ?METRICS(auth_metrics, K)).
-
--define(ACL_METRICS, ?METRICS(acl_metrics)).
--define(ACL_METRICS(K), ?METRICS(acl_metrics, K)).

+ 4 - 16
apps/emqx_auth_redis/src/emqx_acl_redis.erl

@@ -21,26 +21,14 @@
 -include_lib("emqx/include/emqx.hrl").
 -include_lib("emqx/include/emqx.hrl").
 -include_lib("emqx/include/logger.hrl").
 -include_lib("emqx/include/logger.hrl").
 
 
--export([ register_metrics/0
-        , check_acl/5
+-export([ check_acl/5
         , description/0
         , description/0
         ]).
         ]).
 
 
--spec(register_metrics() -> ok).
-register_metrics() ->
-    lists:foreach(fun emqx_metrics:ensure/1, ?ACL_METRICS).
-
-check_acl(ClientInfo, PubSub, Topic, AclResult, Config) ->
-    case do_check_acl(ClientInfo, PubSub, Topic, AclResult, Config) of
-        ok -> emqx_metrics:inc(?ACL_METRICS(ignore)), ok;
-        {stop, allow} -> emqx_metrics:inc(?ACL_METRICS(allow)), {stop, allow};
-        {stop, deny} -> emqx_metrics:inc(?ACL_METRICS(deny)), {stop, deny}
-    end.
-
-do_check_acl(#{username := <<$$, _/binary>>}, _PubSub, _Topic, _AclResult, _Config) ->
+check_acl(#{username := <<$$, _/binary>>}, _PubSub, _Topic, _AclResult, _Config) ->
     ok;
     ok;
-do_check_acl(ClientInfo, PubSub, Topic, _AclResult,
-             #{acl_cmd := AclCmd, timeout := Timeout, type := Type, pool := Pool}) ->
+check_acl(ClientInfo, PubSub, Topic, _AclResult,
+          #{acl_cmd := AclCmd, timeout := Timeout, type := Type, pool := Pool}) ->
     case emqx_auth_redis_cli:q(Pool, Type, AclCmd, ClientInfo, Timeout) of
     case emqx_auth_redis_cli:q(Pool, Type, AclCmd, ClientInfo, Timeout) of
         {ok, []} -> ok;
         {ok, []} -> ok;
         {ok, Rules} ->
         {ok, Rules} ->

+ 1 - 1
apps/emqx_auth_redis/src/emqx_auth_redis.app.src

@@ -1,6 +1,6 @@
 {application, emqx_auth_redis,
 {application, emqx_auth_redis,
  [{description, "EMQ X Authentication/ACL with Redis"},
  [{description, "EMQ X Authentication/ACL with Redis"},
-  {vsn, "4.3.0"}, % strict semver, bump manually!
+  {vsn, "4.3.1"}, % strict semver, bump manually!
   {modules, []},
   {modules, []},
   {registered, [emqx_auth_redis_sup]},
   {registered, [emqx_auth_redis_sup]},
   {applications, [kernel,stdlib,eredis,eredis_cluster,ecpool]},
   {applications, [kernel,stdlib,eredis,eredis_cluster,ecpool]},

+ 11 - 0
apps/emqx_auth_redis/src/emqx_auth_redis.appup.src

@@ -0,0 +1,11 @@
+%% -*- mode: erlang -*-
+{VSN,
+  [{"4.3.0",
+    [{load_module,emqx_auth_redis_app,brutal_purge,soft_purge,[]},
+     {load_module,emqx_acl_redis,brutal_purge,soft_purge,[]}]},
+   {<<".*">>,[]}],
+  [{"4.3.0",
+    [{load_module,emqx_auth_redis_app,brutal_purge,soft_purge,[]},
+     {load_module,emqx_acl_redis,brutal_purge,soft_purge,[]}]},
+   {<<".*">>,[]}]
+}.

+ 0 - 1
apps/emqx_auth_redis/src/emqx_auth_redis_app.erl

@@ -59,7 +59,6 @@ load_acl_hook(AclCmd) ->
                timeout => Timeout,
                timeout => Timeout,
                type => Type,
                type => Type,
                pool => ?APP},
                pool => ?APP},
-    ok = emqx_acl_redis:register_metrics(),
     emqx:hook('client.check_acl', fun emqx_acl_redis:check_acl/5, [Config]).
     emqx:hook('client.check_acl', fun emqx_acl_redis:check_acl/5, [Config]).
 
 
 if_cmd_enabled(Par, Fun) ->
 if_cmd_enabled(Par, Fun) ->

+ 4 - 26
lib-ce/emqx_modules/src/emqx_mod_acl_internal.erl

@@ -38,26 +38,12 @@
 -type(acl_rules() :: #{publish   => [emqx_access_rule:rule()],
 -type(acl_rules() :: #{publish   => [emqx_access_rule:rule()],
                        subscribe => [emqx_access_rule:rule()]}).
                        subscribe => [emqx_access_rule:rule()]}).
 
 
--record(acl_metrics, {
-    allow = 'client.acl.allow',
-    deny = 'client.acl.deny',
-    ignore = 'client.acl.ignore'
-    }).
-
--define(METRICS(Type), tl(tuple_to_list(#Type{}))).
--define(METRICS(Type, K), #Type{}#Type.K).
-
--define(ACL_METRICS, ?METRICS(acl_metrics)).
--define(ACL_METRICS(K), ?METRICS(acl_metrics, K)).
-
-
 %%--------------------------------------------------------------------
 %%--------------------------------------------------------------------
 %% API
 %% API
 %%--------------------------------------------------------------------
 %%--------------------------------------------------------------------
 
 
 load(Env) ->
 load(Env) ->
     Rules = rules_from_file(proplists:get_value(acl_file, Env)),
     Rules = rules_from_file(proplists:get_value(acl_file, Env)),
-    register_metrics(),
     emqx_hooks:add('client.check_acl', {?MODULE, check_acl, [Rules]},  -1).
     emqx_hooks:add('client.check_acl', {?MODULE, check_acl, [Rules]},  -1).
 
 
 unload(_Env) ->
 unload(_Env) ->
@@ -82,15 +68,9 @@ description() ->
       -> {ok, allow} | {ok, deny} | ok).
       -> {ok, allow} | {ok, deny} | ok).
 check_acl(Client, PubSub, Topic, _AclResult, Rules) ->
 check_acl(Client, PubSub, Topic, _AclResult, Rules) ->
     case match(Client, Topic, lookup(PubSub, Rules)) of
     case match(Client, Topic, lookup(PubSub, Rules)) of
-        {matched, allow} ->
-            emqx_metrics:inc(?ACL_METRICS(allow)),
-            {ok, allow};
-        {matched, deny}  ->
-            emqx_metrics:inc(?ACL_METRICS(deny)),
-            {ok, deny};
-        nomatch          ->
-            emqx_metrics:inc(?ACL_METRICS(ignore)),
-            ok
+        {matched, allow} -> {ok, allow};
+        {matched, deny}  -> {ok, deny};
+        nomatch          -> ok
     end.
     end.
 
 
 %%--------------------------------------------------------------------
 %%--------------------------------------------------------------------
@@ -127,9 +107,6 @@ rules_from_file(AclFile) ->
             #{}
             #{}
     end.
     end.
 
 
-register_metrics() ->
-    lists:foreach(fun emqx_metrics:ensure/1, ?ACL_METRICS).
-
 filter(_PubSub, {allow, all}) ->
 filter(_PubSub, {allow, all}) ->
     true;
     true;
 filter(_PubSub, {deny, all}) ->
 filter(_PubSub, {deny, all}) ->
@@ -142,3 +119,4 @@ filter(subscribe, {_AllowDeny, _Who, subscribe, _Topics}) ->
     true;
     true;
 filter(_PubSub, {_AllowDeny, _Who, _, _Topics}) ->
 filter(_PubSub, {_AllowDeny, _Who, _, _Topics}) ->
     false.
     false.
+

+ 1 - 1
lib-ce/emqx_modules/src/emqx_modules.app.src

@@ -1,6 +1,6 @@
 {application, emqx_modules,
 {application, emqx_modules,
  [{description, "EMQ X Module Management"},
  [{description, "EMQ X Module Management"},
-  {vsn, "4.3.4"},
+  {vsn, "4.3.3"},
   {modules, []},
   {modules, []},
   {applications, [kernel,stdlib]},
   {applications, [kernel,stdlib]},
   {mod, {emqx_modules_app, []}},
   {mod, {emqx_modules_app, []}},

+ 6 - 19
lib-ce/emqx_modules/src/emqx_modules.appup.src

@@ -1,45 +1,32 @@
 %% -*-: erlang -*-
 %% -*-: erlang -*-
 {VSN,
 {VSN,
   [
   [
-    {"4.3.3", [
-        {apply, {emqx_metrics, ensure, [['client.acl.allow', 'client.acl.ignore', 'client.acl.deny']]}},
-        {load_module, emqx_mod_acl_internal, brutal_purge, soft_purge, []}
-    ]},
     {"4.3.2", [
     {"4.3.2", [
-      {load_module, emqx_mod_presence, brutal_purge, soft_purge, []},
-      {apply, {emqx_metrics, ensure, [['client.acl.allow', 'client.acl.ignore', 'client.acl.deny']]}},
-      {load_module, emqx_mod_acl_internal, brutal_purge, soft_purge, []}
+      {load_module, emqx_mod_presence, brutal_purge, soft_purge, []}
     ]},
     ]},
     {"4.3.1", [
     {"4.3.1", [
       {load_module, emqx_mod_presence, brutal_purge, soft_purge, []},
       {load_module, emqx_mod_presence, brutal_purge, soft_purge, []},
-      {load_module, emqx_mod_api_topic_metrics, brutal_purge, soft_purge, []},
-      {apply, {emqx_metrics, ensure, [['client.acl.allow', 'client.acl.ignore', 'client.acl.deny']]}},
-      {load_module, emqx_mod_acl_internal, brutal_purge, soft_purge, []}
+      {load_module, emqx_mod_api_topic_metrics, brutal_purge, soft_purge, []}
     ]},
     ]},
     {"4.3.0", [
     {"4.3.0", [
       {update, emqx_mod_delayed, {advanced, []}},
       {update, emqx_mod_delayed, {advanced, []}},
       {load_module, emqx_mod_presence, brutal_purge, soft_purge, []},
       {load_module, emqx_mod_presence, brutal_purge, soft_purge, []},
-      {load_module, emqx_mod_api_topic_metrics, brutal_purge, soft_purge, []},
-      {apply, {emqx_metrics, ensure, [['client.acl.allow', 'client.acl.ignore', 'client.acl.deny']]}},
-      {load_module, emqx_mod_acl_internal, brutal_purge, soft_purge, []}
+      {load_module, emqx_mod_api_topic_metrics, brutal_purge, soft_purge, []}
     ]},
     ]},
     {<<".*">>, []}
     {<<".*">>, []}
   ],
   ],
   [
   [
     {"4.3.2", [
     {"4.3.2", [
-      {load_module, emqx_mod_presence, brutal_purge, soft_purge, []},
-      {load_module, emqx_mod_acl_internal, brutal_purge, soft_purge, []}
+      {load_module, emqx_mod_presence, brutal_purge, soft_purge, []}
     ]},
     ]},
     {"4.3.1", [
     {"4.3.1", [
       {load_module, emqx_mod_presence, brutal_purge, soft_purge, []},
       {load_module, emqx_mod_presence, brutal_purge, soft_purge, []},
-      {load_module, emqx_mod_api_topic_metrics, brutal_purge, soft_purge, []},
-      {load_module, emqx_mod_acl_internal, brutal_purge, soft_purge, []}
+      {load_module, emqx_mod_api_topic_metrics, brutal_purge, soft_purge, []}
     ]},
     ]},
     {"4.3.0", [
     {"4.3.0", [
       {update, emqx_mod_delayed, {advanced, []}},
       {update, emqx_mod_delayed, {advanced, []}},
       {load_module, emqx_mod_presence, brutal_purge, soft_purge, []},
       {load_module, emqx_mod_presence, brutal_purge, soft_purge, []},
-      {load_module, emqx_mod_api_topic_metrics, brutal_purge, soft_purge, []},
-      {load_module, emqx_mod_acl_internal, brutal_purge, soft_purge, []}
+      {load_module, emqx_mod_api_topic_metrics, brutal_purge, soft_purge, []}
     ]},
     ]},
     {<<".*">>, []}
     {<<".*">>, []}
   ]
   ]

+ 66 - 27
src/emqx.appup.src

@@ -1,16 +1,20 @@
 %% -*- mode: erlang -*-
 %% -*- mode: erlang -*-
 {VSN,
 {VSN,
   [{"4.3.12",
   [{"4.3.12",
-    [ {load_module,emqx_channel,brutal_purge,soft_purge,[]}
-    , {load_module,emqx_metrics,brutal_purge,soft_purge,[]}
+    [ {load_module,emqx_metrics,brutal_purge,soft_purge,[]}
+    , {apply,{emqx_metrics,assign_acl_stats_from_ets_to_counter,[]}}
+    , {load_module,emqx_access_control,brutal_purge,soft_purge,[]}
+    , {load_module,emqx_channel,brutal_purge,soft_purge,[]}
     , {load_module,emqx_session,brutal_purge,soft_purge,[]}
     , {load_module,emqx_session,brutal_purge,soft_purge,[]}
     , {load_module,emqx_alarm,brutal_purge,soft_purge,[]}
     , {load_module,emqx_alarm,brutal_purge,soft_purge,[]}
     , {load_module,emqx_limiter,brutal_purge,soft_purge,[]}
     , {load_module,emqx_limiter,brutal_purge,soft_purge,[]}
     ]},
     ]},
    {"4.3.11",
    {"4.3.11",
-    [{load_module,emqx_connection,brutal_purge,soft_purge,[]},
+    [{load_module,emqx_metrics,brutal_purge,soft_purge,[]},
+     {apply,{emqx_metrics,assign_acl_stats_from_ets_to_counter,[]}},
+     {load_module,emqx_access_control,brutal_purge,soft_purge,[]},
+     {load_module,emqx_connection,brutal_purge,soft_purge,[]},
      {load_module,emqx_channel,brutal_purge,soft_purge,[]},
      {load_module,emqx_channel,brutal_purge,soft_purge,[]},
-     {load_module,emqx_metrics,brutal_purge,soft_purge,[]},
      {load_module,emqx_session,brutal_purge,soft_purge,[]},
      {load_module,emqx_session,brutal_purge,soft_purge,[]},
      {load_module,emqx_vm,brutal_purge,soft_purge,[]},
      {load_module,emqx_vm,brutal_purge,soft_purge,[]},
      {load_module,emqx_sys_mon,brutal_purge,soft_purge,[]},
      {load_module,emqx_sys_mon,brutal_purge,soft_purge,[]},
@@ -19,8 +23,10 @@
      {load_module,emqx_http_lib,brutal_purge,soft_purge,[]},
      {load_module,emqx_http_lib,brutal_purge,soft_purge,[]},
      {load_module,emqx_limiter,brutal_purge,soft_purge,[]}]},
      {load_module,emqx_limiter,brutal_purge,soft_purge,[]}]},
    {"4.3.10",
    {"4.3.10",
-    [{load_module,emqx_channel,brutal_purge,soft_purge,[]},
-     {load_module,emqx_metrics,brutal_purge,soft_purge,[]},
+    [{load_module,emqx_metrics,brutal_purge,soft_purge,[]},
+     {apply,{emqx_metrics,assign_acl_stats_from_ets_to_counter,[]}},
+     {load_module,emqx_access_control,brutal_purge,soft_purge,[]},
+     {load_module,emqx_channel,brutal_purge,soft_purge,[]},
      {load_module,emqx_session,brutal_purge,soft_purge,[]},
      {load_module,emqx_session,brutal_purge,soft_purge,[]},
      {load_module,emqx_vm,brutal_purge,soft_purge,[]},
      {load_module,emqx_vm,brutal_purge,soft_purge,[]},
      {load_module,emqx_sys_mon,brutal_purge,soft_purge,[]},
      {load_module,emqx_sys_mon,brutal_purge,soft_purge,[]},
@@ -31,12 +37,14 @@
      {load_module,emqx_connection,brutal_purge,soft_purge,[]},
      {load_module,emqx_connection,brutal_purge,soft_purge,[]},
      {load_module,emqx_limiter,brutal_purge,soft_purge,[]}]},
      {load_module,emqx_limiter,brutal_purge,soft_purge,[]}]},
    {"4.3.9",
    {"4.3.9",
-    [{load_module,emqx_vm,brutal_purge,soft_purge,[]},
+    [{load_module,emqx_metrics,brutal_purge,soft_purge,[]},
+     {apply,{emqx_metrics,assign_acl_stats_from_ets_to_counter,[]}},
+     {load_module,emqx_access_control,brutal_purge,soft_purge,[]},
+     {load_module,emqx_vm,brutal_purge,soft_purge,[]},
      {load_module,emqx_sys_mon,brutal_purge,soft_purge,[]},
      {load_module,emqx_sys_mon,brutal_purge,soft_purge,[]},
      {load_module,emqx_http_lib,brutal_purge,soft_purge,[]},
      {load_module,emqx_http_lib,brutal_purge,soft_purge,[]},
      {load_module,emqx_connection,brutal_purge,soft_purge,[]},
      {load_module,emqx_connection,brutal_purge,soft_purge,[]},
      {load_module,emqx_channel,brutal_purge,soft_purge,[]},
      {load_module,emqx_channel,brutal_purge,soft_purge,[]},
-     {load_module,emqx_metrics,brutal_purge,soft_purge,[]},
      {load_module,emqx_session,brutal_purge,soft_purge,[]},
      {load_module,emqx_session,brutal_purge,soft_purge,[]},
      {load_module,emqx_cm,brutal_purge,soft_purge,[]},
      {load_module,emqx_cm,brutal_purge,soft_purge,[]},
      {load_module,emqx_ws_connection,brutal_purge,soft_purge,[]},
      {load_module,emqx_ws_connection,brutal_purge,soft_purge,[]},
@@ -48,12 +56,14 @@
      {load_module,emqx_app,brutal_purge,soft_purge,[]},
      {load_module,emqx_app,brutal_purge,soft_purge,[]},
      {load_module,emqx_limiter,brutal_purge,soft_purge,[]}]},
      {load_module,emqx_limiter,brutal_purge,soft_purge,[]}]},
    {"4.3.8",
    {"4.3.8",
-    [{load_module,emqx_vm,brutal_purge,soft_purge,[]},
+    [{load_module,emqx_metrics,brutal_purge,soft_purge,[]},
+     {apply,{emqx_metrics,assign_acl_stats_from_ets_to_counter,[]}},
+     {load_module,emqx_access_control,brutal_purge,soft_purge,[]},
+     {load_module,emqx_vm,brutal_purge,soft_purge,[]},
      {load_module,emqx_sys_mon,brutal_purge,soft_purge,[]},
      {load_module,emqx_sys_mon,brutal_purge,soft_purge,[]},
      {load_module,emqx_http_lib,brutal_purge,soft_purge,[]},
      {load_module,emqx_http_lib,brutal_purge,soft_purge,[]},
      {load_module,emqx_connection,brutal_purge,soft_purge,[]},
      {load_module,emqx_connection,brutal_purge,soft_purge,[]},
      {load_module,emqx_channel,brutal_purge,soft_purge,[]},
      {load_module,emqx_channel,brutal_purge,soft_purge,[]},
-     {load_module,emqx_metrics,brutal_purge,soft_purge,[]},
      {load_module,emqx_session,brutal_purge,soft_purge,[]},
      {load_module,emqx_session,brutal_purge,soft_purge,[]},
      {load_module,emqx_cm,brutal_purge,soft_purge,[]},
      {load_module,emqx_cm,brutal_purge,soft_purge,[]},
      {load_module,emqx_ws_connection,brutal_purge,soft_purge,[]},
      {load_module,emqx_ws_connection,brutal_purge,soft_purge,[]},
@@ -65,12 +75,14 @@
      {load_module,emqx_app,brutal_purge,soft_purge,[]},
      {load_module,emqx_app,brutal_purge,soft_purge,[]},
      {load_module,emqx_limiter,brutal_purge,soft_purge,[]}]},
      {load_module,emqx_limiter,brutal_purge,soft_purge,[]}]},
    {"4.3.7",
    {"4.3.7",
-    [{load_module,emqx_vm,brutal_purge,soft_purge,[]},
+    [{load_module,emqx_metrics,brutal_purge,soft_purge,[]},
+     {apply,{emqx_metrics,assign_acl_stats_from_ets_to_counter,[]}},
+     {load_module,emqx_access_control,brutal_purge,soft_purge,[]},
+     {load_module,emqx_vm,brutal_purge,soft_purge,[]},
      {load_module,emqx_sys_mon,brutal_purge,soft_purge,[]},
      {load_module,emqx_sys_mon,brutal_purge,soft_purge,[]},
      {load_module,emqx_http_lib,brutal_purge,soft_purge,[]},
      {load_module,emqx_http_lib,brutal_purge,soft_purge,[]},
      {load_module,emqx_connection,brutal_purge,soft_purge,[]},
      {load_module,emqx_connection,brutal_purge,soft_purge,[]},
      {load_module,emqx_channel,brutal_purge,soft_purge,[]},
      {load_module,emqx_channel,brutal_purge,soft_purge,[]},
-     {load_module,emqx_metrics,brutal_purge,soft_purge,[]},
      {load_module,emqx_session,brutal_purge,soft_purge,[]},
      {load_module,emqx_session,brutal_purge,soft_purge,[]},
      {load_module,emqx_cm,brutal_purge,soft_purge,[]},
      {load_module,emqx_cm,brutal_purge,soft_purge,[]},
      {load_module,emqx_ws_connection,brutal_purge,soft_purge,[]},
      {load_module,emqx_ws_connection,brutal_purge,soft_purge,[]},
@@ -84,12 +96,14 @@
      {load_module,emqx_app,brutal_purge,soft_purge,[]},
      {load_module,emqx_app,brutal_purge,soft_purge,[]},
      {load_module,emqx_limiter,brutal_purge,soft_purge,[]}]},
      {load_module,emqx_limiter,brutal_purge,soft_purge,[]}]},
    {"4.3.6",
    {"4.3.6",
-    [{load_module,emqx_vm,brutal_purge,soft_purge,[]},
+    [{load_module,emqx_metrics,brutal_purge,soft_purge,[]},
+     {apply,{emqx_metrics,assign_acl_stats_from_ets_to_counter,[]}},
+     {load_module,emqx_access_control,brutal_purge,soft_purge,[]},
+     {load_module,emqx_vm,brutal_purge,soft_purge,[]},
      {load_module,emqx_sys_mon,brutal_purge,soft_purge,[]},
      {load_module,emqx_sys_mon,brutal_purge,soft_purge,[]},
      {load_module,emqx_http_lib,brutal_purge,soft_purge,[]},
      {load_module,emqx_http_lib,brutal_purge,soft_purge,[]},
      {load_module,emqx_connection,brutal_purge,soft_purge,[]},
      {load_module,emqx_connection,brutal_purge,soft_purge,[]},
      {load_module,emqx_channel,brutal_purge,soft_purge,[]},
      {load_module,emqx_channel,brutal_purge,soft_purge,[]},
-     {load_module,emqx_metrics,brutal_purge,soft_purge,[]},
      {load_module,emqx_session,brutal_purge,soft_purge,[]},
      {load_module,emqx_session,brutal_purge,soft_purge,[]},
      {load_module,emqx_cm,brutal_purge,soft_purge,[]},
      {load_module,emqx_cm,brutal_purge,soft_purge,[]},
      {load_module,emqx_ws_connection,brutal_purge,soft_purge,[]},
      {load_module,emqx_ws_connection,brutal_purge,soft_purge,[]},
@@ -104,12 +118,14 @@
      {load_module,emqx_app,brutal_purge,soft_purge,[]},
      {load_module,emqx_app,brutal_purge,soft_purge,[]},
      {load_module,emqx_limiter,brutal_purge,soft_purge,[]}]},
      {load_module,emqx_limiter,brutal_purge,soft_purge,[]}]},
    {"4.3.5",
    {"4.3.5",
-    [{load_module,emqx_vm,brutal_purge,soft_purge,[]},
+    [{load_module,emqx_metrics,brutal_purge,soft_purge,[]},
+     {apply,{emqx_metrics,assign_acl_stats_from_ets_to_counter,[]}},
+     {load_module,emqx_access_control,brutal_purge,soft_purge,[]},
+     {load_module,emqx_vm,brutal_purge,soft_purge,[]},
      {load_module,emqx_sys_mon,brutal_purge,soft_purge,[]},
      {load_module,emqx_sys_mon,brutal_purge,soft_purge,[]},
      {load_module,emqx_http_lib,brutal_purge,soft_purge,[]},
      {load_module,emqx_http_lib,brutal_purge,soft_purge,[]},
      {load_module,emqx_connection,brutal_purge,soft_purge,[]},
      {load_module,emqx_connection,brutal_purge,soft_purge,[]},
      {load_module,emqx_channel,brutal_purge,soft_purge,[]},
      {load_module,emqx_channel,brutal_purge,soft_purge,[]},
-     {load_module,emqx_metrics,brutal_purge,soft_purge,[]},
      {load_module,emqx_session,brutal_purge,soft_purge,[]},
      {load_module,emqx_session,brutal_purge,soft_purge,[]},
      {load_module,emqx_ws_connection,brutal_purge,soft_purge,[]},
      {load_module,emqx_ws_connection,brutal_purge,soft_purge,[]},
      {load_module,emqx_alarm_handler,brutal_purge,soft_purge,[]},
      {load_module,emqx_alarm_handler,brutal_purge,soft_purge,[]},
@@ -125,12 +141,14 @@
      {load_module,emqx_app,brutal_purge,soft_purge,[]},
      {load_module,emqx_app,brutal_purge,soft_purge,[]},
      {load_module,emqx_limiter,brutal_purge,soft_purge,[]}]},
      {load_module,emqx_limiter,brutal_purge,soft_purge,[]}]},
    {"4.3.4",
    {"4.3.4",
-    [{load_module,emqx_vm,brutal_purge,soft_purge,[]},
+    [{load_module,emqx_metrics,brutal_purge,soft_purge,[]},
+     {apply,{emqx_metrics,assign_acl_stats_from_ets_to_counter,[]}},
+     {load_module,emqx_access_control,brutal_purge,soft_purge,[]},
+     {load_module,emqx_vm,brutal_purge,soft_purge,[]},
      {load_module,emqx_sys_mon,brutal_purge,soft_purge,[]},
      {load_module,emqx_sys_mon,brutal_purge,soft_purge,[]},
      {load_module,emqx_http_lib,brutal_purge,soft_purge,[]},
      {load_module,emqx_http_lib,brutal_purge,soft_purge,[]},
      {load_module,emqx_connection,brutal_purge,soft_purge,[]},
      {load_module,emqx_connection,brutal_purge,soft_purge,[]},
      {load_module,emqx_channel,brutal_purge,soft_purge,[]},
      {load_module,emqx_channel,brutal_purge,soft_purge,[]},
-     {load_module,emqx_metrics,brutal_purge,soft_purge,[]},
      {load_module,emqx_session,brutal_purge,soft_purge,[]},
      {load_module,emqx_session,brutal_purge,soft_purge,[]},
      {load_module,emqx_ws_connection,brutal_purge,soft_purge,[]},
      {load_module,emqx_ws_connection,brutal_purge,soft_purge,[]},
      {load_module,emqx_alarm_handler,brutal_purge,soft_purge,[]},
      {load_module,emqx_alarm_handler,brutal_purge,soft_purge,[]},
@@ -147,12 +165,14 @@
      {load_module,emqx_app,brutal_purge,soft_purge,[]},
      {load_module,emqx_app,brutal_purge,soft_purge,[]},
      {load_module,emqx_limiter,brutal_purge,soft_purge,[]}]},
      {load_module,emqx_limiter,brutal_purge,soft_purge,[]}]},
    {"4.3.3",
    {"4.3.3",
-    [{load_module,emqx_vm,brutal_purge,soft_purge,[]},
+    [{load_module,emqx_metrics,brutal_purge,soft_purge,[]},
+     {apply,{emqx_metrics,assign_acl_stats_from_ets_to_counter,[]}},
+     {load_module,emqx_access_control,brutal_purge,soft_purge,[]},
+     {load_module,emqx_vm,brutal_purge,soft_purge,[]},
      {load_module,emqx_sys_mon,brutal_purge,soft_purge,[]},
      {load_module,emqx_sys_mon,brutal_purge,soft_purge,[]},
      {load_module,emqx_http_lib,brutal_purge,soft_purge,[]},
      {load_module,emqx_http_lib,brutal_purge,soft_purge,[]},
      {load_module,emqx_connection,brutal_purge,soft_purge,[]},
      {load_module,emqx_connection,brutal_purge,soft_purge,[]},
      {load_module,emqx_channel,brutal_purge,soft_purge,[]},
      {load_module,emqx_channel,brutal_purge,soft_purge,[]},
-     {load_module,emqx_metrics,brutal_purge,soft_purge,[]},
      {load_module,emqx_session,brutal_purge,soft_purge,[]},
      {load_module,emqx_session,brutal_purge,soft_purge,[]},
      {load_module,emqx_alarm_handler,brutal_purge,soft_purge,[]},
      {load_module,emqx_alarm_handler,brutal_purge,soft_purge,[]},
      {load_module,emqx_misc,brutal_purge,soft_purge,[]},
      {load_module,emqx_misc,brutal_purge,soft_purge,[]},
@@ -170,7 +190,10 @@
      {load_module,emqx_app,brutal_purge,soft_purge,[]},
      {load_module,emqx_app,brutal_purge,soft_purge,[]},
      {load_module,emqx_limiter,brutal_purge,soft_purge,[]}]},
      {load_module,emqx_limiter,brutal_purge,soft_purge,[]}]},
    {"4.3.2",
    {"4.3.2",
-    [{load_module,emqx_vm,brutal_purge,soft_purge,[]},
+    [{load_module,emqx_metrics,brutal_purge,soft_purge,[]},
+     {apply,{emqx_metrics,assign_acl_stats_from_ets_to_counter,[]}},
+     {load_module,emqx_access_control,brutal_purge,soft_purge,[]},
+     {load_module,emqx_vm,brutal_purge,soft_purge,[]},
      {load_module,emqx_sys_mon,brutal_purge,soft_purge,[]},
      {load_module,emqx_sys_mon,brutal_purge,soft_purge,[]},
      {load_module,emqx_alarm_handler,brutal_purge,soft_purge,[]},
      {load_module,emqx_alarm_handler,brutal_purge,soft_purge,[]},
      {load_module,emqx_misc,brutal_purge,soft_purge,[]},
      {load_module,emqx_misc,brutal_purge,soft_purge,[]},
@@ -179,7 +202,6 @@
      {load_module,emqx_ws_connection,brutal_purge,soft_purge,[]},
      {load_module,emqx_ws_connection,brutal_purge,soft_purge,[]},
      {load_module,emqx_http_lib,brutal_purge,soft_purge,[]},
      {load_module,emqx_http_lib,brutal_purge,soft_purge,[]},
      {load_module,emqx_channel,brutal_purge,soft_purge,[]},
      {load_module,emqx_channel,brutal_purge,soft_purge,[]},
-     {load_module,emqx_metrics,brutal_purge,soft_purge,[]},
      {load_module,emqx_session,brutal_purge,soft_purge,[]},
      {load_module,emqx_session,brutal_purge,soft_purge,[]},
      {load_module,emqx_connection,brutal_purge,soft_purge,[]},
      {load_module,emqx_connection,brutal_purge,soft_purge,[]},
      {load_module,emqx_cm,brutal_purge,soft_purge,[]},
      {load_module,emqx_cm,brutal_purge,soft_purge,[]},
@@ -193,7 +215,10 @@
      {load_module,emqx_app,brutal_purge,soft_purge,[]},
      {load_module,emqx_app,brutal_purge,soft_purge,[]},
      {load_module,emqx_limiter,brutal_purge,soft_purge,[]}]},
      {load_module,emqx_limiter,brutal_purge,soft_purge,[]}]},
    {"4.3.1",
    {"4.3.1",
-    [{load_module,emqx_vm,brutal_purge,soft_purge,[]},
+    [{load_module,emqx_metrics,brutal_purge,soft_purge,[]},
+     {apply,{emqx_metrics,assign_acl_stats_from_ets_to_counter,[]}},
+     {load_module,emqx_access_control,brutal_purge,soft_purge,[]},
+     {load_module,emqx_vm,brutal_purge,soft_purge,[]},
      {load_module,emqx_sys_mon,brutal_purge,soft_purge,[]},
      {load_module,emqx_sys_mon,brutal_purge,soft_purge,[]},
      {load_module,emqx_alarm_handler,brutal_purge,soft_purge,[]},
      {load_module,emqx_alarm_handler,brutal_purge,soft_purge,[]},
      {load_module,emqx_misc,brutal_purge,soft_purge,[]},
      {load_module,emqx_misc,brutal_purge,soft_purge,[]},
@@ -206,7 +231,6 @@
      {load_module,emqx_congestion,brutal_purge,soft_purge,[]},
      {load_module,emqx_congestion,brutal_purge,soft_purge,[]},
      {load_module,emqx_node_dump,brutal_purge,soft_purge,[]},
      {load_module,emqx_node_dump,brutal_purge,soft_purge,[]},
      {load_module,emqx_channel,brutal_purge,soft_purge,[]},
      {load_module,emqx_channel,brutal_purge,soft_purge,[]},
-     {load_module,emqx_metrics,brutal_purge,soft_purge,[]},
      {load_module,emqx_session,brutal_purge,soft_purge,[]},
      {load_module,emqx_session,brutal_purge,soft_purge,[]},
      {load_module,emqx_plugins,brutal_purge,soft_purge,[]},
      {load_module,emqx_plugins,brutal_purge,soft_purge,[]},
      {load_module,emqx_logger_textfmt,brutal_purge,soft_purge,[]},
      {load_module,emqx_logger_textfmt,brutal_purge,soft_purge,[]},
@@ -220,7 +244,11 @@
      {load_module,emqx_app,brutal_purge,soft_purge,[]},
      {load_module,emqx_app,brutal_purge,soft_purge,[]},
      {load_module,emqx_limiter,brutal_purge,soft_purge,[]}]},
      {load_module,emqx_limiter,brutal_purge,soft_purge,[]}]},
    {"4.3.0",
    {"4.3.0",
-    [{load_module,emqx_vm,brutal_purge,soft_purge,[]},
+    [{load_module,emqx_metrics,brutal_purge,soft_purge,[]},
+     {apply,{emqx_metrics,assign_acl_stats_from_ets_to_counter,[]}},
+     {apply,{emqx_metrics,upgrade_retained_delayed_counter_type,[]}},
+     {load_module,emqx_access_control,brutal_purge,soft_purge,[]},
+     {load_module,emqx_vm,brutal_purge,soft_purge,[]},
      {load_module,emqx_sys_mon,brutal_purge,soft_purge,[]},
      {load_module,emqx_sys_mon,brutal_purge,soft_purge,[]},
      {load_module,emqx_pqueue,brutal_purge,soft_purge,[]},
      {load_module,emqx_pqueue,brutal_purge,soft_purge,[]},
      {load_module,emqx_mqueue,brutal_purge,soft_purge,[]},
      {load_module,emqx_mqueue,brutal_purge,soft_purge,[]},
@@ -240,8 +268,6 @@
      {load_module,emqx_session,brutal_purge,soft_purge,[]},
      {load_module,emqx_session,brutal_purge,soft_purge,[]},
      {load_module,emqx_plugins,brutal_purge,soft_purge,[]},
      {load_module,emqx_plugins,brutal_purge,soft_purge,[]},
      {load_module,emqx_logger_textfmt,brutal_purge,soft_purge,[]},
      {load_module,emqx_logger_textfmt,brutal_purge,soft_purge,[]},
-     {load_module,emqx_metrics,brutal_purge,soft_purge,[]},
-     {apply,{emqx_metrics,upgrade_retained_delayed_counter_type,[]}},
      {load_module,emqx_http_lib,brutal_purge,soft_purge,[]},
      {load_module,emqx_http_lib,brutal_purge,soft_purge,[]},
      {load_module,emqx_access_rule,brutal_purge,soft_purge,[]},
      {load_module,emqx_access_rule,brutal_purge,soft_purge,[]},
      {load_module,emqx_ctl,brutal_purge,soft_purge,[]},
      {load_module,emqx_ctl,brutal_purge,soft_purge,[]},
@@ -252,6 +278,7 @@
    {<<".*">>,[]}],
    {<<".*">>,[]}],
   [{"4.3.12",
   [{"4.3.12",
     [ {load_module,emqx_channel,brutal_purge,soft_purge,[]}
     [ {load_module,emqx_channel,brutal_purge,soft_purge,[]}
+    , {load_module,emqx_access_control,brutal_purge,soft_purge,[]}
     , {load_module,emqx_metrics,brutal_purge,soft_purge,[]}
     , {load_module,emqx_metrics,brutal_purge,soft_purge,[]}
     , {load_module,emqx_session,brutal_purge,soft_purge,[]}
     , {load_module,emqx_session,brutal_purge,soft_purge,[]}
     , {load_module,emqx_alarm,brutal_purge,soft_purge,[]}
     , {load_module,emqx_alarm,brutal_purge,soft_purge,[]}
@@ -261,6 +288,7 @@
     [{load_module,emqx_connection,brutal_purge,soft_purge,[]},
     [{load_module,emqx_connection,brutal_purge,soft_purge,[]},
      {load_module,emqx_channel,brutal_purge,soft_purge,[]},
      {load_module,emqx_channel,brutal_purge,soft_purge,[]},
      {load_module,emqx_metrics,brutal_purge,soft_purge,[]},
      {load_module,emqx_metrics,brutal_purge,soft_purge,[]},
+     {load_module,emqx_access_control,brutal_purge,soft_purge,[]},
      {load_module,emqx_session,brutal_purge,soft_purge,[]},
      {load_module,emqx_session,brutal_purge,soft_purge,[]},
      {load_module,emqx_vm,brutal_purge,soft_purge,[]},
      {load_module,emqx_vm,brutal_purge,soft_purge,[]},
      {load_module,emqx_sys_mon,brutal_purge,soft_purge,[]},
      {load_module,emqx_sys_mon,brutal_purge,soft_purge,[]},
@@ -271,6 +299,7 @@
    {"4.3.10",
    {"4.3.10",
     [{load_module,emqx_channel,brutal_purge,soft_purge,[]},
     [{load_module,emqx_channel,brutal_purge,soft_purge,[]},
      {load_module,emqx_metrics,brutal_purge,soft_purge,[]},
      {load_module,emqx_metrics,brutal_purge,soft_purge,[]},
+     {load_module,emqx_access_control,brutal_purge,soft_purge,[]},
      {load_module,emqx_session,brutal_purge,soft_purge,[]},
      {load_module,emqx_session,brutal_purge,soft_purge,[]},
      {load_module,emqx_vm,brutal_purge,soft_purge,[]},
      {load_module,emqx_vm,brutal_purge,soft_purge,[]},
      {load_module,emqx_sys_mon,brutal_purge,soft_purge,[]},
      {load_module,emqx_sys_mon,brutal_purge,soft_purge,[]},
@@ -287,6 +316,7 @@
      {load_module,emqx_connection,brutal_purge,soft_purge,[]},
      {load_module,emqx_connection,brutal_purge,soft_purge,[]},
      {load_module,emqx_channel,brutal_purge,soft_purge,[]},
      {load_module,emqx_channel,brutal_purge,soft_purge,[]},
      {load_module,emqx_metrics,brutal_purge,soft_purge,[]},
      {load_module,emqx_metrics,brutal_purge,soft_purge,[]},
+     {load_module,emqx_access_control,brutal_purge,soft_purge,[]},
      {load_module,emqx_session,brutal_purge,soft_purge,[]},
      {load_module,emqx_session,brutal_purge,soft_purge,[]},
      {load_module,emqx_cm,brutal_purge,soft_purge,[]},
      {load_module,emqx_cm,brutal_purge,soft_purge,[]},
      {load_module,emqx_ws_connection,brutal_purge,soft_purge,[]},
      {load_module,emqx_ws_connection,brutal_purge,soft_purge,[]},
@@ -304,6 +334,7 @@
      {load_module,emqx_connection,brutal_purge,soft_purge,[]},
      {load_module,emqx_connection,brutal_purge,soft_purge,[]},
      {load_module,emqx_channel,brutal_purge,soft_purge,[]},
      {load_module,emqx_channel,brutal_purge,soft_purge,[]},
      {load_module,emqx_metrics,brutal_purge,soft_purge,[]},
      {load_module,emqx_metrics,brutal_purge,soft_purge,[]},
+     {load_module,emqx_access_control,brutal_purge,soft_purge,[]},
      {load_module,emqx_session,brutal_purge,soft_purge,[]},
      {load_module,emqx_session,brutal_purge,soft_purge,[]},
      {load_module,emqx_cm,brutal_purge,soft_purge,[]},
      {load_module,emqx_cm,brutal_purge,soft_purge,[]},
      {load_module,emqx_ws_connection,brutal_purge,soft_purge,[]},
      {load_module,emqx_ws_connection,brutal_purge,soft_purge,[]},
@@ -321,6 +352,7 @@
      {load_module,emqx_connection,brutal_purge,soft_purge,[]},
      {load_module,emqx_connection,brutal_purge,soft_purge,[]},
      {load_module,emqx_channel,brutal_purge,soft_purge,[]},
      {load_module,emqx_channel,brutal_purge,soft_purge,[]},
      {load_module,emqx_metrics,brutal_purge,soft_purge,[]},
      {load_module,emqx_metrics,brutal_purge,soft_purge,[]},
+     {load_module,emqx_access_control,brutal_purge,soft_purge,[]},
      {load_module,emqx_session,brutal_purge,soft_purge,[]},
      {load_module,emqx_session,brutal_purge,soft_purge,[]},
      {load_module,emqx_cm,brutal_purge,soft_purge,[]},
      {load_module,emqx_cm,brutal_purge,soft_purge,[]},
      {load_module,emqx_ws_connection,brutal_purge,soft_purge,[]},
      {load_module,emqx_ws_connection,brutal_purge,soft_purge,[]},
@@ -340,6 +372,7 @@
      {load_module,emqx_connection,brutal_purge,soft_purge,[]},
      {load_module,emqx_connection,brutal_purge,soft_purge,[]},
      {load_module,emqx_channel,brutal_purge,soft_purge,[]},
      {load_module,emqx_channel,brutal_purge,soft_purge,[]},
      {load_module,emqx_metrics,brutal_purge,soft_purge,[]},
      {load_module,emqx_metrics,brutal_purge,soft_purge,[]},
+     {load_module,emqx_access_control,brutal_purge,soft_purge,[]},
      {load_module,emqx_session,brutal_purge,soft_purge,[]},
      {load_module,emqx_session,brutal_purge,soft_purge,[]},
      {load_module,emqx_cm,brutal_purge,soft_purge,[]},
      {load_module,emqx_cm,brutal_purge,soft_purge,[]},
      {load_module,emqx_ws_connection,brutal_purge,soft_purge,[]},
      {load_module,emqx_ws_connection,brutal_purge,soft_purge,[]},
@@ -360,6 +393,7 @@
      {load_module,emqx_connection,brutal_purge,soft_purge,[]},
      {load_module,emqx_connection,brutal_purge,soft_purge,[]},
      {load_module,emqx_channel,brutal_purge,soft_purge,[]},
      {load_module,emqx_channel,brutal_purge,soft_purge,[]},
      {load_module,emqx_metrics,brutal_purge,soft_purge,[]},
      {load_module,emqx_metrics,brutal_purge,soft_purge,[]},
+     {load_module,emqx_access_control,brutal_purge,soft_purge,[]},
      {load_module,emqx_session,brutal_purge,soft_purge,[]},
      {load_module,emqx_session,brutal_purge,soft_purge,[]},
      {load_module,emqx_ws_connection,brutal_purge,soft_purge,[]},
      {load_module,emqx_ws_connection,brutal_purge,soft_purge,[]},
      {load_module,emqx_pqueue,brutal_purge,soft_purge,[]},
      {load_module,emqx_pqueue,brutal_purge,soft_purge,[]},
@@ -381,6 +415,7 @@
      {load_module,emqx_connection,brutal_purge,soft_purge,[]},
      {load_module,emqx_connection,brutal_purge,soft_purge,[]},
      {load_module,emqx_channel,brutal_purge,soft_purge,[]},
      {load_module,emqx_channel,brutal_purge,soft_purge,[]},
      {load_module,emqx_metrics,brutal_purge,soft_purge,[]},
      {load_module,emqx_metrics,brutal_purge,soft_purge,[]},
+     {load_module,emqx_access_control,brutal_purge,soft_purge,[]},
      {load_module,emqx_session,brutal_purge,soft_purge,[]},
      {load_module,emqx_session,brutal_purge,soft_purge,[]},
      {load_module,emqx_ws_connection,brutal_purge,soft_purge,[]},
      {load_module,emqx_ws_connection,brutal_purge,soft_purge,[]},
      {load_module,emqx_pqueue,brutal_purge,soft_purge,[]},
      {load_module,emqx_pqueue,brutal_purge,soft_purge,[]},
@@ -403,6 +438,7 @@
      {load_module,emqx_connection,brutal_purge,soft_purge,[]},
      {load_module,emqx_connection,brutal_purge,soft_purge,[]},
      {load_module,emqx_channel,brutal_purge,soft_purge,[]},
      {load_module,emqx_channel,brutal_purge,soft_purge,[]},
      {load_module,emqx_metrics,brutal_purge,soft_purge,[]},
      {load_module,emqx_metrics,brutal_purge,soft_purge,[]},
+     {load_module,emqx_access_control,brutal_purge,soft_purge,[]},
      {load_module,emqx_session,brutal_purge,soft_purge,[]},
      {load_module,emqx_session,brutal_purge,soft_purge,[]},
      {load_module,emqx_pqueue,brutal_purge,soft_purge,[]},
      {load_module,emqx_pqueue,brutal_purge,soft_purge,[]},
      {load_module,emqx_mqueue,brutal_purge,soft_purge,[]},
      {load_module,emqx_mqueue,brutal_purge,soft_purge,[]},
@@ -432,6 +468,7 @@
      {load_module,emqx_http_lib,brutal_purge,soft_purge,[]},
      {load_module,emqx_http_lib,brutal_purge,soft_purge,[]},
      {load_module,emqx_channel,brutal_purge,soft_purge,[]},
      {load_module,emqx_channel,brutal_purge,soft_purge,[]},
      {load_module,emqx_metrics,brutal_purge,soft_purge,[]},
      {load_module,emqx_metrics,brutal_purge,soft_purge,[]},
+     {load_module,emqx_access_control,brutal_purge,soft_purge,[]},
      {load_module,emqx_session,brutal_purge,soft_purge,[]},
      {load_module,emqx_session,brutal_purge,soft_purge,[]},
      {load_module,emqx_connection,brutal_purge,soft_purge,[]},
      {load_module,emqx_connection,brutal_purge,soft_purge,[]},
      {load_module,emqx_cm,brutal_purge,soft_purge,[]},
      {load_module,emqx_cm,brutal_purge,soft_purge,[]},
@@ -459,6 +496,7 @@
      {load_module,emqx_node_dump,brutal_purge,soft_purge,[]},
      {load_module,emqx_node_dump,brutal_purge,soft_purge,[]},
      {load_module,emqx_channel,brutal_purge,soft_purge,[]},
      {load_module,emqx_channel,brutal_purge,soft_purge,[]},
      {load_module,emqx_metrics,brutal_purge,soft_purge,[]},
      {load_module,emqx_metrics,brutal_purge,soft_purge,[]},
+     {load_module,emqx_access_control,brutal_purge,soft_purge,[]},
      {load_module,emqx_session,brutal_purge,soft_purge,[]},
      {load_module,emqx_session,brutal_purge,soft_purge,[]},
      {load_module,emqx_plugins,brutal_purge,soft_purge,[]},
      {load_module,emqx_plugins,brutal_purge,soft_purge,[]},
      {load_module,emqx_logger_textfmt,brutal_purge,soft_purge,[]},
      {load_module,emqx_logger_textfmt,brutal_purge,soft_purge,[]},
@@ -489,6 +527,7 @@
      {load_module,emqx_plugins,brutal_purge,soft_purge,[]},
      {load_module,emqx_plugins,brutal_purge,soft_purge,[]},
      {load_module,emqx_logger_textfmt,brutal_purge,soft_purge,[]},
      {load_module,emqx_logger_textfmt,brutal_purge,soft_purge,[]},
      {load_module,emqx_metrics,brutal_purge,soft_purge,[]},
      {load_module,emqx_metrics,brutal_purge,soft_purge,[]},
+     {load_module,emqx_access_control,brutal_purge,soft_purge,[]},
      {load_module,emqx_http_lib,brutal_purge,soft_purge,[]},
      {load_module,emqx_http_lib,brutal_purge,soft_purge,[]},
      {load_module,emqx_access_rule,brutal_purge,soft_purge,[]},
      {load_module,emqx_access_rule,brutal_purge,soft_purge,[]},
      {load_module,emqx_ctl,brutal_purge,soft_purge,[]},
      {load_module,emqx_ctl,brutal_purge,soft_purge,[]},

+ 14 - 3
src/emqx_access_control.erl

@@ -45,10 +45,11 @@ authenticate(ClientInfo = #{zone := Zone}) ->
 -spec(check_acl(emqx_types:clientinfo(), emqx_types:pubsub(), emqx_types:topic())
 -spec(check_acl(emqx_types:clientinfo(), emqx_types:pubsub(), emqx_types:topic())
       -> allow | deny).
       -> allow | deny).
 check_acl(ClientInfo, PubSub, Topic) ->
 check_acl(ClientInfo, PubSub, Topic) ->
-    case emqx_acl_cache:is_enabled() of
+    Result = case emqx_acl_cache:is_enabled() of
         true  -> check_acl_cache(ClientInfo, PubSub, Topic);
         true  -> check_acl_cache(ClientInfo, PubSub, Topic);
         false -> do_check_acl(ClientInfo, PubSub, Topic)
         false -> do_check_acl(ClientInfo, PubSub, Topic)
-    end.
+    end,
+    inc_acl_metrics(Result), Result.
 
 
 check_acl_cache(ClientInfo, PubSub, Topic) ->
 check_acl_cache(ClientInfo, PubSub, Topic) ->
     case emqx_acl_cache:get_acl_cache(PubSub, Topic) of
     case emqx_acl_cache:get_acl_cache(PubSub, Topic) of
@@ -56,7 +57,9 @@ check_acl_cache(ClientInfo, PubSub, Topic) ->
             AclResult = do_check_acl(ClientInfo, PubSub, Topic),
             AclResult = do_check_acl(ClientInfo, PubSub, Topic),
             emqx_acl_cache:put_acl_cache(PubSub, Topic, AclResult),
             emqx_acl_cache:put_acl_cache(PubSub, Topic, AclResult),
             AclResult;
             AclResult;
-        AclResult -> AclResult
+        AclResult ->
+            inc_acl_metrics(cache_hit),
+            AclResult
     end.
     end.
 
 
 do_check_acl(ClientInfo = #{zone := Zone}, PubSub, Topic) ->
 do_check_acl(ClientInfo = #{zone := Zone}, PubSub, Topic) ->
@@ -76,6 +79,14 @@ default_auth_result(Zone) ->
 run_hooks(Name, Args, Acc) ->
 run_hooks(Name, Args, Acc) ->
     ok = emqx_metrics:inc(Name), emqx_hooks:run_fold(Name, Args, Acc).
     ok = emqx_metrics:inc(Name), emqx_hooks:run_fold(Name, Args, Acc).
 
 
+-compile({inline, [inc_acl_metrics/1]}).
+inc_acl_metrics(allow) ->
+    emqx_metrics:inc('client.acl.allow');
+inc_acl_metrics(deny) ->
+    emqx_metrics:inc('client.acl.deny');
+inc_acl_metrics(cache_hit) ->
+    emqx_metrics:inc('client.acl.cache_hit').
+
 -compile({inline, [return_auth_result/1]}).
 -compile({inline, [return_auth_result/1]}).
 return_auth_result(Result = #{auth_result := success}) ->
 return_auth_result(Result = #{auth_result := success}) ->
     {ok, Result};
     {ok, Result};

+ 36 - 3
src/emqx_metrics.erl

@@ -65,8 +65,11 @@
         , code_change/3
         , code_change/3
         ]).
         ]).
 
 
-%% BACKW: v4.3.0
--export([ upgrade_retained_delayed_counter_type/0
+%% BACKW
+-export([%% v4.3.0
+         upgrade_retained_delayed_counter_type/0,
+         %% e4.4.0, e4.3.0-e4.3.6, v4.3.0-v4.3.11
+         assign_acl_stats_from_ets_to_counter/0
         ]).
         ]).
 
 
 -export_type([metric_idx/0]).
 -export_type([metric_idx/0]).
@@ -186,6 +189,12 @@
          {counter, 'session.discarded'},
          {counter, 'session.discarded'},
          {counter, 'session.terminated'}
          {counter, 'session.terminated'}
         ]).
         ]).
+%% Statistic metrics for ACL checking
+-define(STASTS_ACL_METRICS,
+        [ {counter, 'client.acl.allow'},
+          {counter, 'client.acl.deny'},
+          {counter, 'client.acl.cache_hit'}
+        ]).
 
 
 -record(state, {next_idx = 1}).
 -record(state, {next_idx = 1}).
 
 
@@ -204,6 +213,21 @@ upgrade_retained_delayed_counter_type() ->
     Ks = ['messages.retained', 'messages.delayed'],
     Ks = ['messages.retained', 'messages.delayed'],
     gen_server:call(?SERVER, {set_type_to_counter, Ks}, infinity).
     gen_server:call(?SERVER, {set_type_to_counter, Ks}, infinity).
 
 
+%% BACKW: %% e4.4.0, e4.3.0-e4.3.6, v4.3.0-v4.3.11
+assign_acl_stats_from_ets_to_counter() ->
+    CRef = persistent_term:get(?MODULE),
+    Names = ['client.acl.allow', 'client.acl.deny', 'client.acl.cache_hit'],
+    lists:foreach(fun(Name) ->
+        Val = case emqx_metrics:val(Name) of
+            undefined -> 0;
+            Val0 -> Val0
+        end,
+        Idx = reserved_idx(Name),
+        Metric = #metric{name = Name, type = counter, idx = Idx},
+        ok = gen_server:call(?SERVER, {set, Metric}),
+        ok = counters:put(CRef, Idx, Val)
+    end, Names).
+
 %%--------------------------------------------------------------------
 %%--------------------------------------------------------------------
 %% Metrics API
 %% Metrics API
 %%--------------------------------------------------------------------
 %%--------------------------------------------------------------------
@@ -433,7 +457,8 @@ init([]) ->
                             ?MESSAGE_METRICS,
                             ?MESSAGE_METRICS,
                             ?DELIVERY_METRICS,
                             ?DELIVERY_METRICS,
                             ?CLIENT_METRICS,
                             ?CLIENT_METRICS,
-                            ?SESSION_METRICS
+                            ?SESSION_METRICS,
+                            ?STASTS_ACL_METRICS
                            ]),
                            ]),
     % Store reserved indices
     % Store reserved indices
     ok = lists:foreach(fun({Type, Name}) ->
     ok = lists:foreach(fun({Type, Name}) ->
@@ -466,6 +491,10 @@ handle_call({set_type_to_counter, Keys}, _From, State) ->
       end, Keys),
       end, Keys),
     {reply, ok, State};
     {reply, ok, State};
 
 
+handle_call({set, Metric}, _From, State) ->
+    true = ets:insert(?TAB, Metric),
+    {reply, ok, State};
+
 handle_call(Req, _From, State) ->
 handle_call(Req, _From, State) ->
     ?LOG(error, "Unexpected call: ~p", [Req]),
     ?LOG(error, "Unexpected call: ~p", [Req]),
     {reply, ignored, State}.
     {reply, ignored, State}.
@@ -574,6 +603,10 @@ reserved_idx('session.resumed')              -> 221;
 reserved_idx('session.takeovered')           -> 222;
 reserved_idx('session.takeovered')           -> 222;
 reserved_idx('session.discarded')            -> 223;
 reserved_idx('session.discarded')            -> 223;
 reserved_idx('session.terminated')           -> 224;
 reserved_idx('session.terminated')           -> 224;
+%% Stats metrics
+reserved_idx('client.acl.allow')             -> 300;
+reserved_idx('client.acl.deny')              -> 301;
+reserved_idx('client.acl.cache_hit')         -> 302;
 
 
 reserved_idx(_)                              -> undefined.
 reserved_idx(_)                              -> undefined.