Alertmanager集成iTop生成工单脚本

#!/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()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

旷野九思

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值