一、需求讨论

1、请问如何解决延迟问题

1000台机器,每1分钟循环一次但是刚好第一次循环第一秒刚处理完了,结果还没等到第二分钟又出问题,你那必须等到第二次循环,假如我这个服务很重要必须实时知道,
每次客户端汇报过来的同时,触发trigger检测,就可以实时的实现报警反应

2、这样有什么问题?

前提是它给你汇报,如果客户端网络断了,客户端宕机了,就无法汇报了

3、你要确保客户端存活的检测机制

拿到每台机器的所有触发器,检测阈值,如果超过阈值,存到redis
你不用再连redis我给你传(从外部调用 时才用的到,为了避免重复调用 redis连接)

二、那个表达式触发了报警?

1、开发目标为红框内内容

2、触发报警函数功能

def load_service_data_and_calulating()的功能如下:[ iowait.avg(5) >10 and ,idle < 20 or ,mem_usage > 80% and, disk > 90% ]exp_res_list = [] #[ True, False.True ]

1、到redis里取出5分钟的值,进行平均运算,得到的结果,与阈值【按定义的运算符】进行比较

2、拿到,每个表达式的结果,添加到exp_res_list,为什么要拿到结果?因为不是不是最后一条

3、拼接完整的表达式字符串 exp= "False and True and False and True"

4、我为什么不在这里顺手就报警了,这样不是很简单?

  你们学过生产消费者模型吗?为了解耦,另外就是异步

  我要考量到报警收敛,我可能一次批量报警,所以我就单独写一个报警模块

5、将成立的触发发送到报警队列

3、实现代码

    def load_service_data_and_calulating(self,host_obj,trigger_obj,redis_obj):'''fetching out service data from redis db and calculate according to each serivce's trigger configuration:param host_obj::param trigger_obj::param redis_obj: #从外面调用此函数时需传入redis_obj,以减少重复连接:return:'''#StatusData_1_LinuxCPU_10minsself.redis = redis_objcalc_sub_res_list= [] #先把每个expression的结果算出来放在这个列表里,最后再统一计算这个列表positive_expressions = [] #报警的时候,让用户知道,那些条件导致触发报警器成立expression_res_string = '' #最终拼成的表达式运算字符串for expression in trigger_obj.triggerexpression_set.select_related().order_by('id'):print(expression,expression.logic_type)expression_process_obj = ExpressionProcess(self,host_obj,expression)single_expression_res = expression_process_obj.process() #得到单条expression表达式的结果if single_expression_res:calc_sub_res_list.append(single_expression_res)if single_expression_res['expression_obj'].logic_type: #不是最后一条expression_res_string += str(single_expression_res['calc_res']) + ' ' + \single_expression_res['expression_obj'].logic_type + ' 'else:expression_res_string += str(single_expression_res['calc_res']) + ' '#把所有结果为True的expression提出来,报警时你得知道是谁出问题导致trigger触发了if single_expression_res['calc_res'] == True:single_expression_res['expression_obj'] = single_expression_res['expression_obj'].id #要存到redis里,数据库对象转成idpositive_expressions.append(single_expression_res)#else: #single expression不成立,随便加个东西,别让程序出错,这个地方我觉得是个bug#    expression_res_string += 'None'print("whole trigger res:", trigger_obj.name,expression_res_string)if expression_res_string:trigger_res = eval(expression_res_string)print("whole trigger res:", trigger_res )if trigger_res:#终于走到这一步,该触发报警了print("##############trigger alert:",trigger_obj.severity,trigger_res)self.trigger_notifier(host_obj,trigger_obj.id, positive_expressions,msg=trigger_obj.name) #msg 需要专门分析后生成, 这里是临时写的

三、故障持续了多久?

1、开发目标

2、功能如下:

1、连接上 redis连接,双方已经是生产这消费者模式

