作者:唐辉
文档编写目的
Fayson在本文中介绍如何通过shell 和python 脚本获取CM中重要的告警信息,以便更方便的掌握和分析集群以及集群中节点和服务的健康状况。
1.RedHat7.2
2.CDH6.2.0
3.Python 2.7
4.使用root用户操作
操作步骤
在CM中获取API和event信息
首先需要知道CM 中API 获取告警信息的rest API ,可以通过在CM界面>支持>API 文档 搜索events。注:由于C6中API页面改版的缘故,在C6点击查看API详情界面使用的Google 的在线JQuery,建议使用V**,否则C6中可能无法查看详情
因为使用rest API 通过curl 的方式,通过明文用户和密码,在CM中创建一个只读用户用来测试。CM>管理>User&Roles 中添加只读用户
关于事件的汇总可以在CM界面>诊断>事件 中通过添加筛选器来进行查看
编辑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界面创建触发器》
创建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;
编写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
进行测试
添加Linux 定时执行器
写入到定时器中每10分钟执行一次
crontab -e
*/10 * * * * /bin/bash /root/eventScript/event.sh >> /root/eventScript/eventExcute.log
为了立马看到效果,添加了一个CPU触发器进行验证,发现已经成功入库(注:存在重复数据是因为测试将定时器中途有重新获取文件和定时器时间为每分钟执行一次)
总结
通过上述的操作,我们可以同时管理多个CM管理的多个集群的事件信息,以及更加方便我们分析集群的事件,更便捷的掌握集群的健康状况