forked from um-flint/pingdom-zabbix
-
Notifications
You must be signed in to change notification settings - Fork 0
/
pingdom-zabbix.py
executable file
·119 lines (110 loc) · 3.26 KB
/
pingdom-zabbix.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
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
#!/usr/bin/env python
#
# modules
#
import json
import re
import requests
import subprocess
import ConfigParser
#
# pull in the config
#
config = ConfigParser.ConfigParser()
config.read('pingdom-zabbix.ini')
#
# zabbix trapper call
#
def zabbix_trapper(cmd_args):
try:
print ' '.join(cmd_args)
print subprocess.check_output(cmd_args)
except subprocess.CalledProcessError as e:
print "EXCEPTION"
print "returncode:", e.returncode
print "cmd:", e.cmd
print "output:", e.output
#
# pull pingdom data (checks and values)
#
def pingdom_data(pingdom_response):
data = []
for check in pingdom_response.json()['checks']:
data.append({
'name': check['name'],
'status': check['status'],
'resptime': check['lastresponsetime']
})
return data
#
# pingdom checks -> zabbix discovery
#
def zabbix_discovery(pingdom_data):
discovery = []
for check in pingdom_data:
discovery.append(
{"{#NAME}": str(check['name'])}
)
cmd_args = [
'zabbix_sender',
'-z', config.get('ZABBIX', 'server'),
'-p', config.get('ZABBIX', 'port'),
'-s', config.get('ZABBIX', 'host'),
'-k', config.get('ZABBIX', 'key1'),
'-o', "'{ \"data\": " + json.dumps(discovery) + " }'"
]
zabbix_trapper(cmd_args)
#
# pingdom status -> zabbix trapper
#
def zabbix_status(pingdom_data):
for check in pingdom_data:
# turn 'up' into 1 and 'down' into 0
status = 0
if check['status'] == 'up':
status = 1
cmd_args = [
'zabbix_sender',
'-z', config.get('ZABBIX', 'server'),
'-p', config.get('ZABBIX', 'port'),
'-s', config.get('ZABBIX', 'host'),
'-k', config.get('ZABBIX', 'key2') + '["' + str(check['name']) + '"]',
'-o', str(status)
]
zabbix_trapper(cmd_args)
#
# pingdom lastresponsetime -> zabbix trapper
#
def zabbix_resptime(pingdom_data):
for check in data:
cmd_args = [
'zabbix_sender',
'-z', config.get('ZABBIX', 'server'),
'-p', config.get('ZABBIX', 'port'),
'-s', config.get('ZABBIX', 'host'),
'-k', config.get('ZABBIX', 'key3') + '["' + str(check['name']) + '"]',
'-o', str(check['resptime'])
]
zabbix_trapper(cmd_args)
try:
# pingdom variables (convenience)
pingdom = dict(
apiurl = config.get('PINGDOM', 'apiurl'),
appkey = config.get('PINGDOM', 'appkey'),
username = config.get('PINGDOM', 'username'),
password = config.get('PINGDOM', 'password')
)
# connect to pingdom
res = requests.get(pingdom['apiurl'], auth=(pingdom['username'],pingdom['password']), headers={'App-Key': pingdom['appkey']})
if res.status_code == requests.codes.ok:
# fetch pingdom data (checks and values)
data = pingdom_data(res)
# pingdom checks -> zabbix discovery
zabbix_discovery(data)
# pingdom status and lastresponsetime -> zabbix values
zabbix_status(data)
zabbix_resptime(data)
else:
print "EXCEPTION: Bad Request; HTTP {}".format(str(res.status_code))
except Exception as e:
print "EXCEPTION: {}".format(str(e))