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 ->

Reply via email to