This is an automated email from the ASF dual-hosted git repository. davisp pushed a commit to branch opentracing-davisp in repository https://gitbox.apache.org/repos/asf/couchdb.git
commit bcecb6835bd807b31e68ab71e0844247fca24d36 Author: Paul J. Davis <[email protected]> AuthorDate: Mon Nov 4 12:50:12 2019 -0600 Add tracing to fabric --- src/fabric/src/fabric.app.src | 3 ++- src/fabric/src/fabric2_db.erl | 25 ++++++++++++------- src/fabric/src/fabric2_fdb.erl | 52 +++++++++++++++++++++++++++++++-------- src/fabric/src/fabric2_server.erl | 24 +++++++++++++++--- 4 files changed, 81 insertions(+), 23 deletions(-) diff --git a/src/fabric/src/fabric.app.src b/src/fabric/src/fabric.app.src index 77260f9..bbfcf96 100644 --- a/src/fabric/src/fabric.app.src +++ b/src/fabric/src/fabric.app.src @@ -27,6 +27,7 @@ mem3, couch_log, couch_stats, - erlfdb + erlfdb, + ctrace ]} ]}. diff --git a/src/fabric/src/fabric2_db.erl b/src/fabric/src/fabric2_db.erl index e2674a4..4489064 100644 --- a/src/fabric/src/fabric2_db.erl +++ b/src/fabric/src/fabric2_db.erl @@ -1224,15 +1224,22 @@ update_doc_int(#{} = Db, #doc{} = Doc, Options) -> update_docs_interactive(Db, Docs0, Options) -> Docs = tag_docs(Docs0), - Futures = get_winning_rev_futures(Db, Docs), - {Result, _} = lists:mapfoldl(fun(Doc, SeenIds) -> - try - update_docs_interactive(Db, Doc, Options, Futures, SeenIds) - catch throw:{?MODULE, Return} -> - {Return, SeenIds} - end - end, [], Docs), - Result. + Futures = ctrace:with_span('fabric2_db:get_winning_rev_futures/2', fun() -> + get_winning_rev_futures(Db, Docs) + end), + ctrace:with_span('fabric2_db:update_docs_interactive/3 mapfoldl', fun() -> + {Result, _} = lists:mapfoldl(fun(Doc, SeenIds) -> + try + ctrace:with_span('fabric2_db:update_docs_interactive/5', fun() -> + ctrace:add_tags(#{'doc.id' => Doc#doc.id}), + update_docs_interactive(Db, Doc, Options, Futures, SeenIds) + end) + catch throw:{?MODULE, Return} -> + {Return, SeenIds} + end + end, [], Docs), + Result + end). update_docs_interactive(Db, #doc{id = <<?LOCAL_DOC_PREFIX, _/binary>>} = Doc, diff --git a/src/fabric/src/fabric2_fdb.erl b/src/fabric/src/fabric2_fdb.erl index c59346e..95b2d67 100644 --- a/src/fabric/src/fabric2_fdb.erl +++ b/src/fabric/src/fabric2_fdb.erl @@ -76,12 +76,16 @@ transactional(Fun) -> transactional(DbName, Options, Fun) when is_binary(DbName) -> - transactional(fun(Tx) -> - Fun(init_db(Tx, DbName, Options)) + OpName = ctrace:fun_to_op(Fun), + with_span(OpName, #{'db.name' => DbName}, fun() -> + transactional(fun(Tx) -> + Fun(init_db(Tx, DbName, Options)) + end) end). transactional(#{tx := undefined} = Db, Fun) -> + DbName = maps:get(name, Db, undefined), try Reopen = maps:get(reopen, Db, false), Db1 = maps:remove(reopen, Db), @@ -89,18 +93,46 @@ transactional(#{tx := undefined} = Db, Fun) -> true -> undefined; false -> maps:get(layer_prefix, Db1) end, - do_transaction(fun(Tx) -> - case Reopen of - true -> Fun(reopen(Db1#{tx => Tx})); - false -> Fun(Db1#{tx => Tx}) - end - end, LayerPrefix) + OpName = ctrace:fun_to_op(Fun), + with_span(OpName, #{'db.name' => DbName}, fun() -> + do_transaction(fun(Tx) -> + case Reopen of + true -> Fun(reopen(Db1#{tx => Tx})); + false -> Fun(Db1#{tx => Tx}) + end + end, LayerPrefix) + end) catch throw:{?MODULE, reopen} -> - transactional(Db#{reopen => true}, Fun) + with_span('db.reopen', #{'db.name' => DbName}, fun() -> + transactional(Db#{reopen => true}, Fun) + end) end; transactional(#{tx := {erlfdb_transaction, _}} = Db, Fun) -> - Fun(Db). + OpName = ctrace:fun_to_op(Fun), + DbName = maps:get(name, Db, undefined), + with_span(OpName, #{'db.name' => DbName}, fun() -> + Fun(Db) + end). + + +with_span(OpName, ExtraTags, Fun) -> + case ctrace:is_enabled() of + true -> + Tags = maps:merge(#{ + 'span.kind' => <<"client">>, + component => <<"couchdb.fabric">>, + 'db.instance' => fabric2_server:fdb_cluster(), + 'db.namespace' => fabric2_server:fdb_directory(), + 'db.type' => <<"fdb">> + }, ExtraTags), + ctrace:with_span(OpName, fun() -> + ctrace:add_tags(Tags), + Fun() + end); + false -> + Fun() + end. do_transaction(Fun, LayerPrefix) when is_function(Fun, 1) -> diff --git a/src/fabric/src/fabric2_server.erl b/src/fabric/src/fabric2_server.erl index f88ceb6..b5e2ee9 100644 --- a/src/fabric/src/fabric2_server.erl +++ b/src/fabric/src/fabric2_server.erl @@ -20,6 +20,8 @@ fetch/1, store/1, remove/1, + + fdb_cluster/0, fdb_directory/0 ]). @@ -38,6 +40,7 @@ -define(CLUSTER_FILE, "/usr/local/etc/foundationdb/fdb.cluster"). +-define(FDB_CLUSTER, fdb_cluster). -define(FDB_DIRECTORY, fdb_directory). -define(DEFAULT_FDB_DIRECTORY, <<"couchdb">>). @@ -77,9 +80,16 @@ init(_) -> Db = case application:get_env(fabric, eunit_run) of {ok, true} -> + application:set_env(fabric, ?FDB_CLUSTER, <<"eunit_test">>), erlfdb_util:get_test_db([empty]); undefined -> ClusterStr = config:get("erlfdb", "cluster_file", ?CLUSTER_FILE), + try + {ok, Data} = file:read_file(ClusterStr), + application:set_env(fabric, ?FDB_CLUSTER, string:trim(Data)) + catch _:_ -> + application:set_env(fabric, ?FDB_CLUSTER, <<"unknown">>) + end, erlfdb:open(iolist_to_binary(ClusterStr)) end, application:set_env(fabric, db, Db), @@ -115,14 +125,22 @@ code_change(_OldVsn, St, _Extra) -> {ok, St}. +fdb_cluster() -> + fdb_get(?FDB_CLUSTER). + + fdb_directory() -> - case get(?FDB_DIRECTORY) of + fdb_get(?FDB_DIRECTORY). + + +fdb_get(Key) -> + case get(Key) of undefined -> - case application:get_env(fabric, ?FDB_DIRECTORY) of + case application:get_env(fabric, Key) of undefined -> erlang:error(fabric_application_not_started); {ok, Dir} -> - put(?FDB_DIRECTORY, Dir), + put(Key, Dir), Dir end; Dir ->
