Goth process not started for Phoenix application

I have something like below in my application.ex

children = [
  {Goth, name: MyApp.Goth},
  MyApp.SomeService,
  MyApp.Endpoint
]

opts = [strategy: :one_for_one, name: MyApp.Supervisor]
Supervisor.start_link(children, opts)

SomeService looks like this:

defmodule MyApp.SomeService do
  use GenServer

  def start_link(opts \\ []) do
    GenServer.start_link(__MODULE__, opts)
  end

  def init(args) do
    {:ok, _} = Application.ensure_all_started(:goth)
    with token <- Goth.fetch!(MyApp.Goth) do
      # Use token, i.e. use it to fetch stuff from Google Cloud Secret Manager
    end

    {:ok, args}
  end
end

With the code above I get this error:

** (Mix) Could not start application myapp: exited in: MyApp.Application.start(:normal, [])
    ** (EXIT) exited in: GenServer.call({:via, Registry, {Goth.Registry, MyApp.Goth}}, :fetch, 5000)
        ** (EXIT) no process: the process is not alive or there's no process currently associated with the given name, possibly because its application isn't started

Is the call to Application.ensure_all_started not enough. Am I using goth and supervisor wrongly?

This is unexpected, the usage seems correct. Could you create a brand new mix project with just goth and verify it works? And then brand new Phoenix project with just goth?

Application.ensure_all_started(:goth) should not be needed if you add goth to your deps:

defp deps do
  [
    # ...
    {:goth, "~> 1.4"},
    # ...
  ]
end
2 Likes

Application.ensure_all_started(:goth) was a last ditch effort to make it work but I think it doesn’t matter here.

You are right, brand new mix projects do work for me. When I checked it further it was because of another service which does this:

defmodule MyApp.BadService do
  def child_spec(_args) do
    children =
      with token <- Goth.fetch!(MyApp.Goth) do
        for index <- 0..10 do
          # create something with Supervisor.child_spec() and token
        end
      end

    %{
      id: BadSupervisor,
      type: :supervisor,
      start: {Supervisor, :start_link, [children, [strategy: :one_for_one]]}
    }
  end
end

I think the manual supervisor setup here broke something, switching it to use Supervisor fixed it for me. I wish the error message was able to pinpoint the file though since the service in my original post was the latest addition and it took the blame :frowning:

I don’t think that’d work. I don’t know off the top my head when exactly child_spec/1 is being called by supervisor, ie whether it say computes all child specs first it calls them as it goes, but I have a feeling it is as if we wrote:

Goth.fetch!(MyGoth)

children = [
  {Goth, name: MyGoth},
]

which obviously won’t work

1 Like

Something like this should work right? (Goth.fetch should be called only after the Goth process started):

In application.ex

children = [
  {Goth, name: MyApp.Goth},
  MyApp.SomeService,
  MyApp.BadService,
  MyApp.Endpoint
]

opts = [strategy: :one_for_one, name: MyApp.Supervisor]
Supervisor.start_link(children, opts)

BadService:

defmodule MyApp.BadService do
  use Supervisor

  def start_link(init_arg) do
    Supervisor.start_link(__MODULE__, init_arg, name: __MODULE__)
  end

  @impl true
  def init(_init_arg) do
    children =
      with token <- Goth.fetch!(MyApp.Goth) do
        for index <- 0..10 do
          # use token here
        end
      end

    Supervisor.init(children, strategy: :one_for_one)
  end
end

It works for me but I’m not sure if I miss anything. Thank you for helping me get this far!