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