diff --git a/lib/prom_ex.ex b/lib/prom_ex.ex index 8665f63f..171d9019 100644 --- a/lib/prom_ex.ex +++ b/lib/prom_ex.ex @@ -503,9 +503,6 @@ defmodule PromEx do @doc false def metrics_server_child_spec(acc, config, prom_ex_module, process_name) when is_map(config) do - transport_options = [num_acceptors: config.pool_size] - cowboy_opts = Keyword.drop(config.cowboy_opts, [:port, :transport_options]) - port = case Map.fetch(config, :port) do {:ok, port} when is_integer(port) -> @@ -552,13 +549,7 @@ defmodule PromEx do plug_definition = {PromEx.MetricsServer.Plug, plug_opts} - spec = - Plug.Cowboy.child_spec( - ref: process_name, - scheme: scheme, - plug: plug_definition, - options: [{:port, port}, {:transport_options, transport_options} | cowboy_opts] - ) + spec = server_spec(plug_definition, port, scheme, process_name, config) Logger.info( "PromEx is starting a standalone metrics server on port #{inspect(port)} over #{Atom.to_string(scheme)}" @@ -571,6 +562,35 @@ defmodule PromEx do acc end + cond do + Code.ensure_loaded?(Bandit) -> + def server_spec(plug_definition, port, scheme, _process_name, _config) do + Bandit.child_spec( + scheme: scheme, + plug: plug_definition, + port: port + ) + end + + Code.ensure_loaded?(Plug.Cowboy) -> + def server_spec(plug_definition, port, scheme, process_name, config) do + transport_options = [num_acceptors: config.pool_size] + cowboy_opts = Keyword.drop(config.cowboy_opts, [:port, :transport_options]) + + Plug.Cowboy.child_spec( + ref: process_name, + scheme: scheme, + plug: plug_definition, + options: [{:port, port}, {:transport_options, transport_options} | cowboy_opts] + ) + end + + true -> + def server_spec(_plug_definition, _port, _scheme, _process_name, _config) do + raise "PromEx.MetricsServer requires Bandit or Plug.Cowboy to be available" + end + end + @doc false def metric_prefix(otp_app, plug_in) do [otp_app, :prom_ex, plug_in] diff --git a/mix.exs b/mix.exs index 71dda7ae..16e3626f 100644 --- a/mix.exs +++ b/mix.exs @@ -69,6 +69,7 @@ defmodule PromEx.MixProject do {:phoenix_live_view, ">= 0.20.0", optional: true}, {:plug, ">= 1.16.0", optional: true}, {:plug_cowboy, ">= 2.6.0", optional: true}, + {:bandit, ">= 1.0.0", optional: true}, {:ecto, ">= 3.11.0", optional: true}, {:oban, ">= 2.10.0", optional: true}, {:absinthe, ">= 1.7.0", optional: true}, diff --git a/mix.lock b/mix.lock index ed1639b5..0e56d358 100644 --- a/mix.lock +++ b/mix.lock @@ -1,5 +1,6 @@ %{ "absinthe": {:hex, :absinthe, "1.7.8", "43443d12ad2b4fcce60e257ac71caf3081f3d5c4ddd5eac63a02628bcaf5b556", [:mix], [{:dataloader, "~> 1.0.0 or ~> 2.0", [hex: :dataloader, repo: "hexpm", optional: true]}, {:decimal, "~> 1.0 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: true]}, {:nimble_parsec, "~> 1.2.2 or ~> 1.3", [hex: :nimble_parsec, repo: "hexpm", optional: false]}, {:opentelemetry_process_propagator, "~> 0.2.1 or ~> 0.3", [hex: :opentelemetry_process_propagator, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "c4085df201892a498384f997649aedb37a4ce8a726c170d5b5617ed3bf45d40b"}, + "bandit": {:hex, :bandit, "1.6.11", "2fbadd60c95310eefb4ba7f1e58810aa8956e18c664a3b2029d57edb7d28d410", [:mix], [{:hpax, "~> 1.0", [hex: :hpax, repo: "hexpm", optional: false]}, {:plug, "~> 1.14", [hex: :plug, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}, {:thousand_island, "~> 1.0", [hex: :thousand_island, repo: "hexpm", optional: false]}, {:websock, "~> 0.5", [hex: :websock, repo: "hexpm", optional: false]}], "hexpm", "543f3f06b4721619a1220bed743aa77bf7ecc9c093ba9fab9229ff6b99eacc65"}, "broadway": {:hex, :broadway, "1.1.0", "8ed3aea01fd6f5640b3e1515b90eca51c4fc1fac15fb954cdcf75dc054ae719c", [:mix], [{:gen_stage, "~> 1.0", [hex: :gen_stage, repo: "hexpm", optional: false]}, {:nimble_options, "~> 0.3.7 or ~> 0.4 or ~> 1.0", [hex: :nimble_options, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4.3 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "25e315ef1afe823129485d981dcc6d9b221cea30e625fd5439e9b05f44fb60e4"}, "bunt": {:hex, :bunt, "1.0.0", "081c2c665f086849e6d57900292b3a161727ab40431219529f13c4ddcf3e7a44", [:mix], [], "hexpm", "dc5f86aa08a5f6fa6b8096f0735c4e76d54ae5c9fa2c143e5a1fc7c1cd9bb6b5"}, "bypass": {:hex, :bypass, "2.1.0", "909782781bf8e20ee86a9cabde36b259d44af8b9f38756173e8f5e2e1fabb9b1", [:mix], [{:plug, "~> 1.7", [hex: :plug, repo: "hexpm", optional: false]}, {:plug_cowboy, "~> 2.0", [hex: :plug_cowboy, repo: "hexpm", optional: false]}, {:ranch, "~> 1.3", [hex: :ranch, repo: "hexpm", optional: false]}], "hexpm", "d9b5df8fa5b7a6efa08384e9bbecfe4ce61c77d28a4282f79e02f1ef78d96b80"}, @@ -48,6 +49,7 @@ "telemetry_metrics": {:hex, :telemetry_metrics, "1.0.0", "29f5f84991ca98b8eb02fc208b2e6de7c95f8bb2294ef244a176675adc7775df", [:mix], [{:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "f23713b3847286a534e005126d4c959ebcca68ae9582118ce436b521d1d47d5d"}, "telemetry_metrics_prometheus_core": {:hex, :telemetry_metrics_prometheus_core, "1.2.1", "c9755987d7b959b557084e6990990cb96a50d6482c683fb9622a63837f3cd3d8", [:mix], [{:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}, {:telemetry_metrics, "~> 0.6 or ~> 1.0", [hex: :telemetry_metrics, repo: "hexpm", optional: false]}], "hexpm", "5e2c599da4983c4f88a33e9571f1458bf98b0cf6ba930f1dc3a6e8cf45d5afb6"}, "telemetry_poller": {:hex, :telemetry_poller, "1.1.0", "58fa7c216257291caaf8d05678c8d01bd45f4bdbc1286838a28c4bb62ef32999", [:rebar3], [{:telemetry, "~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "9eb9d9cbfd81cbd7cdd24682f8711b6e2b691289a0de6826e58452f28c103c8f"}, + "thousand_island": {:hex, :thousand_island, "1.3.14", "ad45ebed2577b5437582bcc79c5eccd1e2a8c326abf6a3464ab6c06e2055a34a", [:mix], [{:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "d0d24a929d31cdd1d7903a4fe7f2409afeedff092d277be604966cd6aa4307ef"}, "websock": {:hex, :websock, "0.5.3", "2f69a6ebe810328555b6fe5c831a851f485e303a7c8ce6c5f675abeb20ebdadc", [:mix], [], "hexpm", "6105453d7fac22c712ad66fab1d45abdf049868f253cf719b625151460b8b453"}, "websock_adapter": {:hex, :websock_adapter, "0.5.6", "0437fe56e093fd4ac422de33bf8fc89f7bc1416a3f2d732d8b2c8fd54792fe60", [:mix], [{:bandit, ">= 0.6.0", [hex: :bandit, repo: "hexpm", optional: true]}, {:plug, "~> 1.14", [hex: :plug, repo: "hexpm", optional: false]}, {:plug_cowboy, "~> 2.6", [hex: :plug_cowboy, repo: "hexpm", optional: true]}, {:websock, "~> 0.5", [hex: :websock, repo: "hexpm", optional: false]}], "hexpm", "e04378d26b0af627817ae84c92083b7e97aca3121196679b73c73b99d0d133ea"}, }