How to configure extra_application in elixir?

Background

I have an app that checks the machine’s memory usage using :memsup.get_memory_data/0 before proceeding with an operation. If said memory usage is too high, I just refuse to do the operation.

Problem

Now, according to the documentation, :memsup.get_memory_data asks the machine how much memory it has allocated every X time. By default X is 60 minutes. This is wwaaaayyy too long.

There is a way to configure it using :memsup.set_check_interval/1 but the new interval I pass only takes effect after the first check, so it means that if I start the app and then use :memsup.set_check_interval(1) to check the memory every minute, I will have to wait 60 minutes before I start checking the memory every minute like I want. What’s even worst, is that if the application or process is restarted, I go back to waiting 60 minutes again because any changes using this function are not persisted.

Code

So in order to use :memsup you need to include os_mon into your extra_applications mix.exs file:


  def application do
    [
      extra_applications: [:logger, :runtime_tools, :os_mon],
      mod: {MyApp.Application, []}
    ]
  end

However, this doesn’t tell me how I can configure the os_mon app, and reading the erlang documentation lead me to this config page which only confused me further.

I was hopping to see something simple, like changing my config.exs file but I found no information regarding it.

Question

How do I configure os_mon on startup, so its memory check interval is 1 minute instead of 60?

The documentation states that the default is 1 minute (60000 ms). Is that incorrect?

http://erlang.org/doc/man/memsup.html#config

Oops, you are correct. This a a confusion from my part. Turns out I forgot that memsup.get_check_interval/0 which returns in ms:

:memsup.get_check_interval()
60000

Converts to minutes like the following: :memsup.get_check_interval() /1000 / 60. I had forgotten the /60 part, my bad.

Still, now I have to know. How would I configure this in my mix.exs (lets say I want every 5 minutes)?

Don’t know.

As far as I can tell sys.config would need something like

{os_mon, [{memory_check_interval, 5}]}

So according to this

config :os_mon,
  memory_check_interval: 5

via the config.exs (or any file it references).

At least that would be my starting point …


In any case - the fact that set_check_interval/1 takes minutes but get_check_interval/0 returns ms is confusing.

3 Likes