Prometheusデータベースの欠落データをトラブルシューティングするにはどうすればよいですか?


13

実行中のインフラストラクチャに関する詳細なメトリックを収集するために、Prometheusを監視ワークフローに徐々に統合しています。

この間、プロメテウスがデータをプルするはずのエクスポーターが応答しなくなるという奇妙な問題に遭遇することがよくあります。ネットワークの設定ミスが原因である可能性があります-アクセスできなくなっているか、エクスポーターがクラッシュしたためです。

理由が何であれ、Prometheusに表示されると予想されるデータの一部が欠落しており、特定の期間にわたってシリーズに何もないことがわかりました。1つのエクスポーターが失敗(タイミングアウト?)すると、他のエクスポーターが失敗することもあります(最初のタイムアウトがジョブ全体をトップレベルタイムアウトより上に押し上げましたか?ただ推測しています)。

データのギャップ

上記の視覚化で示されているように、私が見るのはシリーズのギャップです。これが発生した場合、ログには何もありません。プロメテウスの自己計量もかなり不毛のようです。プロメテウスがやっていることを手作業で再現し、どこで壊れているのかを手作業で再現しようとする必要がありました。これは面倒です。もっと良い方法があるはずです!リアルタイムアラートは必要ありませんが、少なくとも、エクスポーターがデータを配信できなかったことを確認できるようにしたいと考えています。ブール値の「データを確認してください」というフラグでさえも始まりです。

輸出業者からデータを取得できなかったプロメテウスに関する意味のある情報を取得するにはどうすればよいですか?Prometheusデータ収集の手動シミュレーションを実行せずにギャップが存在する理由を理解するにはどうすればよいですか?この点に関して、おそらくプロメテウスを超えてデータ収集全般の監視に拡張された場合でも、賢明な慣行は何ですか?


問題に関連するログエントリまたは警告/エラーがありますか?
ケノーブ

何もありませんが、データシリーズにギャップがあります。Prometheusの出力には、保留中の変更を数分ごとに保存することに関する通常の通常の行が含まれています(隠しログをいくつか見逃さない限り)。
サンダー

私たちもこの問題に直面しています。@サンダーは原因を見つけることができましたか?
ディーパックN

@DeepakNいいえ、残念ながらここに追加する有益な洞察はありません。Prometheusを使用する場合の問題は残ります。
サンダー

回答:


5

私はあなたがrate次のようなものでメトリックに関する何らかのアラートを行うことができると思います:

ALERT DropInMetricsFromExporter
  IF rate(<metric_name>[1m]) == 0
  FOR 3m
  ANNOTATIONS {
    summary = "Rate of metrics is 0 {{ $labels.<your_label> }}",
    description = "Rate of metric dropped, actually: {{ $value }}%",
}

主な考え方は、メトリックレートが0の場合は常に3分間警告することです。適切なメトリック名と、エクスポート元から正しい情報を提供する必要があることを示すラベルを付けます。

エクスポーターが監視する適切なメトリックを選択することは複雑である可能性があり、詳細な洞察が得られない場合、真空状態からより良いアドバイスを提供することは困難です。
このブログ投稿は、より一般的な検出のインスピレーションにもなります。


rateは、指定されたカウンターの1秒あたりのレートを計算します。これは、メトリックがスクレイピングされる速度とは関係ありません(-> scrape_interval)。あなたの例では、与えられたカウンター(metric_name)が3分間増加しない場合に警告を出しますが、これはおそらくOPが望んでいるものではありません。
ヨハネス '魚' Ziemke

@ Johannes'fish'Ziemkeそのため、適切な指標を見つけるのは複雑だと言った。timeたとえば、ノードエクスポータでメトリックを使用すると実行できます。輸出業者の失敗を警告するより良い方法がある場合は、お気軽に回答を追加してください
Tensibai

@ Johannes'fish'Ziemke devops.se btwにようこそ:)
天柴iba

1

ギャップを引き起こした可能性があるいくつかの理由があります。ほとんどの場合、エクスポーターは到達可能ではありません。その場合、時up系列は0になります。これについては、次のように警告できますhttps://prometheus.io/docs/alerting/rules/#templatingから取得)。

# Alert for any instance that is unreachable for >5 minutes.
ALERT InstanceDown
  IF up == 0
  FOR 5m
  LABELS { severity = "page" }
  ANNOTATIONS {
    summary = "Instance {{ $labels.instance }} down",
    description = "{{ $labels.instance }} of job {{ $labels.job }} has been down for more than 5 minutes.",
  }

ステータスページで、エラーメッセージを含めてダウンしていることも確認できます。残念ながら、過去のエラーを確認する方法はありませんが、これを追跡する問題がありますhttps : //github.com/prometheus/prometheus/issues/2820

また、Prometheusサーバーが過負荷になり、スクレイピングが停止する可能性があり、これもギャップを説明します。その場合Storage needs throttling. Scrapes and rule evaluations will be skipped.、ログにエラーが表示され、prometheus_target_skipped_scrapes_totalメトリックが増加するはずです。これについても警告する必要があります。例:

ALERT PrometheusSkipsScrapes
  IF rate(prometheus_target_skipped_scrapes_total[2m]) > 0
  FOR 5m

1

これがあなたが見ているのと同じ問題かどうかはわかりません。しかし、GC設定を特に設定しなかったJavaアプリケーションのこれらのランダムなギャップを見ました。つまり、JVMがFull GCを実行している間にインスタンスのアクティビティが停止したため、データ収集が停止したときにギャップが発生していました。Javaを使用している場合、これが発生する可能性があります。私たちの修正は、GCアクティビティの長さの指定された制限でG1ガベージコレクター(Java 8+)を明示的に使用して、データ収集のこれらの時間ギャップを防ぐことでした。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.