From 81f18ff0a582078c58de0ea2f4286f532f8c529c Mon Sep 17 00:00:00 2001 From: Manu S Ajith Date: Mon, 11 Jul 2022 07:00:04 -0500 Subject: [PATCH] Setup promex (#1999) * Setup promex Signed-off-by: Manu S Ajith * Cleanup promex config file Signed-off-by: Manu S Ajith --- .gitignore | 2 ++ config/runtime.exs | 12 ++++++++++++ lib/plausible/application.ex | 3 ++- lib/plausible/prom_ex.ex | 35 +++++++++++++++++++++++++++++++++++ lib/plausible_web/endpoint.ex | 1 + mix.exs | 5 +++-- mix.lock | 4 ++++ 7 files changed, 59 insertions(+), 3 deletions(-) create mode 100644 lib/plausible/prom_ex.ex diff --git a/.gitignore b/.gitignore index 874ac41c6..96ffc0419 100644 --- a/.gitignore +++ b/.gitignore @@ -58,3 +58,5 @@ plausible-report.xml # Dializer /priv/plts/*.plt /priv/plts/*.plt.hash + +.env diff --git a/config/runtime.exs b/config/runtime.exs index b87bb4548..92b5e36f0 100644 --- a/config/runtime.exs +++ b/config/runtime.exs @@ -461,3 +461,15 @@ end config :tzdata, :data_dir, get_var_from_path_or_env(config_dir, "STORAGE_DIR", Application.app_dir(:tzdata, "priv")) + +promex_disabled? = + config_dir + |> get_var_from_path_or_env("PROMEX_DISABLED", "true") + |> String.to_existing_atom() + +config :plausible, Plausible.PromEx, + disabled: promex_disabled?, + manual_metrics_start_delay: :no_delay, + drop_metrics_groups: [], + grafana: :disabled, + metrics_server: :disabled diff --git a/lib/plausible/application.ex b/lib/plausible/application.ex index c249319af..d3288711b 100644 --- a/lib/plausible/application.ex +++ b/lib/plausible/application.ex @@ -18,7 +18,8 @@ defmodule Plausible.Application do Supervisor.child_spec({Cachex, name: :user_agents, limit: 1000}, id: :cachex_user_agents), Supervisor.child_spec({Cachex, name: :sessions, limit: nil}, id: :cachex_sessions), PlausibleWeb.Endpoint, - {Oban, Application.get_env(:plausible, Oban)} + {Oban, Application.get_env(:plausible, Oban)}, + Plausible.PromEx ] opts = [strategy: :one_for_one, name: Plausible.Supervisor] diff --git a/lib/plausible/prom_ex.ex b/lib/plausible/prom_ex.ex new file mode 100644 index 000000000..090096432 --- /dev/null +++ b/lib/plausible/prom_ex.ex @@ -0,0 +1,35 @@ +defmodule Plausible.PromEx do + use PromEx, otp_app: :plausible + + alias PromEx.Plugins + + @impl true + def plugins do + [ + Plugins.Application, + Plugins.Beam, + {Plugins.Phoenix, router: PlausibleWeb.Router, endpoint: PlausibleWeb.Endpoint}, + Plugins.Ecto, + Plugins.Oban + ] + end + + @impl true + def dashboard_assigns do + [ + datasource_id: "grafanacloud-prom", + default_selected_interval: "30s" + ] + end + + @impl true + def dashboards do + [ + {:prom_ex, "application.json"}, + {:prom_ex, "beam.json"}, + {:prom_ex, "phoenix.json"}, + {:prom_ex, "ecto.json"}, + {:prom_ex, "oban.json"} + ] + end +end diff --git a/lib/plausible_web/endpoint.ex b/lib/plausible_web/endpoint.ex index 2bafa948b..22f6c5589 100644 --- a/lib/plausible_web/endpoint.ex +++ b/lib/plausible_web/endpoint.ex @@ -30,6 +30,7 @@ defmodule PlausibleWeb.Endpoint do end plug Plug.RequestId + plug PromEx.Plug, prom_ex_module: Plausible.PromEx plug Plug.Telemetry, event_prefix: [:phoenix, :endpoint] plug Plug.Logger diff --git a/mix.exs b/mix.exs index 8f5a978b2..fa9a5aa1b 100644 --- a/mix.exs +++ b/mix.exs @@ -51,7 +51,7 @@ defmodule Plausible.MixProject do # Type `mix help deps` for examples and options. defp deps do [ - {:finch, "~> 0.12.0"}, + {:finch, "~> 0.12.0", override: true}, {:bcrypt_elixir, "~> 2.0"}, {:combination, "~> 0.0.3"}, {:cors_plug, "~> 3.0"}, @@ -108,7 +108,8 @@ defmodule Plausible.MixProject do {:telemetry, "~> 1.0", override: true}, {:opentelemetry_ecto, "~> 1.0.0"}, {:observer_cli, "~> 1.7"}, - {:mimic, "~> 1.7", only: :test} + {:mimic, "~> 1.7", only: :test}, + {:prom_ex, "~> 1.7.1"} ] end diff --git a/mix.lock b/mix.lock index 6335a670d..8bb3147e5 100644 --- a/mix.lock +++ b/mix.lock @@ -93,6 +93,7 @@ "plug_crypto": {:hex, :plug_crypto, "1.2.2", "05654514ac717ff3a1843204b424477d9e60c143406aa94daf2274fdd280794d", [:mix], [], "hexpm", "87631c7ad914a5a445f0a3809f99b079113ae4ed4b867348dd9eec288cecb6db"}, "poolboy": {:hex, :poolboy, "1.5.2", "392b007a1693a64540cead79830443abf5762f5d30cf50bc95cb2c1aaafa006b", [:rebar3], [], "hexpm", "dad79704ce5440f3d5a3681c8590b9dc25d1a561e8f5a9c995281012860901e3"}, "postgrex": {:hex, :postgrex, "0.16.3", "fac79a81a9a234b11c44235a4494d8565303fa4b9147acf57e48978a074971db", [:mix], [{:connection, "~> 1.1", [hex: :connection, repo: "hexpm", optional: false]}, {:db_connection, "~> 2.1", [hex: :db_connection, repo: "hexpm", optional: false]}, {:decimal, "~> 1.5 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:table, "~> 0.1.0", [hex: :table, repo: "hexpm", optional: true]}], "hexpm", "aeaae1d2d1322da4e5fe90d241b0a564ce03a3add09d7270fb85362166194590"}, + "prom_ex": {:hex, :prom_ex, "1.7.1", "39331ee3fe6f9a8587d8208bf9274a253bb80281700e127dd18786cda5e08c37", [:mix], [{:absinthe, ">= 1.6.0", [hex: :absinthe, repo: "hexpm", optional: true]}, {:broadway, ">= 1.0.2", [hex: :broadway, repo: "hexpm", optional: true]}, {:ecto, ">= 3.5.0", [hex: :ecto, repo: "hexpm", optional: true]}, {:finch, "~> 0.10.2", [hex: :finch, repo: "hexpm", optional: false]}, {:jason, "~> 1.2", [hex: :jason, repo: "hexpm", optional: false]}, {:oban, ">= 2.4.0", [hex: :oban, repo: "hexpm", optional: true]}, {:phoenix, ">= 1.5.0", [hex: :phoenix, repo: "hexpm", optional: true]}, {:phoenix_live_view, ">= 0.14.0", [hex: :phoenix_live_view, repo: "hexpm", optional: true]}, {:plug, ">= 1.12.1", [hex: :plug, repo: "hexpm", optional: true]}, {:plug_cowboy, "~> 2.5.1", [hex: :plug_cowboy, repo: "hexpm", optional: false]}, {:telemetry, "~> 1.0.0", [hex: :telemetry, repo: "hexpm", optional: false]}, {:telemetry_metrics, "~> 0.6.1", [hex: :telemetry_metrics, repo: "hexpm", optional: false]}, {:telemetry_metrics_prometheus_core, "~> 1.0.2", [hex: :telemetry_metrics_prometheus_core, repo: "hexpm", optional: false]}, {:telemetry_poller, "~> 1.0.0", [hex: :telemetry_poller, repo: "hexpm", optional: false]}], "hexpm", "4c978872b88a929833925a0f4d0561824804c671fdd04581e765509ed0a6ed08"}, "public_suffix": {:git, "https://github.com/axelson/publicsuffix-elixir", "89372422ab8b433de508519ef474e39699fd11ca", []}, "ranch": {:hex, :ranch, "1.8.0", "8c7a100a139fd57f17327b6413e4167ac559fbc04ca7448e9be9057311597a1d", [:make, :rebar3], [], "hexpm", "49fbcfd3682fab1f5d109351b61257676da1a2fdbe295904176d5e521a2ddfe5"}, "recon": {:hex, :recon, "2.5.2", "cba53fa8db83ad968c9a652e09c3ed7ddcc4da434f27c3eaa9ca47ffb2b1ff03", [:mix, :rebar3], [], "hexpm", "2c7523c8dee91dff41f6b3d63cba2bd49eb6d2fe5bf1eec0df7f87eb5e230e1c"}, @@ -103,6 +104,9 @@ "sleeplocks": {:hex, :sleeplocks, "1.1.1", "3d462a0639a6ef36cc75d6038b7393ae537ab394641beb59830a1b8271faeed3", [:rebar3], [], "hexpm", "84ee37aeff4d0d92b290fff986d6a95ac5eedf9b383fadfd1d88e9b84a1c02e1"}, "ssl_verify_fun": {:hex, :ssl_verify_fun, "1.1.6", "cf344f5692c82d2cd7554f5ec8fd961548d4fd09e7d22f5b62482e5aeaebd4b0", [:make, :mix, :rebar3], [], "hexpm", "bdb0d2471f453c88ff3908e7686f86f9be327d065cc1ec16fa4540197ea04680"}, "telemetry": {:hex, :telemetry, "1.1.0", "a589817034a27eab11144ad24d5c0f9fab1f58173274b1e9bae7074af9cbee51", [:rebar3], [], "hexpm", "b727b2a1f75614774cff2d7565b64d0dfa5bd52ba517f16543e6fc7efcc0df48"}, + "telemetry_metrics": {:hex, :telemetry_metrics, "0.6.1", "315d9163a1d4660aedc3fee73f33f1d355dcc76c5c3ab3d59e76e3edf80eef1f", [:mix], [{:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "7be9e0871c41732c233be71e4be11b96e56177bf15dde64a8ac9ce72ac9834c6"}, + "telemetry_metrics_prometheus_core": {:hex, :telemetry_metrics_prometheus_core, "1.0.2", "c98b1c580de637bfeac00db41b9fb91fb4c3548ee3d512a8ed7299172312eaf3", [:mix], [{:telemetry, "~> 0.4 or ~> 1.0.0", [hex: :telemetry, repo: "hexpm", optional: false]}, {:telemetry_metrics, "~> 0.6", [hex: :telemetry_metrics, repo: "hexpm", optional: false]}], "hexpm", "48351a0d56f80e38c997b44232b1043e0a081670d16766eee920e6254175b730"}, + "telemetry_poller": {:hex, :telemetry_poller, "1.0.0", "db91bb424e07f2bb6e73926fcafbfcbcb295f0193e0a00e825e589a0a47e8453", [:rebar3], [{:telemetry, "~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "b3a24eafd66c3f42da30fc3ca7dda1e9d546c12250a2d60d7b81d264fbec4f6e"}, "telemetry_registry": {:hex, :telemetry_registry, "0.3.0", "6768f151ea53fc0fbca70dbff5b20a8d663ee4e0c0b2ae589590e08658e76f1e", [:mix, :rebar3], [{:telemetry, "~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "492e2adbc609f3e79ece7f29fec363a97a2c484ac78a83098535d6564781e917"}, "timex": {:hex, :timex, "3.7.7", "3ed093cae596a410759104d878ad7b38e78b7c2151c6190340835515d4a46b8a", [:mix], [{:combine, "~> 0.10", [hex: :combine, repo: "hexpm", optional: false]}, {:gettext, "~> 0.10", [hex: :gettext, repo: "hexpm", optional: false]}, {:tzdata, "~> 1.0", [hex: :tzdata, repo: "hexpm", optional: false]}], "hexpm", "0ec4b09f25fe311321f9fc04144a7e3affe48eb29481d7a5583849b6c4dfa0a7"}, "tls_certificate_check": {:hex, :tls_certificate_check, "1.14.0", "6d1638d56ac68b25c987d401dffb7cd059281339aadc3f8bf27ab33ee19ddbfe", [:rebar3], [{:ssl_verify_fun, "1.1.6", [hex: :ssl_verify_fun, repo: "hexpm", optional: false]}], "hexpm", "b4452ddd3ae89cd84451afa0e218cb3ccd5178fe3c1de7fabcbddb12a137bcf4"},