1. 用过zabbix的人都知道各种监控项目都是建立在模板的基础上,然后自己也模仿做一个监控系统

  2. 先画张关系图,是自己以后设计监控系统的模板图

    设计一个父类template模板类,接下来就是各种具体的模板,比如linux监控的模板、Windows监控的模板或者是自定义模板等等,再拿linux的模板来说,linuxTemplate下面肯定监控CPU、内存、硬盘等信息,暂且把这些监控的服务都称为一个服务的集合service list,然后CPU下面才是真正的每一个监控项,如cpu的iowait、usage、idle等等

  3. models设计

  4. 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

基本上监控模板表结构算是设计完了