一、目录结构

二、入口

1、文件MonitorServer.py

import os
import sys if __name__ == "__main__":
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "CrazyMonitor.settings") from monitor.backends.management import execute_from_command_line execute_from_command_line(sys.argv)

2、启动函数management.py

    def start(self):
'''start monitor server frontend and backend'''
reactor = data_processing.Datandler(settings)
reactor.looping()

三、检测主机需要监控的服务数据是否按时正常汇报

1、功能如下

1、生成全局的监控配置dict

2、循环所有要监控的服务

3、检测此服务最近的汇报数据

4、检测 有没有这个机器的trigger,如果没有,把机器状态改成ok

2、实现代码

    def looping(self):
'''
start looping data ...
检测所有主机需要监控的服务的数据有没有按时汇报上来,只做基本检测
:return:
'''
#get latest report data
self.update_or_load_configs() #生成全局的监控配置dict
count = 0
while not self.exit_flag:
print("looping %s".center(50,'-') % count)
count += 1
if time.time() - self.config_last_loading_time >= self.config_update_interval:
print("\033[41;1mneed update configs ...\033[0m")
self.update_or_load_configs()
print("monitor dic",self.global_monitor_dic)
if self.global_monitor_dic:
for h,config_dic in self.global_monitor_dic.items():
print('handling host:\033[32;1m%s\033[0m' %h)
for service_id,val in config_dic['services'].items(): #循环所有要监控的服务
#print(service_id,val)
service_obj,last_monitor_time = val
if time.time() - last_monitor_time >= service_obj.interval: #reached the next monitor interval
print("\033[33;1mserivce [%s] has reached the monitor interval...\033[0m" % service_obj.name)
self.global_monitor_dic[h]['services'][service_obj.id][1] = time.time()
#self.load_service_data_and_calulating(h,service_obj)
#only do basic data validataion here, alert if the client didn't report data to server in \
#the configured time interval
self.data_point_validation(h,service_obj) #检测此服务最近的汇报数据
else:
next_monitor_time = time.time() - last_monitor_time - service_obj.interval
print("service [%s] next monitor time is %s" % (service_obj.name,next_monitor_time)) if time.time() - self.global_monitor_dic[h]['status_last_check'] >10:
#检测 有没有这个机器的trigger,如果没有,把机器状态改成ok
trigger_redis_key = "host_%s_trigger*" % (h.id)
trigger_keys = self.redis.keys(trigger_redis_key)
#print('len grigger keys....',trigger_keys)
if len(trigger_keys) ==0: #没有trigger被触发,可以把状态改为ok了
h.status = 1
h.save()
#looping triggers 这里是真正根据用户的配置来监控了
#for trigger_id,trigger_obj in config_dic['triggers'].items():
# #print("triggers expressions:",trigger_obj.triggerexpression_set.select_related())
# self.load_service_data_and_calulating(h,trigger_obj) time.sleep(self.poll_interval)

四、监控主机是否存活

1、功能如下

1、拼出此服务在redis中存储的对应key

2、超过监控间隔但数据还没汇报过来

3、监控主机是否存活

4、要是主机死掉了我就在数据库你注释有问题

5、客户端起来从来每连上过没所以没有数据数据

2、实现代码

    def data_point_validation(self,host_obj,service_obj):
'''
only do basic data validation here, alert if the client didn't report data to server in the configured time interval
:param h:
:param service_obj:
:return:
'''
service_redis_key = "StatusData_%s_%s_latest" %(host_obj.id,service_obj.name) #拼出此服务在redis中存储的对应key
latest_data_point = self.redis.lrange(service_redis_key,-1,-1)
if latest_data_point: #data list is not empty,
latest_data_point = json.loads(latest_data_point[0].decode())
#print('laste::::',latest_data_point)
print("\033[41;1mlatest data point\033[0m %s" % latest_data_point)
latest_service_data,last_report_time = latest_data_point
monitor_interval = service_obj.interval + self.django_settings.REPORT_LATE_TOLERANCE_TIME
if time.time() - last_report_time > monitor_interval: #超过监控间隔但数据还没汇报过来,something wrong with client
no_data_secs = time.time() - last_report_time
msg = '''Some thing must be wrong with client [%s] , because haven't receive data of service [%s] \
for [%s]s (interval is [%s])\033[0m''' %(host_obj.ip_addr, service_obj.name,no_data_secs, monitor_interval)
self.trigger_notifier(host_obj=host_obj,trigger_id=None,positive_expressions=None,
msg=msg)
print("\033[41;1m%s\033[0m" %msg )
if service_obj.name == 'uptime': #监控主机存活的服务
host_obj.status = 3 #unreachable
host_obj.save()
else:
host_obj.status = 5 #problem
host_obj.save() else: # no data at all
print("\033[41;1m no data for serivce [%s] host[%s] at all..\033[0m" %(service_obj.name,host_obj.name))
msg = '''no data for serivce [%s] host[%s] at all..''' %(service_obj.name,host_obj.name)
self.trigger_notifier(host_obj=host_obj,trigger_id=None,positive_expressions=None,msg=msg)
host_obj.status = 5 #problem
host_obj.save()
#print("triggers:", self.global_monitor_dic[host_obj]['triggers'])

