本节内容

为什么要做监控?

常用监控系统设计讨论

监控系统架构设计

监控表结构设计

为什么要做监控?

–熟悉IT监控系统的设计原理
–开发一个简版的类Zabbix监控系统
–掌握自动化开发项目的程序设计思路及架构解藕原则
 

常用监控系统设计讨论

Zabbix
Nagios
 

监控系统需求讨论

1.可监控常用系统服务、应用、网络设备等
2.一台主机上可监控多个不同服务、不同服务的监控间隔可不同
3.同一个服务在不同主机上的监控间隔、报警阈值可不同
4.可以批量的给一批主机添加、删除、修改要监控的服务
5.告警级别:
  • 不同的服务 因为业务重要程度不同,如果出了问题可以设置不同的报警级别
  • 可以指定特定的服务或告警级别的事件通知给特定的用户
  • 告警的升级设定
6.历史数据 的存储和优化
  • 实现用最少的空间占用量存储最多的有效数据
  • 如何做到1s中之内取出一台主机上所有服务的5年的监控数据?

7. 数据可视化,如何做出简洁美观的用户界面?

8.如何实现单机支持5000+机器监控需求?
9.采取何种通信方式?主动、被动?
10.如何实现监控服务器的水平扩展?
 
 

采用什么架构?

•Mysql
•主动通信? Snmp,wget…
•被动通信?Agent ---how to communicate with the monitor server
•Socket server –>  Sockect client
•能否用现成的c/s架构? Rabbit mq, redis 订阅发布, http ?
 

采用HTTP好处

1.接口设计简单

2.容易水平扩展做分布式

3.Socket稳定成熟,省去较多的通信维护精力

Http特性:

1.短连接

2.无状态

3.安全认证

4.被动通信

