如何在Ubuntu14.04上配置StatsD以收集Graphite的任意统计信息

来自菜鸟教程
跳转至:导航、​搜索

介绍

Graphite 是一个图形库,可让您以灵活而强大的方式可视化不同类型的数据。 它绘制由其他统计数据收集应用程序发送给它的数据。

在之前的指南中,我们讨论了 如何安装和配置 Graphite 本身如何安装和配置 collectd 以编译系统和服务统计信息。

在本指南中,我们将讨论如何安装和配置 StatsD。 StatsD 是一个轻量级的统计数据收集守护进程,可用于收集任意统计数据。

StatsD 与 Graphite 配置的写入间隔同步将统计信息刷新到 Graphite。 为此,它聚合刷新间隔之间的所有数据,并为每个统计数据创建单点以发送到 Graphite。

通过这种方式,StatsD 允许应用程序绕过发送 Graphite 统计信息的有效速率限制。 它有许多用不同编程语言编写的库,这使得在应用程序中构建统计跟踪变得微不足道。

在本指南中,我们将安装和配置 StatsD。 我们将假设您已按照之前指南中的安装说明进行操作,并且您已在 Ubuntu 14.04 服务器上配置了 Graphite 和 collectd。

安装 StatsD

StatsD 程序在 Ubuntu 默认存储库中不可用。 但是,它可以在 GitHub 上获得,并且具有将其编译成 Ubuntu 包所需的配置文件。

获取组件

在我们安装实际程序之前,我们需要从存储库中获取一些包。 我们需要 git 以便我们可以克隆存储库。 我们还需要 node.js,因为 StatsD 是一个节点应用程序。

我们还需要一些允许我们构建 Ubuntu 包的包。 让我们现在得到所有这些:

sudo apt-get install git nodejs devscripts debhelper

我们将在我们的主目录中创建包。 更具体地说,我们将在我们的主目录中创建一个名为“build”的目录来完成这个过程。

现在创建目录:

mkdir ~/build

现在,我们将 StatsD 项目克隆到该目录中。 进入目录,然后发出克隆命令:

cd ~/build
git clone https://github.com/etsy/statsd.git

构建和安装包

进入包含我们的 StatsD 文件的新目录:

cd statsd

现在,我们可以通过简单地发出以下命令来创建 StatsD 包:

dpkg-buildpackage

将在 ~/build 目录中创建一个 .deb 文件。 让我们回到那个目录。

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

它应该如下所示:

 { 石墨端口:2003 ,石墨主机:“本地主机”,端口:8125 } 

我们只想调整此配置中的一个设置。 我们想关闭一种叫做遗留命名空间的东西。

StatsD 使用它以不同的方式组织其数据。 然而,在最近的版本中,它已标准化为更直观的结构。 我们想使用新格式。

为此,我们需要添加以下行:

{石墨端口:2003,石墨主机:“localhost”,端口:8125 ,石墨:{ legacyNamespace:假} }

这将让我们使用更合理的命名约定。 完成后保存并关闭文件。

为 StatsD 创建存储架构

接下来,我们需要定义更多的存储模式。

打开存储模式文件:

sudo nano /etc/carbon/storage-schemas.conf

我们将使用我们为 collectd 定义的完全相同的保留策略。 唯一的区别是名称和匹配模式。

StatsD 将其所有数据发送到带有 stats 前缀的 Graphite,因此我们可以匹配该模式。 记得把这个 放在 的默认存储规范之上:

[statsd]
pattern = ^stats.*
retentions = 10s:1d,1m:7d,10m:1y

完成后保存并关闭文件。

创建数据聚合配置

让我们设置一些聚合规范。 StatsD 以非常具体的方式发送数据,因此我们可以通过匹配正确的模式轻松确保我们正确地聚合数据。

在编辑器中打开文件:

sudo nano /etc/carbon/storage-aggregation.conf

我们需要以灵活的方式配置我们的聚合来准确地转换我们的值。 我们将从 StatsD 项目 中获取一些关于如何最好地聚合数据的线索。