五、存活检测监控项间隔设计

1、实例化

1、循环检测每台主机多久没有给我汇报数据
2、监控配置有可能变更
3、检测每个主机每个服务
4、主机是好的服务全挂了

class DataHandler(object):
def __init__(self,django_settings,connect_redis=True):
self.django_settings = django_settings
self.poll_interval = 3 #每3秒进行一次全局轮训
self.config_update_interval = 120 #每120s重新从数据库加载一次配置数据
self.config_last_loading_time = time.time()
self.global_monitor_dic = {}
self.exit_flag = False
if connect_redis:
self.redis = redis_conn.redis_conn(django_settings

2、方法

1、要是主机死掉了我就在数据库你注释有问题
2、客户端起来从来每连上过没所以没有数据数据

    def update_or_load_configs(self):
'''
load monitor configs from Mysql DB
:return:
'''
all_enabled_hosts = models.Host.objects.all()
for h in all_enabled_hosts:
if h not in self.global_monitor_dic: # new host
self.global_monitor_dic[h] = {'services':{}, 'triggers':{}}
'''self.global_monitor_dic ={
'h1':{'services'{'cpu':[cpu_obj,0],
'mem':[mem_obj,0]
},
'trigger':{t1:t1_obj,}
}
}'''
#print(h.host_groups.select_related())
service_list = []
trigger_list = []
for group in h.host_groups.select_related():
#print("grouptemplates:", group.templates.select_related()) for template in group.templates.select_related():
#print("tempalte:",template.services.select_related())
#print("triigers:",template.triggers.select_related())
service_list.extend(template.services.select_related())
trigger_list.extend(template.triggers.select_related())
for service in service_list:
if service.id not in self.global_monitor_dic[h]['services']: #first loop
self.global_monitor_dic[h]['services'][service.id] = [service,0]
else:
self.global_monitor_dic[h]['services'][service.id][0] = service
for trigger in trigger_list:
#if not self.global_monitor_dic['triggers'][trigger.id]:
self.global_monitor_dic[h]['triggers'][trigger.id] = trigger #print(h.templates.select_related() )
#print('service list:',service_list) for template in h.templates.select_related():
service_list.extend(template.services.select_related())
trigger_list.extend(template.triggers.select_related())
for service in service_list:
if service.id not in self.global_monitor_dic[h]['services']: #first loop
self.global_monitor_dic[h]['services'][service.id] = [service,0]
else:
self.global_monitor_dic[h]['services'][service.id][0] = service
for trigger in trigger_list:
self.global_monitor_dic[h]['triggers'][trigger.id] = trigger
#print(self.global_monitor_dic[h])
#通过这个时间来确定是否需要更新主机状态
self.global_monitor_dic[h].setdefault('status_last_check',time.time()) self.config_last_loading_time = time.time()
return True

3、网络延迟容忍度设置

1、网络延迟应该可以自定义容忍度30秒
2、客户端每30秒给我汇报一次我还活着

REPORT_LATE_TOLERANCE_TIME = 10 #allow service report late than monitor interval no more than defined seconds.

  

分布式监控系统开发【day38】:主机存活检测程序解析(七)的更多相关文章

  1. Python之路,Day20 - 分布式监控系统开发

    Python之路,Day20 - 分布式监控系统开发   本节内容 为什么要做监控? 常用监控系统设计讨论 监控系统架构设计 监控表结构设计 为什么要做监控? –熟悉IT监控系统的设计原理 –开发一个 ...

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

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

  3. Python之分布式监控系统开发

    为什么要做监控? –熟悉IT监控系统的设计原理 –开发一个简版的类Zabbix监控系统 –掌握自动化开发项目的程序设计思路及架构解藕原则 常用监控系统设计讨论 Zabbix Nagios 监控系统需求 ...

  4. day26 分布式监控系统开发

    本节内容 为什么要做监控? 常用监控系统设计讨论 监控系统架构设计 监控表结构设计 为什么要做监控? –熟悉IT监控系统的设计原理 –开发一个简版的类Zabbix监控系统 –掌握自动化开发项目的程序设 ...

  5. 分布式监控系统开发【day37】:表结构设计(二)

    一.表结构关系图 二.表结构需求讨论 1.主机表(Host) 1.解决了什么问题? 1.如果我不想让它监控了,就有一个开关的东西给它禁掉2.主机存活状态检测间隔 2.代码 class Host(mod ...

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

    一.需求讨论 1.请问如何解决延迟问题 1000台机器,每1分钟循环一次但是刚好第一次循环第一秒刚处理完了,结果还没等到第二分钟又出问题,你那必须等到第二次循环,假如我这个服务很重要必须实时知道,每次 ...

  7. 分布式监控系统开发【day38】:报警策略队列处理(五)

    一.目录结构 二.报警策略队列处理 1.入口MonitorServer import os import sys if __name__ == "__main__": os.env ...

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

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

  9. 分布式监控系统开发【day38】:报警策略设计(二)

    一.策略和动作多对多的好处坏处 1.好处: 相同服务,相同策略的服务可以不用重复写好多次触发器 2.坏处: 1.策略A给小李和小罗发邮件2.策略B给小胡和小崔发邮件3.策略A是第三部发邮件4.策略B是 ...

随机推荐

  1. WIN提权总结【本地存档-转载】

    [ web提权 ] 1.能不能执行cmd就看这个命令:net user,net不行就用net1,再不行就上传一个net到可写可读目录,执行/c c:\windows\temp\cookies\net1 ...

  2. kaptcha验证码的使用

    使用kaptcha可以方便的配置: 验证码的字体 验证码字体的大小 验证码字体的字体颜色 验证码内容的范围(数字,字母,中文汉字!) 验证码图片的大小,边框,边框粗细,边框颜色 验证码的干扰线(可以自 ...

  3. 一篇文章搞定mongodb

    一 安装 1 安装目录下新建文件夹data,etc,logs #在bin文件下启动cmd,指定数据存储的路径mongod --dbpath D:\MongoDB\data\db 2 etc文件夹中新建 ...

  4. $.extend()浅拷贝深拷贝

    参考网址:http://bijian1013.iteye.com/blog/2255037 jQuery.extend() 函数用于将一个或多个对象的内容合并到目标对象. 注意:1. 如果只为$.ex ...

  5. 在虚拟机中,设置centos7静态ip

    https://blog.csdn.net/qq_34182808/article/details/80065908

  6. CSAPP:第九章 虚拟内存

    CSAPP:第九章 虚拟内存 关键点:虚拟内存.物理内存 9.1 物理地址和虚拟地址9.2 地址空间9.3 虚拟内存作为缓存的公工具 9.1 物理地址和虚拟地址   计算机的主存被组织成一个由M个连续 ...

  7. loadrunner迭代和并发的区别

    转载: ZEE的回答: 用比喻的方式来回一下: 四车道的马路,如果只有四辆车并排走过就是并发: 如果四辆车排成一纵队走过就是迭代: 如果有100辆车排成25行依次走过就是并发加迭代. 在以上说法中,只 ...

  8. CF1012B Chemical table

    $CF1012B Chemical table 给你一个 \(n\times m\) 的矩形,一开始有 \(q\) 个格子上被标记.对于任意两行两列,如果交汇的四个格子中有三个被标记,那么第 \(4\ ...

  9. nginx与fastdfs配置详解与坑

    nginx与fastdfs配置详解与坑 环境 ubantu19.04 fastdfs-5.11 fastdfs-nginx-module-1.20 libfastcommon-1.0.39 nginx ...

  10. C#/.NET基于Topshelf创建Windows服务程序及服务的安装和卸载(极速,简洁)

    本文首发于:码友网--一个专注.NET/.NET Core开发的编程爱好者社区. 文章目录 C#/.NET基于Topshelf创建Windows服务的系列文章目录: C#/.NET基于Topshelf ...