分佈式監控系統開發【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
相關文章
相關標籤/搜索