Python从小白到高手实现系列三百一十一:监控系统与应用指标
是用Python 编写的(https://github.com/agroszer/munin-node-python)。munin-node-c 是用C 编写的(https://github.com/munin-monitoring/munin-c),munin- nodepython。有一个munin-python 包(http://python-munin.readthedocs.org/en
对于监控性能而言,可供选择的工具数量可能非常多。如果你的期望很高,那么你可
能需要同时使用几种工具。
无论使用哪种技术栈,Munin(http://munin-monitoring.org)都是许多组织最常用的工
具之一。它是一个分析资源趋势的好工具,即使是没有额外配置的默认安装也提供了大量
有用的信息。它的安装包括两个主要组件。
● Munin 主机,从其他节点收集指标并提供指标图形。
● 在被监视主机上安装的Munin 节点,用于收集本地指标并将其发送到Munin 主机。
主机、节点和大多数插件都是用Perl 编写的。也有其他语言编写的节点实现:
munin-node-c 是用C 编写的(https://github.com/munin-monitoring/munin-c),munin- nodepython
是用Python 编写的(https://github.com/agroszer/munin-node-python)。Munin 的contrib 仓库提供了许多可用的插件。也就是说,它对大多数流行的数据库和系统服务都
提供了开箱即用的支持。甚至还有用于监控流行的Python Web 服务器(例如uWSGI 和
Gunicorn)的插件。
Munin 的主要缺点是它将图形作为静态图像,实际的绘图配置包含在特定的插件配置
中。这不利于创建灵活的监控仪表板,也不利于在同一个图形中对比不同来源的指标值。
但这是我们为它简单的安装和功能的多样所需要付出的代价。编写你自己的插件非常简单。
有一个munin-python 包(http://python-munin.readthedocs.org/en/latest/),可以帮助你用
Python 编写Munin 插件。
不幸的是,Munin 的架构假设在每台负责收集指标的主机上总是有一个独立的监控守护
进程,这可能并不是监控自定义应用的性能指标的最佳解决方案。编写自己的Munin 插件的
确非常简单,但前提是监控进程能够以某种方式报告其性能统计。如果你想要收集某个自定
义应用指标,那么可能需要将其聚集并保存在某个临时存储中,最终上报给一个自定义的
Munin 插件。这使得创建自定义指标变得更加复杂,因此你可能会考虑其他解决方案。
另一种常用的解决方案可以使收集自定义指标变得特别简单,它就是StatsD
(https://github.com/etsy/statsd)。它是一个用Node.js 编写的网络守护进程,可以监听各种统
计信息,例如计数器、计时器和计量器。由于基于UDP 的简单协议,它的集成非常简单。
使用名为statsd 的Python 包也可以很容易地向StatsD 守护进程发送指标,如下所示:
import statsd
c = statsd.StatsClient(‘localhost’, 8125)
c.incr(‘foo’) # 增加’foo’计数器。
c.timing(‘stats.timed’, 320) # 记录320ms 的’stats.timed’。
由于UDP 是无连接的(connectionless),它对应用代码的性能开销很低,所以它很适
合跟踪并测量应用代码内的自定义事件。
不幸的是,StatsD 只是指标收集守护进程,所以它不提供任何报告功能。你需要能够
处理来自StatsD 的数据的其他进程,以便查看实际的指标图形。最常见的选择是Graphite
(http://graphite.readthedocs.org)。它主要完成以下两件事情。
● 保存数值型的时间序列数据。
● 根据需要呈现这个数据的图形。
Graphite 让你能够保存高度可定制的图形预设。你还可以将许多图形分组到不同的主
题仪表板中。与Munin 类似,图形被渲染为静态图像,但也有JSON API 允许其他前端来
读取图形数据并用其他方式来渲染。与Graphite 集成的一个很棒的仪表板插件是Grafana
(http://grafana.org)。它很值得尝试一下,因为它比普通的Graphite 仪表板具有更好的可用
性。Grafana 提供的图形是完全交互式的,也更易于管理。
不幸的是,Graphite 是一个有点复杂的项目。它不是整体的服务,而是由下列3 个单
独的组件组成。
● Carbon:使用Twisted 编写的守护进程,用于监听时间序列数据。
● whisper:简单的数据库,用于保存时间序列数据。
● graphite webapp:Django web 应用,根据需求将图形渲染为静态图像(使用Cairo
库)或JSON 数据。
在与StatsD 项目一起使用时,statsd 守护进程将其数据发送给carbon 守护进程。
这使得完整的解决方案变成各种应用的复杂堆积,其中每个应用都使用完全不同的技术来
编写。此外,没有可用的预配置图形、插件和仪表板,因此你需要自己配置一切。这在开
始时包括很多工作,很容易遗漏一些重要的事情。因此,即使你决定用Graphite 作为核心
监控服务,使用Munin 作为监控备用可能也是个好主意。
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)