本節內容ios
爲何要作監控? redis
經常使用監控系統設計討論sql
監控系統架構設計express
監控表結構設計django
7. 數據可視化,如何作出簡潔美觀的用戶界面?安全
1.接口設計簡單服務器
2.容易水平擴展作分佈式網絡
3.Socket穩定成熟,省去較多的通訊維護精力架構
Http特性:分佈式
1.短鏈接
2.無狀態
3.安全認證
4.被動通訊
#!_*_coding:utf8_*_ from django.db import models # 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'), (4,'Offline'), ) status = models.IntegerField(u'狀態',choices=status_choices,default=1) memo = models.TextField(u"備註",blank=True,null=True) def __unicode__(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 __unicode__(self): return self.name class ServiceIndex(models.Model): name = models.CharField(max_length=64) key =models.CharField(max_length=64) 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 __unicode__(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) memo = models.CharField(u"備註",max_length=128,blank=True,null=True) def __unicode__(self): return self.name #def get_service_items(obj): # return ",".join([i.name for i in obj.items.all()]) 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 __unicode__(self): return self.name ''' class TriggerExpression(models.Model): name = models.CharField(u"觸發器表達式名稱",max_length=64,blank=True,null=True) service = models.ForeignKey(Service,verbose_name=u"關聯服務") service_index = models.ForeignKey(ServiceIndex,verbose_name=u"關聯服務指標") logic_type_choices = (('or','OR'),('and','AND')) logic_type = models.CharField(u"邏輯關係",choices=logic_type_choices,max_length=32,blank=True,null=True) left_sibling = models.ForeignKey('self',verbose_name=u"左邊條件",blank=True,null=True,related_name='left_sibling_condition' ) operator_type_choices = (('eq','='),('lt','<'),('gt','>')) operator_type = models.CharField(u"運算符",choices=operator_type_choices,max_length=32) data_calc_type_choices = ( ('avg','Average'), ('max','Max'), ('hit','Hit'), ('last','Last'), ) data_calc_func= models.CharField(u"數據處理方式",choices=data_calc_type_choices,max_length=64) data_calc_args = models.CharField(u"函數傳入參數",help_text=u"如果多個參數,則用,號分開,第一個值是時間",max_length=64) threshold = models.IntegerField(u"閾值") def __unicode__(self): return "%s %s(%s(%s))" %(self.service_index,self.operator_type,self.data_calc_func,self.data_calc_args) ''' class TriggerExpression(models.Model): #name = models.CharField(u"觸發器表達式名稱",max_length=64,blank=True,null=True) trigger = models.ForeignKey('Trigger',verbose_name=u"所屬觸發器") service = models.ForeignKey(Service,verbose_name=u"關聯服務") service_index = models.ForeignKey(ServiceIndex,verbose_name=u"關聯服務指標") specified_index_key = models.CharField(verbose_name=u"只監控專門指定的指標key",max_length=64,blank=True,null=True) operator_type_choices = (('eq','='),('lt','<'),('gt','>')) operator_type = models.CharField(u"運算符",choices=operator_type_choices,max_length=32) data_calc_type_choices = ( ('avg','Average'), ('max','Max'), ('hit','Hit'), ('last','Last'), ) data_calc_func= models.CharField(u"數據處理方式",choices=data_calc_type_choices,max_length=64) data_calc_args = models.CharField(u"函數傳入參數",help_text=u"如果多個參數,則用,號分開,第一個值是時間",max_length=64) threshold = models.IntegerField(u"閾值") logic_type_choices = (('or','OR'),('and','AND')) logic_type = models.CharField(u"與一個條件的邏輯關係",choices=logic_type_choices,max_length=32,blank=True,null=True) #next_condition = models.ForeignKey('self',verbose_name=u"右邊條件",blank=True,null=True,related_name='right_sibling_condition' ) def __unicode__(self): return "%s %s(%s(%s))" %(self.service_index,self.operator_type,self.data_calc_func,self.data_calc_args) class Meta: pass #unique_together = ('trigger_id','service') class Trigger(models.Model): name = models.CharField(u'觸發器名稱',max_length=64) #expressions= models.TextField(u"表達式") severity_choices = ( (1,'Information'), (2,'Warning'), (3,'Average'), (4,'High'), (5,'Diaster'), ) #expressions = models.ManyToManyField(TriggerExpression,verbose_name=u"條件表達式") severity = models.IntegerField(u'告警級別',choices=severity_choices) enabled = models.BooleanField(default=True) memo = models.TextField(u"備註",blank=True,null=True) def __unicode__(self): return "<serice:%s, severity:%s>" %(self.name,self.get_severity_display()) class Action(models.Model): name = models.CharField(max_length=64,unique=True) host_groups = models.ManyToManyField('HostGroup',blank=True) hosts = models.ManyToManyField('Host',blank=True) conditions = models.TextField(u'告警條件') interval = models.IntegerField(u'告警間隔(s)',default=300) operations = models.ManyToManyField('ActionOperation') recover_notice = models.BooleanField(u'故障恢復後發送通知消息',default=True) recover_subject = models.CharField(max_length=128,blank=True,null=True) recover_message = models.TextField(blank=True,null=True) enabled = models.BooleanField(default=True) def __unicode__(self): return self.name class ActionOperation(models.Model): name = models.CharField(max_length=64) step = models.SmallIntegerField(u"第n次告警",default=1) action_type_choices = ( ('email','Email'), ('sms','SMS'), ('script','RunScript'), ) action_type = models.CharField(u"動做類型",choices=action_type_choices,default='email',max_length=64) #notifiers= models.ManyToManyField(host_models.UserProfile,verbose_name=u"通知對象",blank=True) def __unicode__(self): return self.name class Maintenance(models.Model): name = models.CharField(max_length=64,unique=True) hosts = models.ManyToManyField('Host',blank=True) host_groups = models.ManyToManyField('HostGroup',blank=True) content = models.TextField(u"維護內容") start_time = models.DateTimeField() end_time = models.DateTimeField() def __unicode__(self): return self.name '''' CPU idle 80 usage 90 system 30 user iowait 50 memory : usage free swap cache buffer load: load1 load 5 load 15 '''