cyberdelia / metrology

A library to easily measure what's going on in your python.
https://metrology.readthedocs.org
MIT License
309 stars 25 forks source link

Non-existent network error handling in GraphiteReporter #28

Open edigaryev opened 7 years ago

edigaryev commented 7 years ago

When the remote end closes the connection (e.g. carbon-cache restarts), sendall() throws SIGPIPE:

Exception in thread Thread-1:
Traceback (most recent call last):
  File "/usr/lib64/python2.7/threading.py", line 810, in __bootstrap_inner
    self.run()
  File "/home/user/.local/lib64/python2.7/site-packages/metrology/utils/periodic.py", line 24, in run
    self.task()
  File "/home/user/.local/lib64/python2.7/site-packages/metrology/reporter/base.py", line 14, in task
    self.write()
  File "/home/user/.local/lib64/python2.7/site-packages/metrology/reporter/graphite.py", line 92, in write
    self._send()
  File "/home/user/.local/lib64/python2.7/site-packages/metrology/reporter/graphite.py", line 133, in _send_plaintext
    self.socket.sendall(self.batch_buffer + "\n")
  File "/usr/lib64/python2.7/socket.py", line 228, in meth
    return getattr(self._sock,name)(*args)
error: [Errno 32] Broken pipe

ECONNREFUSED is thrown when the remote end isn't accepting connections yet:

Exception in thread Thread-1:
Traceback (most recent call last):
  File "/usr/lib64/python2.7/threading.py", line 810, in __bootstrap_inner
    self.run()
  File "/home/user/.local/lib64/python2.7/site-packages/metrology/utils/periodic.py", line 24, in run
    self.task()
  File "/home/user/.local/lib64/python2.7/site-packages/metrology/reporter/base.py", line 14, in task
    self.write()
  File "/home/user/.local/lib64/python2.7/site-packages/metrology/reporter/graphite.py", line 92, in write
    self._send()
  File "/home/user/.local/lib64/python2.7/site-packages/metrology/reporter/graphite.py", line 133, in _send_plaintext
    self.socket.sendall(self.batch_buffer + "\n")
  File "/home/user/.local/lib64/python2.7/site-packages/metrology/reporter/graphite.py", line 48, in socket
    self._socket.connect((self.host, self.port))
  File "/usr/lib64/python2.7/socket.py", line 228, in meth
    return getattr(self._sock,name)(*args)
error: [Errno 111] Connection refused

These exceptions cause periodic task (thread) to be terminated with no indication and/or connection retry attempts whatsoever.