hansonkd

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

Where Next?

Popular in Questions Top

aalberti333
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
pgiesin
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
SoCreat
i’m a new one to elixir which editor can i use vs code? or atom? Thanks! :smiley:
New
jononomo
I am trying to figure out how Mix knows whether the environment is test, dev, or prod -- where is this set? Thanks.
New
fireproofsocks
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
freewebwithme
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
qwerescape
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
hpopp
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
Qqwy
Original source of discussion: This topic on the Pragmatic Programmers' Functional Web Development with Elixir, OTP, and Phoenix forum. ...
New
lanycrost
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 Top

sorentwo
Hello! tl;dr Announcing Oban, an Ecto based job processing library with a focus on reliability and historical observability. After spen...
977 41022 311
New
vonH
In asking this question I am more interested about the expressiveness of the language itself and less concerned about the availability of...
New
joaquinalcerro
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
vertexbuffer
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
alice
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
WestKeys
Currently suffering from paralysis by [HTTP client] analysis. This is rather unusual in Elixirland as there tends to be consensus on the ...
New
Qqwy
Original source of discussion: This topic on the Pragmatic Programmers' Functional Web Development with Elixir, OTP, and Phoenix forum. ...
New
TunkShif
This post is an instruction guide to help you setup your Neovim for Elixir development from scratch. It includes general information on h...
273 38985 115
New
aesmail
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
vrod
I am using the Starship cross-shell prompt – it seems pretty nice, but I get some errors: [WARN] - (starship::utils): Executing command ...
New

We're in Beta

About us Mission Statement