hansonkd
Best way to validate runtime config before supervisor startup
HI,
I would like to know what the best way to validate runtime configuration before the supervisor starts their children. Essentially I need to check that if one environment variable is set, another is also set, if not the application should exit with 1:
defmodule MyApp.MyAppSupervisor do
# Automatically defines child_spec/1
use Supervisor
alias Vapor.Provider.{File, Env}
def start_link(init_arg) do
Supervisor.start_link(__MODULE__, init_arg, name: __MODULE__)
end
@impl true
def init(_init_arg) do
providers = [
%Env{bindings: [
{:proxy_enable, "PROXY_ENABLE", default: false, map: fn s -> String.upcase(s) == "TRUE" end},
{:proxy_upstream, "PROXY_UPSTREAM", default: ""},
{:proxy_environment, "PROXY_ENVIRONMENT", default: 0, map: &String.to_integer/1},
{:proxy_timeout, "PROXY_TIMEOUT", default: 5000, map: &String.to_integer/1},
{:proxy_max_connections, "PROXY_MAX_CONNECTIONS", default: 100, map: &String.to_integer/1},
]},
# %File{path: "config.yaml", bindings: [kafka_brokers: "kafka.brokers"]},
]
# If values could not be found we raise an exception and halt the boot
# process
config = Vapor.load!(providers)
Application.put_env(:my_app, MyApp.PlugProxy, [
upstream: config[:proxy_upstream],
environment: config[:proxy_environment],
timeout: config[:proxy_timeout]
])
children = [
]
children =
if config.proxy_enable do
if config.proxy_upstream == "" do
IO.puts "You must configure Proxy Upstream"
exit {:shutdown, 1}
end
child_specs =
[
Cables.child_spec(:http_proxy_pool, config.proxy_upstream, :http, max_connections: config.proxy_max_connections),
MyApp.ProxyEndpoint
]
children ++ child_specs
else
children
end
Supervisor.init(children, strategy: :one_for_one)
end
end
However, I get a rather ugly output and also a crash_dump.
>>> mix release
...
>>> _build/dev/rel/myapp/bin/myapp start
You must configure Proxy Upstream
[info] Application myapp exited: MyApp.Application.start(:normal, []) returned an error: shutdown: failed to start child: MyApp.MyAppSupervisor
** (EXIT) shutdown
[os_mon] memory supervisor port (memsup): Erlang has closed
[os_mon] cpu supervisor port (cpu_sup): Erlang has closed
{"Kernel pid terminated",application_controller,"{application_start_failure,myapp,{{shutdown,{failed_to_start_child,'Elixir.MyApp.MyAppSupervisor',shutdown}},{'Elixir.MyApp.Application',start,[normal,[]]}}}"}
Kernel pid terminated (application_controller) ({application_start_failure,myapp,{{shutdown,{failed_to_start_child,'Elixir.MyApp.MyAppSupervisor',shutdown}},{'Elixir.MyApp
Crash dump is being written to: erl_crash.dump...done
What is the best way to not show the error message and prevent it from writing a crash dump?
I would like the output of my application to be:
>>> _build/dev/rel/myapp/bin/myapp start
You must configure Proxy Upstream
>>> ehco $?
1
Popular in Questions
As the title describes, I’m trying to run Enum.map() over a list of key/value pairs, where the value is a map. My data looks like this:
...
New
This should be a simple problem but I just can’t seem to figure it out. I have a standalone Elixir app that won’t find the database.
Dep...
New
i’m a new one to elixir
which editor can i use
vs code? or atom?
Thanks! :smiley:
New
I am trying to figure out how Mix knows whether the environment is test, dev, or prod -- where is this set?
Thanks.
New
I’m working on defining a simple Ecto schema for a table (in PostGres), but I don’t see where I can define a column as NOT NULL. Conside...
New
Using vs code and installed ElixirLS: support and debugger.
And I got an error popped up on start up says
Failed to run ‘elixir’ comma...
New
Is there a way to get the call stack or stack trace at any point in the code? Not from exceptions, but an expression that returns how the...
New
To simplify some tasks at work, I wrote and published this package yesterday. It’s a simple macro that enables Access behaviour on struct...
New
Original source of discussion: This topic on the Pragmatic Programmers' Functional Web Development with Elixir, OTP, and Phoenix forum.
...
New
Hi everyone!
I need implement if…else if…else condition from my elixir code, and anymore of this control flow structures not work proper...
New
Other popular topics
Hello!
tl;dr Announcing Oban, an Ecto based job processing library with a focus on reliability and historical observability.
After spen...
New
In asking this question I am more interested about the expressiveness of the language itself and less concerned about the availability of...
New
Hi there,
I am working with Ecto-Postgresql and I need to call all of the records from a specific table but the table has 40,000 record...
New
Hello, can anybody help here..? I have a list of players and I what to delete an element, but every for loop the list is reverting to ori...
New
Hey,
Just curious what are the main benefits of Elixir compared to Clojure?
When is Elixir more useful than Clojure and vice versa?
Th...
New
Currently suffering from paralysis by [HTTP client] analysis. This is rather unusual in Elixirland as there tends to be consensus on the ...
New
Original source of discussion: This topic on the Pragmatic Programmers' Functional Web Development with Elixir, OTP, and Phoenix forum.
...
New
This post is an instruction guide to help you setup your Neovim for Elixir development from scratch. It includes general information on h...
New
Hello guys,
I have finally made it. I created an admin interface for a framework. It’s been on my todo list for years and with the curre...
New
I am using the Starship cross-shell prompt – it seems pretty nice, but I get some errors:
[WARN] - (starship::utils): Executing command ...
New







