This is an automated email from the ASF dual-hosted git repository.

nickva pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/couchdb.git

commit d4067c4f9274b93a0f07dda6c5f75ab451858bcd
Author: Sam Smith <[email protected]>
AuthorDate: Wed Jul 15 15:47:01 2026 +0100

    feat(couch): add process_count gauge to query server manager
    
    Track the number of active query server processes to provide
    visibility into resource usage. The gauge is updated when processes
    spawn/remove.
---
 src/couch/priv/stats_descriptions.cfg | 4 ++++
 src/couch/src/couch_proc_manager.erl  | 9 +++++++--
 2 files changed, 11 insertions(+), 2 deletions(-)

diff --git a/src/couch/priv/stats_descriptions.cfg 
b/src/couch/priv/stats_descriptions.cfg
index 17f028782..3497b728b 100644
--- a/src/couch/priv/stats_descriptions.cfg
+++ b/src/couch/priv/stats_descriptions.cfg
@@ -322,6 +322,10 @@
     {type, counter},
     {desc, <<"number of acquired external processes">>}
 ]}.
+{[couchdb, query_server, process_count], [
+    {type, gauge},
+    {desc, <<"number of active query server processes">>}
+]}.
 {[couchdb, query_server, process_starts], [
     {type, counter},
     {desc, <<"number of OS process starts">>}
diff --git a/src/couch/src/couch_proc_manager.erl 
b/src/couch/src/couch_proc_manager.erl
index ea4a76001..a95acc7c0 100644
--- a/src/couch/src/couch_proc_manager.erl
+++ b/src/couch/src/couch_proc_manager.erl
@@ -141,6 +141,8 @@ init([]) ->
 
     ok = configure_language_servers(),
 
+    couch_stats:update_gauge([couchdb, query_server, process_count], 
get_proc_count()),
+
     {ok, #state{
         config = get_proc_config(),
         threshold_ts = timestamp(),
@@ -250,6 +252,7 @@ handle_info({'EXIT', Pid, spawn_error}, State) ->
     % Assert when removing that we always expect the opener to have been there
     [{Pid, #client{lang = Lang}}] = ets:take(?OPENING, Pid),
     dec_count(Lang),
+    couch_stats:update_gauge([couchdb, query_server, process_count], 
get_proc_count()),
     ok = flush_waiters(State, Lang),
     {noreply, State};
 handle_info({'EXIT', Pid, Reason}, State) ->
@@ -370,7 +373,8 @@ find_proc(Lang, DbPat, DDocKey) when
 spawn_proc(#client{} = Client) ->
     Pid = spawn_link(?MODULE, new_proc, [Client]),
     ets:insert(?OPENING, {Pid, Client}),
-    inc_count(Client#client.lang).
+    inc_count(Client#client.lang),
+    couch_stats:update_gauge([couchdb, query_server, process_count], 
get_proc_count()).
 
 % This instance was spawned without a client to replenish
 % the untagged pool asynchronously
@@ -686,7 +690,8 @@ remove_proc(#proc{pid = Pid} = Proc) ->
         false ->
             ok
     end,
-    dec_count(Proc#proc.lang).
+    dec_count(Proc#proc.lang),
+    couch_stats:update_gauge([couchdb, query_server, process_count], 
get_proc_count()).
 
 flush_waiters(#state{} = State, Lang) ->
     #state{hard_limit = HardLimit, config = {[_ | _] = Cfg}} = State,

Reply via email to