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

Add ensure/2 funcs to avoid needless logs (#3483)

JianBo He 5 лет назад
Родитель
Сommit
ea2a424ce2
4 измененных файлов с 37 добавлено и 4 удалено
  1. 13 0
      src/emqx_metrics.erl
  2. 1 1
      src/emqx_reason_codes.erl
  3. 5 3
      src/emqx_types.erl
  4. 18 0
      test/emqx_metrics_SUITE.erl

+ 13 - 0
src/emqx_metrics.erl

@@ -30,6 +30,8 @@
 
 
 -export([ new/1
 -export([ new/1
         , new/2
         , new/2
+        , ensure/1
+        , ensure/2
         , all/0
         , all/0
         ]).
         ]).
 
 
@@ -204,6 +206,17 @@ new(gauge, Name) ->
 new(counter, Name) ->
 new(counter, Name) ->
     create(counter, Name).
     create(counter, Name).
 
 
+-spec(ensure(metric_name()) -> ok).
+ensure(Name) ->
+    ensure(counter, Name).
+
+-spec(ensure(gauge|counter, metric_name()) -> ok).
+ensure(Type, Name) when Type =:= gauge; Type =:= counter ->
+    case ets:lookup(?TAB, Name) of
+        [] -> create(Type, Name);
+        _ -> ok
+    end.
+
 %% @private
 %% @private
 create(Type, Name) ->
 create(Type, Name) ->
     case gen_server:call(?SERVER, {create, Type, Name}) of
     case gen_server:call(?SERVER, {create, Type, Name}) of

+ 1 - 1
src/emqx_reason_codes.erl

@@ -50,7 +50,7 @@ name(16#11) -> no_subscription_existed;
 name(16#18) -> continue_authentication;
 name(16#18) -> continue_authentication;
 name(16#19) -> re_authenticate;
 name(16#19) -> re_authenticate;
 name(16#80) -> unspecified_error;
 name(16#80) -> unspecified_error;
-name(16#81) -> malformed_Packet;
+name(16#81) -> malformed_packet;
 name(16#82) -> protocol_error;
 name(16#82) -> protocol_error;
 name(16#83) -> implementation_specific_error;
 name(16#83) -> implementation_specific_error;
 name(16#84) -> unsupported_protocol_version;
 name(16#84) -> unsupported_protocol_version;

+ 5 - 3
src/emqx_types.erl

@@ -91,7 +91,9 @@
 
 
 -type(ver() :: ?MQTT_PROTO_V3
 -type(ver() :: ?MQTT_PROTO_V3
              | ?MQTT_PROTO_V4
              | ?MQTT_PROTO_V4
-             | ?MQTT_PROTO_V5).
+             | ?MQTT_PROTO_V5
+             | non_neg_integer()).
+
 -type(qos() :: ?QOS_0 | ?QOS_1 | ?QOS_2).
 -type(qos() :: ?QOS_0 | ?QOS_1 | ?QOS_2).
 -type(qos_name() :: qos0 | at_most_once |
 -type(qos_name() :: qos0 | at_most_once |
                     qos1 | at_least_once |
                     qos1 | at_least_once |
@@ -107,7 +109,7 @@
 -type(conninfo() :: #{socktype := socktype(),
 -type(conninfo() :: #{socktype := socktype(),
                       sockname := peername(),
                       sockname := peername(),
                       peername := peername(),
                       peername := peername(),
-                      peercert := esockd_peercert:peercert(),
+                      peercert := nossl | undefined | esockd_peercert:peercert(),
                       conn_mod := module(),
                       conn_mod := module(),
                       proto_name := binary(),
                       proto_name := binary(),
                       proto_ver := ver(),
                       proto_ver := ver(),
@@ -116,7 +118,7 @@
                       username := username(),
                       username := username(),
                       conn_props := properties(),
                       conn_props := properties(),
                       connected := boolean(),
                       connected := boolean(),
-                      connected_at := erlang:timestamp(),
+                      connected_at := non_neg_integer(),
                       keepalive := 0..16#FFFF,
                       keepalive := 0..16#FFFF,
                       receive_maximum := non_neg_integer(),
                       receive_maximum := non_neg_integer(),
                       expiry_interval := non_neg_integer(),
                       expiry_interval := non_neg_integer(),

+ 18 - 0
test/emqx_metrics_SUITE.erl

@@ -42,6 +42,24 @@ t_new(_) ->
           1 = emqx_metrics:val('metrics.test.total')
           1 = emqx_metrics:val('metrics.test.total')
       end).
       end).
 
 
+t_ensure(_) ->
+    with_metrics_server(
+      fun() ->
+          ok = emqx_metrics:ensure('metrics.test'),
+          ok = emqx_metrics:ensure('metrics.test'),
+          0 = emqx_metrics:val('metrics.test'),
+          ok = emqx_metrics:inc('metrics.test'),
+          1 = emqx_metrics:val('metrics.test'),
+          ok = emqx_metrics:ensure(counter, 'metrics.test.cnt'),
+          0 = emqx_metrics:val('metrics.test.cnt'),
+          ok = emqx_metrics:inc('metrics.test.cnt'),
+          1 = emqx_metrics:val('metrics.test.cnt'),
+          ok = emqx_metrics:ensure(gauge, 'metrics.test.total'),
+          0 = emqx_metrics:val('metrics.test.total'),
+          ok = emqx_metrics:inc('metrics.test.total'),
+          1 = emqx_metrics:val('metrics.test.total')
+      end).
+
 t_all(_) ->
 t_all(_) ->
     with_metrics_server(
     with_metrics_server(
       fun() ->
       fun() ->