diff --git a/manifest/product_octez.ml b/manifest/product_octez.ml index 77405f2b4d2c03adaec44775d5f805f2dbe83c7a..42ac55d790d996081236b5a6e899993a122f3287 100644 --- a/manifest/product_octez.ml +++ b/manifest/product_octez.ml @@ -2332,6 +2332,7 @@ let tezt_cloud = [ tezt_lib |> open_ |> open_ ~m:"Base"; tezt_tezos |> open_ |> open_ ~m:"Runnable.Syntax"; + tezt_performance_regression |> open_; ] ~release_status:Unreleased diff --git a/tezt/lib_cloud/cli.ml b/tezt/lib_cloud/cli.ml index 65e0ee6ef39bc48a8971f8859b122361cfaea320..496b5d0907279dcb1e95b43b033a3b8e2c3e051b 100644 --- a/tezt/lib_cloud/cli.ml +++ b/tezt/lib_cloud/cli.ml @@ -84,12 +84,19 @@ let website_port = ~description:"Set the port used for the website. Default is 8080" 8080 +let grafana = + Clap.flag + ~section + ~set_long:"grafana" + ~description:"Flag to set whether to run grafana" + false + let prometheus = Clap.flag ~section ~set_long:"prometheus" ~description:"Flag to set whether metrics are exported into prometheus" - false + grafana let prometheus_snapshot_directory = Clap.default_string diff --git a/tezt/lib_cloud/cli.mli b/tezt/lib_cloud/cli.mli index e078c61f78660399114f375a1fde847228f4c4bb..6d4ff992c9c0c32c6fc33774a823a2cfd40df58c 100644 --- a/tezt/lib_cloud/cli.mli +++ b/tezt/lib_cloud/cli.mli @@ -46,6 +46,8 @@ val website_port : int test, the database is snapshotted so that it can be imported later on. *) val prometheus : bool +val grafana : bool + val prometheus_snapshot_directory : string val prometheus_snapshot : string option diff --git a/tezt/lib_cloud/cloud.ml b/tezt/lib_cloud/cloud.ml index 86aa80ed7c5a287ed1a8800509fddfb7cd267b65..d7f676cb688527e46e17c45d45c49acd3862be1b 100644 --- a/tezt/lib_cloud/cloud.ml +++ b/tezt/lib_cloud/cloud.ml @@ -34,6 +34,7 @@ type t = { agents : Agent.t list; website : Web.t option; prometheus : Prometheus.t option; + grafana : Grafana.t option; deployement : Deployement.t option; } @@ -56,6 +57,9 @@ let shutdown ?exn t = let* () = Option.fold ~none:Lwt.return_unit ~some:Prometheus.shutdown t.prometheus in + let* () = + Option.fold ~none:Lwt.return_unit ~some:Grafana.shutdown t.grafana + in let* () = Option.fold ~none:Lwt.return_unit @@ -109,7 +113,14 @@ let register ?(docker_push = true) ?vms ~__FILE__ ~title ~tags ?seed f = match vms with | None -> (* If there is no configuration, it is a similar scenario as if there were not agent. *) - f {agents = []; website = None; prometheus = None; deployement = None} + f + { + agents = []; + website = None; + grafana = None; + prometheus = None; + deployement = None; + } | Some configurations -> let ports_per_vm = Cli.ports_per_vm in let* deployement = @@ -151,7 +162,15 @@ let register ?(docker_push = true) ?vms ~__FILE__ ~title ~tags ?seed f = Lwt.return_some prometheus else Lwt.return_none in - let t = {website; agents; prometheus; deployement = Some deployement} in + let* grafana = + if Cli.grafana then + let* grafana = Grafana.run () in + Lwt.return_some grafana + else Lwt.return_none + in + let t = + {website; agents; prometheus; grafana; deployement = Some deployement} + in let sigint = sigint () in let main_promise = (* We also catch error raised from the scenario directly. *) diff --git a/tezt/lib_cloud/dune b/tezt/lib_cloud/dune index 18e4bc6c4553b806ccaad7d5c44f89c852cf2e3e..8c5855675b5b582416a39e0aafbcb5d62f84a8bb 100644 --- a/tezt/lib_cloud/dune +++ b/tezt/lib_cloud/dune @@ -6,10 +6,12 @@ (package tezt-cloud) (libraries tezt - tezt-tezos) + tezt-tezos + tezt-tezos.tezt-performance-regression) (flags (:standard) -open Tezt -open Tezt.Base -open Tezt_tezos - -open Tezt_tezos.Runnable.Syntax)) + -open Tezt_tezos.Runnable.Syntax + -open Tezt_tezos_tezt_performance_regression)) diff --git a/tezt/lib_cloud/grafana.ml b/tezt/lib_cloud/grafana.ml new file mode 100644 index 0000000000000000000000000000000000000000..39b0056d1a08752b593d960c2ff18a41386d4ec2 --- /dev/null +++ b/tezt/lib_cloud/grafana.ml @@ -0,0 +1,91 @@ +(*****************************************************************************) +(* *) +(* SPDX-License-Identifier: MIT *) +(* SPDX-FileCopyrightText: 2024 Nomadic Labs *) +(* *) +(*****************************************************************************) + +include Tezt_tezos_tezt_performance_regression.Grafana + +type t = {provisioning_file : string; dashboard_directory : string} + +let provisioning_file () = + let provisioning_file = + Filename.get_temp_dir_name () + // "grafana" // "provisioning" // "provisioning.yml" + in + let* () = Process.run "mkdir" ["-p"; provisioning_file |> Filename.dirname] in + let content = + {| +apiVersion: 1 + +datasources: + - name: Prometheus + type: prometheus + access: proxy + url: http://prometheus:9090 + isDefault: true + +providers: + - name: 'default' + orgId: 1 + folder: '' + type: file + disableDeletion: true + options: + path: /var/lib/grafana/dashboards +|} + in + with_open_out provisioning_file (fun oc -> + Stdlib.seek_out oc 0 ; + output_string oc content) ; + Lwt.return provisioning_file + +let shutdown _t = Process.run "docker" ["kill"; "grafana"] + +let run () = + let cmd = "docker" in + let* () = + Process.run "mkdir" ["-p"; Filename.get_temp_dir_name () // "grafana"] + in + let dashboard_directory = + Filename.get_temp_dir_name () // "grafana" // "dashboards" + in + let* () = + Process.run "mkdir" ["-p"; dashboard_directory |> Filename.dirname] + in + let* provisioning_file = provisioning_file () in + let args = + [ + "run"; + "-d"; + "--rm"; + "--name"; + "grafana"; + "--network"; + "host"; + "-p"; + "3000:3000"; + "-e"; + "GF_AUTH_ANONYMOUS_ENABLED=true"; + "-e"; + "GF_AUTH_ANONYMOUS_ORG_ROLE=Viewer"; + "-v"; + Format.asprintf + "%s:/etc/grafana/provisioning" + (Filename.dirname provisioning_file); + "-v"; + Format.asprintf "%s:/var/lib/grafana/dashboards" dashboard_directory; + "grafana/grafana"; + ] + in + let* status = Process.spawn cmd args |> Process.wait in + let* () = + match status with + | WEXITED 0 -> Lwt.return_unit + | _ -> + (* For some reason the container is already alive, we restart it. *) + let* () = shutdown () in + Process.run cmd args + in + Lwt.return {provisioning_file; dashboard_directory} diff --git a/tezt/lib_cloud/grafana.mli b/tezt/lib_cloud/grafana.mli new file mode 100644 index 0000000000000000000000000000000000000000..ee3b5694eca909cc8e6a2a867ea059c964e598a7 --- /dev/null +++ b/tezt/lib_cloud/grafana.mli @@ -0,0 +1,14 @@ +(*****************************************************************************) +(* *) +(* SPDX-License-Identifier: MIT *) +(* SPDX-FileCopyrightText: 2024 Nomadic Labs *) +(* *) +(*****************************************************************************) + +include module type of Tezt_tezos_tezt_performance_regression.Grafana + +type t + +val run : unit -> t Lwt.t + +val shutdown : t -> unit Lwt.t