Steins;Lab

某团的自留研究所

20分钟理解并写出简易的网速监控API

这是一篇学习笔记。用于快速理解,并在Raspbian(或者其他Linux系统)上,利用Python的Flask框架快速写出一份简易的网速监控API。

 

0 序言

我目前成为了树莓派的重度使用者。平时Python的练习可以在上面做,同时它也是我的NAS(简易版)、离线下载机、无线路由器……

对于我来说,对某台机器网速的监控有很大的需求,因此之前尝试利用基于PHP的探针提供的API来监控实时网速。

[趴会儿Project]No.004 洞察秋毫的观测者 – 服务器监控助手(基于PHP探针和Raspberry Pi)

PHP探针在建站环境上的主机会非常方便。但是对于没有PHP环境的主机,专门为了一个探针而配置PHP,则过于臃肿。

今天写了这篇文章,同时也作为我自己的笔记,用Python的Flask框架快速写出一份简易的网速监控API。

进行操作后,不只是网速监控API,可以根据自身需求推广到其他API的快速搭建。

 

我们最终的目标是,HTTP访问目标ip:端口,得到json形式的返回结果:

包含网口名,rx和tx字节数,此时的时间戳(api提供端无状态,只提供时间戳。网速信息在api获取端运算)。

注:JSON(JavaScript Object Notation, JS 对象标记) 是一种轻量级的数据交换格式。它基于 ECMAScript (w3c制定的js规范)的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。 易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。

 

1 了解 /proc

Linux 内核提供了一种通过 /proc 文件系统,在运行时访问内核内部数据结构、改变内核设置的机制。proc文件系统是一个伪文件系统,它只存在内存当中,而不占用外存空间。它以文件系统的方式为访问系统内核数据的操作提供接口。

 

详情可参考 Linux下/proc目录简介 [1]

对于状态监控,我们一般关心的信息如下:

/proc/cpuinfo cpu的信息

/proc/loadavg 根据过去一段时间内CPU和IO的状态得出的负载状态

/proc/meminfo RAM使用的相关信息

/proc/uptime 系统已经运行了多久

/proc/net 网卡设备信息

/proc/net/dev 显示网络适配器及统计信息

/proc/diskstats 取得磁盘信息

 

这样,我们就可以各取所需。在本例中,我使用了/proc/net/dev 显示网络适配器及统计信息。

/proc/net/dev就是我们流量监控的数据来源。

我关心eth0的网卡流量。因此我只要抓出eth0(第六行)行的RX字节数和TX字节数即可,再在api中返回此时的时间戳。

对于 /proc/net/dev 文件中我关心的信息,我使用的部分Python代码如下。

至此,我们得到的strline2就是eth0行中包含的数据列表。根据/proc/net/dev 格式,rx数据量是strline2[1],tx数据量是strline2[9]。当然,你也可以用正则表达式来实现。

毕竟是自己使用的简易API,如果不是特别在意的话,实现方法不优雅也无妨。

至此我们就能把自己需要的信息提取出来了

 

 

2 熟悉 flask 框架

Flask是一个使用Python编写的轻量级Web应用框架。基于Werkzeug WSGI工具箱和Jinja2 模板引擎。 Flask使用BSD授权。 Flask也被称为“microframework”,因为它使用简单的核心,用extension增加其他功能。Flask没有默认使用的数据库、窗体验证工具。然而,Flask保留了扩增的弹性,可以用Flask-extension加入这些功能:ORM、窗体验证工具、文件上传、各种开放式身份验证技术。

Flask有提供文档 http://docs.jinkan.org/docs/flask/

用简单的话说,Flask可以让你快速搭建起来一个web服务端,而省去一些技术细节。

不要误解,Flask的能力足以支撑大型的商业项目。但由于其轻量易上手,使得我们也可以在自己的项目中轻松使用。我们来看一下其helloworld代码。

如你所见,短短几行代码实现了基本的web静态服务。

 

我们将上面获取网速的代码加入,就可以实现我们的API功能。

具体操作如下:

安装flask

在我们的目录下新建一个app.py并编辑

写入以下代码

注意,相比helloworld,最后一行代表的含义是:在0.0.0.0(本地/不检查ip)上开放,端口5050,开启调试,然后执行

此时访问 http://localhost:5050 或者 http://目标机器ip:5050 即可返回HelloWorld。(访问失败,注意防火墙设置)

具体特性如调试、路由等等使用方法,本文不多提及,请参照官方文档。

 

 

3 写出服务端

我们最终的目标是,HTTP访问目标ip:端口,得到json形式的返回结果:

 

接下来将上面两部分结合,写出服务端即可。我的代码如下:

说明:

1 jsonify是flask提供的快速打包工具。使用jsonify(net),即可将net打包为json,然后直接返回即可。

2 成功实现后,请取消debug。

 

我提供一个示例:

http://sfo01.misaka.cc:5050/

访问得到

关于此api的利用,可以参阅我之前的文章。定期刷新获取json,解析后,两次请求数据量差与time时间戳之差之商即为网速。

[趴会儿Project]No.004 洞察秋毫的观测者 – 服务器监控助手(基于PHP探针和Raspberry Pi)

 

 

 

4 持久运行与使用

可以使用一切使进程持续运行的方法。

可以使用tmux

开启新对话时使用

 

即可

在新的会话中使用

后,终端即可直接关闭。返回会话可使用

直接返回

 

 

5 小结

至此。我们使用flask完成了一个最简单的API的搭建。下一步可以考虑更广的用途。

最后,笔者为生活在一个不需要重复造轮子的时代而感到幸运。

 

 

6 相关阅读

[1] Linux下/proc目录简介 http://blog.csdn.net/zdwzzu2006/article/details/7747977

[2] 百度百科-JSON https://baike.baidu.com/item/JSON

[2] Flask框架中文文档 http://docs.jinkan.org/docs/flask/

 

 

  1. 催更的fandy说道:
    Wordpress App 6 Wordpress App 6 iPhone iOS 9.3.1 iPhone iOS 9.3.1

    站主该更新了

    1. SPtuan说道:
      Google Chrome 61 Google Chrome 61 Windows 10 Windows 10

      有啥好的题材建议么

      1. fandy说道:
        Mozilla Compatible Mozilla Compatible iPhone iOS 9.3.1 iPhone iOS 9.3.1

        明天万圣节,来个游戏roll楼呗

        1. SPtuan说道:
          Unknown Unknown Unknown Unknown

          谁催更谁roll,你可以在自己博客roll4份橘子汁,18块钱

          1. fandy说道:
            Mozilla Compatible Mozilla Compatible iPhone iOS 9.3.1 iPhone iOS 9.3.1

            我猜送不出去2333我好友里没这么多有steam账号的,还是交给你吧

          2. SPtuan说道:
            Unknown Unknown Unknown Unknown

            放心吧roll游戏还能roll不出去,快发

          3. fandy说道:
            Mozilla Compatible Mozilla Compatible iPhone iOS 9.3.1 iPhone iOS 9.3.1

            圣诞节再说吧,现在没这个心情

          4. SPtuan说道:
            Unknown Unknown Unknown Unknown

            成交

  2. hen说道:
    Wordpress App 6 Wordpress App 6 iPhone iOS 9.3.1 iPhone iOS 9.3.1

    博主这是要深入学习python了么

    1. SPtuan说道:
      Google Chrome 61 Google Chrome 61 Windows 10 Windows 10

      Python能做的事太多了,想随便深入一项都太难了

发表评论

电子邮件地址不会被公开。 必填项已用*标注

This site uses Akismet to reduce spam. Learn how your comment data is processed.