From 67267acb700a6d552e30f6c1cc226da00a7ff6b4 Mon Sep 17 00:00:00 2001 From: William Yang Date: Mon, 4 Oct 2021 14:36:30 +0200 Subject: [PATCH] feat(olp): management API --- apps/emqx/src/emqx_olp.erl | 21 +++++++++++++++++++++ apps/emqx_management/src/emqx_mgmt_cli.erl | 22 ++++++++++++++++++++++ 2 files changed, 43 insertions(+) diff --git a/apps/emqx/src/emqx_olp.erl b/apps/emqx/src/emqx_olp.erl index f38218765..758c2d348 100644 --- a/apps/emqx/src/emqx_olp.erl +++ b/apps/emqx/src/emqx_olp.erl @@ -14,12 +14,20 @@ %% limitations under the License. %%-------------------------------------------------------------------- -module(emqx_olp). + -export([ is_overloaded/0 , backoff/1 , backoff_gc/1 , backoff_hibernation/1 ]). + +%% exports for O&M +-export([ status/0 + , on/0 + , off/0 + ]). + -spec is_overloaded() -> boolean(). is_overloaded() -> load_ctl:is_overloaded(). @@ -45,6 +53,19 @@ backoff_hibernation(Zone) -> load_ctl:is_overloaded() andalso emqx_config:get_zone_conf(Zone, [overload_protection, enable], false) andalso emqx_config:get_zone_conf(Zone, [overload_protection, backoff_hibernation], false). + +-spec status() -> any(). +status() -> + is_overloaded(). + +-spec off() -> ok | {error, timeout}. +off() -> + load_ctl:stop_runq_flagman(5000). + +-spec on() -> any(). +on() -> + load_ctl:restart_runq_flagman(). + %%%_* Emacs ==================================================================== %%% Local Variables: %%% allout-layout: t diff --git a/apps/emqx_management/src/emqx_mgmt_cli.erl b/apps/emqx_management/src/emqx_mgmt_cli.erl index abe64d886..bc6da3caf 100644 --- a/apps/emqx_management/src/emqx_mgmt_cli.erl +++ b/apps/emqx_management/src/emqx_mgmt_cli.erl @@ -38,6 +38,7 @@ , trace/1 , log/1 , authz/1 + , olp/1 ]). -define(PROC_INFOKEYS, [status, @@ -495,6 +496,27 @@ authz(_) -> {"authz cache-clean ", "Clears authorization cache for given client"} ]). + +%%-------------------------------------------------------------------- +%% @doc OLP (Overload Protection related) +olp(["status"]) -> + S = case emqx_olp:is_overloaded() of + true -> "overloaded"; + false -> "not overloaded" + end, + emqx_ctl:print("~p is ~s ~n", [node(), S]); +olp(["off"]) -> + Res = emqx_olp:off(), + emqx_ctl:print("Turn off overload protetion ~p : ~p ~n", [node(), Res]); +olp(["on"]) -> + Res = emqx_olp:on(), + emqx_ctl:print("Turn on overload protection ~p : ~p ~n", [node(), Res]); +olp(_) -> + emqx_ctl:usage([{"olp status", "Return OLP status if system is overloaded"}, + {"olp on", "Turn on overload protection"}, + {"olp off", "Turn off overload protection"} + ]). + %%-------------------------------------------------------------------- %% Dump ETS %%--------------------------------------------------------------------