how to suppress "PROGRESS REPORT" from Erlang interactive shell - erlang

I'm using Erlang/OTP 20 on macOS. Eshell prints multiple lines with heading "PROGRESS REPORT", I want it to not print that.
Inverse greping and similar work around are not desirable.
Here's a sample of statements getting printed:
=PROGRESS REPORT==== 28-Aug-2017::22:39:40 ===
supervisor: {local,sasl_safe_sup}
started: [{pid,<0.59.0>},
{id,alarm_handler},
{mfargs,{alarm_handler,start_link,[]}},
{restart_type,permanent},
{shutdown,2000},
{child_type,worker}]
=PROGRESS REPORT==== 28-Aug-2017::22:39:40 ===
supervisor: {local,sasl_sup}
started: [{pid,<0.58.0>},
{id,sasl_safe_sup},
{mfargs,
{supervisor,start_link,
[{local,sasl_safe_sup},sasl,safe]}},
{restart_type,permanent},
{shutdown,infinity},
{child_type,supervisor}]
=PROGRESS REPORT==== 28-Aug-2017::22:39:40 ===
supervisor: {local,sasl_sup}
started: [{pid,<0.60.0>},
{id,release_handler},
{mfargs,{release_handler,start_link,[]}},
{restart_type,permanent},
{shutdown,2000},
{child_type,worker}]

As described in the documentation for the sasl application, you can suppress progress reports by setting the configuration parameter errlog_type to error.
You can specify it on the command line:
erl -sasl errlog_type error
Or, if you're using a sys.config file, add it there:
{sasl, [{errlog_type, error}]}
Setting it with application:set_env after the node has started won't work: it only takes effect if the value was set before the sasl application started.

If you don't want the SASL app to start at all you can use a different boot script:
erl -boot start_clean
This will disable SASL messages completely.

Related

How do I disable the error logger in EUnit test cases?

When running an EUnit test that tests an application or starts and stops (or tests killing of) gen_server or supervisor processs, error logger outputs crash reports and other messages by default:
$ rebar3 eunit 1s
===> Verifying dependencies...
===> Compiling my_app
===> Performing EUnit tests...
...........=INFO REPORT==== 5-Sep-2019::16:32:18.760457 ===
application: ranch
exited: stopped
type: temporary
=INFO REPORT==== 5-Sep-2019::16:32:18.760545 ===
application: xmerl
exited: stopped
type: temporary
=INFO REPORT==== 5-Sep-2019::16:32:18.763882 ===
application: my_app
exited: stopped
type: temporary
......=ERROR REPORT==== 5-Sep-2019::16:32:18.814431 ===
** Generic server my_app_sup terminating
** Last message in was {'EXIT',<0.279.0>,test_kill}
** When Server state == {state,
{local,my_app_sup},
simple_one_for_one,
{[undefined],
#{undefined =>
{child,undefined,undefined,
{my_app_server,start_link,[]},
transient,5000,worker,
[my_app_server]}}},
{maps,#{<0.355.0> => [my_app_test]}},
1,5,[],0,my_app_sup,[]}
** Reason for termination ==
** test_kill
=CRASH REPORT==== 5-Sep-2019::16:32:18.814598 ===
crasher:
initial call: supervisor:my_app_sup/1
pid: <0.354.0>
registered_name: my_app_sup
exception exit: test_kill
in function gen_server:decode_msg/9 (gen_server.erl, line 432)
ancestors: [<0.279.0>]
message_queue_len: 0
messages: []
links: []
dictionary: []
trap_exit: true
status: running
heap_size: 1598
stack_size: 27
reductions: 6463
neighbours:
...........
Finished in 0.457 seconds
28 tests, 0 failures
How can I avoid these expected messages during testing?
These can be avoided by temporarily disabling TTY reports in the error logger. Surround the code which produces the reports with this:
my_test() ->
error_logger:tty(false),
try
% code that produces error logger reports
after
error_logger:tty(true)
end.
If you use this many times in the tests, this wrapper can be useful:
without_error_logger(Fun) ->
error_logger:tty(false),
try
Fun()
after
error_logger:tty(true)
end.
Which is used like so:
without_error_logger(fun() ->
% code that produces error logger reports
end)

How do you use Gun as a Cowboy client?

