python 開發練習之 監控

本節內容ios

爲何要作監控? redis

經常使用監控系統設計討論sql

監控系統架構設計express

監控表結構設計django

 

 

爲何要作監控? 

–熟悉IT監控系統的設計原理
–開發一個簡版的類Zabbix監控系統
–掌握自動化開發項目的程序設計思路及架構解藕原則
 

經常使用監控系統設計討論

Zabbix
Nagios
 

監控系統需求討論

1.可監控經常使用系統服務、應用、網絡設備等
2.一臺主機上可監控多個不一樣服務、不一樣服務的監控間隔可不一樣
3.同一個服務在不一樣主機上的監控間隔、報警閾值可不一樣
4.能夠批量的給一批主機添加、刪除、修改要監控的服務
5.告警級別:
  • 不一樣的服務 由於業務重要程度不一樣,若是出了問題能夠設置不一樣的報警級別
  • 能夠指定特定的服務或告警級別的事件通知給特定的用戶
  • 告警的升級設定

 

6.歷史數據 的存儲和優化
  • 實現用最少的空間佔用量存儲最多的有效數據
  • 如何作到1s中以內取出一臺主機上全部服務的5年的監控數據?

7. 數據可視化,如何作出簡潔美觀的用戶界面?安全

8.如何實現單機支持5000+機器監控需求?
9.採起何種通訊方式?主動、被動?
10.如何實現監控服務器的水平擴展?
 
 

採用什麼架構?

•Mysql
•主動通訊? Snmp,wget…
•被動通訊?Agent ---how to communicate with the monitor server
•Socket server –>  Sockect client
•可否用現成的c/s架構? Rabbit mq, redis 訂閱發佈, http ?
 

採用HTTP好處

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
'''
View Code
相關文章
相關標籤/搜索