0

我正在使用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 在这里抱怨什么吗?

4

1 回答 1

0

错误消息是说dict:fetch(default, SomeDict)被调用并引发了badarg异常。通常,当密钥(default在您的情况下)不存在时会发生这种情况。

问题是在您设置的 Tsung 配置中id="users",它将文件 id 设置为users. 但ts_file_server:get_next_line/0预计文件 id 为default.

从配置中删除id="users"或将 Erlang 部分更改为 use ts_file_server:get_next_line/1,传入您在配置文件中使用的文件 id。

于 2015-05-17T15:48:08.613 回答