Python中使用rrdtool结合Django进行带宽监控
我们有个网关需要做下带宽监控,能获取这个数据的唯一方法就是登录到管理界面查看。然后咱就写了个模拟登录的爬虫,定时抓取数据用rrdtool存储,最后通过Django来展示。这里就涉及了python的rrdtool,还有django怎么生成rrdtool这两个事。
rrdtool怎么使用的不细说了,比较好的教程是cu上的那个帖子,贴下部分代码,希望遇到类似需求的读者少走弯路。
安装就是 pip install rrdtool
创建和更新rrd数据库
创建和更新rrd文件
# coding:utf-8
import os
import time
import rrdtool
from settings import BASE_DIR
def rrd_init_or_update(rrdname, rx, tx):
base_dir = os.path.join(BASE_DIR, "rrddatas")
rrdpath = os.path.join(base_dir, rrdname)
if not os.path.isdir(base_dir):
os.makedirs(base_dir)
if os.path.isfile(rrdpath):
rrd_update(rrdpath, rx, tx)
else:
rrd_init(rrdpath)
rrd_update(rrdpath, rx, tx)
def rrd_init(rrdname):
"""
聚合时间根据自己需要
"""
rrdtool.create(rrdname,
"--start", str(int(time.time()) - 3600*24),
"--step", '300',
"DS:wan_rx:COUNTER:600:0:U",
"DS:wan_tx:COUNTER:600:0:U",
"RRA:AVERAGE:0.5:1:600",
"RRA:AVERAGE:0.5:4:600",
"RRA:AVERAGE:0.5:24:600",
"RRA:AVERAGE:0.5:288:730",
"RRA:MAX:0.5:1:600",
"RRA:MAX:0.5:4:600",
"RRA:MAX:0.5:24:600",
"RRA:MAX:0.5:288:730",
"RRA:MIN:0.5:1:600",
"RRA:MIN:0.5:4:600",
"RRA:MIN:0.5:24:600",
"RRA:MIN:0.5:288:730")
def rrd_update(rrdname, rx, tx):
rrdtool.update(rrdname, "N:%s:%s" % (rx, tx))
注意 “DS:wan_rx:COUNTER:600:0:U”, 这里的U代表不限制上线,从0到最大值,如果可以预测区间,最好给一个最大值。
画图展示到web端
django展示rrd画图的view部分
#-*- coding=utf-8 -*-
import os
import cStringIO
import tempfile
import datetime
import rrdtool
from django.shortcuts import render
from django.http import HttpResponse
from PIL import Image
def wn_status(request):
rrd_name = os.path.join(BASE_DIR, "rrddatas/gw.rrd")
fd, path = tempfile.mkstemp('.png')
# 时间格式中的 : 也要转义
dtime = datetime.datetime.strftime(
datetime.datetime.now(),
"%Y-%m-%d %H\:%M\:%S"
)
rrdtool.graph(path,
'--start', "-12h",
"-t", "渭南网关带宽",
"-w", "600",
"-h", "200",
'DEF:value1={0}:wan_rx:AVERAGE'.format(rrd_name),
'DEF:value2={0}:wan_tx:AVERAGE'.format(rrd_name),
'AREA:value1#00ff00: rx',
'LINE:value2#ff0000: tx',
"COMMENT:\\n",
'AREA:value1#00ff00:下载',
'GPRINT:value1:LAST:当前\:%8.0lf',
'GPRINT:value1:AVERAGE:平均\:%8.0lf',
'GPRINT:value1:MAX:最大\:%8.0lf',
'GPRINT:value1:MIN:最小\:%8.0lf',
"COMMENT:\\n",
'LINE2:value2#4433ff:上传',
'GPRINT:value2:LAST:当前\:%8.0lf',
'GPRINT:value2:AVERAGE:平均\:%8.0lf',
'GPRINT:value2:MAX:最大\:%8.0lf',
'GPRINT:value2:MIN:最小\:%8.0lf',
"COMMENT:\\n",
"COMMENT:Date " + dtime)
im = Image.open(path)
out = cStringIO.StringIO()
im.save(out, format='png')
room = out.getvalue()
out.close()
os.remove(path)
return HttpResponse(room, 'image/png')
!!注意: COMMENT那里需要做下转义,否则无法正常换行。画图中特别要注意转义的问题 \ : 都要转义。
还有的做法就是定时使用 rrdtool的命令行工具生成监控图,web端访问的时候就和普通图片一样了。如果定时生成图片,就没那么灵活了。
Python中使用rrdtool结合Django进行带宽监控的更多相关文章
- Django之在Python中调用Django环境
Django之在Python中调用Django环境 新建一个py文件,在其中写下如下代码: import os if __name__ == '__main__': os.environ.setdef ...
- 真正搞明白Python中Django和Flask框架的区别
在谈Python中Django框架和Flask框架的区别之前,我们需要先探讨如下几个问题. 一.为什么要使用框架? 为了更好地阐述这个问题,我们把开发一个应用的过程进行类比,往往开发一个应用(web应 ...
- django 商城项目之购物车以及python中的一些redis命令
最近在用django restframe框架做一个商城项目,有一个关于购物车的业务逻辑,是用cookie和redis存储的购物车信息,在这里记录一下. 完成一个商城项目,如果不做一个购物车,就是十分可 ...
- Python中的Django框架中prefetch_related()函数对数据库查询的优化
实例的背景说明 假定一个个人信息系统,需要记录系统中各个人的故乡.居住地.以及到过的城市.数据库设计如下: Models.py 内容如下: ? 1 2 3 4 5 6 7 8 9 10 11 12 1 ...
- 干货福利:如何使用Python中Django模板?
前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者: 穆胜亮 篇文章将学习如何使用Django模板.模板是在Django ...
- Python 学习第十九天 django知识
一,django 知识总结 1,同一个name属性的标签,多个值获取 <form action="/login/" method="POST" encty ...
- python 学习笔记十六 django深入学习一 路由系统,模板,admin,数据库操作
django 请求流程图 django 路由系统 在django中我们可以通过定义urls,让不同的url路由到不同的处理函数 from . import views urlpatterns = [ ...
- python 学习笔记十五 django基础
Python的WEB框架有Django.Tornado.Flask 等多种,Django相较与其他WEB框架其优势为:大而全,框架本身集成了ORM.模型绑定.模板引擎.缓存.Session等诸多功能. ...
- Python中的下划线(译文)
原文地址这篇文章讨论Python中下划线_的使用.跟Python中很多用法类似,下划线_的不同用法绝大部分(不全是)都是一种惯例约定. 单个下划线(_) 主要有三种情况: 1. 解释器中 _符号是指交 ...
随机推荐
- [COGS 1799][国家集训队2012]tree(伍一鸣)
Description 一棵n个点的树,每个点的初始权值为1.对于这棵树有q个操作,每个操作为以下四种操作之一: + u v c:将u到v的路径上的点的权值都加上自然数c: - u1 v1 u2 v2 ...
- [CQOI 2010]扑克牌
Description 你有n种牌,第i种牌的数目为ci.另外有一种特殊的 牌:joker,它的数目是m.你可以用每种牌各一张来组成一套牌,也可以用一张joker和除了某一种牌以外的其他牌各一张组成1 ...
- UOJ #206. 【APIO2016】Gap
Description Solution 第一个子任务,直接从 \((a[i],a[j])\) 推出 \((a[i+1],a[j-1])\) 就行了,只需要 \(\frac{N+1}{2}\) 第二个 ...
- [BZOJ]1018 堵塞的交通(SHOI2008)
一道有点神的线段树. Description 有一天,由于某种穿越现象作用,你来到了传说中的小人国.小人国的布局非常奇特,整个国家的交通系统可以被看成是一个2行C列的矩形网格,网格上的每个点代表一个城 ...
- C语言程序设计第三次作业 —— 选择结构(1)
(一)改错题 计算f(x)的值:输入实数x,计算并输出下列分段函数f(x)的值,输出时保留1位小数. (错误一) 错误原因及改正:第九行语句结尾缺少半角分号,添加分号即可改正 (错误二) 错误原因及改 ...
- 浅析java内存管理机制
内存管理是计算机编程中的一个重要问题,一般来说,内存管理主要包括内存分配和内存回收两个部分.不同的编程语言有不同的内存管理机制,本文在对比C++和Java语言内存管理机制的不同的基础上,浅析java中 ...
- DataOutputStream&DataInputStream
DataOutputStream&DataInputStream是对输出输入流的扩展,可以直接读写int double等数据类型 下面是今天的练习,细节都写到注释里面了: package Zh ...
- joomla网站内插入doc文档
最近我的网站又出了问题,之前用joomla做的网站,由于要放doc文档,后来想尽办法终于用iframe的办法,先把文档传到scribd网,然后把文档嵌到网站里去,但是狗血的,去年五月份的时候我们伟大的 ...
- Python3 循环
Python中的循环语句有 for 和 while. Python循环语句的控制结构图如下所示: while 循环 Python中while语句的一般形式: while 判断条件: statement ...
- ionic3-ng4学习见闻--(多语言方案)
1.安装ng2-translate npm install ng2-translate --save 2.app.moudle.ts 引入模块,在下方新增方法 import { TranslateMo ...