diff options
author | Nick Vatamaniuc <vatamane@gmail.com> | 2022-10-17 14:46:43 -0400 |
---|---|---|
committer | Nick Vatamaniuc <nickva@users.noreply.github.com> | 2022-10-17 16:51:18 -0400 |
commit | 4a9bef0fe02832111c0c52dd0e0215e32693bffd (patch) | |
tree | c1def6294b23fc051c1ad2d553e74143460964a7 | |
parent | 9636405b29f9157eb7870995d837cb53a77cf1f2 (diff) | |
download | couchdb-4a9bef0fe02832111c0c52dd0e0215e32693bffd.tar.gz |
Fix prometheus message queue len race condition
By the time we get the message queue length the registered process might have
died already. In that case `whereis/1` would return `undefined` and would crash
the gen_server process.
-rw-r--r-- | src/couch_prometheus/src/couch_prometheus_server.erl | 23 |
1 files changed, 12 insertions, 11 deletions
diff --git a/src/couch_prometheus/src/couch_prometheus_server.erl b/src/couch_prometheus/src/couch_prometheus_server.erl index 969f68ec9..fbca9eb66 100644 --- a/src/couch_prometheus/src/couch_prometheus_server.erl +++ b/src/couch_prometheus/src/couch_prometheus_server.erl @@ -149,23 +149,24 @@ get_io_stats() -> ]. get_message_queue_stats() -> - Queues = lists:map( - fun(Name) -> - case process_info(whereis(Name), message_queue_len) of - {message_queue_len, N} -> - N; - _ -> - 0 - end - end, - registered() - ), + QLenFun = fun(Name) -> message_queue_len(whereis(Name)) end, + Queues = lists:map(QLenFun, registered()), [ to_prom(erlang_message_queues, gauge, lists:sum(Queues)), to_prom(erlang_message_queue_min, gauge, lists:min(Queues)), to_prom(erlang_message_queue_max, gauge, lists:max(Queues)) ]. +message_queue_len(undefined) -> + 0; +message_queue_len(Pid) when is_pid(Pid) -> + case process_info(Pid, message_queue_len) of + {message_queue_len, N} -> + N; + _ -> + 0 + end. + get_run_queue_stats() -> %% Workaround for https://bugs.erlang.org/browse/ERL-1355 {Normal, Dirty} = |