2、所以我要把传送接口约定好,内容包括

  1. host_id:那台主机
  2. trigger_id:哪一个触发器,
  3. positive_expressions:哪一个表达式触发的报警
  4. msg:消息
  5. time: 什么时候报警的
  6. start_time:什么时间开始的
  7. duration:故障持续多久了

3、发不到订阅的频道TRIGGER_CHAN = 'trigger_event_channel'

4、为什么是pickle?

  1. 我的ositive_expressions里面存的是什么东西,是实例
  2. redis里面肯定存不成实例,所以我以字符串的形式存进去,json序列化不了实例

5、先把之前的trigger加载回来,获取上次报警的时间,以统计 故障持续时间
6、同时在redis中记录这个trigger , 前端页面展示时要统计trigger 个数
7、一个trigger 记录5分钟后会自动清除, 为了在前端统计trigger个数用的

3、代码实现

    def trigger_notifier(self,host_obj,trigger_id, positive_expressions,redis_obj=None,msg=None):'''all the triggers alerts need to be published through here:param host_obj::param trigger_id::param positive_expressions: it's list, contains all the expression has True result:param redis_obj::return:'''#alert.sendmail(msg )#alert.sendsms(msg)if redis_obj: #从外部调用 时才用的到,为了避免重复调用 redis连接self.redis = redis_objprint("\033[43;1mgoing to send alert msg to trigger queue............\033[0m")print('trigger_notifier argv:',host_obj,trigger_id, positive_expressions,redis_obj)#msg_dic = {'host_id':host_obj.id,'trigger_id':trigger_id,'positive_expressions':positive_expressions,'msg':msg,'time': time.strftime("%Y-%m-%d %H:%M:%S",time.localtime()),'start_time':time.time() ,'duration':None}self.redis.publish(self.django_settings.TRIGGER_CHAN, pickle.dumps(msg_dic))#先把之前的trigger加载回来,获取上次报警的时间,以统计 故障持续时间trigger_redis_key = "host_%s_trigger_%s" % (host_obj.id, trigger_id)old_trigger_data = self.redis.get(trigger_redis_key)print("old_trigger_data",old_trigger_data)if old_trigger_data:old_trigger_data = old_trigger_data.decode()trigger_startime = json.loads(old_trigger_data)['start_time']msg_dic['start_time'] = trigger_startimemsg_dic['duration'] = round(time.time() - trigger_startime)#同时在redis中纪录这个trigger , 前端页面展示时要统计trigger 个数self.redis.set(trigger_redis_key, json.dumps(msg_dic), 300) #一个trigger 纪录 5分钟后会自动清除, 为了在前端统计trigger个数用的

转载于:https://www.cnblogs.com/luoahong/p/9566478.html

