我正在使用tsung对我的 websocket 服务器进行负载测试。我是tsung
新手erlang
。
我有一个导出到 .csv 文件的用户和密钥列表。为了让它运行,我将 csv 文件缩减为:
1;2
文件末尾没有空行。
这是我的tsung
配置片段(否则工作正常):
<options>
<option name="file_server" id="users" value="PATH_TO_MY_CSV/users.csv"/>
</options>
[...]
<setdynvars sourcetype="erlang" callback="loadusers:user">
<var name="connection_url" />
</setdynvars>
[...]
<request subst="true">
<websocket type="connect" path="/?%%_connection_url%%"/>
</request>
这是我的loadusers.erl
,它使用ts_file_server tsung 模块:
-module(loadusers).
-export([user/1]).
user({Pid,DynVar})->
{ok,Line} = ts_file_server:get_next_line(),
[Username, Passwd] = string:tokens(Line,";"),
"username=" ++ Username ++"&password=" ++ Passwd.
这是erlang错误堆栈:
** State machine <0.90.0> terminating
** Last message in was {timeout,#Ref<0.0.0.414>,end_thinktime}
** When State == think
** Data == {state_rcv,none,
{{0,0,0,0},0},
undefined,0,10000,"192.168.59.103",443,ts_tcp,
{proto_opts,negociate,"/http-bind/","/chat","binary",10,
600000,infinity,32768,32768,undefined,undefined,[]},
true,1,undefined,true,undefined,
{1431,872144,388666},
6,6,false,undefined,0,[],<<>>,
{websocket_session,undefined,undefined},
0,2,524288,524288,
[{tsung_userid,2}],
ts_websocket,[],undefined,none}
** Reason for termination =
** {{badarg,[{dict,fetch,
[default,
{dict,1,16,16,8,80,48,
{[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[]},
{{[],[],[],
[[users|{file,{<<"1;2">>},1,-1}]],
[],[],[],[],[],[],[],[],[],[],[],[]}}}],
[{file,"dict.erl"},{line,130}]},
{ts_file_server,handle_call,3,
[{file,"src/tsung_controller/ts_file_server.erl"},
{line,159}]},
{gen_server,try_handle_call,4,
[{file,"gen_server.erl"},{line,607}]},
{gen_server,handle_msg,5,[{file,"gen_server.erl"},{line,639}]},
{proc_lib,init_p_do_apply,3,[{file,"proc_lib.erl"},{line,237}]}]},
{gen_server,call,[{global,ts_file_server},{get_next_line,default}]}}
我知道dynvars
可以直接从 tsung config中提取,但我需要在脚本中执行此操作,因为稍后我将需要动态操作数据。重要提示:读取相同的 csv 文件可以正常工作,因此脚本似乎是问题所在。
有人可以向我解释一下 erlang 在这里抱怨什么吗?