From fb7cd5bb758f8c3bc12e4b800cfce6a7d609411d Mon Sep 17 00:00:00 2001 From: Valentin Chaboche Date: Thu, 14 Nov 2024 11:09:40 +0100 Subject: [PATCH 1/3] EVM/Node: add an event when the L1 block is processed --- etherlink/bin_node/lib_dev/evm_context.ml | 5 +++++ etherlink/bin_node/lib_dev/evm_context_events.ml | 10 ++++++++++ 2 files changed, 15 insertions(+) diff --git a/etherlink/bin_node/lib_dev/evm_context.ml b/etherlink/bin_node/lib_dev/evm_context.ml index 0c62ce0df927..f904e757a86b 100644 --- a/etherlink/bin_node/lib_dev/evm_context.ml +++ b/etherlink/bin_node/lib_dev/evm_context.ml @@ -724,6 +724,11 @@ module State = struct let* ctxt = replace_current_commit ctxt conn evm_state in return (ctxt, evm_state, on_success) in + let*! () = + Option.iter_s + (fun l1_level -> Evm_context_events.processed_l1_level l1_level) + finalized_level + in on_success ctxt.session ; on_modified_head ctxt evm_state context ; let*! head_info in diff --git a/etherlink/bin_node/lib_dev/evm_context_events.ml b/etherlink/bin_node/lib_dev/evm_context_events.ml index 9ef62cfd4924..cf9bb43861e6 100644 --- a/etherlink/bin_node/lib_dev/evm_context_events.ml +++ b/etherlink/bin_node/lib_dev/evm_context_events.ml @@ -97,6 +97,14 @@ let unexpected_l1_block = ("expected_level", Data_encoding.int32) ("provided_level", Data_encoding.int32) +let processed_l1_level = + declare_1 + ~section + ~name:"evm_context_processed_l1_level" + ~level:Info + ~msg:"Processed L1 level {level}" + ("level", Data_encoding.int32) + let ready () = emit ready () let shutdown () = emit shutdown () @@ -116,3 +124,5 @@ let gc_waiter_failed exn = let unexpected_l1_block ~expected_level ~provided_level = emit unexpected_l1_block (expected_level, provided_level) + +let processed_l1_level level = emit processed_l1_level level -- GitLab From 8cbb36713534e844a45ff9b7094347ba48735182 Mon Sep 17 00:00:00 2001 From: Valentin Chaboche Date: Thu, 14 Nov 2024 11:27:29 +0100 Subject: [PATCH 2/3] EVM/Node: add metrics for last processed l1 level --- etherlink/CHANGES_NODE.md | 7 +++++++ etherlink/bin_node/lib_dev/evm_context.ml | 17 ++++++++++------- etherlink/bin_node/lib_dev/metrics.ml | 15 ++++++++++++++- etherlink/bin_node/lib_dev/rpc.ml | 12 +++++++----- 4 files changed, 38 insertions(+), 13 deletions(-) diff --git a/etherlink/CHANGES_NODE.md b/etherlink/CHANGES_NODE.md index 49803424f2be..7b83b782eacd 100644 --- a/etherlink/CHANGES_NODE.md +++ b/etherlink/CHANGES_NODE.md @@ -4,6 +4,12 @@ ### Features +#### Metrics + +- Adds `l1_level` to expose the last processed L1 block. If the node is connected + to a rollup node it should be close to the most recent finalized L1 block + on the network. (!15623) + ### Bug fixes - Fixes a race condition where rollup node follower would process start @@ -13,6 +19,7 @@ - Adds the duration of the blueprint application to the `blueprint_applied` event. (!15505) +- Adds the last processed L1 block in a new event `evm_context_processed_l1_level`. (!15623) - The gas estimation exits earlier if the simulation needs more than the gas limit per transaction. It also supports custom maximum gas limit. (!15468) - Modify the blueprints publisher worker to log error when it crash diff --git a/etherlink/bin_node/lib_dev/evm_context.ml b/etherlink/bin_node/lib_dev/evm_context.ml index f904e757a86b..5c724c64ca2c 100644 --- a/etherlink/bin_node/lib_dev/evm_context.ml +++ b/etherlink/bin_node/lib_dev/evm_context.ml @@ -726,7 +726,9 @@ module State = struct in let*! () = Option.iter_s - (fun l1_level -> Evm_context_events.processed_l1_level l1_level) + (fun l1_level -> + Metrics.set_l1_level ~level:l1_level ; + Evm_context_events.processed_l1_level l1_level) finalized_level in on_success ctxt.session ; @@ -1094,10 +1096,10 @@ module State = struct Evm_store.use store @@ fun conn -> let* pending_upgrade = Evm_store.Kernel_upgrades.find_latest_pending conn in let* latest_relationship = Evm_store.L1_l2_levels_relationships.find conn in - let finalized_number = + let finalized_number, l1_level = match latest_relationship with - | None -> Ethereum_types.Qty Z.zero - | Some {finalized; _} -> finalized + | None -> (Ethereum_types.Qty Z.zero, None) + | Some {finalized; l1_level; _} -> (finalized, Some l1_level) in let smart_rollup_address = Option.map @@ -1200,7 +1202,7 @@ module State = struct pending_upgrade in - return (ctxt, (init_status, smart_rollup_address)) + return (ctxt, (init_status, smart_rollup_address, l1_level)) let reset ~data_dir ~l2_level = let open Lwt_result_syntax in @@ -1730,14 +1732,15 @@ let start ?kernel_path ~data_dir ~preimages ~preimages_endpoint in let*! () = Blueprint_events.publisher_is_ready () in Lwt.wakeup worker_waker worker ; - let*! init_status in + let*! init_status, sr1, l1_level = init_status in let*! head_info in let (Qty finalized_number) = !head_info.finalized_number in let (Qty next_blueprint_number) = !head_info.next_blueprint_number in Metrics.set_level ~level:(Z.pred next_blueprint_number) ; Metrics.set_confirmed_level ~level:finalized_number ; + Option.iter (fun l1_level -> Metrics.set_l1_level ~level:l1_level) l1_level ; let*! () = Evm_context_events.ready () in - return init_status + return (init_status, sr1) let rollup_node_metadata ~rollup_node_data_dir = let open Lwt_result_syntax in diff --git a/etherlink/bin_node/lib_dev/metrics.ml b/etherlink/bin_node/lib_dev/metrics.ml index 625e4e9d213d..6fb4375f2c72 100644 --- a/etherlink/bin_node/lib_dev/metrics.ml +++ b/etherlink/bin_node/lib_dev/metrics.ml @@ -270,6 +270,7 @@ type t = { block : Block.t; simulation : Simulation.t; health : Health.t; + l1_level : Gauge.t; } module BlueprintChunkSent = struct @@ -304,7 +305,17 @@ let metrics = let block = Block.init name in let simulation = Simulation.init name in let health = Health.init name in - {chain; block; simulation; health} + let l1_level = + Gauge.v_label + ~registry + ~label_name:"l1_level" + ~help:"Last processed L1 block level" + ~namespace + ~subsystem + "l1_level" + name + in + {chain; block; simulation; health; l1_level} let init ~mode ~tx_pool_size_info ~smart_rollup_address = Info.init ~mode ~smart_rollup_address ; @@ -317,6 +328,8 @@ let set_gas_price price = Gauge.set metrics.chain.gas_price (Z.to_float price) let set_confirmed_level ~level = Gauge.set metrics.chain.confirmed_head (Z.to_float level) +let set_l1_level ~level = Gauge.set metrics.l1_level (Int32.to_float level) + let start_bootstrapping () = Gauge.set metrics.health.bootstrapping 1. let stop_bootstrapping () = Gauge.set metrics.health.bootstrapping 0. diff --git a/etherlink/bin_node/lib_dev/rpc.ml b/etherlink/bin_node/lib_dev/rpc.ml index af6b1e2ab2d6..c31aaf18bcd5 100644 --- a/etherlink/bin_node/lib_dev/rpc.ml +++ b/etherlink/bin_node/lib_dev/rpc.ml @@ -19,11 +19,13 @@ let set_metrics_level (ctxt : Evm_ro_context.t) = | Some (Qty latest, _) -> Metrics.set_level ~level:latest | None -> () -let set_metrics_confirmed_level (ctxt : Evm_ro_context.t) = +let set_metrics_confirmed_levels (ctxt : Evm_ro_context.t) = let open Lwt_result_syntax in - let+ candidate = Evm_store.(use ctxt.store Context_hashes.find_finalized) in + let+ candidate = Evm_store.(use ctxt.store L1_l2_levels_relationships.find) in match candidate with - | Some (Qty finalized, _) -> Metrics.set_confirmed_level ~level:finalized + | Some {l1_level; finalized = Qty finalized; _} -> + Metrics.set_confirmed_level ~level:finalized ; + Metrics.set_l1_level ~level:l1_level | None -> () let main ~data_dir ~evm_node_endpoint ~(config : Configuration.t) = @@ -55,7 +57,7 @@ let main ~data_dir ~evm_node_endpoint ~(config : Configuration.t) = in let* () = set_metrics_level ctxt in - let* () = set_metrics_confirmed_level ctxt in + let* () = set_metrics_confirmed_levels ctxt in Metrics.init ~mode:"rpc" @@ -88,5 +90,5 @@ let main ~data_dir ~evm_node_endpoint ~(config : Configuration.t) = in Blueprints_watcher.notify blueprint ; Metrics.set_level ~level:number ; - let* () = set_metrics_confirmed_level ctxt in + let* () = set_metrics_confirmed_levels ctxt in return_unit -- GitLab From 2fa80948c8aee7d98f2d0257a62d5925c3a62ce1 Mon Sep 17 00:00:00 2001 From: Valentin Chaboche Date: Thu, 14 Nov 2024 17:19:54 +0100 Subject: [PATCH 3/3] EVM/Node: remove spurious assert false --- etherlink/bin_node/lib_dev/evm_context.ml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/etherlink/bin_node/lib_dev/evm_context.ml b/etherlink/bin_node/lib_dev/evm_context.ml index 5c724c64ca2c..6e10ef9af1e2 100644 --- a/etherlink/bin_node/lib_dev/evm_context.ml +++ b/etherlink/bin_node/lib_dev/evm_context.ml @@ -736,7 +736,7 @@ module State = struct let*! head_info in head_info := session_to_head_info ctxt.session ; return_unit) - else assert false + else return_unit type error += Cannot_apply_blueprint of {local_state_level : Z.t} -- GitLab