#!_*_coding:utf8_*_
from django.db import models # Create your models here. class Host(models.Model):
name = models.CharField(max_length=64,unique=True)
ip_addr = models.GenericIPAddressField(unique=True)
host_groups = models.ManyToManyField('HostGroup',blank=True) # A B C
templates = models.ManyToManyField("Template",blank=True) # A D E
monitored_by_choices = (
('agent','Agent'),
('snmp','SNMP'),
('wget','WGET'),
)
monitored_by = models.CharField(u'监控方式',max_length=64,choices=monitored_by_choices)
status_choices= (
(1,'Online'),
(2,'Down'),
(3,'Unreachable'),
(4,'Offline'),
)
status = models.IntegerField(u'状态',choices=status_choices,default=1)
memo = models.TextField(u"备注",blank=True,null=True) def __unicode__(self):
return self.name class HostGroup(models.Model):
name = models.CharField(max_length=64,unique=True)
templates = models.ManyToManyField("Template",blank=True)
memo = models.TextField(u"备注",blank=True,null=True)
def __unicode__(self):
return self.name class ServiceIndex(models.Model):
name = models.CharField(max_length=64)
key =models.CharField(max_length=64)
data_type_choices = (
('int',"int"),
('float',"float"),
('str',"string")
)
data_type = models.CharField(u'指标数据类型',max_length=32,choices=data_type_choices,default='int')
memo = models.CharField(u"备注",max_length=128,blank=True,null=True)
def __unicode__(self):
return "%s.%s" %(self.name,self.key) class Service(models.Model):
name = models.CharField(u'服务名称',max_length=64,unique=True)
interval = models.IntegerField(u'监控间隔',default=60)
plugin_name = models.CharField(u'插件名',max_length=64,default='n/a')
items = models.ManyToManyField('ServiceIndex',verbose_name=u"指标列表",blank=True)
memo = models.CharField(u"备注",max_length=128,blank=True,null=True) def __unicode__(self):
return self.name
#def get_service_items(obj):
# return ",".join([i.name for i in obj.items.all()]) class Template(models.Model):
name = models.CharField(u'模版名称',max_length=64,unique=True)
services = models.ManyToManyField('Service',verbose_name=u"服务列表")
triggers = models.ManyToManyField('Trigger',verbose_name=u"触发器列表",blank=True)
def __unicode__(self):
return self.name
'''
class TriggerExpression(models.Model):
name = models.CharField(u"触发器表达式名称",max_length=64,blank=True,null=True)
service = models.ForeignKey(Service,verbose_name=u"关联服务")
service_index = models.ForeignKey(ServiceIndex,verbose_name=u"关联服务指标")
logic_type_choices = (('or','OR'),('and','AND'))
logic_type = models.CharField(u"逻辑关系",choices=logic_type_choices,max_length=32,blank=True,null=True)
left_sibling = models.ForeignKey('self',verbose_name=u"左边条件",blank=True,null=True,related_name='left_sibling_condition' )
operator_type_choices = (('eq','='),('lt','<'),('gt','>'))
operator_type = models.CharField(u"运算符",choices=operator_type_choices,max_length=32)
data_calc_type_choices = (
('avg','Average'),
('max','Max'),
('hit','Hit'),
('last','Last'),
)
data_calc_func= models.CharField(u"数据处理方式",choices=data_calc_type_choices,max_length=64)
data_calc_args = models.CharField(u"函数传入参数",help_text=u"若是多个参数,则用,号分开,第一个值是时间",max_length=64)
threshold = models.IntegerField(u"阈值") def __unicode__(self):
return "%s %s(%s(%s))" %(self.service_index,self.operator_type,self.data_calc_func,self.data_calc_args)
''' class TriggerExpression(models.Model):
#name = models.CharField(u"触发器表达式名称",max_length=64,blank=True,null=True)
trigger = models.ForeignKey('Trigger',verbose_name=u"所属触发器")
service = models.ForeignKey(Service,verbose_name=u"关联服务")
service_index = models.ForeignKey(ServiceIndex,verbose_name=u"关联服务指标")
specified_index_key = models.CharField(verbose_name=u"只监控专门指定的指标key",max_length=64,blank=True,null=True)
operator_type_choices = (('eq','='),('lt','<'),('gt','>'))
operator_type = models.CharField(u"运算符",choices=operator_type_choices,max_length=32)
data_calc_type_choices = (
('avg','Average'),
('max','Max'),
('hit','Hit'),
('last','Last'),
)
data_calc_func= models.CharField(u"数据处理方式",choices=data_calc_type_choices,max_length=64)
data_calc_args = models.CharField(u"函数传入参数",help_text=u"若是多个参数,则用,号分开,第一个值是时间",max_length=64)
threshold = models.IntegerField(u"阈值") logic_type_choices = (('or','OR'),('and','AND'))
logic_type = models.CharField(u"与一个条件的逻辑关系",choices=logic_type_choices,max_length=32,blank=True,null=True)
#next_condition = models.ForeignKey('self',verbose_name=u"右边条件",blank=True,null=True,related_name='right_sibling_condition' )
def __unicode__(self):
return "%s %s(%s(%s))" %(self.service_index,self.operator_type,self.data_calc_func,self.data_calc_args)
class Meta:
pass #unique_together = ('trigger_id','service') class Trigger(models.Model):
name = models.CharField(u'触发器名称',max_length=64)
#expressions= models.TextField(u"表达式")
severity_choices = (
(1,'Information'),
(2,'Warning'),
(3,'Average'),
(4,'High'),
(5,'Diaster'),
)
#expressions = models.ManyToManyField(TriggerExpression,verbose_name=u"条件表达式")
severity = models.IntegerField(u'告警级别',choices=severity_choices)
enabled = models.BooleanField(default=True)
memo = models.TextField(u"备注",blank=True,null=True) def __unicode__(self):
return "<serice:%s, severity:%s>" %(self.name,self.get_severity_display()) class Action(models.Model):
name = models.CharField(max_length=64,unique=True)
host_groups = models.ManyToManyField('HostGroup',blank=True)
hosts = models.ManyToManyField('Host',blank=True) conditions = models.TextField(u'告警条件')
interval = models.IntegerField(u'告警间隔(s)',default=300)
operations = models.ManyToManyField('ActionOperation') recover_notice = models.BooleanField(u'故障恢复后发送通知消息',default=True)
recover_subject = models.CharField(max_length=128,blank=True,null=True)
recover_message = models.TextField(blank=True,null=True) enabled = models.BooleanField(default=True) def __unicode__(self):
return self.name class ActionOperation(models.Model):
name = models.CharField(max_length=64)
step = models.SmallIntegerField(u"第n次告警",default=1)
action_type_choices = (
('email','Email'),
('sms','SMS'),
('script','RunScript'),
)
action_type = models.CharField(u"动作类型",choices=action_type_choices,default='email',max_length=64)
#notifiers= models.ManyToManyField(host_models.UserProfile,verbose_name=u"通知对象",blank=True)
def __unicode__(self):
return self.name class Maintenance(models.Model):
name = models.CharField(max_length=64,unique=True)
hosts = models.ManyToManyField('Host',blank=True)
host_groups = models.ManyToManyField('HostGroup',blank=True)
content = models.TextField(u"维护内容")
start_time = models.DateTimeField()
end_time = models.DateTimeField() def __unicode__(self):
return self.name ''''
CPU
idle 80
usage 90
system 30
user
iowait 50 memory :
usage
free
swap
cache
buffer load:
load1
load 5
load 15
'''

