feat(hook): new emqx hook 'delivery.dropped'
This commit is contained in:
parent
449854fa11
commit
9434c0fa6c
|
@ -750,9 +750,10 @@ handle_deliver(Delivers, Channel = #channel{session = Session,
|
||||||
|
|
||||||
ignore_local(Delivers, Subscriber, Session) ->
|
ignore_local(Delivers, Subscriber, Session) ->
|
||||||
Subs = emqx_session:info(subscriptions, Session),
|
Subs = emqx_session:info(subscriptions, Session),
|
||||||
lists:dropwhile(fun({deliver, Topic, #message{from = Publisher}}) ->
|
lists:dropwhile(fun({deliver, Topic, #message{from = Publisher} = Msg}) ->
|
||||||
case maps:find(Topic, Subs) of
|
case maps:find(Topic, Subs) of
|
||||||
{ok, #{nl := 1}} when Subscriber =:= Publisher ->
|
{ok, #{nl := 1}} when Subscriber =:= Publisher ->
|
||||||
|
ok = emqx_hooks:run('delivery.dropped', [Msg, #{node => node()}, no_local]),
|
||||||
ok = emqx_metrics:inc('delivery.dropped'),
|
ok = emqx_metrics:inc('delivery.dropped'),
|
||||||
ok = emqx_metrics:inc('delivery.dropped.no_local'),
|
ok = emqx_metrics:inc('delivery.dropped.no_local'),
|
||||||
true;
|
true;
|
||||||
|
|
|
@ -146,7 +146,7 @@
|
||||||
%% PubSub Metrics
|
%% PubSub Metrics
|
||||||
{counter, 'messages.publish'}, % Messages Publish
|
{counter, 'messages.publish'}, % Messages Publish
|
||||||
{counter, 'messages.dropped'}, % Messages dropped due to no subscribers
|
{counter, 'messages.dropped'}, % Messages dropped due to no subscribers
|
||||||
{counter, 'messages.dropped.expired'}, % QoS2 Messages expired
|
{counter, 'messages.dropped.await_pubrel_timeout'}, % QoS2 await PUBREL timeout
|
||||||
{counter, 'messages.dropped.no_subscribers'}, % Messages dropped
|
{counter, 'messages.dropped.no_subscribers'}, % Messages dropped
|
||||||
{counter, 'messages.forward'}, % Messages forward
|
{counter, 'messages.forward'}, % Messages forward
|
||||||
{counter, 'messages.retained'}, % Messages retained
|
{counter, 'messages.retained'}, % Messages retained
|
||||||
|
@ -542,7 +542,8 @@ reserved_idx('messages.qos2.received') -> 106;
|
||||||
reserved_idx('messages.qos2.sent') -> 107;
|
reserved_idx('messages.qos2.sent') -> 107;
|
||||||
reserved_idx('messages.publish') -> 108;
|
reserved_idx('messages.publish') -> 108;
|
||||||
reserved_idx('messages.dropped') -> 109;
|
reserved_idx('messages.dropped') -> 109;
|
||||||
reserved_idx('messages.dropped.expired') -> 110;
|
reserved_idx('messages.dropped.expired') -> 110; %% To be removed in 5.0
|
||||||
|
reserved_idx('messages.dropped.await_pubrel_timeout') -> 110;
|
||||||
reserved_idx('messages.dropped.no_subscribers') -> 111;
|
reserved_idx('messages.dropped.no_subscribers') -> 111;
|
||||||
reserved_idx('messages.forward') -> 112;
|
reserved_idx('messages.forward') -> 112;
|
||||||
reserved_idx('messages.retained') -> 113;
|
reserved_idx('messages.retained') -> 113;
|
||||||
|
|
|
@ -403,7 +403,9 @@ dequeue(Cnt, Msgs, Q) ->
|
||||||
{empty, _Q} -> dequeue(0, Msgs, Q);
|
{empty, _Q} -> dequeue(0, Msgs, Q);
|
||||||
{{value, Msg}, Q1} ->
|
{{value, Msg}, Q1} ->
|
||||||
case emqx_message:is_expired(Msg) of
|
case emqx_message:is_expired(Msg) of
|
||||||
true -> ok = inc_expired_cnt(delivery),
|
true ->
|
||||||
|
ok = emqx_hooks:run('delivery.dropped', [Msg, #{node => node()}, expired]),
|
||||||
|
ok = inc_delivery_expired_cnt(),
|
||||||
dequeue(Cnt, Msgs, Q1);
|
dequeue(Cnt, Msgs, Q1);
|
||||||
false -> dequeue(acc_cnt(Msg, Cnt), [Msg|Msgs], Q1)
|
false -> dequeue(acc_cnt(Msg, Cnt), [Msg|Msgs], Q1)
|
||||||
end
|
end
|
||||||
|
@ -565,7 +567,8 @@ retry_delivery([{PacketId, {Msg, Ts}}|More], Acc, Now, Session =
|
||||||
retry_delivery(PacketId, Msg, Now, Acc, Inflight) when is_record(Msg, message) ->
|
retry_delivery(PacketId, Msg, Now, Acc, Inflight) when is_record(Msg, message) ->
|
||||||
case emqx_message:is_expired(Msg) of
|
case emqx_message:is_expired(Msg) of
|
||||||
true ->
|
true ->
|
||||||
ok = inc_expired_cnt(delivery),
|
ok = emqx_hooks:run('delivery.dropped', [Msg, #{node => node()}, expired]),
|
||||||
|
ok = inc_delivery_expired_cnt(),
|
||||||
{Acc, emqx_inflight:delete(PacketId, Inflight)};
|
{Acc, emqx_inflight:delete(PacketId, Inflight)};
|
||||||
false ->
|
false ->
|
||||||
Msg1 = emqx_message:set_flag(dup, true, Msg),
|
Msg1 = emqx_message:set_flag(dup, true, Msg),
|
||||||
|
@ -593,7 +596,7 @@ expire_awaiting_rel(Now, Session = #session{awaiting_rel = AwaitingRel,
|
||||||
NotExpired = fun(_PacketId, Ts) -> age(Now, Ts) < Timeout end,
|
NotExpired = fun(_PacketId, Ts) -> age(Now, Ts) < Timeout end,
|
||||||
AwaitingRel1 = maps:filter(NotExpired, AwaitingRel),
|
AwaitingRel1 = maps:filter(NotExpired, AwaitingRel),
|
||||||
ExpiredCnt = maps:size(AwaitingRel) - maps:size(AwaitingRel1),
|
ExpiredCnt = maps:size(AwaitingRel) - maps:size(AwaitingRel1),
|
||||||
(ExpiredCnt > 0) andalso inc_expired_cnt(message, ExpiredCnt),
|
(ExpiredCnt > 0) andalso inc_await_pubrel_timeout(ExpiredCnt),
|
||||||
NSession = Session#session{awaiting_rel = AwaitingRel1},
|
NSession = Session#session{awaiting_rel = AwaitingRel1},
|
||||||
case maps:size(AwaitingRel1) of
|
case maps:size(AwaitingRel1) of
|
||||||
0 -> {ok, NSession};
|
0 -> {ok, NSession};
|
||||||
|
@ -644,18 +647,16 @@ run_hook(Name, Args) ->
|
||||||
%%--------------------------------------------------------------------
|
%%--------------------------------------------------------------------
|
||||||
%% Inc message/delivery expired counter
|
%% Inc message/delivery expired counter
|
||||||
%%--------------------------------------------------------------------
|
%%--------------------------------------------------------------------
|
||||||
|
inc_delivery_expired_cnt() ->
|
||||||
|
inc_delivery_expired_cnt(1).
|
||||||
|
|
||||||
-compile({inline, [inc_expired_cnt/1, inc_expired_cnt/2]}).
|
inc_delivery_expired_cnt(N) ->
|
||||||
|
|
||||||
inc_expired_cnt(K) -> inc_expired_cnt(K, 1).
|
|
||||||
|
|
||||||
inc_expired_cnt(delivery, N) ->
|
|
||||||
ok = emqx_metrics:inc('delivery.dropped', N),
|
ok = emqx_metrics:inc('delivery.dropped', N),
|
||||||
emqx_metrics:inc('delivery.dropped.expired', N);
|
emqx_metrics:inc('delivery.dropped.expired', N).
|
||||||
|
|
||||||
inc_expired_cnt(message, N) ->
|
inc_await_pubrel_timeout(N) ->
|
||||||
ok = emqx_metrics:inc('messages.dropped', N),
|
ok = emqx_metrics:inc('messages.dropped', N),
|
||||||
emqx_metrics:inc('messages.dropped.expired', N).
|
emqx_metrics:inc('messages.dropped.await_pubrel_timeout', N).
|
||||||
|
|
||||||
%%--------------------------------------------------------------------
|
%%--------------------------------------------------------------------
|
||||||
%% Next Packet Id
|
%% Next Packet Id
|
||||||
|
|
Loading…
Reference in New Issue