1、Open-falcon运维监控系统简介

OpenFalcon是一款由小米运维团队从互联网公司的需求出发, 根据多年的运维经验,结合市面上使用的一些运维监控系统的使用经验和反馈,开发的一套企业级、高可用、可扩展的开源监控解决方案。简单了使用一下Open-falcon运维监控,结合使用过的zabbix,cacti,nagios来说,觉得有以下几个优点:

  1. 支持用户主动push,可以结合一些业务需求采集数据,同时也支持用户自定义的插件。
  2. 支持策略模板,模板继承和覆盖,多种告警方式,支持callback调用
  3. 由于dashboard采用的是rrd数据,结合rrdtool的数据归档策略,可以及时返回历史数据
  4. 多维度的数据展示,用户可以自定义Screen。
  5. 有着完善的开源社区,开源社区提供了各种第三方应用的监控插件。目前的插件支持Linux、Windows、Mysql、Redis、Memache、RabbitMQ和交换机监控。

在这里就不再赘述Open-falcon运维监控系统各种组件,以及如何部署,官方文档写的十分明白,有兴趣的可以去看看官方文档。

官方文档地址:http://book.open-falcon.org/
Open-falcon的github地址:https://github.com/open-falcon/

2、遇到的问题

在使用Open-falcon的过程中遇到过这么一个问题,就是在发送微信报警的时候,发现只能绑定一个企业微信中的应用,如果监控的机器多起来,各种类型的报警成堆的在一个微信应用中出现。所以面对不同的报警类型的告警信息需要把他归类在不同的应用发送,这样面对不同的问题时便可以更加方便的解决。查看了官方提供的微信网关,研究了一下,官方使用go语言写,对于go语言没怎么接触,所以打算用python写一个微信的接口,能够自定义添加绑定不同的应用。

官方的微信接口:https://github.com/Yanjunhui/chat

3、解决的方案及思路

大概思路就是,python从wechat.conf配置文件中提取配置信息,定时获取微信的access_token,并且存入到指定access_token.conf的配置文件中,绑定端口监听Open-falcon发送过来的数据,解析提取关键的信息,判断告警类型,并且从access_token.conf配置文件中获取指定应用access_token,然后发送到指定的url。
企业微信API:https://work.weixin.qq.com/api/doc

4、详细解决方法及代码分析

4.1、首先需要统一配置文件的格式:wechat.conf、access_token.conf

wechat.conf

access_token.conf

4.2、获取wechat.conf配置文件的配置项,定时获取access_token

def get_accesstoken():
url = 'https://qyapi.weixin.qq.com/'
ap = ConfigParser.SafeConfigParser()
cp = ConfigParser.SafeConfigParser()
ap.read('./config/wechat.conf')
config = ap.sections()
for i in config:if i != 'http' and i != 'weixin':agentid = ap.get(i, 'AgentId')corpid = ap.get(i, 'CorpID')corpsecret = ap.get(i, 'Secret')token_url = '%s/cgi-bin/gettoken?corpid=%s&corpsecret=%s' % (url, corpid, corpsecret)access_token = json.loads(urllib.urlopen(token_url).read().decode())['access_token']cp.add_section(i)cp.set(i,"AgentId",agentid)cp.set(i, "access_token", access_token)cp.write(open('./config/access_token.conf','w'))
global timer
timer = threading.Timer(3600,get_accesstoken)
timer.start()

4.3、收集Open-falcon发送到端口的数据

关键代码如下:
#继承threading.Thread类,重写方法,绑定指定端口,接收数据def __init__(self,port):threading.Thread.__init__(self)self.port = portself.sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)self.sock.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)self.sock.bind(('0.0.0.0',port))self.sock.listen(0)
    #对于接收到的数据进行url解码def run(self):while True:data = self.client.recv(BUFSIZE)if(data):string = urllib.unquote(data)self.handle_String(string)#print stringelse:break

4.4、对于获取到的数据进行字符串截取

具体用法如下图:

字符串截取代码具体如下:
def handle_String(self,s):a = s.split('&')dict = {}for i in range(len(a)):if len(re.split('\[',a[i]))>1:dict['content']=re.split('content=',a[i])[1]elif len(re.split('tos=',a[i]))>1:dict['tos']=re.split('tos=',a[i])[1]flag = re.split('\[',dict['content'])[5].split('*')[0]touser = dict['tos']content = dict['content']obj = wechat.Weixin(flag, content)obj.message(touser)logging.debug('Send to %s Wechat %s %s  ' % (touser,flag,content))

4.5、对于截取过的数据封装在对象中,并且判断获取指定的access_token和配置项,封装发送。

关键代码如下:
    def message(self,touser):url = 'https://qyapi.weixin.qq.com/'cp = ConfigParser.SafeConfigParser()ap = ConfigParser.SafeConfigParser()cp.read('./config/wechat.conf')ap.read('./config/access_token.conf')config = cp.sections()access_config = ap.sections()agentname = 'test4'agentid = cp.get('test4', 'AgentId')self.token = ap.get('test4','AgentId')#遍历配置项是否有对应告警类型的应用for i in config:if i !='http' and i!= 'weixin':value = cp.get('weixin',i)if self.flag == value:agentname = iagentid = cp.get(i, 'AgentId')for k in access_config:if k == agentname:self.token = ap.get(k,'access_token')values = {"touser": touser,"msgtype": 'text',"agentid": agentid,"text": {'content':self.content},"safe": 0}return self.send_message(url,json.dumps(values))

4.6、发送告警信息到指定应用

关键代码如下:
    def send_message(self,url,data):send_url = "%s/cgi-bin/message/send?access_token=%s" %(url,self.token)self.response = urllib.urlopen(urllib.Request(url=send_url,data=data)).read()x = json.loads(self.response.decode())['errcode']if x==0 :logging.debug('Successfully %s ' % (data))return 'Successfully'else:logging.debug('Faild %s' % (data))return 'Failed'

4.7、修改Open-falcon发送告警指定端口

修改alarm配置文件中发送告警信息的指定端口为4567,对应程序中的绑定监听的端口
vim openfalcon/alarm/config/cfg.json

修改内容如下:

  "api": {"im": "http://127.0.0.1:4567","sms": "http://127.0.0.1:10086/sms","mail": "http://127.0.0.1:10086/mail","dashboard": "http://127.0.0.1:8081","plus_api":"http://127.0.0.1:8080","plus_api_token": "default-token-used-in-server-side"},

**最后效果图** 

总结

因为只在自己的几台虚拟机上运行,暂时还没发现出问题。如果有什么问题希望大家指正,自己学python不久,自己写这个东西学到了很多,遇到问题就不要怕解决,就怕不思考。
接口的源代码:https://github.com/libuliduobuqiuqiu/openfalcon-wechat

转载于:https://blog.51cto.com/mbb97/2137379

