0

の代わりにGraphitex (Elixir の Graphite Carbon API クライアント) を使用しようとしています。gen_udpgen_tcp

クライアントは、質問に関係のないパブリック API を使用して、UDP ソケットをラップする GenServer です。

問題のあるビットはconnect/1terminate/2およびhandle_cast/2GenServer コールバックのようです。

オリジナルの実装はここにあります。私のフォークはここにあります。

私がしたこと:

  • :gen_tcp.connect(host, port, opts)(ここでhost、 とportはリモート Graphite Carbon UDP エンドポイントのものです) を:gen_udp.open(0, opts)(OS が選択したポートを取得するため) に置き換えます
  • OS が選択した UDP ソケットを介してリモートに送信するように置き換えられ:gen_tcp.send(socket, msg)ました:gen_udp.send(socket, host, port, msg)msghost:port

のフォークでアプリを実行すると発生するエラーgraphitex:

12:12:14.160 [info]  Connecting to carbon at localhost:2003
12:12:14.383 [error] GenServer Graphitex.Client terminating
** (FunctionClauseError) no function clause matching in Graphitex.Client.terminate/2
    (graphitex) lib/graphitex/client.ex:78: Graphitex.Client.terminate({{:badmatch, {:error, :econnrefused}}, [{Graphitex.Client, :connect, 1, [file: 'lib/graphitex/client.ex', line: 73]}, {Graphitex.Client, :handle_cast, 2, [file: 'lib/graphitex/client.ex', line: 86]}, {:gen_server, :try_dispatch, 4, [file: 'gen_server.erl', line: 637]}, {:gen_server, :handle_msg, 6, [file: 'gen_server.erl', line: 711]}, {:proc_lib, :init_p_do_apply, 3, [file: 'proc_lib.erl', line: 249]}]}, %{socket: nil})
    (stdlib) gen_server.erl:673: :gen_server.try_terminate/3
    (stdlib) gen_server.erl:858: :gen_server.terminate/10
    (stdlib) proc_lib.erl:249: :proc_lib.init_p_do_apply/3
Last message: {:"$gen_cast", {:metric, 'graphite_consumer 1000 1570525934\n'}}
State: %{socket: nil}

ソケット(はっきりと入れた状態connect/1)はのようnilです。なぜそうなのか不思議です。:gen_udp.open(0)in IEx は正常に動作し、 を返します{:ok, socket}

4

1 に答える 1