cdn域名图表展示及监控
说明:应朋友要求搭建阿里云cdn域名和师界云cdn域名的集中展示和监控平台
主要用到:
python3.6
Django3.0.2
layui==2.4.5
一、搭建项目及整体架构
新建一个django的项目
(本人使用的windows上pycharm编写的,以下命令针对windows)
django-admin.exe startproject new_project
django-admin.exe startapp new_app
完成项目和app的创建后,我们需要想这个平台的初始架构 django 是mvt框架 我们先定义好model模型 也就是数据库和表结构
1.数据模型设计
model.py
from django.db import models
# Create your models here.
class Cdn_bpsdata(models.Model):
id = models.CharField(verbose_name='主键id',max_length=15,unique=True,primary_key=True)
DomainName = models.CharField(verbose_name='域名',max_length=100)
Value = models.CharField(verbose_name='值',max_length=100)
HttpsValue = models.CharField(verbose_name='https值',max_length=100)
RequestId = models.CharField(verbose_name='请求id',max_length=100)
start_time = models.DateTimeField(verbose_name='utc开始时间')
end_time = models.DateTimeField(verbose_name='utc结束时间')
TimeStamp = models.DateTimeField(verbose_name='utc当前时间')
uptime = models.DateTimeField('更新时间',auto_now=True)
DataInterval = models.CharField(verbose_name='粒度',max_length=100)
TimeStamp_cst = models.DateTimeField(verbose_name='当前时间',null=True)
def __unicode__(self):
return self.id
class Cdn_trafficdata(models.Model):
id = models.CharField(verbose_name='主键id',max_length=15,unique=True,primary_key=True)
DomainName = models.CharField(verbose_name='域名',max_length=100)
Value = models.CharField(verbose_name='值',max_length=100)
HttpsValue = models.CharField(verbose_name='https值',max_length=100)
RequestId = models.CharField(verbose_name='请求id',max_length=100)
start_time = models.DateTimeField(verbose_name='utc开始时间')
end_time = models.DateTimeField(verbose_name='utc结束时间')
TimeStamp = models.DateTimeField(verbose_name='utc当前时间')
uptime = models.DateTimeField('更新时间',auto_now=True)
DataInterval = models.CharField(verbose_name='粒度',max_length=100)
TimeStamp_cst = models.DateTimeField(verbose_name='当前时间',null=True)
def __unicode__(self):
return self.id
class DomainName_tab(models.Model):
name_id = models.CharField(verbose_name='主键id',max_length=15,unique=True,primary_key=True)
DomainName = models.CharField(verbose_name='域名',max_length=100)
uptime = models.DateTimeField('更新时间',auto_now=True)
def __unicode__(self):
return self.name_id
class DomainName_tab_shijie(models.Model):
name_id = models.CharField(verbose_name='主键id', max_length=15, unique=True, primary_key=True)
DomainName = models.CharField(verbose_name='域名', max_length=100)
uptime = models.DateTimeField('更新时间', auto_now=True)
def __unicode__(self):
return self.name_id
class Cdn_lookcloud(models.Model):
id = models.CharField(verbose_name='主键id',max_length=15,unique=True,primary_key=True)
DomainName = models.CharField(verbose_name='域名',max_length=100)
Value = models.CharField(verbose_name='值',max_length=100)
start_time = models.DateTimeField(verbose_name='utc开始时间')
end_time = models.DateTimeField(verbose_name='utc结束时间')
TimeStamp = models.DateTimeField(verbose_name='utc当前时间')
uptime = models.DateTimeField('更新时间',auto_now=True)
DataInterval = models.CharField(verbose_name='粒度',max_length=100)
TimeStamp_cst = models.DateTimeField(verbose_name='当前时间',null=True)
code = models.CharField(verbose_name='code',max_length=100)
message = models.CharField(verbose_name='信息',max_length=100)
def __unicode__(self):
return self.id
class Cdn_lookcloud_flow(models.Model):
id = models.CharField(verbose_name='主键id',max_length=15,unique=True,primary_key=True)
DomainName = models.CharField(verbose_name='域名',max_length=100)
Value = models.CharField(verbose_name='值',max_length=100)
start_time = models.DateTimeField(verbose_name='utc开始时间')
end_time = models.DateTimeField(verbose_name='utc结束时间')
TimeStamp = models.DateTimeField(verbose_name='utc当前时间')
uptime = models.DateTimeField('更新时间',auto_now=True)
DataInterval = models.CharField(verbose_name='粒度',max_length=100)
TimeStamp_cst = models.DateTimeField(verbose_name='当前时间',null=True)
code = models.CharField(verbose_name='code',max_length=100)
message = models.CharField(verbose_name='信息',max_length=100)
def __unicode__(self):
return self.id
class Controls(models.Model):
c_id = models.CharField(verbose_name='主键id', max_length=15, unique=True, primary_key=True)
DomainName = models.CharField(verbose_name='域名', max_length=100)
control_value = models.CharField(verbose_name='监控值',max_length=100)
control_item = models.CharField(verbose_name='监控项', max_length=100)
control_info = models.CharField(verbose_name='监控信息', max_length=100)
email = models.CharField(verbose_name='邮箱', max_length=100)
status = models.CharField(verbose_name='状态', max_length=100)
isstart = models.CharField(verbose_name='是否启动', max_length=100)
uptime = models.DateTimeField('更新时间',auto_now=True)
def __unicode__(self):
return self.c_id
class Controls_info(models.Model):
timec_id = models.CharField(verbose_name='时间戳id', max_length=15, unique=True, primary_key=True)
DomainName = models.CharField(verbose_name='域名', max_length=100)
control_value = models.CharField(verbose_name='监控值',max_length=100)
control_count = models.CharField(verbose_name='连续次数', max_length=100)
start_time = models.DateTimeField(verbose_name='开始时间')
uptime = models.DateTimeField('更新时间', auto_now=True)
def __unicode__(self):
return self.timec_id
数据库
| 阿里云带宽数据表
| 视界云带宽数据表
| 视界云流量数据表
| 阿里云流量数据表
| 监控表
| 监控记录日志
| 阿里云域名列表
| 视界云域名列表
定义完数据模型后因为前端狗屁不会,所以我们拷贝一个前端源码然后修改就行了
下载链接:http://x.xuebingsi.com/
- 前端页面
登录页面:login.html
主页面:index.html
阿里云图表展示页面:aliyun.html
视界云图表展示页面:shije.html
视界云监控页面页面:monitor.html
视界云监控添加子页面:member-add.html
视界云监控修改子页面:member-edit.html
视界云监控删除子页面:member-del.html
监控日志页面:check_rizhi.html
- 视图接口
阿里云域名选择接口:DomainName_info
视界云域名选择接口:DomainName_info_shijie
阿里云图表数据接口:Get_datas
视界云图表数据接口:Get_datas_shijie
视界云监控展示接口:monitor_info
视界云监控添加接口:monitor_add
视界云监控修改接口:monitor_edit
视界云监控删除接口:monitor_delete
监控日志接口:check_info
- 后台调用接口
监控实时查询接口:flush_check
2.路由
url.py
from django.conf.urls import include, url
from django.contrib import admin
from dnsdata import views
from dnsdata import check_views
urlpatterns = [
#登录页面
url(r'admin/', admin.site.urls),
url(r'^$', views.login, name='login'),
url(r'^login/$', (views.login), name='login'),
url(r'^checklogin/$', (views.checklogin), name='checklogin'),
url(r'^index/$', (views.index), name='index'),
#欢迎页面 目前未作处理
url(r'^welcome/$', (views.welcome), name='welcome'),
#cdn域名图表展示页面
url(r'^aliyun_info/$', (views.aliyun_info), name='aliyun_info'),
url(r'^shijie_info/$', (views.shijie_info), name='shijie_info'),
#监控页面
url(r'^monitor/$', (views.monitor), name='monitor'),
#监控添加和修改页面
url(r'^member_add/$', (views.member_add), name='member_add'),
url(r'^member_edit/$', (views.member_edit), name='member_edit'),
#域名接口
url(r'^DomainName_info/$', (views.DomainName_info), name='DomainName_info'),
url(r'^DomainName_info_shijie/$', (views.DomainName_info_shijie), name='DomainName_info_shijie'),
#域名展示数据接口
url(r'^Get_datas/$', (views.Get_datas), name='Get_datas'),
url(r'^Get_datas_shijie/$', (views.Get_datas_shijie), name='Get_datas_shijie'),
# 监控列表数据接口
url(r'^monitor_info/$', (views.monitor_info), name='monitor_info'),
#监控添加
url(r'^monitor_add/$', (views.monitor_add), name='monitor_add'),
#修改
url(r'^monitor_edit/$', (views.monitor_edit), name='monitor_edit'),
#删除
url(r'^monitor_delete/$', (views.monitor_delete), name='monitor_delete'),
#监控接口及数据检查更新
url(r'^flush_check/$', (check_views.flush_check), name='flush_check'),
#日志页面
url(r'^check_rizhi/$', (views.check_rizhi), name='check_rizhi'),
#日志获取接口
url(r'^check_info/$', (views.check_info), name='check_info'),
]
二、图表展示方法
图表展示使用echarts

