Skip to content

Crashing on a struct that gets persisted as JSON  #17

@bhuntpenn

Description

@bhuntpenn

Hi there, I add Ecto.DevLogger.install(Brybags.Repo) to my Application.start/2 callback, and start the application.

The following crash is logged to the terminal.

10:46:32.388 [error] Handler [:ecto_dev_logger, :brybags, :repo] has failed and has been detached. Class=:error
Reason=%Protocol.UndefinedError{
  protocol: Ecto.DevLogger.PrintableParameter,
  value: %Cheese.Assignments{
    members: [%Cheese.Member{node: :"brybags@catah", can_provide: []}],
    assignments: [
      %Cheese.Assignment{
        service: Ingest.Providers.GoatsSupervisor,
        shard_id: 0,
        owning_node: nil
      },
      %Cheese.Assignment{
        service: Cheese.Registration.ButterSupervisor,
        shard_id: 1,
        owning_node: nil
      }
    ]
  },
  description: ""
}
Stacktrace=[
  {Ecto.DevLogger.PrintableParameter, :impl_for!, 1,
   [file: 'lib/ecto/dev_logger/printable_parameter.ex', line: 1]},
  {Ecto.DevLogger.PrintableParameter, :to_expression, 1,
   [file: 'lib/ecto/dev_logger/printable_parameter.ex', line: 31]},
  {Ecto.DevLogger, :"-inline_params/4-fun-1-", 3,
   [file: 'lib/ecto/dev_logger.ex', line: 109]},
  {Regex, :apply_list, 5, [file: 'lib/regex.ex', line: 756]},
  {Regex, :apply_list, 5, [file: 'lib/regex.ex', line: 751]},
  {Regex, :replace, 4, [file: 'lib/regex.ex', line: 686]},
  {Ecto.DevLogger, :"-telemetry_handler/4-fun-0-", 6,
   [file: 'lib/ecto/dev_logger.ex', line: 82]},
  {Logger, :__do_log__, 4, [file: 'lib/logger.ex', line: 884]},
  {:telemetry, :"-execute/3-fun-0-", 4,
   [
     file: '/Users/Bryan.Hunt/repos/brybags/devlogger_experiment/deps/telemetry/src/telemetry.erl',
     line: 135
   ]},
  {:lists, :foreach, 2, [file: 'lists.erl', line: 1342]},
  {Ecto.Adapters.SQL, :log, 4, [file: 'lib/ecto/adapters/sql.ex', line: 1078]},
  {DBConnection, :log, 5, [file: 'lib/db_connection.ex', line: 1559]},
  {Postgrex, :query_prepare_execute, 4, [file: 'lib/postgrex.ex', line: 361]},
  {Ecto.Adapters.SQL, :query!, 4, [file: 'lib/ecto/adapters/sql.ex', line: 438]},
  {Cheese.Adapters.Postgres.Server, :handle_call, 3,
   [file: 'lib/cheese/adapters/postgres/server.ex', line: 107]},
  {:gen_server, :try_handle_call, 4, [file: 'gen_server.erl', line: 721]},
  {:gen_server, :handle_msg, 6, [file: 'gen_server.erl', line: 750]},
  {:proc_lib, :init_p_do_apply, 3, [file: 'proc_lib.erl', line: 226]}
]

I then install the handler manually, Ecto.DevLogger.install(Brybags.Repo) and everything works fine.

I was thinking, perhaps I should implement a PrintableParameter like such, but doesn't seem to have taken effect (I did edit the dep source code directly, but in any event, I'm not sure what approach I should take).

  defimpl Ecto.DevLogger.PrintableParameter, for: Any do # or maybe 
    # test
    def to_expression(x) when is_map(x) , do: to_string_literal( Map.from_struct(x))
    def to_string_literal(x), do: Jason.encode!(Map.from_struct(x))
  end

Or would I have to do something like this?

  defimpl Ecto.DevLogger.PrintableParameter, for: Cheese.Assignments.. 
  defimpl Ecto.DevLogger.PrintableParameter, for: Cheese.Assignment..
  defimpl Ecto.DevLogger.PrintableParameter, for: Cheese.Member.. 

I'm asking because I'm wondering if I can add something to improve first-time user experience, it works fine by manually running Ecto.DevLogger.install(Brybags.Repo) - but I'm thinking of the next person.

  • Some names have been changed to protect the guilty.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions