前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >0654-6.2.0-如何通过CM API获取集群事件并入库到MySQL

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

作者头像
Fayson
修改2019-06-18 18:01:52
1.2K0
修改2019-06-18 18:01:52
举报
文章被收录于专栏:Hadoop实操Hadoop实操

作者:唐辉

文档编写目的

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 ,内容如下

代码语言:javascript
复制
#!/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

代码语言:javascript
复制
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 的,注意查看注释代码)

代码语言:javascript
复制
#!/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分钟执行一次

代码语言:javascript
复制
crontab -e

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

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

总结

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

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-06-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Hadoop实操 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云数据库 SQL Server
腾讯云数据库 SQL Server (TencentDB for SQL Server)是业界最常用的商用数据库之一,对基于 Windows 架构的应用程序具有完美的支持。TencentDB for SQL Server 拥有微软正版授权,可持续为用户提供最新的功能,避免未授权使用软件的风险。具有即开即用、稳定可靠、安全运行、弹性扩缩等特点。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档