前端传id给js通过ajax来调用数据接口返回给前端
前端传id给图表进行展示

定义图表方法
var myChart = echarts.init(document.getElementById(‘main1’));


myChart.setOption({})来获取数据

使用刚指定的配置项和数据显示图表。
myChart.setOption(option);
三、监控展示及报警方法
监控页面使用的layui的table方法

传id给js处理

通过后台接口插入数据展示
添加监控接口调用

修改及删除监控调用

添加其实也可以加入table的case只是我太懒开始写好的一套就不想改
最后就是监控报警这块以及页面table的刷新正好配合定时器一起跑


这里也是因为前端菜的原因写的是整个table的刷新,没有针对到单个值
前端报警显示逻辑
每天查询日志表dnsdata_controls_info 以大于今天时间来查询没有数据则正常
前端报警逻辑
在数据库查询监控项的数据
统计超过三条连续的则插入监控日志表
这里监控后台接口写的有点乱就不多说了
不过对于统计这块是根据时间戳来排序统计的
页面展示如下
登录

图表

监控

日志

四、后记
本人太懒加上写的这个项目比较low一点吧,就不做多陈述了 具体源码在
https://github.com/clearlove-luzude/flowtab
后面有写了好的项目cmdb之类的,在好好写一下分享吧。
本文介绍了一个基于Django和Echarts的CDN监控与图表展示平台,包括数据模型设计、图表展示方法、监控报警机制及后端接口设计。
2727

被折叠的 条评论
为什么被折叠?



