add the ability connect to unix socket
Ilya committed
Jan 11, 2017 at 15:09 UTC
91e2049cf6b2688fed625d66b76d7936ab4e2d56
1 file changed
+41
-13
python.d/haproxy.chart.py
+41
-13
@@ -2,7 +2,7 @@
2
# Description: haproxy netdata python.d module
3
# Author: l2isbad
4
5
-from base import UrlService
5
+from base import UrlService, SocketService
6
7
# default module values (can be overridden per job in `config`)
8
# update_every = 2
@@ -51,16 +51,36 @@ CHARTS = {
51
}
52
53
54
-class Service(UrlService):
54
+class Service(UrlService, SocketService):
55
def __init__(self, configuration=None, name=None):
56
- UrlService.__init__(self, configuration=configuration, name=name)
57
- self.url = "http://127.0.0.1:7000/haproxy_stats;csv"
56
+ SocketService.__init__(self, configuration=configuration, name=name)
57
+ self.user = self.configuration.get('user')
58
+ self.password = self.configuration.get('pass')
59
+ self.request = 'show stat\n'
60
+ self.poll_method = (UrlService, SocketService)
61
self.order = ORDER
62
self.order_front = [_ for _ in ORDER if _.startswith('f')]
63
self.order_back = [_ for _ in ORDER if _.startswith('b')]
64
self.definitions = CHARTS
65
self.charts = True
66
67
+ def check(self):
68
+ if self.configuration.get('url'):
69
+ self.poll_method = self.poll_method[0]
70
+ url = self.configuration.get('url')
71
+ if not url.endswith(';csv'):
72
+ self.error('Bad url(%s). Must be http://<ip.address>:<port>/<url>;csv' % url)
73
+ return False
74
+ elif self.configuration.get('socket'):
75
+ self.poll_method = self.poll_method[1]
76
+ else:
77
+ self.error('No configuration is specified')
78
+ return False
79
+
80
+ if self.poll_method.check(self):
81
+ self.info('Plugin was started succesfully. We are using %s.' % self.poll_method.__name__)
82
+ return True
83
+
84
def create_charts(self, front_ends, back_ends):
85
for _ in range(len(front_ends)):
86
self.definitions['fbin']['lines'].append(['_'.join(['fbin', front_ends[_]['# pxname']]), front_ends[_]['# pxname'], 'incremental', 1, 1024])
@@ -80,12 +100,8 @@ class Service(UrlService):
100
Format data received from http request
101
:return: dict
102
"""
83
- if self.url[-4:] != ';csv':
84
- self.url += ';csv'
85
- self.info('Url rewritten to %s' % self.url)
86
-
103
try:
88
- raw_data = self._get_raw_data().splitlines()
104
+ raw_data = self.poll_method._get_raw_data(self).splitlines()
105
except Exception as e:
106
self.error(str(e))
107
return None
@@ -117,13 +133,25 @@ class Service(UrlService):
133
return to_netdata
134
135
def is_backend(backend):
120
- return backend['svname'] == 'BACKEND' and backend['# pxname'] != 'stats'
136
+ try:
137
+ return backend['svname'] == 'BACKEND' and backend['# pxname'] != 'stats'
138
+ except Exception:
139
+ return False
140
141
def is_frontend(frontend):
123
- return frontend['svname'] == 'FRONTEND' and frontend['# pxname'] != 'stats'
142
+ try:
143
+ return frontend['svname'] == 'FRONTEND' and frontend['# pxname'] != 'stats'
144
+ except Exception:
145
+ return False
146
147
def is_server(server):
126
- return not server['svname'].startswith(('FRONTEND', 'BACKEND'))
148
+ try:
149
+ return not server['svname'].startswith(('FRONTEND', 'BACKEND'))
150
+ except Exception:
151
+ return False
152
153
def is_server_down(server, back_ends, _):
129
- return server['# pxname'] == back_ends[_]['# pxname'] and server['status'] != 'UP'
154
+ try:
155
+ return server['# pxname'] == back_ends[_]['# pxname'] and server['status'] != 'UP'
156
+ except Exception:
157
+ return False