1 | # -*- coding: utf-8 -*-
|
---|
2 | # Description: rrdcached netdata python.d module
|
---|
3 | # Author: Mirek Laus (mirek@laus.cz)
|
---|
4 |
|
---|
5 | from bases.FrameworkServices.SocketService import SocketService
|
---|
6 |
|
---|
7 | ORDER = [
|
---|
8 | 'Queue',
|
---|
9 | 'Events',
|
---|
10 | 'Tree',
|
---|
11 | 'Journal'
|
---|
12 | ]
|
---|
13 |
|
---|
14 | CHARTS = {
|
---|
15 | 'Queue': {
|
---|
16 | 'options': [None, 'rrdcached queue length', 'items', 'queue', 'rrdcached.queue', 'line'],
|
---|
17 | 'lines': [
|
---|
18 | ['QueueLength', 'queue length', 'absolute'],
|
---|
19 | ['UpdatesWritten', 'updates written', 'incremental'],
|
---|
20 | ['FlushesReceived', 'flushes received', 'incremental']
|
---|
21 | ]
|
---|
22 | },
|
---|
23 | 'Events': {
|
---|
24 | 'options': [None, 'rrdcached updates', 'events/s', 'events', 'rrdcached.events', 'line'],
|
---|
25 | 'lines': [
|
---|
26 | ['UpdatesReceived', 'updates received', 'incremental'],
|
---|
27 | ['DataSetsWritten', 'datasets written', 'incremental']
|
---|
28 | ]
|
---|
29 | },
|
---|
30 | 'Tree': {
|
---|
31 | 'options': [None, 'rrdcached tree', 'items', 'tree', 'rrdcached.tree', 'line'],
|
---|
32 | 'lines': [
|
---|
33 | ['TreeNodesNumber', 'nodes number', 'absolute'],
|
---|
34 | ['TreeDepth', 'tree depth', 'absolute']
|
---|
35 | ]
|
---|
36 | },
|
---|
37 | 'Journal': {
|
---|
38 | 'options': [None, 'rrdcached journal', 'size', 'journal', 'rrdcached.journal', 'line'],
|
---|
39 | 'lines': [
|
---|
40 | ['JournalBytes', 'journal size', 'absolute', 1, 1024*1024*1024],
|
---|
41 | ['JournalRotate', 'journal rotate', 'absolute']
|
---|
42 | ]
|
---|
43 | }
|
---|
44 | }
|
---|
45 |
|
---|
46 |
|
---|
47 | class Service(SocketService):
|
---|
48 | def __init__(self, configuration=None, name=None):
|
---|
49 | SocketService.__init__(self, configuration=configuration, name=name)
|
---|
50 | self.order = ORDER
|
---|
51 | self.definitions = CHARTS
|
---|
52 | self.host = self.configuration.get('host', '127.0.0.1')
|
---|
53 | self.port = self.configuration.get('port', 42217)
|
---|
54 | self.unix_socket = self.configuration.get('socket')
|
---|
55 | self.request = 'STATS\r\n'
|
---|
56 |
|
---|
57 | def _get_data(self):
|
---|
58 | """
|
---|
59 | Format data received from socket
|
---|
60 | :return: dict
|
---|
61 | """
|
---|
62 | try:
|
---|
63 | raw = self._get_raw_data()
|
---|
64 | except (ValueError, AttributeError):
|
---|
65 | return None
|
---|
66 |
|
---|
67 | if raw is None:
|
---|
68 | self.debug('rrdcached returned no data')
|
---|
69 | return None
|
---|
70 |
|
---|
71 | lines = raw.split('\n')
|
---|
72 | ret = dict()
|
---|
73 | for i, line in enumerate(lines):
|
---|
74 | try:
|
---|
75 | data = line.split(': ')[:2]
|
---|
76 | ret[str(data[0])] = int(data[1])
|
---|
77 | except (ValueError, IndexError) as e:
|
---|
78 | continue
|
---|
79 | return ret or None
|
---|