python 开发练习之 监控的更多相关文章

  1. 麦子学院python开发全套完整无加密课程

    点击了解更多Python课程>>> 麦子学院python开发全套完整无加密课程 第一阶段:Python基础准备 1.Web前端开发之HTML+CSS基础入门 2.Javascript ...

  2. TriAquae 是一款由国产的基于Python开发的开源批量部署管理工具

    怀着鸡动的心情跟大家介绍一款国产开源运维软件TriAquae,轻松帮你搞定大部分运维工作!TriAquae 是一款由国产的基于Python开发的开源批量部署管理工具,可以允许用户通过一台控制端管理上千 ...

  3. 真香!Python开发工程师都选择这个数据库:因为它免费

    数据库类别 既然我们要使用关系数据库,就必须选择一个关系数据库. 目前广泛使用的关系数据库也就这么几种: 付费的商用数据库: Oracle,典型的高富帅: SQL Server,微软自家产品,Wind ...

  4. 作为一名Python开发,我谈Linux和mac的使用体验

    我是一名Python开发,在2018.7~2021.6使用的是Linux系统 Deepin OS 作为自己的开发系统:在2022.7-至今使用的是 mac OS 系统作为开发系统. Deepin OS ...

  5. python开发环境搭建

    虽然网上有很多python开发环境搭建的文章,不过重复造轮子还是要的,记录一下过程,方便自己以后配置,也方便正在学习中的同事配置他们的环境. 1.准备好安装包 1)上python官网下载python运 ...

  6. 【Machine Learning】Python开发工具:Anaconda+Sublime

    Python开发工具:Anaconda+Sublime 作者:白宁超 2016年12月23日21:24:51 摘要:随着机器学习和深度学习的热潮,各种图书层出不穷.然而多数是基础理论知识介绍,缺乏实现 ...

  7. Python开发工具PyCharm个性化设置(图解)

    Python开发工具PyCharm个性化设置,包括设置默认PyCharm解析器.设置缩进符为制表符.设置IDE皮肤主题等,大家参考使用吧. JetBrains PyCharm Pro 4.5.3 中文 ...

  8. Python黑帽编程1.2 基于VS Code构建Python开发环境

    Python黑帽编程1.2  基于VS Code构建Python开发环境 0.1  本系列教程说明 本系列教程,采用的大纲母本为<Understanding Network Hacks Atta ...

  9. Eclipse中Python开发环境搭建

    Eclipse中Python开发环境搭建  目 录  1.背景介绍 2.Python安装 3.插件PyDev安装 4.测试Demo演示 一.背景介绍 Eclipse是一款基于Java的可扩展开发平台. ...

随机推荐

  1. CSS(七)

    CSS3圆角.阴影.rgba CSS3圆角 设置某一个角的圆角,比如设置左上角的圆角:border-top-left-radius:30px 60px; 同时分别设置四个角: border-radiu ...

  2. Hibernate 配置文件的基础配置

    Hibernate 配置文件主要用于配置数据库连接和 Hibernate运行时所需的各种属性 每个 Hibernate 配置文件对应一个 Configuration 对象 Hibernate.cfg. ...

  3. css 元素溢出

    css元素溢出: 当子元素的尺寸超过父元素的尺寸时,需要设置父元素显示溢出的子元素的方式,设置的方法是通过overflow属性来设置. overflow的设置项: (1)visible 默认值 内容不 ...

  4. HTML5_canvas_pen.translate()_

    .save() 和 .restore() 除了会保存之前的样式,还会保存之前的坐标轴 pen.translate(x, y); 将画布的 坐标轴原点(0, 0) 从画布的左上角,移动到 (x, y) ...

  5. ECMA Script 6_symbol(symbol.iterator) 新接口_iterator接口

    iterator 接口 只要部署了 iterator 接口 symbol(symbol.iterator), 则可以进行 for...of  遍历

  6. css 中 zoom和transform:scale的区别(转载)

    一.IE和Chrome等浏览器与zoom 还在几年前,zoom还只是IE浏览器自己私有的玩具,但是,现在,除了FireFox浏览器,其他,尤其Chrome和移动端浏览器已经很好支持zoom属性了: z ...

  7. F#周报2019年第14期

    新闻 发布F# 4.6 SAFE Stack v1.0 发布fable编译器2.2,Fable.Core 3及其它 发布ML.NET 1.0 RC Saturn:增加路由诊断页面 Visual Stu ...

  8. 输入URL地址到页面加载完成 过程

    在浏览器的地址栏中输入URL地址"http://www.gacl.cn:8080/JavaWebDemo1/1.jsp"去访问服务器上的1.jsp这个web资源的过程 1.浏览器根 ...

  9. SVN百度云服务器安装使用。

    安装SVN客户端 此时,必须重启,否则经常出现用不了. 重启后,还是用不了的话,那么就重新安装系统. 网站地址: http://xiaomosheng.bceapp.com/ SVN代码服务器的地址: ...

  10. Nginx(一)-windows下的安装配置

    第一步 下载 官网下载地址 因为只是测试这里选择最新版本1.13.9 下载完成得到zip压缩包 解压后得到如下目录 第二步  启动nginx 注意不要直接双击nginx.exe,这样会导致修改配置后重 ...