From dac00237901b1095a13c95867b0e77a5caafa391 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Thir=C3=A9?= Date: Thu, 27 Jun 2024 00:15:34 +0200 Subject: [PATCH] Tezt/Cloud: Add a support for grafana --- manifest/product_octez.ml | 1 + tezt/lib_cloud/cli.ml | 9 +++- tezt/lib_cloud/cli.mli | 2 + tezt/lib_cloud/cloud.ml | 23 +++++++++- tezt/lib_cloud/dune | 6 ++- tezt/lib_cloud/grafana.ml | 91 ++++++++++++++++++++++++++++++++++++++ tezt/lib_cloud/grafana.mli | 14 ++++++ 7 files changed, 141 insertions(+), 5 deletions(-) create mode 100644 tezt/lib_cloud/grafana.ml create mode 100644 tezt/lib_cloud/grafana.mli diff --git a/manifest/product_octez.ml b/manifest/product_octez.ml index 77405f2b4d2c..42ac55d790d9 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 65e0ee6ef39b..496b5d090727 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 e078c61f7866..6d4ff992c9c0 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 86aa80ed7c5a..d7f676cb6885 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 18e4bc6c4553..8c5855675b5b 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 000000000000..39b0056d1a08 --- /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 000000000000..ee3b5694eca9 --- /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 -- GitLab