用過zabbix的人都知道各種監控項目都是建立在模板的基礎上,然後自己也模仿做一個監控系統
先畫張關係圖,是自己以後設計監控系統的模板圖
設計一個父類template模板類,接下來就是各種具體的模板,比如linux監控的模板、Windows監控的模板或者是自定義模板等等,再拿linux的模板來說,linuxTemplate下面肯定監控CPU、內存、硬盤等信息,暫且把這些監控的服務都稱爲一個服務的集合service list,然後CPU下面纔是真正的每一個監控項,如cpu的iowait、usage、idle等等
models設計
class Templates(models.Model): #monitor template name = models.CharField(max_length=50, unique=True) service_list = models.ManyToManyField('ServiceList') def __unicode__(self): return self.name
定義了一個Template類,有該模板的名字,主意Template和ServiceList這兩個類的對應關係:多對多,即意味着一個模板可以對應多個服務集合,一個服務集合也可以對應多個模板,就像linuxTemplate會包含CPU、MEM等,CPU也可以屬於LinuxTemplate和WinTemplate一樣
class ServiceList(models.Model): name = models.CharField(max_length=50,unique=True) service = models.ForeignKey('Services') check_interval = models.IntegerField(default=300) conditons = models.ManyToManyField('Conditions',verbose_name=u'監控閥值',null=True,blank=True) description = models.TextField() def __unicode__(self): return self.name
上面是ServiceList類,正如前面提到的,ServiceList包含Services,所以service這一列是ServicesList的外鍵;此外ServiceList還和Conditions也是多對多的關係,每個服務集合都有監控計算閥值的方法,而這些計算方法也可以被多個服務集合所使用
再看看Conditions(監控報警閥值計算)這個類
class Conditions(models.Model): name = models.CharField(max_length=100,unique=True) item = models.ForeignKey('Items', verbose_name=u'監控值') formula = models.ForeignKey('Formulas', verbose_name=u'運算函數',null=True,blank=True) operator = models.ForeignKey(Operators,verbose_name=u'運算符',null=True,blank=True) data_type = models.CharField(default='char',max_length=32, verbose_name=u'數據類型') threshold = models.CharField(max_length=64, verbose_name=u'閥值') def __unicode__(self): return self.name
同樣,有name列,還有外鍵item‘監控值’、formula‘運算函數’、operator‘運算符’、data_type'數據類型'、threshold‘閥值’
同理,看下Conditions類關聯的一些類表
Items類:
class Items(models.Model): # monitor item name = models.CharField(max_length=50, unique=True) key = models.CharField(max_length=100,unique=True) data_type_option = (('float','Float'),('string','String'),('integer', 'Integer') ) data_type = models.CharField(max_length=50, choices=data_type_option) unit = models.CharField(max_length=30,default='%') enabled = models.BooleanField(default=True) def __unicode__(self): return self.name
Formulas類
class Formulas(models.Model): name = models.CharField(max_length=64,unique=True) key = models.CharField(max_length=64,unique=True) memo = models.TextField() def __unicode__(self): return self.name
Operators類
class Operators(models.Model): name = models.CharField(max_length=32,unique=True) key = models.CharField(max_length=32) memo = models.TextField() def __unicode__(self): return self.name
基本上監控模板表結構算是設計完了