From 5088d9f1fdb7858697148bb877db60fd2787c8a9 Mon Sep 17 00:00:00 2001 From: Julien Date: Tue, 2 Dec 2025 12:30:49 +0100 Subject: [PATCH 1/3] DAL_node: Add telemetry environment to the configuration --- src/lib_dal_node/cli.ml | 36 ++++-- src/lib_dal_node/cli.mli | 1 + src/lib_dal_node/configuration_file.ml | 147 +++++++++++++----------- src/lib_dal_node/configuration_file.mli | 1 + 4 files changed, 110 insertions(+), 75 deletions(-) diff --git a/src/lib_dal_node/cli.ml b/src/lib_dal_node/cli.ml index 23d7d060909d..5adc882d7865 100644 --- a/src/lib_dal_node/cli.ml +++ b/src/lib_dal_node/cli.ml @@ -61,8 +61,8 @@ let merge_experimental_features _ _configuration = () let override_conf ?data_dir ?rpc_addr ?expected_pow ?listen_addr ?public_addr ?endpoint ?(slots_backup_uris = []) ?(trust_slots_backup_uris = false) ?metrics_addr ?profile ?(peers = []) ?history_mode ?service_name - ?service_namespace ?experimental_features ?fetch_trusted_setup - ?(verbose = false) ?(ignore_l1_config_peers = false) + ?service_namespace ?telemetry_env ?experimental_features + ?fetch_trusted_setup ?(verbose = false) ?(ignore_l1_config_peers = false) ?(disable_amplification = false) ?batching_configuration ?publish_slots_regularly configuration = let profile = @@ -99,6 +99,7 @@ let override_conf ?data_dir ?rpc_addr ?expected_pow ?listen_addr ?public_addr service_name = Option.value ~default:configuration.service_name service_name; service_namespace = Option.value ~default:configuration.service_namespace service_namespace; + telemetry_env = Option.either telemetry_env configuration.telemetry_env; fetch_trusted_setup = Option.value ~default:configuration.fetch_trusted_setup @@ -556,6 +557,24 @@ module Term = struct let service_namespace = arg_to_cmdliner service_namespace_arg + let telemetry_env_name_env = + make_env + ~docs:"Opentelemetry" + ~doc:"Enable to provide an opentelemetry environement name" + "OTEL_ENV_NAME" + + let telemetry_env_name_arg = + make_arg + ~doc: + "A name that describes the environment in which the node is running. \ + This name can appear in observability data such as traces." + ~env:telemetry_env_name_env + ~parse:Result.ok + ~pp:Format.pp_print_string + "telemetry-env" + + let telemetry_env = arg_to_cmdliner telemetry_env_name_arg + let fetch_trusted_setup_arg = make_arg ~doc: @@ -717,6 +736,7 @@ module Run = struct history_mode service_name service_namespace + telemetry_env fetch_trusted_setup disable_shard_validation verbose @@ -752,6 +772,7 @@ module Run = struct ?history_mode ?service_name ?service_namespace + ?telemetry_env ?fetch_trusted_setup ~verbose ~ignore_l1_config_peers @@ -820,10 +841,10 @@ module Run = struct $ net_addr $ public_addr $ endpoint $ slots_backup_uris $ trust_slots_backup_uris $ metrics_addr $ attester_profile $ operator_profile $ observer_profile $ bootstrap_profile $ peers - $ history_mode $ service_name $ service_namespace $ fetch_trusted_setup - $ disable_shard_validation $ verbose $ ignore_l1_config_peers - $ disable_amplification $ ignore_topics $ batching_configuration - $ publish_slots_regularly)) + $ history_mode $ service_name $ service_namespace $ telemetry_env + $ fetch_trusted_setup $ disable_shard_validation $ verbose + $ ignore_l1_config_peers $ disable_amplification $ ignore_topics + $ batching_configuration $ publish_slots_regularly)) let cmd = Cmdliner.Cmd.v info term end @@ -1057,7 +1078,7 @@ module Action = struct ?public_addr ?endpoint ?slots_backup_uris ?(trust_slots_backup_uris = false) ?metrics_addr ?attesters ?operators ?observers ?(bootstrap = false) ?peers ?history_mode ?service_name - ?service_namespace ?fetch_trusted_setup + ?service_namespace ?telemetry_env ?fetch_trusted_setup ?(disable_shard_validation = false) ?(verbose = false) ?(ignore_l1_config_peers = false) ?(disable_amplification = false) ?ignore_topics ?batching_configuration ?publish_slots_regularly () = @@ -1080,6 +1101,7 @@ module Action = struct history_mode service_name service_namespace + telemetry_env fetch_trusted_setup disable_shard_validation verbose diff --git a/src/lib_dal_node/cli.mli b/src/lib_dal_node/cli.mli index 94057388a124..2d8e04c19446 100644 --- a/src/lib_dal_node/cli.mli +++ b/src/lib_dal_node/cli.mli @@ -144,6 +144,7 @@ module Action : sig ?history_mode:Configuration_file.history_mode -> ?service_name:string -> ?service_namespace:string -> + ?telemetry_env:string -> ?fetch_trusted_setup:bool -> ?disable_shard_validation:bool -> ?verbose:bool -> diff --git a/src/lib_dal_node/configuration_file.ml b/src/lib_dal_node/configuration_file.ml index c84131baf17d..2f0b1331c3ef 100644 --- a/src/lib_dal_node/configuration_file.ml +++ b/src/lib_dal_node/configuration_file.ml @@ -121,6 +121,7 @@ type t = { version : int; service_name : string; service_namespace : string; + telemetry_env : string option; experimental_features : experimental_features; fetch_trusted_setup : bool; verbose : bool; @@ -200,6 +201,7 @@ let default = version = current_version; service_name = default_service_name; service_namespace = default_service_namespace; + telemetry_env = None; experimental_features = default_experimental_features; fetch_trusted_setup = default_fetch_trusted_setup; verbose = false; @@ -245,6 +247,7 @@ let encoding : t Data_encoding.t = version; service_name; service_namespace; + telemetry_env; experimental_features; fetch_trusted_setup; verbose; @@ -264,16 +267,15 @@ let encoding : t Data_encoding.t = slots_backup_uris, trust_slots_backup_uris, metrics_addr ), - ( history_mode, - profile, - version, - service_name, - service_namespace, - experimental_features, - fetch_trusted_setup, - verbose, - ignore_l1_config_peers, - disable_amplification ) ), + ( (history_mode, profile, version), + ( service_name, + service_namespace, + telemetry_env, + experimental_features, + fetch_trusted_setup, + verbose, + ignore_l1_config_peers, + disable_amplification ) ) ), (batching_configuration, publish_slots_regularly) )) (fun ( ( ( data_dir, rpc_addr, @@ -285,16 +287,15 @@ let encoding : t Data_encoding.t = slots_backup_uris, trust_slots_backup_uris, metrics_addr ), - ( history_mode, - profile, - version, - service_name, - service_namespace, - experimental_features, - fetch_trusted_setup, - verbose, - ignore_l1_config_peers, - disable_amplification ) ), + ( (history_mode, profile, version), + ( service_name, + service_namespace, + telemetry_env, + experimental_features, + fetch_trusted_setup, + verbose, + ignore_l1_config_peers, + disable_amplification ) ) ), (batching_configuration, publish_slots_regularly) ) -> { @@ -313,6 +314,7 @@ let encoding : t Data_encoding.t = version; service_name; service_namespace; + telemetry_env; experimental_features; fetch_trusted_setup; verbose; @@ -377,54 +379,63 @@ let encoding : t Data_encoding.t = ~description:"The point for the DAL node metrics server" (Encoding.option P2p_point.Id.encoding) None)) - (obj10 - (dft - "history_mode" - ~description:"The history mode for the DAL node" - history_mode_encoding - default_history_mode) - (dft - "profiles" - ~description:"The Octez DAL node profiles" - Profile_manager.unresolved_encoding - Profile_manager.Empty) - (req "version" ~description:"The configuration file version" int31) - (dft - "service_name" - ~description:"Name of the service" - Data_encoding.string - default.service_name) - (dft - "service_namespace" - ~description:"Namespace for the service" - Data_encoding.string - default.service_namespace) - (dft - "experimental_features" - ~description:"Experimental features" - experimental_features_encoding - default_experimental_features) - (dft - "fetch_trusted_setup" - ~description:"Install trusted setup" - bool - true) - (dft - "verbose" - ~description: - "Whether to emit details about frequent logging events" - bool - default.verbose) - (dft - "ignore_l1_config_peers" - ~description:"Ignore the boot(strap) peers provided by L1" - bool - default.ignore_l1_config_peers) - (dft - "disable_amplification" - ~description:"Disable amplification" - bool - default.disable_amplification))) + (merge_objs + (obj3 + (dft + "history_mode" + ~description:"The history mode for the DAL node" + history_mode_encoding + default_history_mode) + (dft + "profiles" + ~description:"The Octez DAL node profiles" + Profile_manager.unresolved_encoding + Profile_manager.Empty) + (req + "version" + ~description:"The configuration file version" + int31)) + (obj8 + (dft + "service_name" + ~description:"Name of the service" + Data_encoding.string + default.service_name) + (dft + "service_namespace" + ~description:"Namespace for the service" + Data_encoding.string + default.service_namespace) + (opt + "telemetry_environment" + ~description:"Environment name for telemetry" + Data_encoding.string) + (dft + "experimental_features" + ~description:"Experimental features" + experimental_features_encoding + default_experimental_features) + (dft + "fetch_trusted_setup" + ~description:"Install trusted setup" + bool + true) + (dft + "verbose" + ~description: + "Whether to emit details about frequent logging events" + bool + default.verbose) + (dft + "ignore_l1_config_peers" + ~description:"Ignore the boot(strap) peers provided by L1" + bool + default.ignore_l1_config_peers) + (dft + "disable_amplification" + ~description:"Disable amplification" + bool + default.disable_amplification)))) (obj2 (dft "batching_configuration" diff --git a/src/lib_dal_node/configuration_file.mli b/src/lib_dal_node/configuration_file.mli index 8f54a2c33766..f0e4af4e67c1 100644 --- a/src/lib_dal_node/configuration_file.mli +++ b/src/lib_dal_node/configuration_file.mli @@ -79,6 +79,7 @@ type t = { version : int; (** The version of the configuration. *) service_name : string; (** Name of the service provided by this node. *) service_namespace : string; (** Namespace for the service. *) + telemetry_env : string option; (* Running environment name for telemetry *) experimental_features : experimental_features; (** Experimental features. *) fetch_trusted_setup : bool; (** Should the trusted setup be downloaded if not found or has invalid hash. *) -- GitLab From dc3164765bdd24c162f10f16f3d9cf4de56a5e1a Mon Sep 17 00:00:00 2001 From: Julien Date: Tue, 2 Dec 2025 12:49:03 +0100 Subject: [PATCH 2/3] profiler/otel_backend: add global environment --- .../backends/complex/opentelemetry_profiler.ml | 8 +++++++- .../backends/complex/opentelemetry_profiler.mli | 10 ++++++---- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/src/lib_profiler/backends/complex/opentelemetry_profiler.ml b/src/lib_profiler/backends/complex/opentelemetry_profiler.ml index 48f6089a3713..43bf0ba57acd 100644 --- a/src/lib_profiler/backends/complex/opentelemetry_profiler.ml +++ b/src/lib_profiler/backends/complex/opentelemetry_profiler.ml @@ -5,13 +5,19 @@ (* *) (*****************************************************************************) -let initialize ?unique_identifier service_name = +let initialize ?unique_identifier ?env 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 ; + (match env with + | None -> () + | Some env -> + Opentelemetry.Globals.add_global_attribute + "deployment.environment" + (`String env)) ; Opentelemetry.GC_metrics.basic_setup () ; Ambient_context.set_storage_provider (Ambient_context_lwt.storage ()) ; Opentelemetry_client_cohttp_lwt.setup () diff --git a/src/lib_profiler/backends/complex/opentelemetry_profiler.mli b/src/lib_profiler/backends/complex/opentelemetry_profiler.mli index 9b2948824eeb..1f05beae5dfa 100644 --- a/src/lib_profiler/backends/complex/opentelemetry_profiler.mli +++ b/src/lib_profiler/backends/complex/opentelemetry_profiler.mli @@ -5,10 +5,12 @@ (* *) (*****************************************************************************) -(** [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 +(** [initialize ?unique_identifier ?env 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). [?env] correspond to the execution environment + (NL-vigie1, etherlink-mainnet). *) +val initialize : ?unique_identifier:string -> ?env: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 514ca7f64c2f3d6f8c0581531e4d385b67d06b4e Mon Sep 17 00:00:00 2001 From: Julien Date: Tue, 2 Dec 2025 12:49:30 +0100 Subject: [PATCH 3/3] DAL_node: pass environment name to otel --- src/lib_dal_node/daemon.ml | 1 + 1 file changed, 1 insertion(+) diff --git a/src/lib_dal_node/daemon.ml b/src/lib_dal_node/daemon.ml index a99a71306efc..cd8e36b6b407 100644 --- a/src/lib_dal_node/daemon.ml +++ b/src/lib_dal_node/daemon.ml @@ -607,6 +607,7 @@ let run ?(disable_shard_validation = false) ~ignore_pkhs ~data_dir ~config_file {driver_ids = [Opentelemetry]} (Opentelemetry_profiler.initialize ~unique_identifier:(P2p_peer.Id.to_b58check identity.peer_id) + ?env:config.telemetry_env config.service_name)] ; let self = (* What matters is the identity, the reachable point is more like a placeholder here. *) -- GitLab