自动化监控系统(二)连接数据库,创建app,添加model,同步数据库
数据库我使用:mysql5.7
程序连接数据库的模块:pymysql
一、创建数据库:
dbname:automatedmonitor
二、使用pip安装pymysql,这里我直接在pycharm上安装:
三、在settings里配置数据库连接:
DATABASES = {
'default': {
#指定数据库类型
'ENGINE': 'django.db.backends.mysql',
#数据库名
'NAME': "automatedmonitor",
#IP地址
'HOST':"127.0.0.1",
#用户名
'USER':"root",
#密码
'PASSWORD':"",
#端口
'PORT':"" }
}
四、接下来是规划目录结构
1、项目根目录下创建apps目录,所有app应用将会放在里面。
2、创建static目录,存放静态文件-JS和CSS。
3、创建media目录,用来存放媒体文件,比如:用户上传的文件等。
4、创建log目录,存放日志文件。
5、创建templates目录,用来存放HTML文件
6、创建images目录,存放图片。
PS:别的后面需要再添加。
五、model表结构,monitor app:
#!_*_coding:utf8_*_ from django.db import models
from django.utils.translation import ugettext_lazy as _
from django.utils.safestring import mark_safe # Create your models here. #主机表
class Host(models.Model):
#主机名唯一
name = models.CharField(max_length=64,unique=True,verbose_name="主机名")
#IP地址唯一
ip_addr = models.GenericIPAddressField(unique=True,verbose_name="IP地址")
#主机组
host_groups = models.ManyToManyField('HostGroup',blank=True,verbose_name="主机组") # A B C
#默认模板
templates = models.ManyToManyField("Template",blank=True,verbose_name="默认模板") # A D E
monitored_by_choices = (
('agent','Agent'),
('snmp','SNMP'),
('wget','WGET'),
)
#监控选择
monitored_by = models.CharField(max_length=64,choices=monitored_by_choices,verbose_name="监控方式")
status_choices= (
(1,'Online'),
(2,'Down'),
(3,'Unreachable'),
(4,'Offline'),
(5,'Problem'),
)
#
host_alive_check_interval = models.IntegerField( default=30,verbose_name="主机存活状态检测间隔")
#主机状态
status = models.IntegerField(choices=status_choices,default=1,verbose_name="主机状态")
#备注信息
memo = models.TextField(blank=True,null=True,verbose_name="备注信息") def __str__(self):
return self.name #主机组表
class HostGroup(models.Model):
#主机组名
name = models.CharField(max_length=64,unique=True,verbose_name="主机组名")
#主机组模板
templates = models.ManyToManyField("Template",blank=True,verbose_name="主机组模板")
#备注信息
memo = models.TextField(blank=True,null=True,verbose_name="备注信息")
def __str__(self):
return self.name #一个服务下有多个指标,指标表
class ServiceIndex(models.Model):
#指标名称
name = models.CharField(max_length=64,verbose_name="指标名称")
#具体指标,比如cpu下的idle
key =models.CharField(max_length=64)
data_type_choices = (
('int',"int"),
('float',"float"),
('str',"string")
)
#指标数据类型
data_type = models.CharField(max_length=32,choices=data_type_choices,default='int',verbose_name="指标数据类型")
#备注
memo = models.CharField(max_length=128,blank=True,null=True,verbose_name="备注")
def __str__(self):
return "%s.%s" %(self.name,self.key) #服务表
class Service(models.Model):
#服务名称
name = models.CharField(max_length=64,unique=True,verbose_name="服务名称")
#监控间隔
interval = models.IntegerField(default=60,verbose_name="监控间隔")
#插件名,client拿到它来进行监控
plugin_name = models.CharField(max_length=64,default='n/a',verbose_name="插件名")
#指标列表,比如CPu下有多个指标,是一对多的关系
items = models.ManyToManyField('ServiceIndex',blank=True,verbose_name="指标列表")
#子服务
has_sub_service = models.BooleanField(default=False,help_text=u"如果一个服务还有独立的子服务 ,选择这个,比如 网卡服务有多个独立的子网卡",verbose_name="子服务") #如果一个服务还有独立的子服务 ,选择这个,比如 网卡服务有多个独立的子网卡
#备注
memo = models.CharField(max_length=128,blank=True,null=True,verbose_name="备注") def __str__(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 __str__(self):
return self.name #触发一个报警,由多个指标来判断,触发关联表,一个表达式只能关联一个trigger
class TriggerExpression(models.Model):
#所属触发器
trigger = models.ForeignKey('Trigger',verbose_name="所属触发器")
#关联服务
service = models.ForeignKey(Service,verbose_name="关联服务")
#关联服务指标
service_index = models.ForeignKey(ServiceIndex,verbose_name="关联服务指标")
#只监控专门指定的指标key
specified_index_key = models.CharField(verbose_name="只监控专门指定的指标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(choices=data_calc_type_choices,max_length=64,verbose_name="数据处理方式")
#函数传入参数
data_calc_args = models.CharField(help_text="若是多个参数,则用,号分开,第一个值是时间",max_length=64,verbose_name="函数传入参数")
#阈值
threshold = models.IntegerField(u"阈值") logic_type_choices = (('or','OR'),('and','AND'))
#与另一个表达式的关系
logic_type = models.CharField(choices=logic_type_choices,max_length=32,blank=True,null=True,verbose_name="与一个条件的逻辑关系")
def __str__(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(max_length=64,verbose_name="触发器名称")
severity_choices = (
(1,'Information'),
(2,'Warning'),
(3,'Average'),
(4,'High'),
(5,'Diaster'),
)
#expressions = models.ManyToManyField(TriggerExpression,verbose_name=u"条件表达式")
#告警级别
severity = models.IntegerField(choices=severity_choices,verbose_name="告警级别") enabled = models.BooleanField(default=True)
#备注
memo = models.TextField(blank=True,null=True,verbose_name="备注") def __str__(self):
return "<serice:%s, severity:%s>" %(self.name,self.get_severity_display()) #触发报警后的动作类型
class Action(models.Model):
#action名称
name = models.CharField(max_length=64,unique=True,verbose_name="动作名称")
#关联哪个主机组
host_groups = models.ManyToManyField('HostGroup',blank=True,verbose_name="主机组")
#关联哪个主机
hosts = models.ManyToManyField('Host',blank=True,verbose_name="主机")
#告警条件
conditions = models.TextField(verbose_name="告警条件")
#触发器
triggers = models.ManyToManyField('Trigger',blank=True,help_text=u"想让哪些trigger触发当前报警动作",verbose_name="触发器")
#告警间隔
interval = models.IntegerField(default=300,verbose_name="告警间隔(s)")
#关联别的动作
operations = models.ManyToManyField('ActionOperation',verbose_name='ActionOperation')
#故障恢复是否要通知
recover_notice = models.BooleanField(verbose_name='故障恢复后发送通知消息',default=True)
#恢复后通知的主题是什么
recover_subject = models.CharField(max_length=128,blank=True,null=True,verbose_name="通知主题")
#通知文本
recover_message = models.TextField(blank=True,null=True,verbose_name="通知文本")
#是否停用
enabled = models.BooleanField(default=True,verbose_name="是否停用") def __str__(self):
return self.name #触发报警后的具体动作
class ActionOperation(models.Model):
name = models.CharField(max_length=64,verbose_name="告警升级")
step = models.SmallIntegerField(verbose_name="第n次告警",default=1,help_text="当trigger触发次数小于这个值时就执行这条记录里报警方式")
action_type_choices = (
('email','Email'),
('sms','SMS'),
('script','RunScript'),
)
#通过告警次数,给告警级别升级,并且指定动作类型
action_type = models.CharField(verbose_name="动作类型",choices=action_type_choices,default='email',max_length=64)
#告警通知对象
notifiers= models.ManyToManyField('UserProfile',verbose_name="通知对象",blank=True)
_msg_format = '''Host({hostname},{ip}) service({service_name}) has issue,msg:{msg}'''
#消息格式
msg_format = models.TextField(verbose_name="消息格式",default=_msg_format)
def __str__(self):
return self.name #主机维护表
class Maintenance(models.Model): name = models.CharField(max_length=64,unique=True)
#主机
hosts = models.ManyToManyField('Host',verbose_name='主机',blank=True)
#主机组
host_groups = models.ManyToManyField('HostGroup',verbose_name='主机组',blank=True)
#维护内容
content = models.TextField(verbose_name="维护内容")
#开始时间
start_time = models.DateTimeField()
#结束时间
end_time = models.DateTimeField() def __str__(self):
return self.name class EventLog(models.Model):
"""存储报警及其它事件日志"""
event_type_choices = ((0,'报警事件'),(1,'维护事件'))
event_type = models.SmallIntegerField(choices=event_type_choices,default=0)
host = models.ForeignKey("Host",verbose_name="Host")
trigger = models.ForeignKey("Trigger",verbose_name="Trigger",blank=True,null=True)
log = models.TextField(blank=True,null=True)
date = models.DateTimeField(auto_now_add=True) def __str__(self):
return "host%s %s" %(self.host , self.log) ''''
CPU
idle 80
usage 90
system 30
user
iowait 50 memory :
usage
free
swap
cache
buffer load:
load1
load 5
load 15
'''
users app:
from django.db import models from users import auth
# Create your models here. class UserProfile(auth.AbstractBaseUser, auth.PermissionsMixin):
email = models.EmailField(
verbose_name='email address',
max_length=255,
unique=True, )
password = models.CharField(_('password'), max_length=128,
help_text=mark_safe('''<a class='btn-link' href='password'>重置密码</a>''')) phone = models.BigIntegerField(blank=True,null=True)
weixin = models.CharField(max_length=64,blank=True,null=True) is_active = models.BooleanField(default=True)
is_admin = models.BooleanField(default=False)
is_staff = models.BooleanField(
verbose_name='staff status',
default=True,
help_text='Designates whether the user can log into this admin site.',
)
name = models.CharField(max_length=32)
#role = models.ForeignKey("Role",verbose_name="权限角色") memo = models.TextField(verbose_name='备注', blank=True, null=True, default=None)
date_joined = models.DateTimeField(blank=True, null=True, auto_now_add=True) USERNAME_FIELD = 'email'
# REQUIRED_FIELDS = ['name','token','department','tel','mobile','memo']
REQUIRED_FIELDS = ['name'] def get_full_name(self):
# The user is identified by their email address
return self.email def get_short_name(self):
# The user is identified by their email address
return self.email def __str__(self): # __str__ on Python 2
return self.email # def has_perm(self, perm, obj=None):
# "Does the user have a specific permission?"
# # Simplest possible answer: Yes, always
# return True
def has_perms(self, perm, obj=None):
"Does the user have a specific permission?"
# Simplest possible answer: Yes, always
return True def has_module_perms(self, app_label):
"Does the user have permissions to view the app `app_label`?"
# Simplest possible answer: Yes, always
return True @property
def is_superuser(self):
"Is the user a member of staff?"
# Simplest possible answer: All admins are staff
return self.is_admin objects = auth.UserManager() class Meta:
verbose_name = '账户'
verbose_name_plural = '账户'
遇到个问题:
原因:多对多manytomanyfield字段需要关联别的表,第一个参数需要加上表名
host_groups = models.ManyToManyField('HostGroup',blank=True,verbose_name="主机组")
#关联哪个主机
hosts = models.ManyToManyField('Host',blank=True,verbose_name="主机")
#告警条件
conditions = models.TextField(verbose_name="告警条件")
#触发器
triggers = models.ManyToManyField('Trigger',blank=True,help_text=u"想让哪些trigger触发当前报警动作",verbose_name="触发器")
#告警间隔
interval = models.IntegerField(default=300,verbose_name="告警间隔(s)")
#关联别的动作
operations = models.ManyToManyField('ActionOperation',verbose_name='ActionOperation')
对django自带的UserProfile进行扩展字段,但是发现在同步数据库的时候,会出现如下报错。
原因:重载django自带的model,需要在settings里说明:
#重载,这里是app名称.model的类名
AUTH_USER_MODEL = 'monitor.UserProfile'
自动化监控系统(二)连接数据库,创建app,添加model,同步数据库的更多相关文章
- 自动化监控系统(三) 搭建xadmin做网站后台
Django有个自带的admin后台,不过界面不怎么好看,这里我用xadmin 我的python版本是3.5,可以使用支持py3的xadmin:https://github.com/sshwsfc/x ...
- Legolas工业自动化平台案例 —— 水源地自动化监控系统
天津港爆炸事件后,除了安置群众.追究事故责任外,人们最关心的莫过于爆炸污染物对于周边环境的影响,其中最重要的一块就是饮用水的安全.所幸的是,水源的安全监测是实实在在有据可依的.环保单位和供水企业在建设 ...
- 分布式监控系统Zabbix3.2给异常添加邮件报警
在前一篇 分布式监控系统Zabbix3.2跳坑指南 中已安装好服务端和客户端,此处客户端是被监控的服务器,可能有上百台服务器.监控的目的一个是可以查看历史状态,可以对比零晨和工作区间数据的对比,以便后 ...
- zabbix系列(二)zabbix3.0.4添加对mysql数据库性能的监控
zabbix3.0.4添加Mysql的监控 zabbix3.0 server已自带mysql的模板了,只需安装agent端,然后在web端给主机增加模板就行了. Agent端操纵 /etc/zabbi ...
- 分布式监控系统Zabbix-完整安装记录 -添加端口监控
对于进程和端口的监控,可以使用zabbix自带的key进行监控,只需要在server端维护就可以了,相比于nagios使用插件去监控的方式更为简单.下面简单介绍配置:监控端口zabbix监控端口使用如 ...
- 分布式监控系统Zabbix--完整安装记录 -添加apache监控
前面介绍了zabbix3.0.3环境及相关监控项的添加,下面介绍下针对apache的监控配置:1)在apache配置文件中打开server-status状态访问功能(自带的) [root@IDC-Ad ...
- 大数据系统之监控系统(二)Flume的扩展
一些需求是原生Flume无法满足的,因此,基于开源的Flume我们增加了许多功能. EventDeserializer的缺陷 Flume的每一个source对应的deserializer必须实现接口E ...
- 分布式监控系统Zabbix--完整安装记录 -添加web页面监控
通过zabbix做web监控,不仅仅可以监控到站点的响应时间,还可以根据站点返回的状态码或响应时间做报警设置,比如说对某个url进行监控,当访问返回的状态码是非200状态时都报警(创建触发器即可).下 ...
- Django(二)创建app,设置相关后台
location 最后一个文件夹名就是project名,我用了DjangoProject. Application 是自动加入的APP名字,我用了DjangoTest 1.添加APP在pycharm的 ...
随机推荐
- UVA11572_Unique Snowflakes
超级经典的题目,扫描区间,滑动窗口 对这题目的最大感受就是,单独看这个题目,其实不难,但是很多我感觉挺难或者没做出来的题目,都是由这些若干个经典的算法组合而成的 滑动窗口便是一个典型的例子!!!!遇到 ...
- 通过rocketmq思考一下mq的设计取舍
1. RocketMQ路由中心NameServer 2. RocketMQ消息发送 3. RocketMQ消息存储 4. RocketMQ消息消费 5. 消息过滤FiterServer 6. Rock ...
- mysql 5.7.20 从frm文件中得到建表语句 (使用 mysql-utilities)
系统环境 centos 7.2 mysql社区版 5.7.20 mysql-utilities 根据官网的说法,截止到2018年5月30日,实用工具的一些功能在Shell的路线图中,鼓励用户迁 ...
- CTU OPEN 2017 Shooting Gallery /// 区间DP
题目大意: 给定n 给定n个数 选定一个区间留下其他消去 要求区间两端的两个数一样 若成功留下一个区间 则在选定区间的基础上 继续进行上述操作 直到无法再选出这样的区间 求最多操作数 按区间长度由短到 ...
- Javascript基础一(介绍)
Javascript的发展历史: JavaScript在设计之初只是为了做表单验证.但是现如今,JavaScript已经成为了一门功能全面的编程语言,已经是WEB中不可缺少的一部分,如今的JavaSc ...
- ios打包,通过Xcode生成ipa文件
ios打包,通过Xcode生成ipa文件 干货文章 ·2018-03-21 19:03:47 打开ios项目目录,配置证书 将运行设备选择,如下图 选择:Product -> Scheme -& ...
- STL_map
map<string,int> m; int main() { m[; cout<<m["]<<endl; ; }
- Github Statistics 一个基于 React 的 GitHub 数据统计工具
V 站曾经有个热帖说为何我的开源项目只有 Fork 没有 Star,楼下有个热评说开源项目关注的不应该是 Commit 数据吗?先不论 Star.Fork 和 Commit,issue .pr 也应是 ...
- C++中的delete加深认识
delete操作: 我们在删除一个指针之后,编译器只会释放该指针所指向的内存空间,而不会删除这个指针本身. 1.假如你不去释放,那么该区域的内存始终不能被其他数据所使用.2.指向该内存的指针是个局部变 ...
- Cache技术―OSCache
Cache技术―OSCache 版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明http://aumy2008.blogbus.com/logs/36462938.html 一.简介 ...