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


    一、表结构关系图

    二、表结构需求讨论

    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
    

      

  • 相关阅读:
    断点续传的原理
    中国无线音乐搜索综合测评结果
    从头开始学jsp
    SQLServer和Oracle常用函数对比
    Asp.net程序重启自己
    What Can I do if "The type initializer for 'Emgu.CV.CvInvoke' threw an exception"?
    C++Builder2010多线程调用WebService的问题
    Desmon and Penny
    C#显示摄像头预览
    甲骨文78亿美金并购全球第二芯片商AMD
  • 原文地址:https://www.cnblogs.com/luoahong/p/9516079.html
Copyright © 2020-2023  润新知