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

1、表结构关系图

 

2、表结构需求讨论

一、主机表(Host)

一、解决了什么问题?前端

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

二、代码mysql

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

二、主机组表(HostGroup)

一、解决了什么问题?linux

当你有1000台的主机,当有900台须要用到同一个模板的时候我就把这个主机添加到同一个组里,而后让这个组添加这个模板就能够sql

二、代码数据库

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

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

一、解决了什么问题?django

一、一个服务里面,会不会包含多个指标?
二、指标信息要不要存?那我存它干吗?要不要监控指标了?
三、mysql里存的配置关系客户端须要不须要存?
由于客户端的监控插件里面已经知道要监控那些指标,不须要服务器给客户端传过去
四、既然客户端不须要,那服务器要存它干吗?
  一、触发报警
  二、前端图形展现windows

五、每一个服务存储的监控指标关系
六、对指标的格式要求必须在这里定义
七、你这个指标名为何必定是惟一的?假如入linux和windows都有iowat这个指标,因此我有必要设置他们不同吗?服务器

二、代码spa

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)

四、服务表(Service)

一、解决了什么问题?

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

二、代码

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

五、模板表(Template)

一、解决了什么问题?

  一、当你有1000台的主机,当有900台须要用到同一个模板的时候我就把这个主机添加到同一个组里,而后让这个组添加这个模板就能够

       二、一个模板能够包含多个服务

二、代码

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

六、自定义用户(UserProfile)

一、解决了什么问题?

二、代码

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


    def __str__(self):
        return self.name

3、完整表结构代码 

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
相关文章
相关标签/搜索