-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathdocker2prtg.py
76 lines (60 loc) · 2.29 KB
/
docker2prtg.py
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
#!/usr/bin/python3
# coding: utf-8
import pandas as pd
from jinja2 import Template
import subprocess
from io import StringIO
import re
import sys
#configuration
dockerBinary = "/usr/bin/docker"
#parse docker fields
def parseDockerStatsFields(cmd):
return re.findall(r'{{\.([a-zA-Z0-9]*)\}}',cmd)
#cleanupValues
def cleanupVals(row):
if row.get('CPUPerc') is not None:
row['CPUPerc'] = row['CPUPerc'].replace("%","").strip()
if row.get('MemUsage') is not None:
row['MemUsage'] = row['MemUsage'].split("/")[0].replace("MiB","").strip()
return row
#get docker stats
def getDockerStats(fields):
cmd = dockerBinary + ' stats --no-stream --format "'+fields+'"'
stats = subprocess.run(cmd.split(), stdout=subprocess.PIPE).stdout.decode('utf-8').replace('"','')
dockerStatsFields = parseDockerStatsFields(cmd)
dockerStats = pd.read_csv(StringIO(stats), names = dockerStatsFields, header = None, sep=';', index_col = False)
dockerStats = dockerStats.apply(cleanupVals,axis=1)
dockerStats = dockerStats.to_dict(orient='records')
return {'data':dockerStats}
#define xml template
def buildXML(dockerStats):
template = Template("""
<?xml version="1.0" encoding="Windows-1252" ?>
<prtg>
{%for stat in dockerStats.data %}<result>
<channel>{{stat.Name}} {{dockerStats.fieldName}}</channel>
<value>{{stat[dockerStats.fieldName]}}</value>
</result>{% endfor %}
</prtg>
""")
rendered = template.render({'dockerStats':dockerStats})
return rendered
#render xml template
def renderDockerStats(dockerStats,fieldName):
dockerStats.update({'fieldName':fieldName})
return buildXML(dockerStats)
#main
def main(argv):
fields = "{{.Name}};{{.Container}};{{.CPUPerc}};{{.MemUsage}};{{.NetIO}}"
if len(argv) > 1:
selectedField = argv[1]
dockerStats = getDockerStats(fields)
renderedDockerStats = renderDockerStats(dockerStats,selectedField)
print(renderedDockerStats)
else:
availableFields = parseDockerStatsFields(fields)
print("Select one of the available fields {} and pass it as an argument to the script".format([x for x in availableFields if x not in ['Name','Container']]))
print("docker2prtg.py <field>")
if __name__ == "__main__":
main(sys.argv)