From 3ac8cc60578b9f7ed3e73b467519aec013708637 Mon Sep 17 00:00:00 2001 From: Pierrick Couderc Date: Fri, 6 Dec 2024 10:21:11 +0100 Subject: [PATCH 1/2] Node/Profiling: use the peer ID as unique identifier for Opentelemetry --- src/bin_node/node_run_command.ml | 10 ++++++---- .../opentelemetry_profiler.ml | 19 +++++++++++++------ .../opentelemetry_profiler.mli | 7 ++++--- 3 files changed, 23 insertions(+), 13 deletions(-) diff --git a/src/bin_node/node_run_command.ml b/src/bin_node/node_run_command.ml index fc478691af84..d1f11d4d8125 100644 --- a/src/bin_node/node_run_command.ml +++ b/src/bin_node/node_run_command.ml @@ -753,6 +753,12 @@ let run ?verbosity ?sandbox ?target ?(cli_warnings = []) in let* () = Config_validation.check ?ignore_testchain_warning config in let* identity = init_identity_file config in + () + [@profiler.custom + {driver_ids = [Opentelemetry]} + (Opentelemetry_profiler.initialize + ~unique_identifier:(P2p_peer.Id.to_b58check identity.peer_id) + "octez-node")] ; Updater.init (Data_version.protocol_dir config.data_dir) ; let*! () = Event.(emit starting_node) @@ -892,10 +898,6 @@ let process sandbox verbosity target singleprocess force_history_mode_switch "Failed to parse the provided target. A ',' \ value was expected.") in - () - [@profiler.custom - {driver_ids = [Opentelemetry]} - (Opentelemetry_profiler.initialize "octez-node")] ; Lwt_lock_file.with_lock ~when_locked: (`Fail (Exn (Failure "Data directory is locked by another process"))) diff --git a/src/lib_profiler_backend/opentelemetry_profiler.ml b/src/lib_profiler_backend/opentelemetry_profiler.ml index 6d31761d4491..602ffd3dc5fe 100644 --- a/src/lib_profiler_backend/opentelemetry_profiler.ml +++ b/src/lib_profiler_backend/opentelemetry_profiler.ml @@ -5,7 +5,12 @@ (* *) (*****************************************************************************) -let initialize service_name = +let initialize ?unique_identifier service_name = + let service_name = + match unique_identifier with + | None -> service_name + | Some id -> Format.sprintf "%s-%s" service_name id + in Opentelemetry.Globals.service_name := service_name ; Opentelemetry.GC_metrics.basic_setup () ; Ambient_context.set_storage_provider (Ambient_context_lwt.storage ()) ; @@ -23,6 +28,9 @@ let add_event ?attrs name = |> Option.iter @@ fun scope -> Trace.add_event scope @@ fun () -> Event.make ?attrs name) +let add_attribute attrs id value = + match attrs with None -> [(id, value)] | Some attrs -> (id, value) :: attrs + let trace ?force_new_trace_id ?trace_state ?service_name ?attrs ?kind ?trace_id ?parent ?scope ?links name k = Opentelemetry.Trace.with_ @@ -42,12 +50,11 @@ let trace_operation op ?attrs = let op_hash = match op with `Operation op -> Operation.hash op | `Hash oph -> oph in - let metadata = - ( "operation_hash", - `String (Tezos_crypto.Hashed.Operation_hash.to_b58check op_hash) ) - in let attrs = - match attrs with None -> [metadata] | Some attrs -> metadata :: attrs + add_attribute + attrs + "operation_hash" + (`String (Tezos_crypto.Hashed.Operation_hash.to_b58check op_hash)) in trace ~trace_id:(op_hash_to_trace_id op_hash) ~attrs diff --git a/src/lib_profiler_backend/opentelemetry_profiler.mli b/src/lib_profiler_backend/opentelemetry_profiler.mli index d0ea56b73b3a..e6bc5aa3e651 100644 --- a/src/lib_profiler_backend/opentelemetry_profiler.mli +++ b/src/lib_profiler_backend/opentelemetry_profiler.mli @@ -5,9 +5,10 @@ (* *) (*****************************************************************************) -(** [initialize service_name] initializes the Opentelemetry client to output the - traces. *) -val initialize : string -> unit +(** [initialize ?unique_identifier service_name] initializes the Opentelemetry client to output the + traces. [?unique_identifier] can be used to discriminate a service used + in multiple binaries (for example multiple `octez-node` in the network). *) +val initialize : ?unique_identifier:string -> string -> unit (** [op_hash_to_trace_id op_hash] returns a valid [Opentelemetry.Trace_id.t] that can be used when tracing. When tracing an operation application, using the -- GitLab From ab30708f6a4a7eb7f808672cfa12d8d1d57d623c Mon Sep 17 00:00:00 2001 From: Pierrick Couderc Date: Fri, 6 Dec 2024 10:42:30 +0100 Subject: [PATCH 2/2] Shell: trace fetched operations --- src/lib_shell/prevalidator.ml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/lib_shell/prevalidator.ml b/src/lib_shell/prevalidator.ml index b1f40cca9f11..c1750b1d27d9 100644 --- a/src/lib_shell/prevalidator.ml +++ b/src/lib_shell/prevalidator.ml @@ -718,12 +718,18 @@ module Make_s else match Parser.parse oph op with | Error _ -> + () + [@profiler.custom + Opentelemetry_profiler.add_event "parse_operation failed"] ; let* () = Events.(emit unparsable_operation) oph in Prevalidator_classification.add_unparsable oph pv.shell.classification ; return_ok_unit | Ok parsed_op -> ( + () + [@profiler.custom + Opentelemetry_profiler.add_event "parse_operation succeeded"] ; let* v = pre_filter pv @@ -1532,6 +1538,8 @@ module Make op [@profiler.aggregate_s {verbosity = Notice; metadata = [("prometheus", "")]} "on_arrived"] + [@profiler.custom_s + Opentelemetry_profiler.trace_operation (`Hash oph) "on_arrived"] | Request.Advertise -> Requests.on_advertise pv.shell -- GitLab