StatsD 是由 Etsy 开发并发布的汇总和总结应用指标的一个简单的守护进程,近些年来发展迅速,已经变成了一个用于收集应用性能指标的统一的协议。
关于 Statsd 的使用已经有很多文章介绍过,所以本文也不再赘述,本文主要来聊一聊它的来源原理以及和它类似的一个工具 Collectd 。
Etsy 使用 Statsd 监控系统应用
Etsy 工程师曾写 blog 介绍自己怎样使用 statsd 以及为什么使用它,有时间可以看一看这篇文章 Measure Anything, Measure Everything 。
Statsd 最初是由 Etsy 的 Erik Kastner 编写配合 Graphite/Carbon 使用的前端进程,最初是为了汇总和总结应用指标。开始使用的语言是 Node,后来其他语言也开发了此功能。它收集数据时基于2大功能:Counting & Timing。应用程序的指标通过特定语言的客户端库进行检测,然后这些库用很简单的协议和 Statsd 后台守护进程进行通信,后台进程汇集指标并把他们传递到绘图软件或监控后台。
Statsd 如和工作
首先,你可以通过 Statsd 收集任何你想要的数据,例如 Gauges , Counters , Timing 和 Sets ,Statsd 客户端库通过发送 UDP 数据包来调用每个 Statsd 服务器,使用 UPD 发送数据到 Stated 服务器的原因很明显,快,UDP是断开连接的协议,数据包不需要确认就发送到收件人,不会像通过 TCP 或提交数据时由于 HTTP 协议而阻断。在调用时,Statsd 客户端库没有任何缓冲的数据,这样两者之间调用就很简单,如果有大数据量的操作时,可以选择在数据发送到 Statsd 时加入样本数据,即发送一定比例的数据。
Statsd 后台守护进程会监听所有应用库的 UDP 流量,通过时间流收集数据并在后台所需时间间隔内更新数据。例如聚合功能调用计时器可以每10秒收集一次数据,分析出这些数据的最大值,最小值,平均值,中间值,90值和95值,Statsd 后台守护进程和后端将根据所用的后端改变协议。监控后端把收集到的指标转化成图表,例如最常用的 Graphite,这个数据处理工具处理收集到的指标,作出突出偏离常态的曲线图,下图为 Graphite 处理前后的图表。
Etsy 已开源 Statsd ,以下是基于基本线路协议发送的指标格式:
<metricname>:<value>|<type>
如果你在本地运行 StatsD 和默认的 UDP 服务器,可在命令行发送最简单的指标格式:
echo "foo:1|c" | nc -u -w0 127.0.0.1 8125
现在 Statsd 已经发展的很壮大,总结有以下几个原因:
-
简单:非常容易获取应用程序,StatsD 协议是基于文本的,可以直接写入和读取
-
低耦合性:基于后台程序运行的应用程序,采取 UDP 这种发送后完了的协议,收集指标和应用程序本身之间没有依赖
-
占用空间小:StatsD 客户端非常轻便的,不带任何状态,不需要的线程,且添加可以忽略不计
-
普遍及支持多种语言: 有基于 Ruby,Python,Java,erlang,Node,Scala,Go,haskell 等几乎所有语言的客户端
-
开源且商用
Collectd
Collectd 其实是 C 语言开发的一个守护(daemon)进程,像 Statsd 一样它也做周期性收集统计数据,此外它还管数据存储,给各种存储方式提供不同的存储机制,具体可以参考 Collectd 的官网 。
Collectd 不仅仅是收集性能数据,还根据这些数据会周期性统计系统的相关信息,以这些统计信息为依准,检查当前服务器性能(如作为性能分析 performance analysis)和预测系统未来的 load(如能力部署 capacity planning),不过它本身并不能生成图形,虽然它能写 RRD 文件,但是它不能从这些文件生成图形,所以一般需要结合一个数据绘图工具 Graphite/Cacti 。像 VPSee 就是选用 Collectd 收集机器的各个性能参数。
相较于其他收集系统相关指标的工具,Collectd 有一定的优点,比如嵌入式系统,C 语言开发(高效)、无需系统 cron 支持(独立)、简单易用,此外他还包含有超过70多种插件以及文档支持。
Collectd 除了解析 configfile 其他一切都是在插件下完成,这意味着主守护进程没有任何外部依赖,现在已知的可以应用在 Linux,Solaris,Mac OS X上,AIX,FreeBSD,NetBSD 和 OpenBSD 等系统中。
Collectd 配置简单:除了那些需要加载的模块,你不需要配置其他任何东西。
Collectd 不是脚本,而是运行在内存里面的进程,不需要每次记录都启动繁重的解释器,有 nice 级别的 10 秒钟的默认解析。
Collectd 能够处理任意数量的主机,从一个到几千个,而且可以通过利用该资源尽可能高效。
Collectd 支持 SNMP,该 SNMP 插件提供了一个通用接口 SNM 协议,可以用它来查询值,并基于 Collectd 机制处理他们,例如发送他们做其他地方的服务器实例。
Collectd 支持各种自定义扩展,C-plugins,Perl-plugins,Java-plugins,Python-plugins,UNIX 域套接字,Java 的 MBean 的支持等。
接下来简单介绍一下安装方法,安装配置 Colloectd,首先要创建一个 collectd.d
目录便于存放稍后会遇到的插件配置文件 graphite.conf
,并在 collectd.conf
包含这个目录 ;
$ sudo apt-get install collectd
$ sudo mkdir /etc/collectd/collectd.d
$ sudo vi /etc/collectd/collectd.conf
...
Include "/etc/collectd/collectd.d"
安装 git 并下载 collectd-carbon 插件:
$ sudo apt-get install git
$ sudo git clone https://github.com/indygreg/collectd-carbon.git /opt/collectd-plugins
修改插件的配置文件的 ModulePath 部分,指向 carbon_writer.py
文件所在目录,并且修改 LineReceiverHost 部分:
$ sudo vi /etc/collectd/collectd.d/graphite.conf
<LoadPlugin "python">
Globals true
</LoadPlugin>
<Plugin "python">
# carbon_writer.py is at path /opt/collectd-plugins/carbon_writer.py
ModulePath "/opt/collectd-plugins/"
Import "carbon_writer"
<Module "carbon_writer">
LineReceiverHost "monitor.vpsee.com"
LineReceiverPort 2003
DifferentiateCountersOverTime true
LowercaseMetricNames true
TypesDB "/usr/share/collectd/types.db"
</Module>
</Plugin>
修改好配置文件后重启服务:
$ sudo /etc/init.d/collectd restart
好了,被监控的服务器已经安装好了 Collectd ,要想真正使用此外还需要安装绘图工具,具体怎么安装我也不详细介绍了,毕竟重点不是那个,以下是 Graphite 的相关链接:Graphite 和 Graphite Project,希望对你有所帮助。
Cloud Insight 集监控、管理、计算、协作、可视化于一身,帮助所有 IT 公司,减少在系统监控上的人力和时间成本投入,让运维工作更加高效、简单。想阅读更多技术文章,请访问 OneAPM 官方技术博客。
本文转自 OneAPM 官方技术博客