Open-falcon运维监控系统——微信接口二次开发相关推荐

  1. 可快速部署的轻量级运维监控系统——WGCLOUD

    WGCLOUD,是国人开源的一款运维监控系统,轻巧实用,具备高性能.自动化等特点,对新手来讲,几乎没有什么学习成本,上手可用,部署方便. 这是一张wgcloud运行的数据通信图 WGCLOUD的ser ...

  2. 常用的17个运维监控系统

    1. Zabbix Zabbix 作为企业级的网络监控工具,通过从服务器,虚拟机和网络设备收集的数据提供实时监控,自动发现,映射和可扩展等功能. Zabbix的企业级监控软件为用户提供内置的Java应 ...

  3. 智能运维监控系统怎么选

    智能运维技术可以将人工智能技术和计算机运维技术相结合,通过一些智能深度学习的方法提升商家在计算机后台的工作效率,其拥有多项快速和高效的运维能力. 运维监控软件具有什么功能 企业在面对着大型数据接口时会 ...

  4. 基于SpringBoot+Bootstrap极简运维监控系统

    真正的大师,永远都怀着一颗学徒的心! 一.项目简介 基于SpringBoot+Bootstrap极简运维监控系统 二.实现功能 支持cpu使用率 支持cpu温度 支持内存使用率 支持磁盘容量 支持磁盘 ...

  5. oracle根据记录添加bsm,【运维监控系统 PIGOSS BSM 】免费在线试用_软件库_选软件网...

    运维管理系统 PIGOSS BSM 不仅可以关联对业务云服务的监控,同时也基于与复杂异构的IT基础架构监控指标建立关联,针对服务器操作系统,数据库,中间件,webserver,企业应用.网络设备.网络 ...

  6. 基于Linux+Nagios+Centreon+Nagvis等构建海量运维监控系统

    参考书目:<海量运维监控系统规划与部署 基于Linux+Nagios+Centreon+Nagvis等> 付哲著 系统环境规划: 基于阿里云centos6.8镜像升级到centos6.9, ...

  7. Lnmp搭建zabbix运维监控系统

    使用目的? 在公司项目中需要做一个日志监控,最开始选择的是efk,但是efk的资料相对较少并且之前对这几个产品都没接触过,使用起来难度.于是选择了zabbix作为项目的运维监控系统. zabbix能做 ...

  8. 转:运维监控系统-监控项及指标的梳理

    转自: 运维监控系统-监控项及指标的梳理_程序员杂谈-CSDN博客_运维监控指标综合监控功能工具 综合监控工具完成对被管对象的集中监控.集中维护和集中管理,被管对象包括网络设备.服务器.PC设备.数据 ...

  9. 运维监控系统实战笔记(day1)

    第一次课 监控需求直接的是为了出现问题时能及时感知到.新的需求: 通过监控了解数据趋势,知道系统在未来的某个时刻可能出问题,预知问题. 通过监控了解系统的水位情况,为服务扩缩容提供数据支撑. 通过监控 ...

最新文章

  1. nosql mysql mongodb_关于NoSQL之MongoDB的一些总结
  2. uni-app 页面数据无法渲染原因总结
  3. javascript面向对象学习笔记(一)——继承
  4. 2018-2019-2 20175223 实验三《敏捷开发与XP实践》实验报告
  5. Python语法教程-基础语法01
  6. solr 配置多个entity_solr建索引优化
  7. 超市库存管理java sql_超市仓库管理系统的设计与实现(MySQL)
  8. 6123测试软件,OTP6123系列手持式OTDR测试仪
  9. 常见的SQL优化面试题
  10. 安装MySQL出现:无法定位序数4699于动态链接库 ...\bin\mysqld.exe
  11. cmake 返回上层目录
  12. SpringBoot个人学习
  13. Qt Visual Studio生成moc文件
  14. 【前端】javascript实现导航栏筋斗云效果特效
  15. 览书记之汽车电子信息技术
  16. java青蛙过河打字_趣味算法——青蛙过河(JAVA)
  17. 23-基于51单片机土壤湿度检测及自动浇花系统(带时间显示)
  18. 渐变的alert_模仿新浪邮箱的alert渐变的提示框
  19. Office365 - Stream提示无法upload的原因
  20. lableimg闪退_打标工具labelme或者labelimg遇到图片闪退的完美解决方案

热门文章

  1. java+long.builder_Java LongStream.Builder accept()用法及代码示例
  2. php获取目录文件 排序输出,php实现对文件夹目录中的文件进行排序的方法
  3. Java解析SQL记录为JSON_Oracle解析复杂json的方法
  4. 取得cpu核心序号_cpu的性能指标有哪些?
  5. jupyter notebook 插入图片
  6. 使用FFT来计算IFFT
  7. 报错解决:-bash: export: `g++11=g++': not a valid identifier
  8. 对服务器文件夹写,服务器文件夹写入权限设置
  9. oracle创建 number,oracle创建表的方法和一些常用命令
  10. C++_可变参数模板到emplace_back再到construct再到forward