@@ -27,6 +27,7 @@ def __init__(self, config):
2727 self .port = config .fetch ('zabbix' , 'port' , int )
2828 self .max_queue_size = config .fetch ('sender' , 'queue' , int )
2929 self .fqdn = config .fetch ('zabbix' , 'client' )
30+ self .re_send = config .fetch ('zabbix' , 're_send' , bool )
3031 self .queue = Queue ()
3132 self .log = logging .getLogger (
3233 'ZBX-{0}:{1}' .format (self .host , self .port ))
@@ -55,13 +56,22 @@ def _flush(self):
5556 metrics = self .queue .flush ()
5657 if len (metrics ) == 0 :
5758 return
59+ clock = int (time .time ())
5860 data = json .dumps ({
5961 'request' : 'sender data' ,
6062 'data' : metrics ,
61- 'clock' : int ( time . time ())
63+ 'clock' : clock
6264 })
63- self ._send_data (data )
64-
65+ sent_all = self ._send_data (data )
66+ if not sent_all and self .re_send :
67+ for metric in metrics :
68+ data = json .dumps ({
69+ 'request' : 'sender data' ,
70+ 'data' : [metric ],
71+ 'clock' : clock
72+ })
73+ self ._send_data (data )
74+
6575 def send_file_to_zabbix (self , path ):
6676 zabbix_client = self .config .fetch ('zabbix' , 'client' )
6777 self .log .setLevel ((self .config .fetch ('log' , 'level' )).upper ())
@@ -82,7 +92,8 @@ def send_file_to_zabbix(self, path):
8292 metrics .append (metric )
8393 else :
8494 self .log .error (
85- 'Can\' t load metric in line: "{0}". The line must have the format: time <tab> value <tab> metric\' s name.' .format (
95+ 'Can\' t load metric in line: "{0}". The line must have the format: '
96+ 'time <tab> value <tab> metric\' s name.' .format (
8697 line .rstrip ('\n ' )))
8798 except Exception as e :
8899 self .log .error ('Can\' t load metric in line: "{0}". Error : {1} ' .format (line .rstrip ('\n ' ), e , ))
@@ -99,6 +110,7 @@ def send_file_to_zabbix(self, path):
99110 break
100111
101112 def _send_data (self , data ):
113+ sent_all = True
102114 data_len = struct .pack ('<Q' , len (data ))
103115 packet = b'ZBXD\x01 ' + data_len + str .encode (data )
104116 try :
@@ -111,13 +123,15 @@ def _send_data(self, data):
111123 resp_body = self ._receive (sock , resp_body_len )
112124 self .log .debug ('response: {0}' .format (resp_body ))
113125 if 'failed: 0' not in str (resp_body ):
126+ sent_all = False
114127 self .log .error (
115128 'On request:\n {0}\n get response'
116129 ' with failed items:\n {1}' .format (
117130 data ,
118131 resp_body ))
119132 finally :
120133 sock .close ()
134+ return sent_all
121135
122136 def _receive (self , sock , count ):
123137 buf = str .encode ('' )
0 commit comments