现在,聚合看起来像这样:

[min] 模式 = .min$ xFilesFactor = 0.1 aggregationMethod = min
[最大值] 模式 = .max$ xFilesFactor = 0.1 聚合方法 = 最大值
[sum] 模式 = .count$ xFilesFactor = 0 aggregationMethod = sum
[default_average] 模式 = .* xFilesFactor = 0.5 聚合方法 = 平均值

我们希望匹配以 .sum.count 结尾的指标,并添加这些值以聚合它们。 我们已经定义了其中一个(带有 sum 部分),但它的标签有点错误,所以我们将对其进行调整。

我们还想分别取以 .lower.upper 结尾的指标的最小值和最大值。 这些指标名称后面也可能有数字,因为它们可用于指示某个百分比的上限值(例如 upper_90)。

最后,我们要配置我们的仪表,它们基本上只是测量某物的当前值(如速度计)。 我们希望将这些设置为始终发送我们给它的最后一个值。 在这种情况下,我们不想使用平均值或任何其他计算值。

最后,该文件应如下所示:

[min] 模式 = .min$ xFilesFactor = 0.1 aggregationMethod = min
[最大值] 模式 = .max$ xFilesFactor = 0.1 聚合方法 = 最大值
[计数]模式 = .count$ xFilesFactor = 0 聚合方法 = 总和
[lower]模式 = .lower(_\d+)?$ xFilesFactor = 0.1 aggregationMethod = min
[上]模式 = .upper(_\d+)?$ xFilesFactor = 0.1聚合方法 = 最大值
[sum]模式 = .sum$ xFilesFactor = 0 aggregationMethod = sum
[量规]模式 = ^。  . 仪表…  xFilesFactor = 0聚合方法 = 最后
[default_average] 模式 = .* xFilesFactor = 0.5 聚合方法 = 平均值

完成后保存并关闭它。

启动服务

现在您已经配置了所有内容,我们可以进行一些服务管理。

首先,您将要重新启动 Carbon 以获取您刚刚设置的新设置。 最好完全停止服务,等待几秒钟然后启动它,而不是仅仅使用“重启”命令:

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 数据指标剖析

StatsD 服务使用 TCP 连接连接到 Graphite 服务。 这允许可靠的信息传输。

但是,StatsD 本身会侦听 UDP 数据包。 它收集一段时间内发送给它的所有数据包(默认为 10 秒)。 然后它聚合它收到的数据包并将每个指标的单个值刷新到 Carbon。

重要的是要意识到 10 秒刷新间隔正是我们在存储模式中配置的最短存储间隔。 这两个配置值必须匹配,因为它允许 StatsD 绕过 Carbon 限制,即每个间隔只接受一个值。

由于这些程序之间的差异,我们将数据发送到 StatsD 的方式与直接发送到 Graphite 的方式略有不同。 如果你还记得,我们通过指定度量名称、值和时间戳来向 Graphite 发送数据,如下所示:

 echo " metric_name metric_valuedate +%s  | 数控-q0 127.0.0.1 2003

这有一些优点,比如允许您设置接收数据的时间戳,这可以让您追溯添加数据。 对于发送到 StatsD 的数据,我们放弃使用时间戳,而是将其替换为数据 类型

语法如下所示:

回显“度量名称:度量值| 类型规格” | 数控-u-w0 127.0.0.1 8125

这将向 StatsD 正在侦听的端口发送一个 UDP 数据包。

请记住,就像直接向 Graphite 发送统计信息一样,这仍然不是通常发送统计信息的方式。 nc 方法仅用于演示目的。

有许多很棒的 StatsD 客户端库,可以轻松地使用任何有意义的编程逻辑从您正在创建的应用程序发送统计数据。 我们将立即演示这一点。

