一、表结构关系图

二、表结构需求讨论

1、主机表(Host)

1、解决了什么问题?

1、如果我不想让它监控了,就有一个开关的东西给它禁掉
2、主机存活状态检测间隔

2、代码

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'),
(5,'Problem'),
)
host_alive_check_interval = models.IntegerField(u"主机存活状态检测间隔", default=30)
status = models.IntegerField(u'状态',choices=status_choices,default=1)
memo = models.TextField(u"备注",blank=True,null=True) def __str__(self):
return self.name

2、主机组表(HostGroup)

1、解决了什么问题?

当你有1000台的主机,当有900台需要用到同一个模板的时候我就把这个主机添加到同一个组里,然后让这个组添加这个模板就可以

2、代码

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 __str__(self):
return self.name

3、监控指标对应关系表(ServiceIndex)

1、解决了什么问题?

1、一个服务里面,会不会包含多个指标?
2、指标信息要不要存?那我存它干嘛?要不要监控指标了?
3、mysql里存的配置关系客户端需要不需要存?
因为客户端的监控插件里面已经知道要监控那些指标,不需要服务器给客户端传过去
4、既然客户端不需要,那服务器要存它干嘛?
  1、触发报警
  2、前端图形展示

5、每个服务存储的监控指标关系
6、对指标的格式要求必须在这里定义
7、你这个指标名为什么一定是唯一的?假如入linux和windows都有iowat这个指标,所以我有必要设置他们不一样吗?

2、代码

class ServiceIndex(models.Model):
name = models.CharField(max_length=64) #Linux cpu idle
key =models.CharField(max_length=64,unique=True) #idle
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 __str__(self):
return "%s.%s" %(self.name,self.key)

4、服务表(Service)

1、解决了什么问题?

1、客户端从服务端拿到的配置如何存储到数据库里,这个属于服务,是不是应该有一个服务表
2、服务名要不要是唯一的呢?
3、服务器主要把服务名给它,还有一个监控间隔给它
4、客户端采用的是插件形式的,肯定有一个插件列表的对应关系
5、一个插件就是一个脚本,比如服务名是cpu执行的插件名叫CpuMinone

2、代码

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)
has_sub_service = models.BooleanField(default=False,help_text=u"如果一个服务还有独立的子服务 ,选择这个,比如 网卡服务有多个独立的子网卡") #如果一个服务还有独立的子服务 ,选择这个,比如 网卡服务有多个独立的子网卡
memo = models.CharField(u"备注",max_length=128,blank=True,null=True) def __str__(self):
return self.name

5、模板表(Template)

1、解决了什么问题?

  1、当你有1000台的主机,当有900台需要用到同一个模板的时候我就把这个主机添加到同一个组里,然后让这个组添加这个模板就可以

2、一个模板可以包含多个服务

2、代码

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 __str__(self):
return self.name

6、自定义用户(UserProfile)

1、解决了什么问题?

2、代码

class UserProfile(models.Model):
user = models.OneToOneField(User)
name = models.CharField(max_length=64,blank=True,null=True) def __str__(self):
return self.name

三、完整表结构代码 

