-
Notifications
You must be signed in to change notification settings - Fork 15
Expand file tree
/
Copy pathproxy_connection_handler.py
More file actions
71 lines (58 loc) · 2.49 KB
/
proxy_connection_handler.py
File metadata and controls
71 lines (58 loc) · 2.49 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
"""Connection Handler class for sending data to a Wavefront proxy.
@author: Hao Song (songhao@vmware.com)
"""
from __future__ import absolute_import
import socket
from . import connection_handler
# pylint: disable=too-many-instance-attributes
class ProxyConnectionHandler(connection_handler.ConnectionHandler):
"""Connection Handler.
For sending data to a Wavefront proxy listening on a given port.
"""
# pylint: disable=too-many-arguments,too-many-positional-arguments
def __init__(self, address, port, wavefront_sdk_metrics_registry,
entity_prefix=None, timeout=None):
"""Construct ProxyConnectionHandler.
@param address: Proxy Address
@param port: Proxy Port
"""
super().__init__()
self._address = address
self._port = int(port)
self.entity_prefix = '' if not entity_prefix else entity_prefix + ''
self.timeout = timeout
self.wf_metrics_registry = wavefront_sdk_metrics_registry
self._write_successes = self.wf_metrics_registry.new_delta_counter(
self.entity_prefix + 'write.success')
self._write_errors = self.wf_metrics_registry.new_delta_counter(
self.entity_prefix + 'write.errors')
self._reconnecting_socket = None
def connect(self):
"""Initialize socket and connect to given address:port."""
self._reconnecting_socket = socket.socket(socket.AF_INET,
socket.SOCK_STREAM)
self._reconnecting_socket.settimeout(self.timeout)
self._reconnecting_socket.connect((self._address, self._port))
def close(self):
"""Close socket if it's open now."""
if self._reconnecting_socket:
self._reconnecting_socket.close()
def send_data(self, line_data, reconnect=True):
"""Send data via proxy.
@param line_data: Data to be sent
@param reconnect: If it's the second time trying to send data
"""
try:
if not self._reconnecting_socket:
self.connect()
self._reconnecting_socket.sendall(line_data.encode('utf-8'))
self._write_successes.inc()
except socket.error as error:
if reconnect:
self._reconnecting_socket = None
# Try to resend
self.send_data(line_data, reconnect=False)
else:
# Second time trying failed
self._write_errors.inc()
raise error