I followed the Getting Started instructions for Cowboy, and I've got Cowboy running and listening on port 8080, and I got the Hello Erlang! response when I entered http://localhost:8080 in my browser. Now, how do I use Gun to connect to Cowboy?
I read the Gun docs, and it says to add "Gun as an erlang.mk dependency". So I downloaded erlang.mk:
~/erlang_programs/my_gun$ curl -O https://erlang.mk/erlang.mk
and following the Erlang.mk User Guide, I created an application:
~/erlang_programs/my_gun$ gmake -f erlang.mk bootstrap
Then I added gun as a dependency to the Makefile:
PROJECT = my_gun
PROJECT_DESCRIPTION = New project
PROJECT_VERSION = 0.1.0
DEPS = gun
include erlang.mk
Then I compiled:
~/erlang_programs/my_gun$ gmake
gmake[1]: Entering directory '/Users/7stud/erlang_programs/my_gun/deps/gun'
gmake[2]: Entering directory '/Users/7stud/erlang_programs/my_gun/deps/cowlib'
ERLC cow_cookie.erl cow_date.erl cow_hpack.erl cow_http.erl cow_http2.erl cow_http_hd.erl cow_http_te.erl cow_mimetypes.erl cow_multipart.erl cow_qs.erl cow_spdy.erl cow_sse.erl cow_uri.erl cow_ws.erl
APP cowlib
gmake[2]: Leaving directory '/Users/7stud/erlang_programs/my_gun/deps/cowlib'
gmake[2]: Entering directory '/Users/7stud/erlang_programs/my_gun/deps/ranch'
DEPEND ranch.d
ERLC ranch.erl ranch_acceptor.erl ranch_acceptors_sup.erl ranch_app.erl ranch_conns_sup.erl ranch_listener_sup.erl ranch_protocol.erl ranch_server.erl ranch_ssl.erl ranch_sup.erl ranch_tcp.erl ranch_transport.erl
APP ranch
gmake[2]: Leaving directory '/Users/7stud/erlang_programs/my_gun/deps/ranch'
DEPEND gun.d
ERLC gun.erl gun_app.erl gun_content_handler.erl gun_data.erl gun_http.erl gun_http2.erl gun_spdy.erl gun_sse.erl gun_sup.erl gun_ws.erl gun_ws_handler.erl
APP gun
GEN rebar.config
gmake[1]: Leaving directory '/Users/7stud/erlang_programs/my_gun/deps/gun'
DEPEND my_gun.d
ERLC my_gun_app.erl my_gun_sup.erl
APP my_gun
GEN /Users/7stud/erlang_programs/my_gun/.erlang.mk/relx
===> Starting relx build process ...
===> Resolving OTP Applications from directories:
/Users/7stud/erlang_programs/my_gun/ebin
/Users/7stud/erlang_programs/my_gun/deps
/Users/7stud/.evm/erlang_versions/otp_src_19.2/lib/erlang/lib
/Users/7stud/erlang_programs/my_gun/apps
===> Resolved my_gun_release-1
===> rendering builtin_hook_status hook to "/Users/7stud/erlang_programs/my_gun/_rel/my_gun_release/bin/hooks/builtin/status"
===> Including Erts from /Users/7stud/.evm/erlang_versions/otp_src_19.2/lib/erlang
===> release successfully created!
===> tarball /Users/7stud/erlang_programs/my_gun/_rel/my_gun_release/my_gun_release-1.tar.gz successfully created!
But when I switch to the erlang shell and try to start gun, I get an error:
~/erlang_programs/my_gun$ erl
Erlang/OTP 19 [erts-8.2] [source] [64-bit] [smp:4:4] [async-threads:10] [hipe] [kernel-poll:false]
Eshell V8.2 (abort with ^G)
1> application:ensure_all_started(gun).
{error,{gun,{"no such file or directory","gun.app"}}}
Can someone post a simple example of how to use Gun (or any other http client with websocket support) to connect to Cowboy?
Okay, I made some progress. I deleted the my_gun directory, recreated the directory, redownloaded erlang.mk, and created a release with the following command:
~/erlang_programs/my_gun$ gmake -f erlang.mk bootstrap-lib bootstrap-rel
Then I added the gun dependency to the Makefile (as described above). Then I did:
~/erlang_programs/my_gun$ gmake run
If there are no errors in the code, then an erlang shell will launch. In the erlang shell, I entered the following code (see the tip below to avoid having to type all the code in the shell):
(my_gun#127.0.0.1)1> application:ensure_all_started(gun).
{ok,[]}
(my_gun#127.0.0.1)2> {ok, ConnPid} = gun:open("localhost", 8080).
=PROGRESS REPORT==== 10-Jul-2017::05:21:58 ===
supervisor: {local,inet_gethost_native_sup}
started: [{pid,<0.366.0>},{mfa,{inet_gethost_native,init,[[]]}}]
{ok,<0.364.0>}
=PROGRESS REPORT==== 10-Jul-2017::05:21:58 ===
supervisor: {local,kernel_safe_sup}
started: [{pid,<0.365.0>},
{id,inet_gethost_native_sup},
{mfargs,{inet_gethost_native,start_link,[]}},
{restart_type,temporary},
{shutdown,1000},
{child_type,worker}]
(my_gun#127.0.0.1)3> {ok, Protocol} = gun:await_up(ConnPid).
{ok,http}
(my_gun#127.0.0.1)4> gun:ws_upgrade(ConnPid, "/websocket").
#Ref<0.0.3.244>
(my_gun#127.0.0.1)5> receive
(my_gun#127.0.0.1)5> {gun_ws_upgrade, ConnPid, ok, Headers} ->
(my_gun#127.0.0.1)5> upgrade_success(ConnPid);
(my_gun#127.0.0.1)5> {gun_response, ConnPid, _, _, Status, Headers} ->
(my_gun#127.0.0.1)5> exit({ws_upgrade_failed, Status, Headers});
(my_gun#127.0.0.1)5> {gun_error, ConnPid, StreamRef, Reason} ->
(my_gun#127.0.0.1)5> exit({ws_upgrade_failed, Reason})
(my_gun#127.0.0.1)5> after 1000 ->
(my_gun#127.0.0.1)5> exit(timeout)
(my_gun#127.0.0.1)5> end.
=CRASH REPORT==== 10-Jul-2017::05:25:17 ===
crasher:
initial call: gun:proc_lib_hack/5
pid: <0.364.0>
registered_name: []
exception exit: {{owner_gone,normal},
[{gun,loop,1,[{file,"src/gun.erl"},{line,706}]},
{gun,proc_lib_hack,5,[{file,"src/gun.erl"},{line,535}]},
{proc_lib,init_p_do_apply,3,
[{file,"proc_lib.erl"},{line,247}]}]}
in function gun:proc_lib_hack/5 (src/gun.erl, line 540)
ancestors: [gun_sup,<0.343.0>]
messages: []
links: [<0.344.0>]
dictionary: []
trap_exit: false
status: running
heap_size: 2586
stack_size: 27
reductions: 10857
neighbours:
=SUPERVISOR REPORT==== 10-Jul-2017::05:25:17 ===
Supervisor: {local,gun_sup}
Context: child_terminated
Reason: {{owner_gone,normal},
[{gun,loop,1,[{file,"src/gun.erl"},{line,706}]},
{gun,proc_lib_hack,5,[{file,"src/gun.erl"},{line,535}]},
{proc_lib,init_p_do_apply,3,
[{file,"proc_lib.erl"},{line,247}]}]}
Offender: [{pid,<0.364.0>},
{id,gun},
{mfargs,{gun,start_link,undefined}},
{restart_type,temporary},
{shutdown,5000},
{child_type,worker}]
** exception exit: {ws_upgrade_failed,404,
[{<<"content-length">>,<<"0">>},
{<<"date">>,
<<"Mon, 10 Jul 2017 11:22:38 GMT">>},
{<<"server">>,<<"Cowboy">>}]}
(my_gun#127.0.0.1)6>
Now, I'm getting a 404 error. Cowboy is running, and when I enter http://localhost:8080 in my browser, I see a response message. Why is Gun giving me a 404 error?
Next I tried using the instructions in the Gun docs to make a GET request:
StreamRef = gun:get(ConnPid, "/").
case gun:await(ConnPid, StreamRef) of
{response, fin, Status, Headers} ->
no_data;
{response, nofin, Status, Headers} ->
{ok, Body} = gun:await_body(ConnPid, StreamRef),
io:format("~s~n", [Body])
end.
and that was successful:
=PROGRESS REPORT==== 10-Jul-2017::06:36:14 ===
supervisor: {local,inet_gethost_native_sup}
started: [{pid,<0.367.0>},{mfa,{inet_gethost_native,init,[[]]}}]
=PROGRESS REPORT==== 10-Jul-2017::06:36:14 ===
supervisor: {local,kernel_safe_sup}
started: [{pid,<0.366.0>},
{id,inet_gethost_native_sup},
{mfargs,{inet_gethost_native,start_link,[]}},
{restart_type,temporary},
{shutdown,1000},
{child_type,worker}]
Hello Erlang!
ok
(my_gun#127.0.0.1)2>
The response means that I was able to use Gun to interact with a Cowboy server--but I want to use websockets. Any ideas what I am doing wrong?
tip:
To avoid having to type all that code in the gun shell, I created the file ~/erlang_programs/my_gun/src/my.erl:
-module(my).
-compile(export_all).
get() ->
{ok, _} = application:ensure_all_started(gun),
{ok, ConnPid} = gun:open("localhost", 8080),
{ok, _Protocol} = gun:await_up(ConnPid),
StreamRef = gun:get(ConnPid, "/"),
case gun:await(ConnPid, StreamRef) of
{response, fin, _Status, _Headers} ->
no_data;
{response, nofin, _Status, _Headers} ->
{ok, Body} = gun:await_body(ConnPid, StreamRef),
io:format("~s~n", [Body])
end.
ws() ->
{ok, _} = application:ensure_all_started(gun),
{ok, ConnPid} = gun:open("localhost", 8080),
{ok, _Protocol} = gun:await_up(ConnPid),
gun:ws_upgrade(ConnPid, "/websocket"),
receive
{gun_ws_upgrade, ConnPid, ok, Headers} ->
upgrade_success(ConnPid, Headers);
{gun_response, ConnPid, _, _, Status, Headers} ->
exit({ws_upgrade_failed, Status, Headers});
{gun_error, _ConnPid, _StreamRef, Reason} ->
exit({ws_upgrade_failed, Reason})
%% More clauses here as needed.
after 1000 ->
exit(timeout)
end,
gun:shutdown(ConnPid).
upgrade_success(ConnPid, Headers) ->
io:format("Upgraded ~w. Success!~nHeaders:~n~p~n",
[ConnPid, Headers]).
Then the make (or gmake) command:
~/erlang_programs/my_gun$ gmake run
will compile everything in the src/ directory and alert you to any errors. Once the gun shell successfully launches in response to gmake run, you can for instance do:
(my_gun#127.0.0.1)1> my:get().
=PROGRESS REPORT==== 10-Jul-2017::06:36:14 ===
supervisor: {local,inet_gethost_native_sup}
started: [{pid,<0.367.0>},{mfa,{inet_gethost_native,init,[[]]}}]
=PROGRESS REPORT==== 10-Jul-2017::06:36:14 ===
supervisor: {local,kernel_safe_sup}
started: [{pid,<0.366.0>},
{id,inet_gethost_native_sup},
{mfargs,{inet_gethost_native,start_link,[]}},
{restart_type,temporary},
{shutdown,1000},
{child_type,worker}]
Hello Erlang!
ok
(my_gun#127.0.0.1)2>
Response to comment:
Since you're getting a 404, I guess you don't have a websocket handler
defined in the cowboy routes.
You are right. I only had the handler shown in the Cowboy Getting Started guide. Now, I've added the websocket setup code and a websocket handler to cowboy. I now have the routes:
hello_erlang_app.erl:
-module(hello_erlang_app).
-behaviour(application).
-export([start/2]).
-export([stop/1]).
start(_Type, _Args) ->
Dispatch = cowboy_router:compile([
{'_', [{"/", hello_handler, []}] },
{'_', [{"/websocket", myws_handler, []}] }
]),
{ok, _} = cowboy:start_clear(my_http_listener,
[{port, 8080}],
#{env => #{dispatch => Dispatch} }
),
hello_erlang_sup:start_link().
stop(_State) ->
ok.
Here's my handler:
-module(myws_handler).
-compile(export_all).
init(Req, State) ->
{cowboy_websocket, Req, State}. %Perform websocket setup
websocket_handle({text, Msg}, State) ->
{
reply,
{text, <<"Server received: ", Msg/binary>>, State} %%Error in format here, too!
};
websocket_handle(_Data, State) ->
{ok, State}.
But I'm still getting a 404 error when I execute my:ws() in the gun shell:
-module(my).
-compile(export_all).
get() ->
{ok, _} = application:ensure_all_started(gun),
{ok, ConnPid} = gun:open("localhost", 8080),
{ok, _Protocol} = gun:await_up(ConnPid),
StreamRef = gun:get(ConnPid, "/"),
case gun:await(ConnPid, StreamRef) of
{response, fin, _Status, _Headers} ->
no_data;
{response, nofin, _Status, _Headers} ->
{ok, Body} = gun:await_body(ConnPid, StreamRef),
io:format("~s~n", [Body])
end.
ws() ->
{ok, _} = application:ensure_all_started(gun),
{ok, ConnPid} = gun:open("localhost", 8080),
{ok, _Protocol} = gun:await_up(ConnPid),
gun:ws_upgrade(ConnPid, "/websocket"),
receive
{gun_ws_upgrade, ConnPid, ok, Headers} ->
upgrade_success(ConnPid, Headers);
{gun_response, ConnPid, _, _, Status, Headers} ->
exit({ws_upgrade_failed, Status, Headers});
{gun_error, _ConnPid, _StreamRef, Reason} ->
exit({ws_upgrade_failed, Reason})
%% More clauses here as needed.
after 1000 ->
exit(timeout)
end,
gun:shutdown(ConnPid).
upgrade_success(ConnPid, Headers) ->
io:format("Upgraded ~w. Success!~nHeaders:~n~w~n",
[ConnPid, Headers]).
Here's the output:
~/erlang_programs/my_gun$ gmake run
gmake[1]: Entering directory '/Users/7stud/erlang_programs/my_gun/deps/gun'
gmake[2]: Entering directory '/Users/7stud/erlang_programs/my_gun/deps/cowlib'
gmake[2]: Leaving directory '/Users/7stud/erlang_programs/my_gun/deps/cowlib'
gmake[2]: Entering directory '/Users/7stud/erlang_programs/my_gun/deps/ranch'
gmake[2]: Leaving directory '/Users/7stud/erlang_programs/my_gun/deps/ranch'
GEN rebar.config
gmake[1]: Leaving directory '/Users/7stud/erlang_programs/my_gun/deps/gun'
DEPEND my_gun.d
ERLC my.erl
APP my_gun
===> Starting relx build process ...
===> Resolving OTP Applications from directories:
/Users/7stud/erlang_programs/my_gun/ebin
/Users/7stud/erlang_programs/my_gun/deps
/Users/7stud/.evm/erlang_versions/otp_src_19.2/lib/erlang/lib
/Users/7stud/erlang_programs/my_gun/apps
/Users/7stud/erlang_programs/my_gun/_rel
===> Resolved my_gun_release-1
===> rendering builtin_hook_status hook to "/Users/7stud/erlang_programs/my_gun/_rel/my_gun_release/bin/hooks/builtin/status"
===> Including Erts from /Users/7stud/.evm/erlang_versions/otp_src_19.2/lib/erlang
===> release successfully created!
===> tarball /Users/7stud/erlang_programs/my_gun/_rel/my_gun_release/my_gun_release-1.tar.gz successfully created!
Exec: /Users/7stud/erlang_programs/my_gun/_rel/my_gun_release/erts-8.2/bin/erlexec -boot /Users/7stud/erlang_programs/my_gun/_rel/my_gun_release/releases/1/my_gun_release -mode embedded -boot_var ERTS_LIB_DIR /Users/7stud/erlang_programs/my_gun/_rel/my_gun_release/lib -config /Users/7stud/erlang_programs/my_gun/_rel/my_gun_release/releases/1/sys.config -args_file /Users/7stud/erlang_programs/my_gun/_rel/my_gun_release/releases/1/vm.args -pa -- console
Root: /Users/7stud/erlang_programs/my_gun/_rel/my_gun_release
/Users/7stud/erlang_programs/my_gun/_rel/my_gun_release
heart_beat_kill_pid = 32843
Erlang/OTP 19 [erts-8.2] [source] [64-bit] [smp:4:4] [async-threads:10] [hipe] [kernel-poll:false]
=PROGRESS REPORT==== 10-Jul-2017::16:26:05 ===
supervisor: {local,sasl_safe_sup}
started: [{pid,<0.353.0>},
{id,alarm_handler},
{mfargs,{alarm_handler,start_link,[]}},
{restart_type,permanent},
{shutdown,2000},
{child_type,worker}]
=PROGRESS REPORT==== 10-Jul-2017::16:26:05 ===
supervisor: {local,sasl_sup}
started: [{pid,<0.352.0>},
{id,sasl_safe_sup},
{mfargs,
{supervisor,start_link,
[{local,sasl_safe_sup},sasl,safe]}},
{restart_type,permanent},
{shutdown,infinity},
{child_type,supervisor}]
=PROGRESS REPORT==== 10-Jul-2017::16:26:05 ===
supervisor: {local,sasl_sup}
started: [{pid,<0.354.0>},
{id,release_handler},
{mfargs,{release_handler,start_link,[]}},
{restart_type,permanent},
{shutdown,2000},
{child_type,worker}]
=PROGRESS REPORT==== 10-Jul-2017::16:26:05 ===
application: sasl
started_at: 'my_gun#127.0.0.1'
=PROGRESS REPORT==== 10-Jul-2017::16:26:05 ===
supervisor: {local,runtime_tools_sup}
started: [{pid,<0.360.0>},
{id,ttb_autostart},
{mfargs,{ttb_autostart,start_link,[]}},
{restart_type,temporary},
{shutdown,3000},
{child_type,worker}]
=PROGRESS REPORT==== 10-Jul-2017::16:26:05 ===
application: runtime_tools
started_at: 'my_gun#127.0.0.1'
Eshell V8.2 (abort with ^G)
(my_gun#127.0.0.1)1> my:ws().
=PROGRESS REPORT==== 10-Jul-2017::16:26:08 ===
supervisor: {local,inet_gethost_native_sup}
started: [{pid,<0.367.0>},{mfa,{inet_gethost_native,init,[[]]}}]
=PROGRESS REPORT==== 10-Jul-2017::16:26:08 ===
supervisor: {local,kernel_safe_sup}
started: [{pid,<0.366.0>},
{id,inet_gethost_native_sup},
{mfargs,{inet_gethost_native,start_link,[]}},
{restart_type,temporary},
{shutdown,1000},
{child_type,worker}]
=CRASH REPORT==== 10-Jul-2017::16:26:08 ===
crasher:
initial call: gun:proc_lib_hack/5
pid: <0.365.0>
registered_name: []
exception exit: {{owner_gone,normal},
[{gun,loop,1,[{file,"src/gun.erl"},{line,706}]},
{gun,proc_lib_hack,5,[{file,"src/gun.erl"},{line,535}]},
{proc_lib,init_p_do_apply,3,
[{file,"proc_lib.erl"},{line,247}]}]}
in function gun:proc_lib_hack/5 (src/gun.erl, line 540)
ancestors: [gun_sup,<0.345.0>]
messages: []
links: [<0.346.0>]
dictionary: []
trap_exit: false
status: running
heap_size: 610
stack_size: 27
reductions: 1042
neighbours:
=SUPERVISOR REPORT==== 10-Jul-2017::16:26:08 ===
Supervisor: {local,gun_sup}
Context: child_terminated
Reason: {{owner_gone,normal},
[{gun,loop,1,[{file,"src/gun.erl"},{line,706}]},
{gun,proc_lib_hack,5,[{file,"src/gun.erl"},{line,535}]},
{proc_lib,init_p_do_apply,3,
[{file,"proc_lib.erl"},{line,247}]}]}
Offender: [{pid,<0.365.0>},
{id,gun},
{mfargs,{gun,start_link,undefined}},
{restart_type,temporary},
{shutdown,5000},
{child_type,worker}]
** exception exit: {ws_upgrade_failed,404,
[{<<"content-length">>,<<"0">>},
{<<"date">>,
<<"Mon, 10 Jul 2017 22:26:08 GMT">>},
{<<"server">>,<<"Cowboy">>}]}
in function my:ws/0 (src/my.erl, line 30)
(my_gun#127.0.0.1)2>
I saved all my files and restarted cowboy and gun, so the changes I made to the code are being executed, but I still get the 404 error.
I compared the format of my routes to the routes in the example that spawn_think linked to in the comments, and my format was wrong. Here is what I have now:
-module(hello_erlang_app).
-behaviour(application).
-export([start/2]).
-export([stop/1]).
start(_Type, _Args) ->
Dispatch = cowboy_router:compile([
{'_', [
{"/", hello_handler, []},
{"/websocket", myws_handler, []}
]}
]),
{ok, _} = cowboy:start_clear(my_http_listener,
[{port, 8080}],
#{env => #{dispatch => Dispatch} }
),
hello_erlang_sup:start_link().
stop(_State) ->
ok.
And after adjusting one of the control sequences in the io:format() statement in my gun client:
-module(my).
-compile(export_all).
get() ->
...
ws() ->
...
upgrade_success(ConnPid, Headers) ->
io:format("Upgraded ~w. Success!~nHeaders:~n~p~n", %% <*** CHANGED ~w to ~p
[ConnPid, Headers]).
here is the output:
~/erlang_programs/my_gun$ gmake run
gmake[1]: Entering directory '/Users/7stud/erlang_programs/my_gun/deps/gun'
gmake[2]: Entering directory '/Users/7stud/erlang_programs/my_gun/deps/cowlib'
gmake[2]: Leaving directory '/Users/7stud/erlang_programs/my_gun/deps/cowlib'
gmake[2]: Entering directory '/Users/7stud/erlang_programs/my_gun/deps/ranch'
gmake[2]: Leaving directory '/Users/7stud/erlang_programs/my_gun/deps/ranch'
GEN rebar.config
gmake[1]: Leaving directory '/Users/7stud/erlang_programs/my_gun/deps/gun'
DEPEND my_gun.d
ERLC my.erl
APP my_gun
===> Starting relx build process ...
===> Resolving OTP Applications from directories:
/Users/7stud/erlang_programs/my_gun/ebin
/Users/7stud/erlang_programs/my_gun/deps
/Users/7stud/.evm/erlang_versions/otp_src_19.2/lib/erlang/lib
/Users/7stud/erlang_programs/my_gun/apps
/Users/7stud/erlang_programs/my_gun/_rel
===> Resolved my_gun_release-1
===> rendering builtin_hook_status hook to "/Users/7stud/erlang_programs/my_gun/_rel/my_gun_release/bin/hooks/builtin/status"
===> Including Erts from /Users/7stud/.evm/erlang_versions/otp_src_19.2/lib/erlang
===> release successfully created!
===> tarball /Users/7stud/erlang_programs/my_gun/_rel/my_gun_release/my_gun_release-1.tar.gz successfully created!
Exec: /Users/7stud/erlang_programs/my_gun/_rel/my_gun_release/erts-8.2/bin/erlexec -boot /Users/7stud/erlang_programs/my_gun/_rel/my_gun_release/releases/1/my_gun_release -mode embedded -boot_var ERTS_LIB_DIR /Users/7stud/erlang_programs/my_gun/_rel/my_gun_release/lib -config /Users/7stud/erlang_programs/my_gun/_rel/my_gun_release/releases/1/sys.config -args_file /Users/7stud/erlang_programs/my_gun/_rel/my_gun_release/releases/1/vm.args -pa -- console
Root: /Users/7stud/erlang_programs/my_gun/_rel/my_gun_release
/Users/7stud/erlang_programs/my_gun/_rel/my_gun_release
heart_beat_kill_pid = 34141
Erlang/OTP 19 [erts-8.2] [source] [64-bit] [smp:4:4] [async-threads:10] [hipe] [kernel-poll:false]
=PROGRESS REPORT==== 10-Jul-2017::16:50:53 ===
supervisor: {local,sasl_safe_sup}
started: [{pid,<0.353.0>},
{id,alarm_handler},
{mfargs,{alarm_handler,start_link,[]}},
{restart_type,permanent},
{shutdown,2000},
{child_type,worker}]
=PROGRESS REPORT==== 10-Jul-2017::16:50:53 ===
supervisor: {local,sasl_sup}
started: [{pid,<0.352.0>},
{id,sasl_safe_sup},
{mfargs,
{supervisor,start_link,
[{local,sasl_safe_sup},sasl,safe]}},
{restart_type,permanent},
{shutdown,infinity},
{child_type,supervisor}]
=PROGRESS REPORT==== 10-Jul-2017::16:50:53 ===
supervisor: {local,sasl_sup}
started: [{pid,<0.354.0>},
{id,release_handler},
{mfargs,{release_handler,start_link,[]}},
{restart_type,permanent},
{shutdown,2000},
{child_type,worker}]
=PROGRESS REPORT==== 10-Jul-2017::16:50:53 ===
application: sasl
started_at: 'my_gun#127.0.0.1'
=PROGRESS REPORT==== 10-Jul-2017::16:50:53 ===
supervisor: {local,runtime_tools_sup}
started: [{pid,<0.360.0>},
{id,ttb_autostart},
{mfargs,{ttb_autostart,start_link,[]}},
{restart_type,temporary},
{shutdown,3000},
{child_type,worker}]
=PROGRESS REPORT==== 10-Jul-2017::16:50:53 ===
application: runtime_tools
started_at: 'my_gun#127.0.0.1'
Eshell V8.2 (abort with ^G)
(my_gun#127.0.0.1)1> my:ws().
=PROGRESS REPORT==== 10-Jul-2017::16:50:57 ===
supervisor: {local,inet_gethost_native_sup}
started: [{pid,<0.367.0>},{mfa,{inet_gethost_native,init,[[]]}}]
=PROGRESS REPORT==== 10-Jul-2017::16:50:57 ===
supervisor: {local,kernel_safe_sup}
started: [{pid,<0.366.0>},
{id,inet_gethost_native_sup},
{mfargs,{inet_gethost_native,start_link,[]}},
{restart_type,temporary},
{shutdown,1000},
{child_type,worker}]
Upgraded <0.365.0>. Success!
Headers:
[{<<"connection">>,<<"Upgrade">>},
{<<"date">>,<<"Mon, 10 Jul 2017 22:50:56 GMT">>},
{<<"sec-websocket-accept">>,<<"S1w7rWXToZefi/NOEcDAEDb4yEU=">>},
{<<"server">>,<<"Cowboy">>},
{<<"upgrade">>,<<"websocket">>}]
ok
(my_gun#127.0.0.1)2>
I've reached the forum's limit on text, so see my answer for how I was actually able to send and receive data using a websocket.
A summary of the issues/suggestions from the comments discussion
For running your Erlang app (in this case including gun as a dependency), you need to have the path to beam and .app files discoverable to the shell. When using erlang.mk, the easiest way to do that would be running the release using make run
On Cowboy side, to have Websocket handled correctly, you need to have a handler defined in your cowboy routes. See example in Cowboy Websocket example
See also Gun user guide for more details about handling Websocket in Gun
Success!
~/erlang_programs/my_gun/src/my.erl:
-module(my).
-compile(export_all).
get() ->
...
ws() ->
{ok, _} = application:ensure_all_started(gun),
{ok, ConnPid} = gun:open("localhost", 8080),
{ok, _Protocol} = gun:await_up(ConnPid),
gun:ws_upgrade(ConnPid, "/websocket"),
receive
{gun_ws_upgrade, ConnPid, ok, Headers} ->
upgrade_success(ConnPid, Headers);
{gun_response, ConnPid, _, _, Status, Headers} ->
exit({ws_upgrade_failed, Status, Headers});
{gun_error, _ConnPid, _StreamRef, Reason} ->
exit({ws_upgrade_failed, Reason})
%% More clauses here as needed.
after 1000 ->
exit(timeout)
end,
upgrade_success(ConnPid, Headers) ->
io:format("Upgraded ~w. Success!~nHeaders:~n~p~n",
[ConnPid, Headers]),
gun:ws_send(ConnPid, {text, "It's raining!"}),
receive
{gun_ws, ConnPid, {text, Msg} } ->
io:format("~s~n", [Msg])
end.
On the cowboy side:
-module(myws_handler).
-compile(export_all).
init(Req, State) ->
{cowboy_websocket, Req, State}. %Perform websocket setup
websocket_handle({text, Msg}, State) ->
{
reply,
{text, io_lib:format("Server received: ~s", [Msg]) },
State
};
websocket_handle(_Other, State) -> %Ignore
{ok, State}.
Here's the output:
~/erlang_programs/my_gun$ gmake run
gmake[1]: Entering directory '/Users/7stud/erlang_programs/my_gun/deps/gun'
gmake[2]: Entering directory '/Users/7stud/erlang_programs/my_gun/deps/cowlib'
gmake[2]: Leaving directory '/Users/7stud/erlang_programs/my_gun/deps/cowlib'
gmake[2]: Entering directory '/Users/7stud/erlang_programs/my_gun/deps/ranch'
gmake[2]: Leaving directory '/Users/7stud/erlang_programs/my_gun/deps/ranch'
GEN rebar.config
gmake[1]: Leaving directory '/Users/7stud/erlang_programs/my_gun/deps/gun'
DEPEND my_gun.d
ERLC my.erl
APP my_gun
===> Starting relx build process ...
===> Resolving OTP Applications from directories:
/Users/7stud/erlang_programs/my_gun/ebin
/Users/7stud/erlang_programs/my_gun/deps
/Users/7stud/.evm/erlang_versions/otp_src_19.2/lib/erlang/lib
/Users/7stud/erlang_programs/my_gun/apps
/Users/7stud/erlang_programs/my_gun/_rel
===> Resolved my_gun_release-1
===> rendering builtin_hook_status hook to "/Users/7stud/erlang_programs/my_gun/_rel/my_gun_release/bin/hooks/builtin/status"
===> Including Erts from /Users/7stud/.evm/erlang_versions/otp_src_19.2/lib/erlang
===> release successfully created!
===> tarball /Users/7stud/erlang_programs/my_gun/_rel/my_gun_release/my_gun_release-1.tar.gz successfully created!
Exec: /Users/7stud/erlang_programs/my_gun/_rel/my_gun_release/erts-8.2/bin/erlexec -boot /Users/7stud/erlang_programs/my_gun/_rel/my_gun_release/releases/1/my_gun_release -mode embedded -boot_var ERTS_LIB_DIR /Users/7stud/erlang_programs/my_gun/_rel/my_gun_release/lib -config /Users/7stud/erlang_programs/my_gun/_rel/my_gun_release/releases/1/sys.config -args_file /Users/7stud/erlang_programs/my_gun/_rel/my_gun_release/releases/1/vm.args -pa -- console
Root: /Users/7stud/erlang_programs/my_gun/_rel/my_gun_release
/Users/7stud/erlang_programs/my_gun/_rel/my_gun_release
heart_beat_kill_pid = 38883
Erlang/OTP 19 [erts-8.2] [source] [64-bit] [smp:4:4] [async-threads:10] [hipe] [kernel-poll:false]
=PROGRESS REPORT==== 10-Jul-2017::18:04:38 ===
supervisor: {local,sasl_safe_sup}
started: [{pid,<0.353.0>},
{id,alarm_handler},
{mfargs,{alarm_handler,start_link,[]}},
{restart_type,permanent},
{shutdown,2000},
{child_type,worker}]
=PROGRESS REPORT==== 10-Jul-2017::18:04:38 ===
supervisor: {local,sasl_sup}
started: [{pid,<0.352.0>},
{id,sasl_safe_sup},
{mfargs,
{supervisor,start_link,
[{local,sasl_safe_sup},sasl,safe]}},
{restart_type,permanent},
{shutdown,infinity},
{child_type,supervisor}]
=PROGRESS REPORT==== 10-Jul-2017::18:04:38 ===
supervisor: {local,sasl_sup}
started: [{pid,<0.354.0>},
{id,release_handler},
{mfargs,{release_handler,start_link,[]}},
{restart_type,permanent},
{shutdown,2000},
{child_type,worker}]
=PROGRESS REPORT==== 10-Jul-2017::18:04:38 ===
application: sasl
started_at: 'my_gun#127.0.0.1'
=PROGRESS REPORT==== 10-Jul-2017::18:04:38 ===
supervisor: {local,runtime_tools_sup}
started: [{pid,<0.360.0>},
{id,ttb_autostart},
{mfargs,{ttb_autostart,start_link,[]}},
{restart_type,temporary},
{shutdown,3000},
{child_type,worker}]
=PROGRESS REPORT==== 10-Jul-2017::18:04:38 ===
application: runtime_tools
started_at: 'my_gun#127.0.0.1'
Eshell V8.2 (abort with ^G)
(my_gun#127.0.0.1)1> my:ws().
=PROGRESS REPORT==== 10-Jul-2017::18:04:41 ===
supervisor: {local,inet_gethost_native_sup}
started: [{pid,<0.367.0>},{mfa,{inet_gethost_native,init,[[]]}}]
=PROGRESS REPORT==== 10-Jul-2017::18:04:41 ===
supervisor: {local,kernel_safe_sup}
started: [{pid,<0.366.0>},
{id,inet_gethost_native_sup},
{mfargs,{inet_gethost_native,start_link,[]}},
{restart_type,temporary},
{shutdown,1000},
{child_type,worker}]
Upgraded <0.365.0>. Success!
Headers:
[{<<"connection">>,<<"Upgrade">>},
{<<"date">>,<<"Tue, 11 Jul 2017 00:04:40 GMT">>},
{<<"sec-websocket-accept">>,<<"pYv8QeeJfzQgaS/x8flZHyrIexk=">>},
{<<"server">>,<<"Cowboy">>},
{<<"upgrade">>,<<"websocket">>}]
Server received: It's raining!
ok
(my_gun#127.0.0.1)2>

RabbitMQ/Erlang crashing: Cannot reallocate 313760 bytes of memory (of type "code")

Can anyone please help to understand these crash logs?
RabbitMQ 3.6.6, Erlang 19.1
RabbitMQ is running on Microsoft Windows Web Server 2008 R2 6.1.7601 Service Pack 1 Build 7601 64bit.
RabbitMQ started to crash yesterday after running OK about one year. Now I have upgraded Erlang and RabbitMQ Server to the versions mentioned above but this did not change anything - still crashing
frequently.
.log:
=ERROR REPORT==== 13-Dec-2016::22:13:55 ===
** Generic server rabbit_disk_monitor terminating
** Last message in was update
** When Server state == {state,"d:/ETOIMI~1/RabbitMQ/RABBIT~1",50000000,
14439952384,100,10000,#Ref<0.0.1.27257>,false,
true}
** Reason for termination ==
** {eacces,[{erlang,open_port,
[{spawn,"C:\\Windows\\system32\\cmd.exe /c dir /-C /W \"d:/ETOIMI~1/RabbitMQ/RABBIT~1\""},
[binary,stderr_to_stdout,stream,in,hide]],
[{file,"erlang.erl"},{line,2080}]},
{os,cmd,1,[{file,"os.erl"},{line,230}]},
{rabbit_disk_monitor,get_disk_free,2,
[{file,"src/rabbit_disk_monitor.erl"},
{line,218}]},
{rabbit_disk_monitor,internal_update,1,
[{file,"src/rabbit_disk_monitor.erl"},
{line,193}]},
{rabbit_disk_monitor,handle_info,2,
[{file,"src/rabbit_disk_monitor.erl"},
{line,165}]},
{gen_server,try_dispatch,4,[{file,"gen_server.erl"},{line,601}]},
{gen_server,handle_msg,5,[{file,"gen_server.erl"},{line,667}]},
{proc_lib,init_p_do_apply,3,[{file,"proc_lib.erl"},{line,247}]}]}
-sasl.log:
=CRASH REPORT==== 13-Dec-2016::22:13:55 ===
crasher:
initial call: rabbit_disk_monitor:init/1
pid: <0.211.0>
registered_name: rabbit_disk_monitor
exception exit: {eacces,
[{erlang,open_port,
[{spawn,
"C:\\Windows\\system32\\cmd.exe /c dir /-C /W \"d:/ETOIMI~1/RabbitMQ/RABBIT~1\""},
[binary,stderr_to_stdout,stream,in,hide]],
[{file,"erlang.erl"},{line,2080}]},
{os,cmd,1,[{file,"os.erl"},{line,230}]},
{rabbit_disk_monitor,get_disk_free,2,
[{file,"src/rabbit_disk_monitor.erl"},
{line,218}]},
{rabbit_disk_monitor,internal_update,1,
[{file,"src/rabbit_disk_monitor.erl"},
{line,193}]},
{rabbit_disk_monitor,handle_info,2,
[{file,"src/rabbit_disk_monitor.erl"},
{line,165}]},
{gen_server,try_dispatch,4,
[{file,"gen_server.erl"},{line,601}]},
{gen_server,handle_msg,5,
[{file,"gen_server.erl"},{line,667}]},
{proc_lib,init_p_do_apply,3,
[{file,"proc_lib.erl"},{line,247}]}]}
in function gen_server:terminate/7 (gen_server.erl, line 812)
ancestors: [rabbit_disk_monitor_sup,rabbit_sup,<0.164.0>]
messages: []
links: [<0.210.0>]
dictionary: []
trap_exit: false
status: running
heap_size: 6772
stack_size: 27
reductions: 381464
neighbours:
=SUPERVISOR REPORT==== 13-Dec-2016::22:13:55 ===
Supervisor: {local,rabbit_disk_monitor_sup}
Context: child_terminated
Reason: {eacces,
[{erlang,open_port,
[{spawn,
"C:\\Windows\\system32\\cmd.exe /c dir /-C /W \"d:/ETOIMI~1/RabbitMQ/RABBIT~1\""},
[binary,stderr_to_stdout,stream,in,hide]],
[{file,"erlang.erl"},{line,2080}]},
{os,cmd,1,[{file,"os.erl"},{line,230}]},
{rabbit_disk_monitor,get_disk_free,2,
[{file,"src/rabbit_disk_monitor.erl"},{line,218}]},
{rabbit_disk_monitor,internal_update,1,
[{file,"src/rabbit_disk_monitor.erl"},{line,193}]},
{rabbit_disk_monitor,handle_info,2,
[{file,"src/rabbit_disk_monitor.erl"},{line,165}]},
{gen_server,try_dispatch,4,
[{file,"gen_server.erl"},{line,601}]},
{gen_server,handle_msg,5,
[{file,"gen_server.erl"},{line,667}]},
{proc_lib,init_p_do_apply,3,
[{file,"proc_lib.erl"},{line,247}]}]}
Offender: [{pid,<0.211.0>},
{name,rabbit_disk_monitor},
{mfargs,{rabbit_disk_monitor,start_link,[50000000]}},
{restart_type,{transient,1}},
{shutdown,30000},
{child_type,worker}]
Also I have found Erlang crash dump, please see
HERE
If there is more information that should be provided by me please let me know.
Thank you!
** {eacces,[{erlang,open_port,
[{spawn,"C:\\Windows\\system32\\cmd.exe /c dir /-C /W \"d:/ETOIMI~1/RabbitMQ/RABBIT~1\""},
eacces is an Erlang error:
eacces Missing search or write permissions for the parent directories
of Dir.
most likely the service has problems to access here: d:/ETOIMI~1/RabbitMQ/RABBIT~1\

Memory limit set to 819MB of 4095MB total - RabbitMQ - How to set set_vm_memory_high_watermark

My rabbitMQ service is crashing as soon as I start it. The service was running fine for last two years but suddenly, it stopped working. I looked at the log and saw this:
=INFO REPORT==== 8-Oct-2015::11:40:56 ===
Starting RabbitMQ 3.0.2 on Erlang R16B
=INFO REPORT==== 8-Oct-2015::11:40:56 ===
Limiting to approx 8092 file handles (7280 sockets)
=WARNING REPORT==== 8-Oct-2015::11:40:56 ===
Only 2048MB of 4095MB memory usable due to limited address space.
=INFO REPORT==== 8-Oct-2015::11:40:56 ===
Memory limit set to 819MB of 4095MB total.
=INFO REPORT==== 8-Oct-2015::11:40:56 ===
Disk free limit set to 1000MB
=INFO REPORT==== 8-Oct-2015::11:40:56 ===
msg_store_transient: using rabbit_msg_store_ets_index to provide index
=INFO REPORT==== 8-Oct-2015::11:40:56 ===
msg_store_persistent: using rabbit_msg_store_ets_index to provide index
=INFO REPORT==== 8-Oct-2015::11:40:56 ===
started TCP Listener on [::]:5672
=ERROR REPORT==== 8-Oct-2015::11:40:56 ===
Error in process
So I decided to run following commad:
rabbitmqctl set_vm_memory_high_watermark 0.5
it gives following error:
Setting memory threshold on rabbit#sn4324324 to 0.5 ...
Error: unable to connect to node rabbit#sn4324324: nodedown
DIAGNOSTICS
===========
nodes in question: [rabbit#sn4324324]
hosts, their running nodes and ports:
- sn4324324: [{rabbitmqctl601389,64542}]
current node details:
- node name: rabbitmqctl601389#sn4324324
- home dir: C:\Users\TestUser
- cookie hash: /GF4XhumN66/5SsNp0a8gQ==
How can I set th value for set_vm_memory_high_watermark

elixir iex shell start error

When I type iex command to start Elixir shell, it prompts the following error, I have no idea what is wrong, tried to reinstall erlang and elixir, but not works.
The error message :
Erlang/OTP 17 [erts-6.4] [source] [64-bit] [smp:4:4] [async- threads:10] [kernel-poll:false]
*** ERROR: Shell process terminated! (^G to start new job) ***
=INFO REPORT==== 8-Apr-2015::17:55:56 ===
application: elixir
exited: {bad_return,
{{elixir,start,[normal,[]]},
{'EXIT',
{{badmatch,{error,enotsup}},
[{elixir,start,2,[{file,"src/elixir.erl"},{line,34}]},
{application_master,start_it_old,4,
[{file,"application_master.erl"},{line,272}]}]}}}}
type: temporary
=INFO REPORT==== 8-Apr-2015::17:55:56 ===
application: syntax_tools
exited: stopped
type: temporary
=INFO REPORT==== 8-Apr-2015::17:55:56 ===
application: compiler
exited: stopped
type: temporary
=INFO REPORT==== 8-Apr-2015::17:55:56 ===
application: crypto
exited: stopped
type: temporary
=ERROR REPORT==== 8-Apr-2015::17:55:56 ===
Error in process <0.27.0> with exit value: {{badmatch,{error,{elixir, {bad_return,{{elixir,start,[normal,[]]},{'EXIT',{{badmatch,{error,enotsup}},[{elixir,start,2,[{file,"src/elixir.erl"},{line,34}]},{application_master,start_it_old,4,[{file,"application_master....
Elixir v1.0.3 does not work with Erlang 17.5. You need to either update Elixir to v1.0.4 or downgrade Erlang to 17.4.
the error enotsup denotes an operation not supported on your platform. check if elixir is correctly compiled, the error occurs at the very beginning of the elixir startup.

Resources