https://gitlab.com/tezos/tezos
Tip revision: 1dd2728a449aa73cf8939a5f3cd23d453c99171f authored by Antonio Locascio on 07 February 2024, 13:05:54 UTC
wip
wip
Tip revision: 1dd2728
main.ml
(*****************************************************************************)
(* *)
(* Open Source License *)
(* Copyright (c) 2018 Dynamic Ledger Solutions, Inc. <contact@tezos.com> *)
(* Copyright (c) 2019-2021 Nomadic Labs, <contact@nomadic-labs.com> *)
(* *)
(* Permission is hereby granted, free of charge, to any person obtaining a *)
(* copy of this software and associated documentation files (the "Software"),*)
(* to deal in the Software without restriction, including without limitation *)
(* the rights to use, copy, modify, merge, publish, distribute, sublicense, *)
(* and/or sell copies of the Software, and to permit persons to whom the *)
(* Software is furnished to do so, subject to the following conditions: *)
(* *)
(* The above copyright notice and this permission notice shall be included *)
(* in all copies or substantial portions of the Software. *)
(* *)
(* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR*)
(* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, *)
(* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL *)
(* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER*)
(* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING *)
(* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER *)
(* DEALINGS IN THE SOFTWARE. *)
(* *)
(*****************************************************************************)
(* FIXME: https://gitlab.com/tezos/tezos/-/issues/4025
Remove backwards compatible Tezos symlinks. *)
let warn_if_argv0_name_not_octez () =
let executable_name = Filename.basename Sys.argv.(0) in
let prefix = "tezos-" in
if TzString.has_prefix executable_name ~prefix then
let expected_name =
let len_prefix = String.length prefix in
"octez-"
^ String.sub
executable_name
len_prefix
(String.length executable_name - len_prefix)
in
Format.eprintf
"@[<v 2>@{<warning>@{<title>Warning@}@}@,\
The executable with name @{<kwd>%s@} has been renamed to @{<kwd>%s@}. \
The name @{<kwd>%s@} is now@,\
deprecated, and it will be removed in a future release. Please update@,\
your scripts to use the new name.@]@\n\
@."
executable_name
expected_name
executable_name
else ()
let () =
Printexc.register_printer @@ function
| Unix.Unix_error (code, "", _) -> Some (Unix.error_message code)
| Unix.Unix_error (code, function_name, "") ->
Some (Printf.sprintf "in %s: %s" function_name (Unix.error_message code))
| Unix.Unix_error (code, function_name, arguments) ->
Some
(Printf.sprintf
"in %s %S: %s"
function_name
arguments
(Unix.error_message code))
| _ -> None
let () =
(* The default allocation policy of Octez is "best-fit" which gives
the best compromise in terms of performances and memory
consumption. This default policy can be changed if the user set
an environment variable. *)
(* Any change to this constant should be replicated into the
external validator in [src/bin_validation/main_validator.ml]. *)
let default_allocation_policy = 2 in
let current = Gc.get () in
(match Sys.getenv_opt "OCAMLRUNPARAM" with
| None -> Gc.set {current with allocation_policy = default_allocation_policy}
| Some _ -> ()) ;
if (Gc.get ()).allocation_policy <> default_allocation_policy then
Format.eprintf
"WARNING: Default allocation policy changed: %d (default %d)@."
current.allocation_policy
default_allocation_policy
(* This can be removed once the protocol is fixed
(currently there is [to_int Int32.max_int] which is obviously invalid). *)
let () =
if Sys.word_size <> 64 then (
prerr_endline "Non-64 bit architectures are not supported." ;
exit 1)
let () = warn_if_argv0_name_not_octez ()
let () =
if Filename.basename Sys.argv.(0) = Updater.compiler_name then (
try
Octez_protocol_compiler.Compiler.main
Octez_protocol_compiler_native.Native.driver
Tezos_version_value.Bin_version.version_string ;
Stdlib.exit 0
with exn ->
Format.eprintf "%a\n%!" Opterrors.report_error exn ;
Stdlib.exit 1)
let () =
if Filename.basename Sys.argv.(0) = "octez-validator" then
Tezos_validation.Command_line.run ()
let () =
if Filename.basename Sys.argv.(0) = "octez-rpc-process" then
exit (Cmdliner.Cmd.eval Octez_rpc_process.Main.cmd)
let term =
let open Cmdliner.Term in
ret (const (`Help (`Pager, None)))
let description =
[
`S "DESCRIPTION";
`P "Entry point for initializing, configuring and running a Tezos node.";
`P Node_identity_command.Manpage.command_description;
`P Node_run_command.Manpage.command_description;
`P Node_replay_command.Manpage.command_description;
`P Config_command.Manpage.command_description;
`P Node_upgrade_command.Manpage.command_description;
`P Node_snapshot_command.Manpage.command_description;
`P Node_reconstruct_command.Manpage.command_description;
`P Node_storage_command.Manpage.command_description;
]
let man = description @ Node_run_command.Manpage.examples
let info =
let version = Tezos_version_value.Bin_version.version_string in
Cmdliner.Cmd.info ~doc:"The Octez node" ~man ~version "octez-node"
module Node_metrics_command = struct
let dump_metrics () =
let open Prometheus in
let open Lwt_syntax in
let metric_type_to_string = function
| Counter -> "Counter"
| Gauge -> "Gauge"
| Summary -> "Summary"
| Histogram -> "Histogram"
in
let pp_label_names fmt =
Format.pp_print_list
~pp_sep:(fun fmt () -> Format.fprintf fmt ";")
(fun fmt v -> Format.fprintf fmt "%a" LabelName.pp v)
fmt
in
Format.printf "@[<v>Name,Type,Description,Labels" ;
let* metrics = Prometheus.CollectorRegistry.(collect default) in
let print_metrics metrics =
List.iter
(fun (v, _) ->
Format.printf
"@,@[%a@],%s,\"%s\",%a"
MetricName.pp
v.MetricInfo.name
(metric_type_to_string v.MetricInfo.metric_type)
v.MetricInfo.help
pp_label_names
v.MetricInfo.label_names)
(Prometheus.MetricFamilyMap.to_list metrics)
in
print_metrics metrics ;
Format.printf "@]@." ;
return_unit
let dump_metrics () = Lwt_main.run (dump_metrics ())
module Term = struct
let process _ = `Ok (dump_metrics ())
let docs = "METRICS OPTIONS"
let dump_metrics =
let doc = "Show available openmetrics in csv format." in
Cmdliner.Arg.(value & flag & info ~docs ~doc ["dump-metrics"])
let term = Cmdliner.Term.(ret (const process $ dump_metrics))
end
module Manpage = struct
let command_description =
"The $(b,dump-metrics) command is meant to dump openmetrics that are \
collected by the Tezos node on console."
let description = [`S "DESCRIPTION"; `P command_description]
let man = description
let info =
Cmdliner.Cmd.info
~doc:"Show all the openmetrics collected by the Tezos node"
~man
"dump-metrics"
end
let cmd = Cmdliner.Cmd.v Manpage.info Term.term
end
let commands =
Cmdliner.Cmd.group
~default:term
info
[
Node_run_command.cmd;
Node_replay_command.cmd;
Config_command.cmd;
Node_identity_command.cmd;
Node_upgrade_command.cmd;
Node_snapshot_command.cmd;
Node_reconstruct_command.cmd;
Node_storage_command.cmd;
Node_metrics_command.cmd;
]
let () =
Random.self_init () ;
exit (Cmdliner.Cmd.eval commands)