|
#!/usr/bin/python
# coding:utf-8
import errno
import time
import socket
class CarbonClient(object):
def __init__(self, host, port):
self._host = host
self._port = port
self._carbon = None
self._connected = None
def connect(self):
"""
建立socket连接
"""
if not self._connected:
self._connect()
def connected(self):
return self._connected
def _connect(self):
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
while 1:
try:
sock.connect((self._host, self._port))
except socket.error as e:
if e.errno == errno.EINTR:
continue
else:
raise e
break
self._carbon = sock
self._connected = True
def close(self):
if self._connected:
self._carbon.close()
self._connected = False
def send(self, metrics):
chunk_start, chunk_end = 0,20
while 1:
payload = []
metrics_chunk = metrics[chunk_start: chunk_end]
if not metrics_chunk:
break
for metric in metrics_chunk:
if len(metric) == 2:
payload.append("{} {} {}\n".format(metric[0], metric[1], int(time.time())))
elif len(metric) == 3:
payload.append("{} {} {}\n".format(*metric))
else:
raise ValueError("Error format data")
self._carbon.sendall("".join(payload))
chunk_start, chunk_end = chunk_end, chunk_end + 20
def __enter__(self):
self.connect()
return self
def __exit__(self, exec_type, exec_value, exc_tb):
self.close()
return exec_value is None
class RebootCarbonClient(CarbonClient):
REBOOT_CARBON_ADDR = ("192.168.1.54", 2003)
def __init__(self):
super(RebootCarbonClient, self).__init__(*self.REBOOT_CARBON_ADDR)
"""
1条:
(key, value, time)
(key, value)
多条
[(key, value), (key, value)]
graphite api
"""
if __name__ == "__main__":
with RebootCarbonClient() as client:
client.send([("hostname.sys.mem.usage", '1096'), ("hostname.sys.mem.usage", '2048')]) |
|
|