即使我发送数据,石墨对所有数据点也显示“无”


8

我已经使用Nginx和PostgresSQL 通过Puppet(https://forge.puppetlabs.com/dwerder/graphite)安装了Graphite 。当我手动发送数据时,它将创建度量标准,但其所有数据点均为“无”(也称为null)。如果我运行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,石墨0.9.12(通过点子)。

PS:我在这里写了有关故障排除尝试的信息- 石墨显示度量标准但没有数据–故障排除

更新

  1. 即使保留策略指定了更高的精度(例如“ 1s”或“ 10s”),耳语文件中的数据点也仅每1m分钟更新一次。
  2. 数据被忽略的解决方法:要么使用带有xFilesFactor = 0.1(而不是0.5)的聚合模式,要么将最低精度设置为1m,而不是<1-49之间的数字>。-请参阅接受的答案或石墨答案的问题下方的注释。根据文档:“ xFilesFactor应该是0到1之间的浮点数,并指定以前的保留级别的时隙中必须有非零值的部分才能聚合为非零值。默认值为0.5。 ”因此,似乎无需考虑指定的1s精度,数据就汇总到1分钟,最终变为None,因为在分钟周期内少于50%的值是非None。

因此,@ jlawrie引导我找到解决方案。事实证明数据实际上在那里,但没有聚合,原因是双重的:

  1. UI和低语获取均显示数据聚合的精度,该精度跨越整个查询周期,默认为24h。也就是说,除非您选择较短的期限,否则任何保留时间<1d的内容都不会显示在用户界面或获取中。由于我的1s保留时间为30分钟,因此我需要选择<=最近30分钟的时间,才能真正看到以最高精度收集的原始数据。
  2. 汇总数据时(在我的情况下,从1s到1min),默认情况下Graphite要求该期间内50%(xFilesFactor = 0.5)的数据点具有值。如果不是,它将忽略现有值并将其聚合为“无”。因此,在我的情况下,我需要在一分钟内至少发送30次数据(30是60s的50%= 1min),以使它们显示在1min的合计值中。但是我的应用仅每10秒发送一次数据,因此我在60个值中只有6个。

=>解决方案是将第一精度从1s更改为10s,并记得在要查看原始数据时选择一个较短的时间段(或将其保留时间扩展到24h以默认显示它)。


Graphite Answers问题数据集是否填充了空值?在这种情况下非常有趣(提及默认情况下,每60秒添加一次null,仅持续24小时),并建议使用ngrep进行故障排除。
JakubHolý2014年


您检查日志了吗?如果接收到的度量存在问题(不使用\ n或使用\ r \ n代替),您应该在console.log或created.log中看到某些内容。如果您使用默认安装路径,则这些日志存储在/ opt / graphite / storage / log / carbon-cache / carbon-cache-a /中。
mattsn0w 2014年

是的,我已经检查了日志。没有什么有趣的。控制台日志实际上只有“ [..] ServerFactory从7002开始[..]从工厂<twisted.internet.protocol.ServerFactory实例在0x1bc4248>开始”,并且具有创建预期指标的记录,但未提及数据-f。例如 (用于另一个无数据量度)“ [..]创建数据库文件/opt/graphite/storage/whisper/ring/handling-time/POST/15MinuteRate.wsp(archive = [(1,1800),(60,1440) ),(300,210240)] xff = 0.5 agg = average)“
雅各布·霍利(JakubHolý

@JakubHolý您是否可以更新jlawrie的答案或发布其他答案,因为该问题现在包含答案
030

Answers:


8

我在使用相同的人偶模块时遇到了相同的问题。我不确定为什么,但是更改默认保留策略似乎可以解决该问题,例如

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

非常感谢!这一神秘的变化确实有所帮助。有趣的是,将保留时间从“ 1s:30m,1m:1d,5m:2y”更改为“ 1m:14d”确实可以“修复”它。我会尝试玩更多。1s粒度可能存在一些问题?
雅各布·霍尔(JakubHolý)2014年

s期间确实确实存在问题-尽管'1m:1d,5m:2y可以正常工作(对数据进行重新记录),10s:30m,1m:1d,5m:2y但可以。实际上,从.wsp文件看来,粒度<1m似乎被忽略了,因为10s:...配置的时间戳仍然间隔1分钟-“ 08:17:00、08:18:00等”。
JakubHolý2014年

好的,因此问题与聚合策略和有关xFilesFactor,此处适用的(默认值)为average和xFilesFactor=0.5(请参阅参考资料/opt/graphite/conf/storage-aggregation.conf)。当我更改为sum0.1通过更改名称时,数据将被存储(尽管点仍然在1m频率处):echo -e "jakub.test.10s30m+1m1d+5m2y.count 42 $(date +%s)" | nc 0.0.0.0 2003
JakubHolý2014年

我玩过diff。阿格雷格。模式,当我设置agg 时记录数据(以1m的间隔)xFilesFactor = 0.1。方法并不重要(至少所有平均,最后,总和)。
JakubHolý14年

根据,聚集模式只接触到多种保留策略游戏。如果我只有一个保留策略,即使分辨率为10秒(这是我发送数据的频率),它也会收集每个单独的数据点。有了多个保留策略,它会根据查询的时间范围选择一个,而whisper-fetch.py​​默认为最后一天,这就是我认为为什么每1分钟只看到一次数据点的原因。仍然不确定为什么它们将显示“无”,而不是汇总值。
jlawrie 2014年

1

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

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

该程序确实使我感到惊讶,因为它表现得很差劲,因此,如果您遇到类似问题,请不要以为这是您的错。


谢谢,我想我应该更多地考虑数据检索和聚合的工作方式,也许确实是问题的原因。但是,我认为“ 以比石墨存储数据的频率高得多的频率提交数据 ”是次优的解决方案,因为仅记录每个石墨周期中接收到的最后一个数据点,而其他人则忽略了-这就是为什么f.ex 。statsD冲洗周期必须=石墨周期
JakubHolý2014年

1
顺便说一句,石墨/碳的“松散”数据可能与碳设置有关,例如MAX_UPDATES_PER_SECOND = 500,MAX_CREATES_PER_MINUTE = 50(我想超过该限制的数据点/指标会被丢弃)。
JakubHolý14年

看来我错了,文档-如果我正确解释-表示设置超出了磁盘访问限制,但数据/指标仍保留在内存中(尽管我想先对此进行验证)。
雅各布·霍利(JakubHolý)2014年

其中有一些绝对可以解释该应用程序存在的一些问题。
一些Linux Nerd
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.