This is an automated email from the ASF dual-hosted git repository. iilyak pushed a commit to branch couch-stats-resource-tracker-v3-rebase-http-4 in repository https://gitbox.apache.org/repos/asf/couchdb.git
commit 3aad1631b9bf616d886a11ba8c9cc313c1af1058 Author: ILYA Khlopotov <[email protected]> AuthorDate: Wed Jun 25 08:20:25 2025 -0700 Move JSON conversion to csrt_entry --- src/couch_stats/src/csrt.erl | 2 +- src/couch_stats/src/csrt_entry.erl | 84 ++++++++++++++++++++++- src/couch_stats/src/csrt_logger.erl | 2 +- src/couch_stats/src/csrt_query.erl | 2 +- src/couch_stats/src/csrt_util.erl | 85 +----------------------- src/couch_stats/test/eunit/csrt_logger_tests.erl | 2 +- src/couch_stats/test/eunit/csrt_server_tests.erl | 6 +- 7 files changed, 91 insertions(+), 92 deletions(-) diff --git a/src/couch_stats/src/csrt.erl b/src/couch_stats/src/csrt.erl index e288a1ad4..08678d248 100644 --- a/src/couch_stats/src/csrt.erl +++ b/src/couch_stats/src/csrt.erl @@ -344,7 +344,7 @@ do_report(ReportName, PidRef) -> -spec to_json(Rctx :: rctx()) -> map(). to_json(Rctx) -> - csrt_util:to_json(Rctx). + csrt_entry:to_json(Rctx). %% %% Stat collection API diff --git a/src/couch_stats/src/csrt_entry.erl b/src/couch_stats/src/csrt_entry.erl index 6da42ea99..094e46ca7 100644 --- a/src/couch_stats/src/csrt_entry.erl +++ b/src/couch_stats/src/csrt_entry.erl @@ -22,11 +22,21 @@ record_info/0 ]). +%% JSON Conversion API +-export([ + convert_type/1, + convert_pidref/1, + convert_pid/1, + convert_ref/1, + convert_string/1, + to_json/1 +]). + -spec value(rctx_field(), #rctx{}) -> any(). value(pid_ref, #rctx{pid_ref = Val}) -> Val; value(nonce, #rctx{nonce = Val}) -> Val; -value(type, #rctx{type = Val}) -> csrt_util:convert_type(Val); +value(type, #rctx{type = Val}) -> convert_type(Val); value(dbname, #rctx{dbname = Val}) -> Val; value(username, #rctx{username = Val}) -> Val; value(db_open, #rctx{db_open = Val}) -> Val; @@ -158,3 +168,75 @@ record_info() -> field_idx => Idx, size => Size }. + +-spec to_json(Rctx :: rctx()) -> map(). +to_json(#rctx{} = Rctx) -> + #{ + updated_at => convert_string(csrt_util:tutc(Rctx#rctx.updated_at)), + started_at => convert_string(csrt_util:tutc(Rctx#rctx.started_at)), + pid_ref => convert_pidref(Rctx#rctx.pid_ref), + nonce => convert_string(Rctx#rctx.nonce), + dbname => convert_string(Rctx#rctx.dbname), + username => convert_string(Rctx#rctx.username), + db_open => Rctx#rctx.db_open, + docs_read => Rctx#rctx.docs_read, + docs_written => Rctx#rctx.docs_written, + js_filter => Rctx#rctx.js_filter, + js_filtered_docs => Rctx#rctx.js_filtered_docs, + rows_read => Rctx#rctx.rows_read, + type => convert_type(Rctx#rctx.type), + get_kp_node => Rctx#rctx.get_kp_node, + get_kv_node => Rctx#rctx.get_kv_node, + %% "Example to extend CSRT" + %% write_kp_node => Rctx#rctx.write_kp_node, + %% write_kv_node => Rctx#rctx.write_kv_node, + changes_returned => Rctx#rctx.changes_returned, + ioq_calls => Rctx#rctx.ioq_calls + }. + +%% +%% Conversion API for outputting JSON +%% + +-spec convert_type(T) -> binary() | null when + T :: #coordinator{} | #rpc_worker{} | undefined. +convert_type(#coordinator{method = Verb0, path = Path, mod = M0, func = F0}) -> + M = atom_to_binary(M0), + F = atom_to_binary(F0), + Verb = atom_to_binary(Verb0), + <<"coordinator-{", M/binary, ":", F/binary, "}:", Verb/binary, ":", Path/binary>>; +convert_type(#rpc_worker{mod = M0, func = F0, from = From0}) -> + M = atom_to_binary(M0), + F = atom_to_binary(F0), + %% Technically From is a PidRef data type from Pid, but different Ref for fabric + From = convert_pidref(From0), + <<"rpc_worker-{", From/binary, "}:", M/binary, ":", F/binary>>; +convert_type(undefined) -> + null. + +-spec convert_pidref(PidRef) -> binary() | null when + PidRef :: {A :: pid(), B :: reference()} | undefined. +convert_pidref({Parent0, ParentRef0}) -> + Parent = convert_pid(Parent0), + ParentRef = convert_ref(ParentRef0), + <<Parent/binary, ":", ParentRef/binary>>; +%%convert_pidref(null) -> +%% null; +convert_pidref(undefined) -> + null. + +-spec convert_pid(Pid :: pid()) -> binary(). +convert_pid(Pid) when is_pid(Pid) -> + list_to_binary(pid_to_list(Pid)). + +-spec convert_ref(Ref :: reference()) -> binary(). +convert_ref(Ref) when is_reference(Ref) -> + list_to_binary(ref_to_list(Ref)). + +-spec convert_string(Str :: string() | binary() | undefined) -> binary() | null. +convert_string(undefined) -> + null; +convert_string(Str) when is_list(Str) -> + list_to_binary(Str); +convert_string(Bin) when is_binary(Bin) -> + Bin. diff --git a/src/couch_stats/src/csrt_logger.erl b/src/couch_stats/src/csrt_logger.erl index c0ec76d18..4c2f7a72d 100644 --- a/src/couch_stats/src/csrt_logger.erl +++ b/src/couch_stats/src/csrt_logger.erl @@ -227,7 +227,7 @@ do_status_report(Rctx) -> -spec do_report(ReportName :: string(), Rctx :: rctx()) -> boolean(). do_report(ReportName, #rctx{} = Rctx) -> JRctx = - case {should_truncate_reports(), csrt_util:to_json(Rctx)} of + case {should_truncate_reports(), csrt_entry:to_json(Rctx)} of {true, JRctx0} -> maps:filter(fun(_K, V) -> V > 0 end, JRctx0); {false, JRctx0} -> diff --git a/src/couch_stats/src/csrt_query.erl b/src/couch_stats/src/csrt_query.erl index 3bfbc8bd1..b461fedcb 100644 --- a/src/couch_stats/src/csrt_query.erl +++ b/src/couch_stats/src/csrt_query.erl @@ -260,7 +260,7 @@ sort_by(KeyFun, ValFun, AggFun) -> {Result, topK(Acc, 10)}. to_json_list(List) when is_list(List) -> - lists:map(fun csrt_util:to_json/1, List). + lists:map(fun csrt_entry:to_json/1, List). -spec query_matcher(MatcherName :: string()) -> {ok, query_result()} | {error, any()}. diff --git a/src/couch_stats/src/csrt_util.erl b/src/couch_stats/src/csrt_util.erl index 2126793b6..7114bad63 100644 --- a/src/couch_stats/src/csrt_util.erl +++ b/src/couch_stats/src/csrt_util.erl @@ -26,16 +26,6 @@ tutc/1 ]). -%% JSON Conversion API --export([ - convert_type/1, - convert_pidref/1, - convert_pid/1, - convert_ref/1, - convert_string/1, - to_json/1 -]). - %% Delta API -export([ add_delta/2, @@ -56,8 +46,7 @@ %% Extra niceties and testing facilities -export([ set_fabric_init_p/2, - set_fabric_init_p/3, - rctx_record_info/0 + set_fabric_init_p/3 ]). -include_lib("couch_stats_resource_tracker.hrl"). @@ -153,78 +142,6 @@ make_dt(A, B, Unit) when is_integer(A) andalso is_integer(B) andalso B > A -> 1 end. -%% -%% Conversion API for outputting JSON -%% - --spec convert_type(T) -> binary() | null when - T :: #coordinator{} | #rpc_worker{} | undefined. -convert_type(#coordinator{method = Verb0, path = Path, mod = M0, func = F0}) -> - M = atom_to_binary(M0), - F = atom_to_binary(F0), - Verb = atom_to_binary(Verb0), - <<"coordinator-{", M/binary, ":", F/binary, "}:", Verb/binary, ":", Path/binary>>; -convert_type(#rpc_worker{mod = M0, func = F0, from = From0}) -> - M = atom_to_binary(M0), - F = atom_to_binary(F0), - %% Technically From is a PidRef data type from Pid, but different Ref for fabric - From = convert_pidref(From0), - <<"rpc_worker-{", From/binary, "}:", M/binary, ":", F/binary>>; -convert_type(undefined) -> - null. - --spec convert_pidref(PidRef) -> binary() | null when - PidRef :: {A :: pid(), B :: reference()} | undefined. -convert_pidref({Parent0, ParentRef0}) -> - Parent = convert_pid(Parent0), - ParentRef = convert_ref(ParentRef0), - <<Parent/binary, ":", ParentRef/binary>>; -%%convert_pidref(null) -> -%% null; -convert_pidref(undefined) -> - null. - --spec convert_pid(Pid :: pid()) -> binary(). -convert_pid(Pid) when is_pid(Pid) -> - list_to_binary(pid_to_list(Pid)). - --spec convert_ref(Ref :: reference()) -> binary(). -convert_ref(Ref) when is_reference(Ref) -> - list_to_binary(ref_to_list(Ref)). - --spec convert_string(Str :: string() | binary() | undefined) -> binary() | null. -convert_string(undefined) -> - null; -convert_string(Str) when is_list(Str) -> - list_to_binary(Str); -convert_string(Bin) when is_binary(Bin) -> - Bin. - --spec to_json(Rctx :: rctx()) -> map(). -to_json(#rctx{} = Rctx) -> - #{ - updated_at => convert_string(tutc(Rctx#rctx.updated_at)), - started_at => convert_string(tutc(Rctx#rctx.started_at)), - pid_ref => convert_pidref(Rctx#rctx.pid_ref), - nonce => convert_string(Rctx#rctx.nonce), - dbname => convert_string(Rctx#rctx.dbname), - username => convert_string(Rctx#rctx.username), - db_open => Rctx#rctx.db_open, - docs_read => Rctx#rctx.docs_read, - docs_written => Rctx#rctx.docs_written, - js_filter => Rctx#rctx.js_filter, - js_filtered_docs => Rctx#rctx.js_filtered_docs, - rows_read => Rctx#rctx.rows_read, - type => convert_type(Rctx#rctx.type), - get_kp_node => Rctx#rctx.get_kp_node, - get_kv_node => Rctx#rctx.get_kv_node, - %% "Example to extend CSRT" - %% write_kp_node => Rctx#rctx.write_kp_node, - %% write_kv_node => Rctx#rctx.write_kv_node, - changes_returned => Rctx#rctx.changes_returned, - ioq_calls => Rctx#rctx.ioq_calls - }. - -spec add_delta(T :: term(), Delta :: maybe_delta()) -> term_delta(). add_delta(T, undefined) -> T; diff --git a/src/couch_stats/test/eunit/csrt_logger_tests.erl b/src/couch_stats/test/eunit/csrt_logger_tests.erl index c856febab..bb38a5d54 100644 --- a/src/couch_stats/test/eunit/csrt_logger_tests.erl +++ b/src/couch_stats/test/eunit/csrt_logger_tests.erl @@ -203,7 +203,7 @@ rctxs() -> [rctx_gen() || _ <- lists:seq(1, ?RCTX_COUNT)]. jrctx(Rctx) -> - JRctx = csrt_util:to_json(Rctx), + JRctx = csrt_entry:to_json(Rctx), case csrt_logger:should_truncate_reports() of true -> maps:filter(fun(_K, V) -> V > 0 end, JRctx); diff --git a/src/couch_stats/test/eunit/csrt_server_tests.erl b/src/couch_stats/test/eunit/csrt_server_tests.erl index 89da7b4b3..eec60670e 100644 --- a/src/couch_stats/test/eunit/csrt_server_tests.erl +++ b/src/couch_stats/test/eunit/csrt_server_tests.erl @@ -497,7 +497,7 @@ pdbg(Str, Args) -> ?DEBUG_ENABLED andalso ?debugFmt(Str, Args). convert_pidref({_, _} = PidRef) -> - csrt_util:convert_pidref(PidRef); + csrt_entry:convert_pidref(PidRef); convert_pidref(PidRef) when is_binary(PidRef) -> PidRef; convert_pidref(false) -> @@ -517,7 +517,7 @@ rctx_assert(Rctx, Asserts0) -> }, Updates = #{ pid_ref => fun convert_pidref/1, - nonce => fun csrt_util:convert_string/1 + nonce => fun csrt_entry:convert_string/1 }, Asserts = maps:merge( DefaultAsserts, @@ -616,4 +616,4 @@ configure_filter(DbName, DDocId, Req, FName) -> load_rctx(PidRef) -> %% Add slight delay to accumulate RPC response deltas timer:sleep(50), - csrt_util:to_json(csrt:get_resource(PidRef)). + csrt_entry:to_json(csrt:get_resource(PidRef)).
