介绍
Graphite是一个图形库,允许您以灵活和强大的方式可视化不同类型的数据。 它图形化由其他统计收集应用程序发送到它的数据。
在以前的导游,我们讨论了如何安装和配置Graphite本身以及如何安装和配置collectd编译系统和服务的统计数据。
在本指南中,我们将讨论如何安装和配置StatsD。 StatsD是一个轻量级统计收集守护进程,可用于收集任意统计信息。
StatsD将统计数据刷新到Graphite与Graphite配置的写间隔同步。 为此,它会在冲洗间隔之间聚合所有数据,并为每个统计数据创建单个点以发送给Graphite。
这样,StatsD允许应用程序围绕发送Graphite统计信息的有效速率限制工作。 它有许多用不同的编程语言编写的库,使得它们在您的应用程序中构建统计跟踪非常简单。
在本指南中,我们将安装和配置StatsD。 我们假设您已经遵循了以前的指南中的安装说明,并且您的Ubuntu 14.04服务器上配置了Graphite和collectd。
安装统计数据
StatsD程序在Ubuntu默认存储库中不可用。 但是,它在GitHub上可用,并具有将其编译为Ubuntu软件包所需的配置文件。
获取组件
在我们安装实际的程序之前,我们需要从存储库中获取一些包。 我们需要git
,使我们可以克隆库。 我们还需要node.js,因为StatsD是一个节点应用程序。
我们还需要一些包,这将允许我们构建一个Ubuntu包。 让我们现在得到所有的:
sudo apt-get install git nodejs devscripts debhelper
我们将在我们的主目录中创建包。 更具体地说,我们将在我们的主目录中创建一个名为“build”的目录来完成这个过程。
现在创建目录:
mkdir ~/build
现在,我们将把StatsD项目克隆到该目录中。 移动到目录,然后发出clone命令:
cd ~/build
git clone https://github.com/etsy/statsd.git
构建并安装软件包
移动到包含我们的StatsD文件的新目录:
cd statsd
现在,我们可以通过发出以下命令创建StatsD包:
dpkg-buildpackage
一个.deb
文件将在创建~/build
目录。 让我们回到那个目录。
cd ..
在我们安装包之前,我们要停止我们的Carbon服务。 这样做的原因是,StatsD服务将在安装时立即开始发送信息,并且尚未正确配置。
发出以下命令立即停止Carbon服务:
sudo service carbon-cache stop
然后我们可以将软件包安装到我们的系统中:
sudo dpkg -i statsd*.deb
正如我们之前所说,Statsd进程自动启动。 让我们暂停一下,重新启动我们的 Carbon服务。 这将允许我们配置StatsD,同时仍然为我们的其他服务留下 Carbon:
sudo service statsd stop
sudo service carbon-cache start
StatsD服务现在安装在我们的服务器上! 但是,我们仍然需要配置所有组件以便一起正常工作。
配置StatsD
我们应该做的第一件事是修改StatsD配置文件。
使用文本编辑器打开文件:
sudo nano /etc/statsd/localConfig.js
它应该看起来像这样:
{ graphitePort: 2003 , graphiteHost: "localhost" , port: 8125 }
我们只想在此配置中调整一个设置。 我们想关闭一些名为legacy的命名空间。
StatsD使用它以不同的方式组织其数据。 然而,在更近的版本中,它已经标准化了更直观的结构。 我们想使用新的格式。
为此,我们需要添加以下行:
{ graphitePort: 2003 , graphiteHost: "localhost" , port: 8125 , graphite: { legacyNamespace: false } }
这将让我们使用更明智的命名约定。 保存并在完成后关闭文件。
为StatsD创建存储架构
接下来,我们需要定义一些更多的存储模式。
打开存储模式文件:
sudo nano /etc/carbon/storage-schemas.conf
我们将使用与为collectd定义的保留策略完全相同的保留策略。 唯一的区别是名称和匹配模式。
StatsD将其所有数据与Graphite的stats
的前缀,因此我们可以匹配该模式。 记得把这个默认的存储规格上面 :
[statsd]
pattern = ^stats.*
retentions = 10s:1d,1m:7d,10m:1y
保存并在完成后关闭文件。
创建数据聚合配置
让我们设置一些聚合规范。 StatsD以非常具体的方式发送数据,因此我们可以轻松地确保我们通过匹配正确的模式正确地聚合数据。
在编辑器中打开文件:
sudo nano /etc/carbon/storage-aggregation.conf
我们需要以灵活的方式配置我们的聚合,以准确地转换我们的值。 我们将采取一些线索从StatsD项目就如何最好地汇总数据。
现在,聚合看起来像这样:
[min] pattern = \.min$ xFilesFactor = 0.1 aggregationMethod = min [max] pattern = \.max$ xFilesFactor = 0.1 aggregationMethod = max [sum] pattern = \.count$ xFilesFactor = 0 aggregationMethod = sum [default_average] pattern = .* xFilesFactor = 0.5 aggregationMethod = average
我们希望,匹配以最终衡量标准.sum
或.count
,并添加值聚集他们。 我们已经有了这些定义(有一sum
一节),但它是一个有点贴错标签,所以我们调整了。
我们也想借此在结束度量最小值和最大值.lower
和.upper
分别。 后他们这些指标名称可能具有号码,以及因为它们可以被用来指示某一百分比(的上限值upper_90
例如)。
最后,我们想要配置我们的仪表,它基本上只是测量某事物(如速度计)的当前值。 我们想设置它们总是发送我们给出的最后一个值。 在这种情况下,我们不想使用平均值或任何其他计算值。
最后,文件应该看起来像这样:
[min] pattern = \.min$ xFilesFactor = 0.1 aggregationMethod = min [max] pattern = \.max$ xFilesFactor = 0.1 aggregationMethod = max [count] pattern = \.count$ xFilesFactor = 0 aggregationMethod = sum [lower] pattern = \.lower(_\d+)?$ xFilesFactor = 0.1 aggregationMethod = min [upper] pattern = \.upper(_\d+)?$ xFilesFactor = 0.1 aggregationMethod = max [sum] pattern = \.sum$ xFilesFactor = 0 aggregationMethod = sum [gauges] pattern = ^.*\.gauges\..* xFilesFactor = 0 aggregationMethod = last [default_average] pattern = .* xFilesFactor = 0.5 aggregationMethod = average
保存并在完成后关闭它。
启动服务
现在你已经配置了一切,我们可以做一些服务管理。
首先,你将要重新启动Carbon来获取刚刚设置的新设置。 最好完全停止服务,等待几秒钟,然后启动它,而不仅仅是使用“restart”命令:
sudo service carbon-cache stop ## wait a few seconds here
sudo service carbon-cache start
现在,您还可以启动StatsD服务,这将连接到Carbon:
sudo service statsd start
就像Carbon本身一样,StatsD也报告自己的统计数据。 这意味着如果您再次在浏览器中访问Graphite页面,您可以立即看到一些新信息。 如果您已经运行该页面,请刷新页面:
http://domain_name_or_ip
正如你所看到的,我们有很多不同的信息,所有这些都与StatsD本身有关:
让我们来了解一下如何提供StatsD数据以及如何与它进行交互。
数据度量的解剖
StatsD服务使用TCP连接连接到Graphite服务。 这允许信息的可靠传送。
但是,StatsD本身侦听UDP数据包。 它收集在一段时间(默认为10秒)发送到它的所有数据包。 然后它聚合接收到的数据包,并将每个度量的单个值刷新为Carbon。
重要的是要意识到,10秒刷新间隔正是我们在存储模式中配置为存储的最短间隔。 重要的是这两个配置值匹配,因为它是允许StatsD绕过每个间隔只接受一个值的Carbon限制。
由于这些程序之间的差异,我们发送数据到StatsD的方式稍微不同于我们直接发送到Graphite。 如果你记得,我们通过指定度量标准名称,值和时间戳,将数据发送到Graphite,如下所示:
echo "metric_name metric_value `date +%s` | nc -q0 127.0.0.1 2003
这有一些优点,例如允许您设置您接收的数据的时间戳,这可以让您追溯添加数据。 对于发送到StatsD数据,我们放弃使用时间戳,而是与数据类型替换它。
语法如下所示:
echo "metric_name:metric_value|type_specification" | nc -u -w0 127.0.0.1 8125
这将发送一个UDP数据包到StatsD正在侦听的端口。
请记住,就像直接将统计信息发送到Graphite,这仍然不是统计信息通常发送的方式。 该nc
方法只是为了演示的目的。
有许多伟大的StatsD客户端库,使得它很容易发送统计信息从您正在创建的应用程序使用任何编程逻辑有意义。 我们将暂时展示这一点。
度量标准名称和值是非常自明的。 让我们来看看可能的指标类型以及它们对StatsD的含义:
- C:这表明“计数”。 基本上,它将StatsD在冲洗间隔内的度量的所有值相加,并发送总值。 这类似于Carbon使用的“sum”聚合方法,这就是为什么我们告诉Carbon在存储这种度量的更长间隔时使用聚合方法的原因。
- G:这表示一个标尺。 测量仪告诉某物的当前值,类似于速度计或燃油表。 在这些情况下,我们只对最近的价值感兴趣。 StatsD将继续发送Carbon相同的值,直到它收到一个不同的值。 Carbon使用“last”方法聚合此数据以保持信息的含义。
- s:这组标记手段传递的值是一个数学集合。 数学中的集包含唯一值。 所以我们可以在StatsD中抛出一堆这种类型的值,它会计算它接收到唯一值的次数。 这对于计算唯一身份用户数量(假设您具有与其相关联的唯一ID属性)的任务很有用。
- MS:这表明该值的时间跨度。 StatsD采用定时值,并且实际上基于数据创建了相当多的不同信息片段。 它传递关于平均值,百分位数,标准差,总和等的 Carbon信息。这些必须由 Carbon正确地聚合,这就是为什么我们添加了很多聚合方法。
正如你所看到的,StatsD做了很多工作,使我们的度量更容易消化。 它以大多数应用程序有意义的方式描述统计信息,并且只要您告诉数据表示什么,它就可以在获取正确格式的数据方面做很多工作。
探索不同的数据类型
仪表
让我们向StatsD发送一些数据来尝试一下。 最简单的是量表。 这将设置当前状态为一个指标,因此它将只传递它接收的最后一个值:
echo "sample.gauge:14|g" | nc -u -w0 127.0.0.1 8125
现在,如果有十条秒(StatsD的刷新速度)后,我们刷新Graphite界面,我们应该看到新状态(这将是下stats
> gauges
> sample
层次)。
注意这一行是不间断的这一次。 我们可以刷新图表,并且每个间隔都有一个值。 以前,Graphite在其数据中会有一定的差距,因为在一段时间内没有接收到某些指标的值。 使用计量器,StatsD在每次刷新时发送最后一个可用值。 它假设你只是告诉它什么时候值应该改变。
为了看到变化,让我们为测量仪发送另外几个值:
echo "sample.gauge:10|g" | nc -u -w0 127.0.0.1 8125
现在至少等待10秒钟,以便StatsD发送该值,然后发送:
echo "sample.gauge:18|g" | nc -u -w0 127.0.0.1 8125
你会看到一个看起来有点类似于这个图表(我们在8分钟的时间框架):
如你所见,这与Graphite函数已经非常相似,因为它只每隔10秒钟记录一个值。 区别是StatsD确保每个间隔使用最后一个已知值。
计数
让我们通过配置一个计数度量来对比这一点。
StatsD将收集在其十秒刷新间隔期间接收的所有数据,并将它们添加在一起以发送该时间帧的单个值。 这更精确地复制了我们要为大多数指标记录的数据。
例如,我们可以连续多次将计数度量值发送到StatsD:
echo "sample.count:1|c" | nc -u -w0 127.0.0.1 8125
echo "sample.count:1|c" | nc -u -w0 127.0.0.1 8125
echo "sample.count:1|c" | nc -u -w0 127.0.0.1 8125
echo "sample.count:1|c" | nc -u -w0 127.0.0.1 8125
echo "sample.count:1|c" | nc -u -w0 127.0.0.1 8125
现在,假设这些都在相同的间隔内发送(某些值可能已经落在间隔分界的任一侧),我们应该在刷新接口时看到一个计数值。 确保调整界面以仅显示过去5至15分钟。
实际上创建了两个指标。 的count
度量告诉我们出现的次数提供了刷新时间间隔内,和rate
度量十个除以该号码以每秒出现的次数到达。 这两个看起来像这样:
正如你所看到的,与指标指标不同,计数指标不会在刷新之间保持其值。 这是度量的意思。 如果你计算一个用户点击一个按钮的次数,只是因为他在十秒钟内点击两次并不意味着下一个十秒的数字也将是两个。
集合
让我们现在尝试一下。
请记住,sets记录传递到某个指标的唯一值的数量。 所以我们可以发送它五个记录,但如果其中四个具有相同的值,则记录的数量将是两个,因为这是唯一值的数量:
echo "sample.set:50|s" | nc -u -w0 127.0.0.1 8125
echo "sample.set:50|s" | nc -u -w0 127.0.0.1 8125
echo "sample.set:50|s" | nc -u -w0 127.0.0.1 8125
echo "sample.set:50|s" | nc -u -w0 127.0.0.1 8125
echo "sample.set:11|s" | nc -u -w0 127.0.0.1 8125
在下面的图片中可以看到,我的值最初跨越了一个刷新间隔,因此只记录了一个数字。 我不得不再次尝试第二次获得序列:
正如你所看到的,我们传递的实际值是一组微不足道。 我们只关心通过了多少个唯一值。
计时器
计时器也许是最有趣的指标。
StatsD在计算定时器的数据最多。 它发送 Carbon许多不同的指标:
echo "sample.timer:512|ms" | nc -u -w0 127.0.0.1 8125
如果我们在几分钟内发送多个值,我们可以看到许多不同的信息,如平均执行时间,计数度量,上限和下限值等。
它可能看起来像这样:
这是一个伟大的指标,用于提供有关您正在创建的程序如何执行的信息。 它可以告诉你,你所做的改变是否会拖慢你的应用程序。
Feeding StatsD指标
现在,您已经了解了数据包的结构,让我们简要地看一个StatsD库,我们可以使用它在我们的程序中发送数据。 任何具有发送UDP数据包功能的语言都可以创建StatsD指标,但是库可以使这个特别简单。
因为Graphite使用Django,让我们留在那个环境中并检查一个Python库。
首先,安装pip
,一个Python包管理器:
sudo apt-get install python-pip
现在,我们可以告诉它来安装最新版本的的python-statsd
通过键入包:
sudo pip install python-statsd
这是一个非常简单的StatsD客户端。
启动Python交互式会话以加载库:
python
现在,我们可以通过键入以下内容导入库:
import statsd
从这里,用法真的很简单。 我们可以创建表示我们各种度量的对象,然后根据需要调整它们。
例如,我们可以创建一个量规对象,然后通过键入以下内容将其设置为15:
gauge = statsd.Gauge('Python_metric')
gauge.send('some_value', 15)
然后我们可以使用gauge.send
送我们想要的任何值StatsD。 库具有与其他度量标准类型类似的功能。 您可以通过了解他们在看项目的页面 。
你应该有一个很好的想法如何构建跟踪到你的应用程序。 将任意指标发送到StatsD进行跟踪和分析的能力使得跟踪统计信息变得如此容易,因此没有理由不收集数据。
结论
此时,您应该已经安装并配置了Graphite。 通过运行本教程和最后一个教程,您还配置了collectd来收集有关系统性能的指标,StatsD还收集有关您自己的开发项目的任意数据。
通过学习利用这些工具,您可以开始制作复杂和可靠的统计信息跟踪,可以帮助您对环境的每个部分做出明智的决策。 做出数据驱动决策的优势是巨大的,因此开始将度量收集集成到您的基础架构中更快,而不是更晚。