How can I debug issues using an erlang lib?

I am trying out rabbit streams but am having some issues using the Lake library.

I am getting a malformed error from inside the library:

[error] GenServer #PID<0.656.0> terminating
** (CaseClauseError) no case clause matching: {:error, {:malformed, <<65, 77, 81, 80, 0, 0, 9, 1>>}}
    (lake 0.1.2) /Users/me/projects/my-app/deps/lake/src/lake_raw_connection.erl:36: :lake_raw_connection.peer_properties/1
    (lake 0.1.2) /Users/me/projects/my-app/deps/lake/src/lake_raw_connection.erl:24: :lake_raw_connection.connect1/6
    (lake 0.1.2) /Users/me/projects/my-app/deps/lake/src/lake_raw_connection.erl:9: :lake_raw_connection.connect/6
    (lake 0.1.2) /Users/me/projects/my-app/deps/lake/src/lake_connection.erl:35: :lake_connection.connect/6

How do I decode this value to debug the issue? The value doesn’t look particularly long, is this even a useful error message? Is there another way I can troubleshoot this issue?

Calling code for background:

    result = :lake.connect(

I thought it might be an issue passing binaries/strings instead of char lists, but have tried <<"localhost">>, 'localhost', String.to_charlist("localhost"), etc but the called function arguments match so I don’t think it is that.

Example in README says:

{ok, Connection} = lake:connect(host(), port(), <<"guest">>, <<"guest">>, <<"/">>)

So you need to use it like:

:lake.connect("localhost", 5672, "guest", "guest", "/")

And looking at the code - actually host can be both - binary or charlist, so all your approaches for the first argument have no effect on the result.

Look at the source. It says it received some data it cannot recognize. Are you sure you are using the right port (5672)?

Google tells me that 5672 is the RabbitMQ port and 5552 is the RabbitMQ Streaming port

1 Like

This is the four characters AMQP followed by a version number - it’s the header from AMQP v0.9.1; that’s not the protocol that lake wants to speak.

+1 for @derek-zhou’s suggestion that the wrong port is being used.