#!/usr/bin/env python3
# --coding:utf-8--
import requests
import json
import sys
import time,datetime
from http.server import BaseHTTPRequestHandler, HTTPServer
now_time=datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
'''
// alertmanager 发过来的json格式
// {
// "version": "4",
// "groupKey": <string>, // key identifying the group of alerts (e.g. to deduplicate)
// "truncatedAlerts": <int>, // how many alerts have been truncated due to "max_alerts"
// "status": "<resolved|firing>",
// "receiver": <string>,
// "groupLabels": <object>,
// "commonLabels": <object>,
// "commonAnnotations": <object>,
// "externalURL": <string>, // backlink to the Alertmanager.
// "alerts": [
// {
// "status": "<resolved|firing>",
// "labels": <object>,
// "annotations": <object>,
// "startsAt": "<rfc3339>",
// "endsAt": "<rfc3339>",
// "generatorURL": <string>, // identifies the entity that caused the alert
// "fingerprint": <string> // fingerprint to identify the alert
// },
// ...
// ]
// }
'''
class RequestHandler(BaseHTTPRequestHandler):
def do_POST(self):
# 解析请求 body
req_body = self.rfile.read(int(self.headers['content-length']))
obj = json.loads(req_body.decode("utf-8"))
# print(req_body)
print(obj)
# print(type(obj))
host = ''
service = ''
service_status = ''
service_level = ''
fail_type = ''
for k,v in obj.items():
if k == 'status':
service_status = v
if k == 'commonAnnotations':
for k1,v1 in v.items():
if k1 == 'description':
service = v1
if k1 == 'instance':
host = v1
if k1 == 'level':
service_level = v1
if k1 == 'type':
fail_type = v1
#print(host+service+service_status)
ITOP_URL = 'http://10.10.10.123'
ITOP_USER = 'monitor'
ITOP_PWD = 'Aa@123456'
TICKET_CLASS = 'Incident' #Incident,Problem,UserRequest 3种类型
TITLE = host + '*_*' + fail_type + '*_*' + service_level
DESCRIPTION = "1HU0*_*" + host + "*_*" + fail_type + "*_*" + service_level + "*_*" + service + "*_*" + service_status + "*_*" + now_time
COMMENT = 'Created from alertmanager'
# 'functionalci_id' => sprintf("SELECT FunctionalCI WHERE name='$host'"
# "SELECT Organization AS O JOIN FunctionalCI AS CI ON CI.org_id = O.id WHERE CI.name='$host'"
if service_level == 'P1-critical':
sl = '2'
if service_level == 'P2-warning':
sl = '3'
if (service_status == "firing"):
json_data = {
'operation': 'core/create',
'class': TICKET_CLASS,
'fields': {
'title': TITLE ,
'description': DESCRIPTION,
'org_id': 'SELECT Organization WHERE id=40',
'urgency': sl,
'caller_id': {"name":"监控","first_name":"系统"},
#'functionalcis_list': [{
# 'functionalci_id': '40',
# 'impact_code': 'manual',
#}],
},
'comment': COMMENT,
'output_fields': 'id',
}
encoded_data = json.dumps(json_data)
print(json_data)
#print(encoded_data)
r = requests.post(ITOP_URL + '/webservices/rest.php?version=1.0', verify=False,
data={'auth_user': ITOP_USER, 'auth_pwd': ITOP_PWD, 'json_data': encoded_data})
result = json.loads(r.text)
if result['code'] == 0:
print("Ticket created.\n")
else:
print(result['message'] + "\n")
else:
print("Service state type !='HARD', doing nothing.\n")
return
self.send_response(200)
self.send_header("Content-type","application/json") #设置post时服务器的响应头
self.end_headers()
result = {
'code': 200,
'msg': 'success'
}
self.wfile.write(json.dumps(result).encode())
return
def run():
port = 8000
server_address = ('10.11.12.34', port)
httpd = HTTPServer(server_address, RequestHandler)
print("httpd start.....")
httpd.serve_forever()
if __name__ == '__main__':
run()
Alertmanager集成iTop生成工单脚本
于 2023-05-10 10:21:25 首次发布