web-dev-qa-db-ja.com

データを送信しても、グラファイトですべてのデータポイントに「なし」と表示される

Puppet( https://forge.puppetlabs.com/dwerder/graphite )を介してnginxとPostgresSQLで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(pip経由)。

PS:私はここに私のトラブルシューティングの試みについて書いています- Graphiteはメトリックを示しますがデータはありません–トラブルシューティング

[〜#〜]更新[〜#〜]

  1. ウィスパーファイルのデータポイントは、保持ポリシーで「1s」や「10s」などのより高い精度が指定されている場合でも、1分ごとにのみ再コアされます。
  2. 無視されるデータの回避策:集約スキーマをxFilesFactor = 0.1(0.5ではなく)で使用するか、最低精度を<1〜49の数値>ではなく1mに設定します。 -承認された回答またはグラファイト回答の質問の下のコメントを参照してください。 ドキュメントによると : "xFilesFactorは0と1の間の浮動小数点数でなければならず、以前の保持レベルのスロットの何分の1でなければならないかを指定します非null値に集約するための-null値。デフォルトは0.5です。 "したがって、指定された精度1に関係なく、データは1分に集約され、最終的にNoneになります。分の期間の値の50%未満が「なし」ではないためです。

[〜#〜]ソリューション[〜#〜]

@jlawrieが私を解決に導きます。データは実際にはそこにありますが、何も集約されていません。理由は二重です。

  1. UIとウィスパーフェッチの両方で、データが集計され、クエリ期間全体にわたる最高の精度で表示されます。デフォルトは24時間です。つまり保持期間が1日未満の場合は、短い期間を選択しない限り、UIまたはフェッチに表示されません。 1秒間の保存期間は30分だったので、収集されている最高の精度で生データを実際に表示するには、過去30分以下の期間を選択する必要があります。
  2. データ(私の場合は1秒から1分)を集計する場合、Graphiteはデフォルトで期間内のデータポイントの50%(xFilesFactor = 0.5)に値があることを要求します。そうでない場合は、既存の値を無視して、Noneに集計します。したがって、私の場合は、1分以内にデータを少なくとも30回送信する必要があります(30は60秒の50%= 1分)。1分に集約された値で表示されるためです。しかし、私のアプリは10秒ごとにデータを送信するだけなので、60の値のうち6つしかありません。

=>解決策は、最初の精度を1秒から10秒に変更し、生データを表示するときはより短い期間を選択することを忘れないでください(またはデフォルトで24時間に保持を延長して表示します)。

8
Jakub Holý

同じパペットモジュールを使用して同じ問題が発生しました。理由は正確にはわかりませんが、デフォルトの保持ポリシーを変更すると修正されるようです。

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

Graphiteがデータを失う方法は数多くあります。そのため、私は実際にデータを使用しないようにしています。簡単なものから始めましょう。アプリケーションを接続して、1秒(文字どおり1秒)待ってから、タイムスタンプ付きのデータを出力します。私は多くの状況でこれがその正確な問題を修正することを発見しました。あなたが試すべきもう一つのことは、グラファイトがデータを記録する頻度よりもはるかに高い頻度でデータを提出することです。もう少し詳しく説明します。もう1つのよくある間違いは、whisper-resize.pyユーティリティの使用ですが、これは実際には機能しませんでした。データがまだ重要ではない場合は、ウィスパーファイルを削除して、新しい保持設定で作成できるようにします。

グラファイトのストレージファイルであるウィスパーファイルは、値と時間を含むポイントとしてデータを格納するのではなく(プログラムを提供したように)、実際には、値が格納される一連のスロットを持つものとしてデータを格納します。プログラムは、保持データファイルを使用して、どのスロットが期間に対応するかを把握します。スロットに正確に収まらないデータを取得した場合、i think保持ファイルと同じディレクトリにある別のファイルに応じて、平均、最小、または最大が使用されます。すべてを台無しにしないようにするための最良の方法は、グラファイトがデータを格納していた頻度よりもはるかに高い頻度でデータを送信することであることがわかりました。正直に言うと、非常に複雑になります。グラファイトの保持期間や、ポイントを埋める平均化アルゴリズムがあるだけでなく(これらは私が思うに)、これらの値はウィスパーファイルにも適用されます。これらが一致しない場合、非常に奇妙なことが起こります。構成が機能するまで、ウィスパーファイルを繰り返し削除し、グラファイトに再作成することをお勧めします。

このプログラムは、かなりバグのある行動をしているように感じました。このような問題が発生した場合は、それが自分の責任だとは思わないでください。

1
Some Linux Nerd