使用 psutil 和 MongoDB 做系统监控

这篇入门文章描述了怎样创建一系列的图表来监控一台或多台服务器的负载。使用 Python(psutil 和 bottle),MongoDB 和 jquery。不管你使用什么样的数据库或 WEB 框架,思路都是一样的。

在最后,你将有一个 web 页面为每台服务器展示图表,图表中显示了 cpu, memory, 和 disk usage。

大纲

  • Part 0: Get the Tools
  • Part 1: Get the Data
    • About the MongoDB Collection.
    • The Data Gathering Code
  • Part 2: Set up the bottle Server
  • Part 3: Display the Data with jqplot
    • The HTML Page
    • The JavaScript (jqplot) Code

我们需要监控两台 FreeBSD 服务器来确保它们是正常的,运行期间没有内存和磁盘使用率问题。 为了这篇文章的目的,这两台服务器的名字是 example01 和 example02。

注意:这些恰好是相同的机器运行 MongoDB 副本集,它们中的一台运行 web 服务。没有理由它们必须是相同的机器 – 你完全可以让 MongoDB 运行在一台不同的服务器上,而不是你想监控的其中一台。这对于 web 服务也是一样的 – 可以在任何服务器上,不是必须得在你监控的其中一台服务器上。

我不想登录每台服务器,然后运行 topds 来找出发生了什么。我想要一个有最新图表的 web 页面可以看一眼,每台服务器一个页面。

整个工作流遵循以下三个步骤:

  • 获取系统数据存入 MongoDB(使用 psutilcron
  • 设置一个 Web 服务器来查询 MongoDB 的数据(使用 bottle
  • 编写一个简单的 Web 页面来展示这些数据(jqplot + AJAX)

你可以在 GitHub 工程 psmonitor 上获取所有的代码。在这篇文章中,我使用一些代码片段。

在第一部分,你在一个 cron 任务中使用 psutil Python 包每五分钟写系统信息到 MongoDB 的一个 capped collection 中。这 5 分钟是完全任意的 – 你可以选择你喜欢的任意时段。我正在监控的系统,几分钟提供足够细的粒度。这部分把数据存入 MongoDB。

在第二部分, bottle 应用程序发出一个请求给 MongoDB,然后得到一个 JSON 数据格式的响应。这是在客户端的 HTML 页面和 MongoDB 数据直接创建了一个代理。

在第三部分,你有一个 HTML 文件匹配到你想监控的每台服务器上。该文件加载 jqplot 并发出一个 AJAX 请求给 bottle 应用程序。这部分是波动的原因 – 我们获取存储在 MongoDB 中的负载数据的时间序列图表。

这个我们创建的其中一个图表的示例:

你可以为你想要的任何数据创建图表。我为每台机器使用的图表是:

  • cpu user percent
  • cpu system percent
  • cpu irq
  • cpu nice percent
  • disk space free
  • memory free

Part 0: Get the Tools

以下的工具需要通过安装来实现,但是你可以使用一个不同的数据库或是 Web 框架,如果你已经有的话。

psutil 是一个非常好用的跨平台的系统监控工具,如果想了解更多,请移步至其项目主页,你可以通过 pip 安装它。

NoSQL 数据库 MongoDB 是一个开源的文档型数据库。如果你有自然适合 JSON 结构的数据,MongoDB 会是一款非常适合存储数据的工具。对我来说,它已经成为了首选的工具,当我随时发现需要存储 JSON 格式数据的时候。有趣的是,我越使用它,越能找到新的用途。MongoDB 的文档型结构是惊人的有用,并且可以为许多信息类型提供 map 。

bottle Web 框架是一个用 Python 写的没有任何依赖的小型框架。你可以通过 pip 安装它。你可以使用包括开发服务器让事情继续,稍后把它放在一个不同的后端服务器。我把我的放在 Apache 服务器,一旦我得到我希望他们的。我稍后将写一篇文章关于这个的设置。

jqplot jquery 插件使得生产图表更容易,加上它们看起来也不错,并且它们是统一的很容易的比较图表。比如,当一个进程波动起来的时候,在图表中很容易看出来,因为你可以同时看到 cpu 和 内存飙升,这两个图表是同样的 X 轴位置。你可以使用这个插件做很多事情,这个练习仅仅只是皮毛。

Part 1: Get the Data

当我们想遵循这样的模式创建一个数据结构的时候,在这步中你可以添加和删除任何 psutil 支持的数据。终点是会看 jqplot 图表的用户,因此在你的脑海里保持数据结构,jqplot 想要的是一个双元素列表的列表,其中一个是时间,像这样:

那个结构不是收集数据的最有效方式,但是记住你的初心是什么一直是很重要的。我们将收集数据并且改变数据结构以便给 jqplot 需要的数据结构。

当第一步我不知道我需要什么和使用什么,我有更多一些测量。我认为,随着时间的流逝,我看到机器的实际需求将改变,并且它非常容易改变。

下面是 python 代码从系统获取数据(使用 psutil )到 MongoDB 数据库。我在 MongoDB 中为每个被检测到的机器创建了一个集合。

你可以在 MongoDB 中创建一个单独的 document,包含了每台机器的数据;这个依赖于你的需求。因为我想每台机器有一个单独的页面,我用同样的方式拆分数据。如果你想把所有机器的图表渲染到一个页面中的话,你或许想让所有机器的数据在一个 document 中。

About the MongoDB Collection

我有一个三个成员的 MongoDB 副本,设置名为 rs1。保存数据的机器