指标名称和值很容易解释。 让我们回顾一下可能的指标类型以及它们对 StatsD 的意义:

  • c:这表示“计数”。 基本上,它会将 StatsD 在刷新间隔内收到的所有指标值相加,然后发送总值。 这类似于 Carbon 使用的“sum”聚合方法,这就是为什么我们告诉 Carbon 在存储这种度量的较长间隔时使用该聚合方法的原因。
  • g:表示量规。 仪表告诉某物的当前值,类似于速度表或燃油表。 在这些情况下,我们只对最近的值感兴趣。 StatsD 将继续向 Carbon 发送相同的值,直到收到不同的值。 Carbon 使用“最后”方法聚合这些数据以保持信息的含义。
  • s:此标记表示传递的值是一个数学集。 数学中的集合包含唯一值。 所以我们可以在 StatsD 中抛出一堆这种类型的值,它会计算它接收到唯一值的次数。 这对于计算唯一用户数量等任务可能很有用(假设您有一个与这些相关的唯一 id 属性)。
  • ms:表示该值为时间跨度。 StatsD 采用时间值,实际上根据数据创建了很多不同的信息。 它传递有关平均值、百分位数、标准差、总和等的碳信息。 这些中的每一个都必须由 Carbon 正确聚合,这就是我们添加很多聚合方法的原因。

如您所见,StatsD 做了很多工作来使我们的指标更易于消化。 它以对大多数应用程序有意义的方式讨论统计数据,只要您告诉它数据代表什么,它就会在将数据转换为正确格式方面做很多繁重的工作。

探索不同的数据类型

仪表

让我们向 StatsD 发送一些数据来尝试一下。 最简单的一种是量规。 这会将当前状态设置为一个指标,因此它只会传入它收到的最后一个值:

echo "sample.gauge:14|g" | nc -u -w0 127.0.0.1 8125

现在,如果十秒后(StatsD 的刷新率)我们刷新 Graphite 界面,我们应该会看到新的 stat(它将位于 stats > gauges > [X165X ] 等级制度)。

注意这次线路是如何不间断的。 我们可以刷新图表,每个间隔都会有一个值。 以前,由于在一段时间内未收到某些指标的值,Graphite 的数据会出现缺口。 使用仪表,StatsD 每次刷新时都会发送最后一个可用值。 它假设您只会告诉它该值何时应该更改。

要查看更改,让我们为仪表发送另外几个值:

echo "sample.gauge:10|g" | nc -u -w0 127.0.0.1 8125

现在等待至少十秒钟,以便 StatsD 发送该值,然后发送:

echo "sample.gauge:18|g" | nc -u -w0 127.0.0.1 8125

您将看到一个看起来与此有些相似的图表(我们正在查看 8 分钟的时间范围):

如您所见,这与 Graphite 已经运行的方式非常相似,因为它每十秒间隔只记录一个值。 不同之处在于 StatsD 确保每个间隔使用最后一个已知值。

计数

让我们通过配置一个计数指标来对比一下。

StatsD 将收集它在其 10 秒刷新间隔期间接收到的所有数据,并将它们加在一起以发送该时间范围内的单个值。 这更接近地复制了我们想要为大多数指标记录的数据。

例如,我们可以连续多次向 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 指标将该数字除以 10 以得出每秒出现的次数。 这两个看起来像这样:

如您所见,与仪表指标不同,计数指标不会在刷新之间保持其值。 这就是度量的含义。 如果您计算用户点击按钮的次数,仅仅因为他在 10 秒内点击了两次,并不意味着接下来的 10 秒该数字也将是两次。

让我们现在尝试一组。

请记住,集合记录了传递给度量的唯一值的数量。 所以我们可以发送 5 条记录,但是如果其中 4 条具有相同的值,那么记录的数量将是 2,因为这是唯一值的数量:

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 来收集有关您自己的开发项目的任意数据。

通过学习利用这些工具,您可以开始制作复杂而可靠的统计跟踪,帮助您对环境的每个部分做出明智的决策。 制定数据驱动决策的优势是巨大的,因此尽早开始将指标收集集成到您的基础架构中。

贾斯汀·艾林伍德