尽管我向 Graphite 发送了数据,但所有数据点都显示“无”

尽管我向 Graphite 发送了数据,但所有数据点都显示“无”

我已经通过 Puppet 安装了 Graphite(https://forge.puppetlabs.com/dwerder/graphite) 使用 nginx 和 PostgresSQL。当我手动向其发送数据时,它会创建指标,但其所有数据点均为“无”(又称为空)。如果我运行 Graphite 附带的 example-client.py,也会发生这种情况。

echo "jakub.test 42 $(date +%s)" | nc 0.0.0.0 2003 # Carbon listens at 2003
# A minute or so later:
$ whisper-fetch.py --pretty /opt/graphite/storage/whisper/jakub/test.wsp | head -n1
Sun May  4 12:19:00 2014    None
$ whisper-fetch.py --pretty /opt/graphite/storage/whisper/jakub/test.wsp | tail -n1
Mon May  5 12:09:00 2014    None
$ whisper-fetch.py --pretty /opt/graphite/storage/whisper/jakub/test.wsp | grep -v None | wc -l
0

和:

$ python /opt/graphite/examples/example-client.py 
# Wait until it sends two batches of data ...
$ whisper-fetch.py /opt/graphite/storage/whisper/system/loadavg_15min.wsp | grep -v None | wc -l
0

根据 ngrep,这是 [来自后续尝试] 到达端口的数据(第 3 行):

####
T 127.0.0.1:34696 -> 127.0.0.1:2003 [AP]
  jakub.test  45 1399362193. 
####^Cexit
23 received, 0 dropped

这是相关部分/opt/graphite/conf/storage-schemas.conf

[default]
pattern = .*
retentions = 1s:30m,1m:1d,5m:2y

知道哪里出了问题吗?Carbon 自己的指标和数据显示在 UI 中。谢谢!

环境:Ubuntu 13.10 Saucy,graphite 0.9.12(通过 pip)。

附言:我在这里写下了我的故障排除尝试 -Graphite 显示指标但没有数据 – 故障排除

更新

  1. 即使保留策略指定了更高的精度(例如“1 秒”或“10 秒”),whisper 文件中的数据点也仅每 1 分钟记录一次。
  2. 忽略数据的解决方法:使用带有xFilesFactor = 0.1(而不是 0.5)的聚合模式,或者将最低精度设置为 1m 而不是 <1-49 之间的数字>s。 - 请参阅接受的答案或 Graphite Answers 问题下方的评论。根据文档:”xFilesFactor应为 0 到 1 之间的浮点数,指定前一个保留级别的槽位中有多少比例必须具有非空值才能聚合为非空值。默认值为 0.5。“因此,看起来,无论是否指定 1 秒的精度,数据都会聚合到 1 分钟并最终为 None,因为分钟周期内不到 50% 的值是非 None 的。

解决方案

所以@jlawrie 给我找到了解决方案。事实证明数据确实存在,但聚合后为空,原因有两个:

  1. UI 和 whisper-fetch 均显示数据汇总达到整个查询周期的最高精度,默认为 24​​ 小时。也就是说,除非您选择更短的时间段,否则保留时间小于 1 天的任何内容都不会显示在 UI 或提取中。由于我的 1 秒保留期为 30 分钟,因此我需要选择 <= 过去 30 分钟的时间段才能真正看到以最高精度收集的原始数据。
  2. 在聚合数据时(在我的例子中是从 1 秒到 1 分钟),Graphite 默认要求该时间段内 50%(xFilesFactor = 0.5)的数据点有值。如果没有,它将忽略现有值并将其聚合为 None。因此,在我的例子中,我需要在一分钟内至少发送 30 次数据(30 是 60 秒的 50% = 1 分钟),以便它们显示在聚合的 1 分钟值中。但我的应用程序每 10 秒只发送一次数据,所以我只有 60 个可能值中的 6 个。

=> 解决方案是将第一个精度从 1 秒更改为 10 秒,并记住在我想要查看原始数据时选择一个较短的周期(或将其保留时间延长至 24 小时以默认显示它)。

答案1

我在使用同一个 puppet 模块时遇到了同样的问题。我不太清楚为什么,但更改默认保留策略似乎可以解决这个问题,例如

class { 'graphite':
  gr_storage_schemas => [
    {
      name       => 'carbon',
      pattern    => '^carbon\.',
      retentions => '1m:90d'
    },
    {
      name       => 'default',
      pattern    => '.*',
      retentions => '1m:14d'
    }
  ],
}

答案2

Graphite 会以多种方式丢失数据,这就是我尽量避免使用它的原因。让我从一个简单的例子开始 - 尝试让您的应用程序连接,等待一秒钟(实际上是一秒钟),然后输出带时间戳的数据。我发现在很多情况下,这可以解决该问题。您应该尝试的另一件事是以比 graphite 记录数据的频率高得多的频率提交数据。我会更详细地讲解这一点。另一个常见的错误是使用 whisper-resize.py 实用程序,它对我来说真的不起作用。如果您的数据还不重要,只需删除 whisper 文件并使用新的保留设置创建它们。

Graphite 的存储文件 whisper 文件不是将数据存储为具有值和时间的点(就像您提供给程序的那样),而是将其存储为一系列用于存储值的插槽。然后,程序会尝试使用保留数据文件找出哪个插槽与时间段相对应。如果它获取的数据不完全适合插槽,则思考实际情况是,它使用平均值、最小值或最大值,具体取决于与保留文件位于同一目录中的另一个文件。我发现,防止一切混乱的最佳方法是以远高于 graphite 存储数据的频率提交数据。老实说,这变得非常复杂 - 不仅有 graphite 的保留期和填充点的平均算法(我认为),而且这些值也应用于 whisper 文件。当这些不匹配时,会发生非常奇怪的事情,因此在您的配置正常工作之前,我建议您反复删除 whisper 文件,然后让 graphite 重新创建它们。

这个程序确实给我的印象很深,因为它存在很多错误,所以如果你遇到类似的问题,不要认为这是你的错。

相关内容