Created
March 27, 2017 14:51
-
-
Save walkure/c1280ed03695d3be6031c640f0cf4526 to your computer and use it in GitHub Desktop.
ZabbixからSlackへ通知を送る実装
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/python | |
import json | |
import os | |
import sys | |
import pprint | |
import io | |
import requests | |
gyazo_token = 'GYAZO_TOKEN' | |
zabbix_host = 'http://zabbix.host/' | |
zabbix_user = 'Admin' | |
zabbix_pass = 'zabbix' | |
def main(argv): | |
(params, slack) = load_params(argv) | |
send_slack(params, slack) | |
def load_params(argv): | |
slack = { | |
'hook': argv[2], | |
} | |
if(len(argv) > 3): | |
slack['channel'] = argv[3] | |
if(len(argv) > 4): | |
slack['name'] = argv[4] | |
if(len(argv) > 5): | |
slack['emoji'] = argv[5] | |
params = {} | |
for line in argv[1].split('\n'): | |
kv = line.split(':') | |
if(len(kv) > 1): | |
params[kv[0].strip()] = ':'.join(kv[1:]).strip() | |
items = [] | |
for it in [''] + list(range(1, 10)): | |
item = load_item_params(['KEY', 'ID', 'NAME', 'VALUE'], it, params) | |
if(('NAME' in item) and '*UNKNOWN*' not in item['NAME']): | |
items.append(item) | |
params['ITEMS'] = items | |
return (params, slack) | |
def load_item_params(item_keys, item_index, params): | |
item = {} | |
item_index = str(item_index) | |
for item_key in item_keys: | |
if('ITEM_' + item_key + item_index in params): | |
item[item_key] = params.pop('ITEM_' + item_key + item_index) | |
return item | |
def send_slack(params, slack): | |
itemids = '&'.join({'itemids[]=' + it['ID'] for it in params['ITEMS']}) | |
msg_prefix = params['MESSAGE_PREFIX'] if 'MESSAGE_PREFIX' in params else '' | |
body = { | |
'text': '{prefix} *{status}* {host}:[{severity}] {name} (<{zabbix}/history.php?action=showgraph&{itemids}|graph>)'.format( | |
status=params['TRIGGER_STATUS'], severity=params[ | |
'TRIGGER_SEVERITY'], | |
name=params['TRIGGER_NAME'], host=params['HOST'], | |
zabbix=zabbix_host, itemids=itemids, prefix=msg_prefix), | |
'fallback': '{prefix} *{status}* {host}:[{severity}] {name}'.format( | |
status=params['TRIGGER_STATUS'], severity=params[ | |
'TRIGGER_SEVERITY'], | |
name=params['TRIGGER_NAME'], host=params['HOST'], prefix=msg_prefix), | |
'attachments': [ | |
{ | |
'color': get_status_color(params), | |
'image_url': get_graph_thumb(params), | |
'fields': [{ | |
'title': it['NAME'], | |
'value':it['VALUE'], | |
'short':True | |
} for it in params['ITEMS'] | |
], | |
}, | |
] | |
} | |
if 'channel' in slack: | |
body['channel'] = slack['channel'] | |
if 'emoji' in slack: | |
body['icon_emoji'] = slack['emoji'] | |
if 'name' in slack: | |
body['username'] = slack['name'] | |
res = requests.post(slack['hook'], data=json.dumps(body)) | |
def get_status_color(params): | |
status = params['TRIGGER_STATUS'] | |
severity = params['TRIGGER_SEVERITY'] | |
if(status == 'OK'): | |
if(severity == 'Information'): | |
return '#bafccc' | |
else: | |
return 'good' | |
elif(status == 'PROBLEM'): | |
if(severity == 'Information'): | |
return '#bafccc' | |
elif(severity == 'Warning'): | |
return 'warning' | |
else: | |
return 'danger' | |
return '#808080' | |
def upload_gyazo(image): | |
img = {'imagedata': io.BytesIO(image)} | |
body = {'access_token': gyazo_token} | |
res = requests.post( | |
'https://upload.gyazo.com/api/upload', files=img, data=body) | |
obj = json.loads(res.text) | |
return obj['url'] | |
def get_graph_thumb(params): | |
zabbix = ZabbixLib(host=zabbix_host, user=zabbix_user, passwd=zabbix_pass) | |
img = zabbix.loadGraphImage({it['ID'] for it in params['ITEMS']}) | |
return upload_gyazo(img) | |
class ZabbixLib: | |
def __init__(self, host=None, user=None, passwd=None): | |
self.__auth = None | |
self.__id = 1 | |
self.__host = host | |
obj = self.__request('user.login', { | |
'user': user, | |
'password': passwd, | |
}) | |
self.__auth = obj | |
def __request(self, method, param): | |
body = { | |
'jsonrpc': '2.0', | |
'method': method, | |
'params': param, | |
'id': self.__id, | |
'auth': self.__auth, | |
} | |
self.__id = self.__id + 1 | |
res = requests.post(self.__host + '/api_jsonrpc.php', json.dumps(body), headers={ | |
'Content-Type': 'application/json'}) | |
obj = res.json() | |
return obj['result'] | |
def loadGraphImage(self, itemids, period=10800): | |
query = '&'.join({'period=' + str(period)} | | |
{'itemids[]=' + it for it in itemids}) | |
cookies = {'zbx_sessionid': self.__auth} | |
res = requests.get(self.__host + '/chart.php?' + | |
query, cookies=cookies) | |
return res.content | |
if __name__ == '__main__': | |
main(sys.argv) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment