You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@couchdb.apache.org by da...@apache.org on 2019/11/05 17:26:54 UTC
[couchdb] 03/06: Add tracing to fabric
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 <pa...@gmail.com>
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 ->