我们有个网关需要做下带宽监控,能获取这个数据的唯一方法就是登录到管理界面查看。然后咱就写了个模拟登录的爬虫,定时抓取数据用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进行带宽监控的更多相关文章

  1. Django之在Python中调用Django环境

    Django之在Python中调用Django环境 新建一个py文件,在其中写下如下代码: import os if __name__ == '__main__': os.environ.setdef ...

  2. 真正搞明白Python中Django和Flask框架的区别

    在谈Python中Django框架和Flask框架的区别之前,我们需要先探讨如下几个问题. 一.为什么要使用框架? 为了更好地阐述这个问题,我们把开发一个应用的过程进行类比,往往开发一个应用(web应 ...

  3. django 商城项目之购物车以及python中的一些redis命令

    最近在用django restframe框架做一个商城项目,有一个关于购物车的业务逻辑,是用cookie和redis存储的购物车信息,在这里记录一下. 完成一个商城项目,如果不做一个购物车,就是十分可 ...

  4. Python中的Django框架中prefetch_related()函数对数据库查询的优化

    实例的背景说明 假定一个个人信息系统,需要记录系统中各个人的故乡.居住地.以及到过的城市.数据库设计如下: Models.py 内容如下: ? 1 2 3 4 5 6 7 8 9 10 11 12 1 ...

  5. 干货福利:如何使用Python中Django模板?

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者: 穆胜亮 篇文章将学习如何使用Django模板.模板是在Django ...

  6. Python 学习第十九天 django知识

    一,django 知识总结 1,同一个name属性的标签,多个值获取 <form action="/login/" method="POST" encty ...

  7. python 学习笔记十六 django深入学习一 路由系统,模板,admin,数据库操作

    django 请求流程图 django 路由系统 在django中我们可以通过定义urls,让不同的url路由到不同的处理函数 from . import views urlpatterns = [ ...

  8. python 学习笔记十五 django基础

    Python的WEB框架有Django.Tornado.Flask 等多种,Django相较与其他WEB框架其优势为:大而全,框架本身集成了ORM.模型绑定.模板引擎.缓存.Session等诸多功能. ...

  9. Python中的下划线(译文)

    原文地址这篇文章讨论Python中下划线_的使用.跟Python中很多用法类似,下划线_的不同用法绝大部分(不全是)都是一种惯例约定. 单个下划线(_) 主要有三种情况: 1. 解释器中 _符号是指交 ...

随机推荐

  1. bzoj 4547 小奇的集合

    Description 有一个大小为n的可重集S,小奇每次操作可以加入一个数a+b(a,b均属于S),求k次操作后它可获得的S的和的最大 值.(数据保证这个值为非负数) Input 第一行有两个整数n ...

  2. ●51NOD 1705 七星剑

    题链: http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1705题解: 期望dp,期望的线性性质 (首先对于第k颗星,一定只 ...

  3. ●BZOJ 4821 [Sdoi2017]相关分析

    题链: http://www.lydsy.com/JudgeOnline/problem.php?id=4821 题解: 线段树是真的恶心,(也许是我的方法麻烦了一些吧)首先那个式子可以做如下化简: ...

  4. hdu 5120(2014北京—求圆相交)

    题意:求环的相交面积 思路: 通过画图可知,面积= 大圆相交面积 - 大小圆相交面积*2 + 小小圆相交面积  再通过圆相交模板计算即可 #include <iostream> #incl ...

  5. [BZOJ]1027 合金(JSOI2007)

    不知道该如何评价吧,很神的一道题,就算是10年前的题目也不可小觑啊. Description 某公司加工一种由铁.铝.锡组成的合金.他们的工作很简单.首先进口一些铁铝锡合金原材料,不同种类的原材料中铁 ...

  6. SPOJ DQUERY树状数组离线or主席树

    D-query Time Limit: 227MS   Memory Limit: 1572864KB   64bit IO Format: %lld & %llu Submit Status ...

  7. Java多线程基础总结

    一.线程和进程关系 二.创建方式1.继承Thread类,重写run方法2.实现Runable接口,重写run方法3.使用匿名内部类 三.API接口start()currentThread() 获取当前 ...

  8. jquery 跨域请求数据问题

    昨天参加了一个前端的面试,被问到一个跨域请求数据问题,我们之前一直用的是apicloud的api进行请求的,跨域是被apicloud封装起来的,也就没有注意跨域请求数据的问题.当被问到用jquery跨 ...

  9. 阿里技术一面,Java研发岗

    之前过了个简单的简历面,过了几天后没打来以为凉了,然后昨晚又接到了电话,括号内容是回答说的,理解有限,不一定都对,欢迎纠正-加油每一个牛友们! 阿里一面: 1.学过哪些技术知识呢? 2.说说接口和抽象 ...

  10. ref string

    string pics=""; pSub.GetSubjectContent(pddm,ref  pics); public string GetSubjectContent(st ...