用过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
基本上监控模板表结构算是设计完了