diff --git a/.gitignore b/.gitignore index 4f6f5693..50769013 100644 --- a/.gitignore +++ b/.gitignore @@ -13,3 +13,4 @@ /.lsp/ /dev/data/* /data*/** +.calva/repl.calva-repl diff --git a/deps.edn b/deps.edn index 5fe32a77..78c1fba5 100644 --- a/deps.edn +++ b/deps.edn @@ -1,7 +1,7 @@ {:deps {org.clojure/clojure {:mvn/version "1.11.3"} org.clojure/core.async {:mvn/version "1.6.681"} com.fluree/db {:git/url "https://github.com/fluree/db.git" - :git/sha "dca1e35afb8b84f557d84b27f0dd387064626012"} + :git/sha "5684c80721398c50886bccc37ba232722d9a406f"} com.fluree/json-ld {:git/url "https://github.com/fluree/json-ld.git" :git/sha "73a990a4b803d0b4cfbbbe4dc16275b39a3add4e"} @@ -24,6 +24,9 @@ ch.qos.logback/logback-classic {:mvn/version "1.5.6"} org.slf4j/slf4j-api {:mvn/version "2.0.13"} + ;; distributed tracing + com.github.steffan-westcott/clj-otel-api {:mvn/version "0.2.7"} + ;; http ;; ring-jetty9-adapter 0.30.x+ uses Jetty 12 & requires JDK 17+ ;; so we have to stay on 0.22.x b/c our minimum JDK version is 11 diff --git a/src/fluree/server/consensus.clj b/src/fluree/server/consensus.clj index 79b1082e..16c0d26c 100644 --- a/src/fluree/server/consensus.clj +++ b/src/fluree/server/consensus.clj @@ -2,8 +2,11 @@ "To allow for pluggable consensus, we have a Transactor protocol. In order to allow for a new consensus type, we need to create a record with all of the following methods. Currently, we support Raft and Standalone." - (:require [fluree.db.util.log :as log] - [fluree.server.consensus.events :as events])) + (:require [clojure.string :as string] + [fluree.db.util.log :as log] + [fluree.server.consensus.events :as events] + [steffan-westcott.clj-otel.api.trace.span :as span] + [steffan-westcott.clj-otel.context :as otel-context])) (set! *warn-on-reflection* true) @@ -11,14 +14,34 @@ (-queue-new-ledger [transactor new-ledger-params]) (-queue-new-transaction [transactor new-tx-params])) +(defn with-trace-context + [event] + (assoc event ::trace-context (otel-context/->headers))) + +;; need to lowercase map keys before calling otel-context/headers->merged-context +;; https://github.com/steffan-westcott/clj-otel/issues/26 +(defn ^:private lowercase-keys [m] + (into {} (map (fn [[k v]] [(string/lower-case (name k)) v])) m)) + +(defn get-trace-context [event] + (-> event ::trace-context lowercase-keys otel-context/headers->merged-context)) + (defn queue-new-ledger [transactor ledger-id tx-id txn opts] - (log/trace "queue-new-ledger:" ledger-id tx-id txn) - (let [event-params (events/create-ledger ledger-id tx-id txn opts)] - (-queue-new-ledger transactor event-params))) + (log/with-mdc {:tx.id tx-id} + (log/trace "queue-new-ledger:" ledger-id tx-id txn) + (span/with-span! {:name "fluree.server.consensus/queue-new-ledger" + :span-kind :producer + :attributes {:tx.id tx-id}} + (let [event-params (events/create-ledger ledger-id tx-id txn opts)] + (-queue-new-ledger transactor (with-trace-context event-params)))))) (defn queue-new-transaction [transactor ledger-id tx-id txn opts] - (log/trace "queue-new-transaction:" txn) - (let [event-params (events/commit-transaction ledger-id tx-id txn opts)] - (-queue-new-transaction transactor event-params))) + (log/with-mdc {:tx.id tx-id} + (log/trace "queue-new-transaction:" txn) + (span/with-span! {:name "fluree.server.consensus/queue-new-transaction" + :span-kind :producer + :attributes {:tx.id tx-id}} + (let [event-params (events/commit-transaction ledger-id tx-id txn opts)] + (-queue-new-transaction transactor (with-trace-context event-params)))))) diff --git a/src/fluree/server/consensus/standalone.clj b/src/fluree/server/consensus/standalone.clj index 1d8ba83d..65fb8502 100644 --- a/src/fluree/server/consensus/standalone.clj +++ b/src/fluree/server/consensus/standalone.clj @@ -6,7 +6,10 @@ [fluree.server.consensus :as consensus] [fluree.server.consensus.events :as events] [fluree.server.consensus.response :as response] - [fluree.server.handlers.shared :refer [deref!]])) + [fluree.server.handlers.shared :refer [deref!]] + [fluree.server.watcher :as watcher] + [fluree.server.handlers.shared :refer [deref!]] + [steffan-westcott.clj-otel.api.trace.span :as span])) (set! *warn-on-reflection* true) @@ -36,27 +39,31 @@ (defn process-event [conn watcher broadcaster event] - (go - (try - (let [event* (if (events/resolve-txn? event) - (> ledger (fluree/load conn) deref!) query* (dissoc query :from)] - (log/debug "history handler received query:" query opts) - {:status 200 - :body (deref! (fluree/history ledger* query* opts))})) + (log/with-mdc {:ledger.id ledger} + (span/add-span-data! {:attributes (org.slf4j.MDC/getCopyOfContextMap)}) + (log/debug "history handler received query:" query opts) + {:status 200 + :body (deref! (fluree/history ledger* query* opts))}))) diff --git a/src/fluree/server/handlers/remote_resource.clj b/src/fluree/server/handlers/remote_resource.clj index 507471bc..095d96d3 100644 --- a/src/fluree/server/handlers/remote_resource.clj +++ b/src/fluree/server/handlers/remote_resource.clj @@ -3,11 +3,13 @@ [fluree.db.connection :as connection] [fluree.db.util.async :refer [ (assoc opts :format :fql) raw-txn (assoc :raw-txn raw-txn) did (assoc :did did)) - resp-p (transact! consensus watcher ledger-id txn opts*)] + resp-p (log/with-mdc {:ledger.id ledger-id} + (do (span/add-span-data! {:attributes (org.slf4j.MDC/getCopyOfContextMap)}) + (transact! consensus watcher ledger-id txn opts*)))] {:status 200, :body (deref! resp-p)}))