Skip to content

Instantly share code, notes, and snippets.

@walkure
Created March 27, 2017 14:51
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save walkure/c1280ed03695d3be6031c640f0cf4526 to your computer and use it in GitHub Desktop.
Save walkure/c1280ed03695d3be6031c640f0cf4526 to your computer and use it in GitHub Desktop.
ZabbixからSlackへ通知を送る実装
#!/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