from django.db import models
from django.contrib.auth.models import User
# 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'),
(5,'Problem'),
)
host_alive_check_interval = models.IntegerField(u"主机存活状态检测间隔", default=30)
status = models.IntegerField(u'状态',choices=status_choices,default=1)
memo = models.TextField(u"备注",blank=True,null=True) def __str__(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 __str__(self):
return self.name class ServiceIndex(models.Model):
name = models.CharField(max_length=64) #Linux cpu idle
key =models.CharField(max_length=64,unique=True) #idle
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 __str__(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)
has_sub_service = models.BooleanField(default=False,help_text=u"如果一个服务还有独立的子服务 ,选择这个,比如 网卡服务有多个独立的子网卡") #如果一个服务还有独立的子服务 ,选择这个,比如 网卡服务有多个独立的子网卡
memo = models.CharField(u"备注",max_length=128,blank=True,null=True) def __str__(self):
return self.name 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 __str__(self):
return self.name class UserProfile(models.Model):
user = models.OneToOneField(User)
name = models.CharField(max_length=64,blank=True,null=True) def __str__(self):
return self.name

  

分布式监控系统开发【day37】:表结构设计(二)的更多相关文章

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

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

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

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

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

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

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

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

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

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

  6. 分布式监控系统开发【day37】:填充表配置项目(三)

    一.注册站点初始化数据库 1.目录结构 2.初始化数据库 python3 manage.py makemigrations python3 manage.py migrate #django2.0之前 ...

  7. 分布式监控系统开发【day37】:服务端生成配置数据(四)

    一.目录结构 二.引子与代码 1.客户端获取服务列表接口 1.解决了什么问题 客户端要给我获取服务列表的的时候,他肯定要告诉他是谁?他怎么告诉我,客户端必须有一个id号 Saltsack你装一个客户端 ...

  8. 分布式监控系统开发【day37】:监控客户端开发(五)

    一.目录结构 二.模块方法调用关系总图 三.入口文件main 1.解决了说明问题 1.客户端就干了一件事情,干什么事情 收集数据汇报给服务端? 但是我这个客户端是插件形式2.首先必须要传一个参数,st ...

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

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

随机推荐

  1. c/c++ 网络编程 UDP 设定MTU

    网络编程 UDP 设定MTU MTU(Maximun Transmisson Unit):一次送信的最大size. 在程序里动态改变MTU.注意:程序运行需要root权限. 程序运行的方法: sudo ...

  2. #020PAT 没整明白的题L1-009 N个数求和 (20 分)

    后面的测试点过不去,两个错误一个超时. 目前未解决   L1-009 N个数求和 (20 分)   本题的要求很简单,就是求N个数字的和.麻烦的是,这些数字是以有理数分子/分母的形式给出的,你输出的和 ...

  3. Python基础——7面向对象高级编程

    实例与类动态添加方法 实例添加属性: def Student(object): pass s = Student() s.name = ‘syz’ 实例添加方法 from types import M ...

  4. 【Python 05】Python开发环境搭建

    Python3安装和使用 1.安装 Python管方下载地址 选择Customize installation安装,并且勾选Add Python 3.X to PATH. 勾选Documentatio ...

  5. 一探究竟:Namenode、SecondaryNamenode、NamenodeHA关系

    NameNode与Secondary NameNode 很多人都认为,Secondary NameNode是NameNode的备份,是为了防止NameNode的单点失败的,其实并不是在这样.文章Sec ...

  6. Django-CRM项目学习(四)-stark的分页器与搜索框

    1.分页器 分页器相关知识点,请查看以下链接 https://www.cnblogs.com/gbq-dog/p/10724859.html 2.代码归类 归类前代码 header_list = [] ...

  7. spring注解驱动--组件注册

    为容器中注册Bean @Configuration代表该类是一个配置类,配置类起到的作用和xml配置文件一样 @Bean代表该方法的返回对象作为Bean加入IOC容器,默认Bean的id是方法的名称. ...

  8. DeconvNet 论文阅读理解

    学习语义分割反卷积网络DeconvNet 一点想法:反卷积网络就是基于FCN改进了上采样层,用到了反池化和反卷积操作,参数量2亿多,非常大,segnet把两个全连接层去掉,效果也能很好,显著减少了参数 ...

  9. 【转】详解springboot-修改内置tomcat版本

    1.解析Spring Boot父级依赖 <parent> <groupId>org.springframework.boot</groupId> <artif ...

  10. js语言规范_ES5-6-7_个人总结

    ## **理解ES** 1. 全称: ECMAScript 2. js语言的规范 3. 我们用的js是它的实现 4. js的组成   * ECMAScript(js基础)   * 扩展-->浏览 ...