分布式监控系统开发【day38】:报警阈值程序逻辑解析(三)相关推荐

  1. Python自动化开发基础 分布式监控系统开发实战 day8-李杰-专题视频课程

    Python自动化开发基础 分布式监控系统开发实战 day8-10994人已学习 课程介绍         从0基础开始讲解Python语法.流程控制.函数式编程.面向对象开发等重要的Python开发 ...

  2. 分布式监控系统开发【day37】:需求讨论(一)

    本节内容 为什么要做监控? 常用监控系统设计讨论 监控需求讨论 如何实现监控服务器的水平扩展? 监控系统架构设计 一.为什么要做监控? 熟悉IT监控系统的设计原理 开发一个简版的类Zabbix监控系统 ...

  3. 分布式监控系统开发【day38】:监控trigger表结构设计(一)

    一.需求讨论 1.zabbix触发器的模板截图 1.zabbix2.4.7 2.zabbix3.0 2.模板与触发器关联的好处 好处就是可以批量处理,比如我说我有1000机器都要监控cpu.内存.IO ...

  4. 分布式监控系统开发【day38】:监控数据如何画图(九)

    一.画图代码 1.收集处理数据 class GraphGenerator(object):'''generate graphs'''def __init__(self,request,redis_ob ...

  5. arduino读取水位传感器的数据显示在基于i2c的1602a上_基于PC-CAN适配卡和总线技术实现潜水电机分布式监控系统的应用方案...

    目前,国内外已有多家公司开发出针对个体潜水电机的智能电了保护装置,虽然可以达到保护电机的目的,但无法实现集中管理.因此,对潜水电机群的实时监控与统一管理的要求日益迫切.本文设计了基于CAN现场总线的潜 ...

  6. 华为吴晟:分布式监控系统的设计与实现

    微服务架构其实就是将单一的应用程序划分成为一组小的服务,其中每个服务都是独立的业务单元,同时又能够被独立开发.运行.测试以及部署.简单来说,它的本质其实就是拆分和独立,这也决定了微服务的部署应该是分布 ...

  7. 基于fastdfs-zyc搭建分布式监控系统

    基于中标麒麟操作系统搭建fastdfs-zyc分布式监控系统 1. 简介 2. 系统环境要求 3. 环境部署,直接上代码 4. 安装tomcat,jdk这步省略,可以自己百度Centos7安装tomc ...

  8. cat全链路监控_CAT分布式监控系统(一):CAT功能介绍 CAT监控系统是什么、能做什么?...

    CAT分布式监控系统(一):CAT监控系统功能介绍 本文概要: 1.CAT监控系统是什么. 2.CAT监控系统能做什么,能监控些什么. 下面有些截图是CAT 2.0版本的,但和3.0版本没什么区别的. ...

  9. CAT分布式监控系统:CAT功能介绍,CAT监控系统是什么,能做什么?

    CAT分布式监控系统(一):CAT监控系统功能介绍        本文概要:              1.CAT监控系统是什么.               2.CAT监控系统能做什么,能监控些什么 ...

最新文章

  1. iPhone 13注定便宜不了,台积电已提前背锅
  2. TCP/IP详解--学习笔记(9)-TCP协议概述
  3. 皮一皮:经历过的举手报道...
  4. Hadoop-HBASE 热添加新节点
  5. ubuntu下如何查找某个文件的路径
  6. 《In Search of an Understandable Consensus Algorithm》翻译
  7. activexobject mysql_ActiveXObject函数详解(转)
  8. python面试题(6)--- read、readline和readlines的区别
  9. 心理测试软件需求分析报告,大学生心理测试软件心理测评档案管理系统
  10. ajax实现JSONP跨域
  11. 一阶微分方程的初等解法
  12. 国内打开Cousera方法
  13. java rtf,用Java实现RTF到PDF
  14. 位(bit), 字节(byte), 字(word),双字(dword or Qword)释义
  15. 用docx把文字写入word并且插入图片、表格
  16. MFC进修笔记2——MFC和Win32
  17. 2977 二叉堆练习1
  18. 深入MTK平台bootloader启动之【 lk -> kernel】分析笔记
  19. 南京邮电大学电工电子(数电)实验报告——组合逻辑电路(数字锁实验和险象的判断与消除)
  20. CarbonData使用示例(java)

热门文章

  1. AOP拦截+权限验证+返回默认接口对象
  2. 闪回flashback table配合flashback versions query的注意事项
  3. VMware15.5安装Linux虚拟机(Centos7)图文教程
  4. L2-026 小字辈-PAT团体程序设计天梯赛GPLT
  5. MediaPlayer对象从停止状态到播放状态调用的方法是prepare()和start()
  6. L1-005. 考试座位号-PAT团体程序设计天梯赛GPLT
  7. 1048. 数字加密(20)-浙大PAT乙级真题
  8. found linux系统wget出现not_Java 9 AOT 试用:仅支持 64 位 Linux和java.base 模块编译
  9. 一加7是什么协议_刘作虎“拔钉”成功:大量一加5、一加3用户入手一加8T
  10. kafka python client:PyKafka vs kafka-python