Advertisement
Guest User

Metrics

a guest
Nov 22nd, 2017
112
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Erlang 3.71 KB | None | 0 0
  1. -module(getData).
  2.  
  3. -behavior(gen_server).
  4.  
  5. -export([start/1, stop/0, plus/0]).
  6.  
  7. -export([init/1, handle_call/3, handle_cast/2, handle_info/2, terminate/2, code_change/3]).
  8.  
  9. %{ok, ListenSocket} = gen_tcp:listen(Port, [binary, {active, true}, {packet, line}])
  10. %Работа с текстовыми протоколами
  11. %Можно читать из сокета по одному байту, пока не встретится специальный байт, символизирующий конец пакета. Это может быть нулевой байт, или символ перевода строки.
  12. %Такой вариант характерен для текстовых протоколов (SMTP, POP3, FTP).
  13. %Писать свою реализацию чтения из сокета нет необходимости, все уже реализовано в gen_tcp. Нужно только указать в настройках сокета опцию {packet, line}.
  14.  
  15. start(ListenSocket) ->
  16.     {ok, Pid} = gen_server:start_link({local, ?MODULE}, ?MODULE, ListenSocket, []),
  17.     Pid.
  18.    
  19. stop() ->
  20.     gen_server:cast(?MODULE, stop).
  21.    
  22. init(ListenSocket) ->
  23.     NumOfMessInSec = 0,
  24.     NumSecWithoutMess = 0,
  25.     {ok, Socket} = gen_tcp:accept(ListenSocket), %это надо вынести из init в handle_info, сделано тут для общего понимания
  26.     Timer = erlang:start_timer(1000, self(), update),
  27.     {ok, {ListenSocket, Socket, NumOfMessInSec, NumSecWithoutMess, Timer}}.
  28.    
  29. handle_call(_Msg, _From, State) ->
  30.     error_logger:error_msg("Unknown msg ~p from ~p~n",[Msg,From]),
  31.     {noreply, State}.
  32.  
  33. handle_cast(reconnect, {ListenSocket, Socket, NumOfMessInSec, NumSecWithoutMess, Timer}) ->
  34.     {ok, NewSocket} = gen_tcp:accept(ListenSocket)
  35.     {noreply, {ListenSocket, NewSocket, NumOfMessInSec, NumSecWithoutMess, Timer}}
  36.     end;
  37.    
  38. handle_cast(stop, State) ->
  39. %   io:format("Normal stop~n"),
  40.     {stop, normal, State};
  41.    
  42. handle_cast(_Msg, State) ->
  43.     error_logger:error_msg("Unknown msg ~p~n",[Msg]),
  44.     {noreply, State}.
  45.  
  46. handle_info({timeout, Ref, update}, {ListenSocket, Socket, NumOfMessInSec, NumSecWithoutMess, OldTimer}) ->
  47.     if
  48.         Ref /= OldTimer ->
  49.             erlang:cancel_timer(OldTimer),
  50.             {noreply, {ListenSocket, Socket, NumOfMessInSec, NumSecWithoutMess, OldTimer}};
  51.         true ->
  52.             erlang:cancel_timer(OldTimer),
  53.             %Если сообщений не было в течении 1 сек (NumOfMessInSec == 0) то NewNumSecWithoutMess = NumSecWithoutMess + 1
  54.             %Если NumSecWithoutMess == 5, то проверятем к примеру icmp ping жив ли сервер и уведомляем об этом наблюдатель
  55.             Timer = erlang:start_timer(1000, self(), update),
  56.             {noreply, {ListenSocket, Socket, NumOfMessInSec, NewNumSecWithoutMess, Timer}}
  57.     end;
  58.    
  59. handle_info({tcp, _MsgSocket, Msg}, {ListenSocket, Socket, NumOfMessInSec, NewNumSecWithoutMess, Timer}) ->
  60. %   Здесь преобразуем метрики, и отправляем форматом {тип, ip_сервера, метрика или nodata, erlang:localtime()} и отправляем на сборщик метрик с логгером
  61. %   если сообщение пришло  то NewNumOfMessInSec = NumOfMessInSec + 1
  62.     {noreply, {ListenSocket, Socket, NewNumOfMessInSec, NewNumSecWithoutMess, Timer}};
  63.  
  64. handle_info({tcp_closed, _Port}, State) ->
  65. %   gen_server:cast(?MODULE, stop),
  66. %   gen_server:cast(?MODULE, reconnect),
  67. %   или же возвращаем процесс в пул
  68.     {noreply, State};
  69.    
  70. handle_info(_Msg, State) ->
  71.     error_logger:error_msg("Unknown msg ~p~n",[Msg]),
  72.     {noreply, State}.
  73.  
  74. terminate(_Reason, _State) ->
  75.     ok.
  76.    
  77. code_change(_OldVersion, State, _Extra) ->
  78.     {ok, State}.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement