lib/cozy_telemetry/poller.ex

defmodule CozyTelemetry.Poller do
  @moduledoc """
  The application that fetches measurements periodically.
  """

  alias CozyTelemetry.Measurements

  @doc """
  Builds a child specifications.
  """
  def child_spec(init_arg) do
    meta = Keyword.get(init_arg, :meta, [])
    measurements_modules = Keyword.get(init_arg, :measurements, [])
    optional_measurements_modules = Keyword.get(init_arg, :optional_measurements, [])

    measurements = load_measurements(measurements_modules, optional_measurements_modules, meta)

    init_arg
    |> Keyword.get(:poller, [])
    |> generate_child_spec(measurements)
  end

  defp load_measurements(modules, optional_modules, meta)
       when is_list(modules) and is_list(optional_modules) do
    measurements =
      Enum.reduce(modules, [], fn module, measurements ->
        measurements ++ Measurements.load_measurements_from_module!(module, meta)
      end)

    optional_measurements =
      Enum.reduce(optional_modules, [], fn module, measurements ->
        measurements ++ Measurements.load_measurements_from_module(module, meta)
      end)

    measurements ++ optional_measurements
  end

  defp generate_child_spec(opts, measurements) do
    opts = Keyword.put(opts, :measurements, measurements)
    :telemetry_poller.child_spec(opts)
  end
end