-
Notifications
You must be signed in to change notification settings - Fork 595
Expand file tree
/
Copy pathconntrack.py
More file actions
89 lines (76 loc) · 2.93 KB
/
conntrack.py
File metadata and controls
89 lines (76 loc) · 2.93 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
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
# coding=utf-8
"""
Collecting connections tracking statistics from nf_conntrack/ip_conntrack
kernel module.
#### Dependencies
* nf_conntrack/ip_conntrack kernel module
"""
import diamond.collector
import os
class ConnTrackCollector(diamond.collector.Collector):
"""
Collector of number of conntrack connections
"""
def get_default_config_help(self):
"""
Return help text for collector configuration
"""
config_help = super(ConnTrackCollector, self).get_default_config_help()
config_help.update({
"dir": "Directories with files of interest, comma seperated",
"files": "List of files to collect statistics from",
})
return config_help
def get_default_config(self):
"""
Returns the default collector settings
"""
config = super(ConnTrackCollector, self).get_default_config()
config.update({
"path": "conntrack",
"dir": "/proc/sys/net/ipv4/netfilter,/proc/sys/net/netfilter",
"files": "ip_conntrack_count,ip_conntrack_max,"
"nf_conntrack_count,nf_conntrack_max",
})
return config
def collect(self):
"""
Collect metrics
"""
collected = {}
files = []
if isinstance(self.config['dir'], str):
dirs = [d.strip() for d in self.config['dir'].split(',')]
elif isinstance(self.config['dir'], list):
dirs = self.config['dir']
if isinstance(self.config['files'], str):
files = [f.strip() for f in self.config['files'].split(',')]
elif isinstance(self.config['files'], list):
files = self.config['files']
for sdir in dirs:
for sfile in files:
if sfile.endswith('conntrack_count'):
metric_name = 'ip_conntrack_count'
elif sfile.endswith('conntrack_max'):
metric_name = 'ip_conntrack_max'
else:
self.log.error('Unknown file for collection: %s', sfile)
continue
fpath = os.path.join(sdir, sfile)
if not os.path.exists(fpath):
continue
try:
with open(fpath, "r") as fhandle:
metric = float(fhandle.readline().rstrip("\n"))
collected[metric_name] = metric
except Exception as exception:
self.log.error("Failed to collect from '%s': %s",
fpath,
exception)
if not collected:
self.log.error('No metric was collected, looks like '
'nf_conntrack/ip_conntrack kernel module was '
'not loaded')
else:
for key in list(collected.keys()):
self.publish(key, collected[key])