0654-6.2.0-如何通过CM API获取集群事件并入库到MySQL

Fayson的github: https://github.com/fayson/cdhproject

推荐关注微信公众号:“Hadoop实操”,ID:gh_c4c535955d0f

1 文档编写目的

Fayson在本文中介绍如何通过shell 和python 脚本获取CM中重要的告警信息,以便更方便的掌握和分析集群以及集群中节点和服务的健康状况。

测试环境:

1.RedHat7.2

2.CDH6.2.0

3.Python 2.7

4.使用root用户操作

2 操作步骤

2.1 在CM中获取API和event信息

首先需要知道CM 中API 获取告警信息的rest API ,可以通过在CM界面>支持>API 文档 搜索events。注:由于C6中API页面改版的缘故,在C6点击查看API详情界面使用的Google 的在线JQuery,建议使用VPN,否则C6中可能无法查看详情

在这里插入图片描述

在这里插入图片描述

因为使用rest API 通过curl 的方式,通过明文用户和密码,在CM中创建一个只读用户用来测试。CM>管理>User&Roles 中添加只读用户

在这里插入图片描述

关于事件的汇总可以在CM界面>诊断>事件 中通过添加筛选器来进行查看

在这里插入图片描述

2.2 编辑Shell 脚本获取数据

在CM界面筛选出想要的数据后,我们可以通过CM API方式用curl 获取数据,并导出到本地文件中,创建event.sh ,内容如下

#!/bin/bash
#由于CM API 的日期是UTC时间,故将日期转化需要将时间转化位UTC时间
nowTime=`date +"%Y-%m-%dT%H:%M:%S.000Z" -d "8 hours ago"`
tenMinAgo=`date +"%Y-%m-%dT%H:%M:%S.000Z" -d "8 hours ago 10 minute ago"`
echo $nowTime $tenMinAgo
#通过curl 的方式将获取的事件导出到指的的文件中,区间为10分钟
# -o 指定输出文件
# -u 指定用户密码
# CDH6.2 中API 版本为V32,CDH5.16.1 中为V19,这里在同一个脚本中获取两个集群的信息,需确保执行的节点访问两个CM节点没有限制,alert==true表示为页面红色告警信息
curl -o /root/eventScript/event1.txt -u readonly:readonly "http://192.168.0.234:7180/api/v32/events?query=alert==true;timeReceived=ge=$tenMinAgo;timeReceived=lt=$nowTime"
curl -o /root/eventScript/event2.txt -u readonly:readonly "http://192.168.0.197:7180/api/v19/events?query=alert==true;timeReceived=ge=$tenMinAgo;timeReceived=lt=$nowTime"

#执行python 脚本解析数据拼接SQL,由于没有安装python MySQLdb 模块,在python中不做入库处理
python /root/eventScript/event.py > /root/eventScript/eventScript.log

#使用shell 命令进行入库操作
if [ ! -f "/root/eventScript/all_event.sql" ]; then
    echo "sql file is not exits!"
else
    mysql -utest -ptest -h 192.168.0.234 test < /root/eventScript/all_event.sql
    sleep 3s
    rm -rf /root/eventScript/all_event.sql
fi

执行调试,由于近10分钟没有告警,所以创建了一个触发器进行测试,详情参考文章《0642-6.2-如何在CM界面创建触发器》
在这里插入图片描述

2.3 创建MySQL测试表

在MySQL中test 库中创建事件表eventtable

在这里插入图片描述

create table eventtable (
     eventTime varchar(50),--事件时间
     eventService varchar(50),--事件服务
     eventCluster varchar(50),--事件集群
     eventName text,--事件名称
     eventContent text,--事件内容
     eventHost varchar(50),--事件主机
     eventLink varchar(100)--事件链接
 ) DEFAULT CHARSET=utf8;

2.4 编写Python脚本解析数据

通过Python 解析获取的数据并拼接SQL文件,创建event.py,内容如下(注:下列Python脚本中有Python2的也有Python3 的,注意查看注释代码)

#!/usr/bin/python3
# -*- coding: utf-8 -*-
import json
import datetime
#--- python2.7 中全局字符编码设置-----
#import sys
#reload(sys)
#sys.setdefaultencoding('utf-8')
#--------------------------------

def getEvent(fileName):
    eventTime=""
    eventService=""
    eventCluster=""
    eventName=""
    eventContent=""
    eventHost=""
    eventLink=""
sqlContent=""
# python2 中没有encoding='UTF-8',可以使用上面注释的写法,下面的写入同理
    with open(fileName,'r',encoding='UTF-8') as load_f:
        load_dict = json.load(load_f)
        #print(load_dict['items'])
        items = load_dict['items']
        eventCount = load_dict['totalResults']
        # 获取的事件总条数大于0执行
        if eventCount > 0:
            for b in range(len(items)):
                 # 时间格式转化
                 eventTime=items[b]['timeReceived']
                 # print(eventTime)
                 UTC_FORMAT = "%Y-%m-%dT%H:%M:%S.%fZ"
                 utcTime = datetime.datetime.strptime(eventTime, UTC_FORMAT)
                 eventTime = utcTime + datetime.timedelta(hours=8)
                 eventTime =str(eventTime).split(".")[0]
                 # print("事件"+str(b)+"发生时间:"+eventTime)
                 # content 中可能出现单引号的情况会导致SQL不正常,替换掉
                 eventContent =items[b]['content'].replace("'"," ")
                 # print("事件内容为:" + eventContent)
                 attr=items[b]['attributes']
                 for a in range(len(attr)):
                    if attr[a]['name'] == "CLUSTER_DISPLAY_NAME" :
                        eventCluster=attr[a]['values'][0]
                        # print("集群名称为:"+eventCluster)
                    if attr[a]['name'] == "SERVICE" :
                        eventService=attr[a]['values'][0]
                        #print("事件服务为:" + eventService)
                    if attr[a]['name'] == "HEALTH_TEST_NAME" :
                        eventName=attr[a]['values'][0]
                        #print("事件名称为:" + eventName)
                    if attr[a]['name'] == "HOSTS" :
                        eventHost = attr[a]['values'][0]
                        #print("事件主机为:" + eventHost)
                    if attr[a]['name'] == "URL" :
                        eventLink = attr[a]['values'][0]
                        #print("事件链接为:" + eventLink)
                 sqlContent ="insert into eventtable (eventTime,eventService,eventCluster,eventName,eventContent,eventHost,eventLink) " \
                        "values ('"+eventTime+"','"+eventService+"','"+eventCluster+"','"+eventName+"','"+eventContent+"','"+eventHost+"','"+eventLink+"')"+";\n"
                 # print(sqlContent)
                 #以追加的方式写入
                 with open('/root/eventScript/all_event.sql', 'a',encoding='UTF-8') as f:
                    f.write(sqlContent)
                    f.close
for i in range(1,3):
    getEvent("/root/eventScript/event"+str(i)+".txt")

测试环境Python2.7
在这里插入图片描述
进行测试

在这里插入图片描述

2.5 添加Linux 定时执行器

写入到定时器中每10分钟执行一次

crontab -e

*/10 * * * * /bin/bash /root/eventScript/event.sh >> /root/eventScript/eventExcute.log

在这里插入图片描述
为了立马看到效果,添加了一个CPU触发器进行验证,发现已经成功入库(注:存在重复数据是因为测试将定时器中途有重新获取文件和定时器时间为每分钟执行一次)

在这里插入图片描述

3 总结

通过上述的操作,我们可以同时管理多个CM管理的多个集群的事件信息,以及更加方便我们分析集群的事件,更便捷的掌握集群的健康状况

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值