本物のPrometheusにクエリを投げる
目標
本物のPrometheusサーバーにクエリを投げて、返ってきた数字を読みます。このラボが終わると、rate・比率・分位数・予測を自分で書けるようになり、間違ったときにはなぜ間違ったのかがわかるようになります。
なぜ重要なのか
PromQLの文法は1日で覚えられます。難しいのは、返ってきた数字が正しいかどうかを判断することです。by (le)を抜いたhistogram_quantileはエラーを出しません。ただ間違った数字を返します。それをダッシュボードに載せておくと、何か月も誰も気づきません。
そのためこの環境には、12時間分の時系列があらかじめ入っています。エラーが急増する区間が2回、p99だけが跳ねる区間が1回、単調に減少するディスクがあります。あなたが書いたクエリがそれらの事象を見つけ出せるかどうかで、正解を確認できます。
環境
promq "<PromQL>" 쿼리를 던진다. promq -r 로 원본 JSON
lab-status 무엇이 떠 있는지, 대상이 몇 개인지
tail -40 /var/log/lab-init.log 준비 과정 로그
Prometheusは127.0.0.1:9090、サンプルサービスのexporterは9101、node_exporterは9100です。Grafanaはlab-start-grafanaで起動し、Webプレビューのポート3000で見ます。
ステップ
http_requests_totalにどんなラベルがあるか調べて/root/obs/01-labels.txt- 1秒あたりのリクエスト率のクエリを
/root/obs/02-rate.promql - 5xxの比率のクエリを
/root/obs/03-errrate.promql - p95レイテンシのクエリを
/root/obs/04-p95.promql - 時系列が最も多いメトリクス5つを
이름 시계열수の形式で/root/obs/05-top.txt(プレースホルダーは名前と時系列数です) - レコーディングルールを
/etc/prometheus/rules/labhub.yml - 設定を反映して、新しい時系列が出てくるか確認
- ディスク枯渇の予測クエリを
/root/obs/08-predict.promql
参考
- クエリをファイルに書く前に、
promqで先に投げてみてください。結果が空なら、ラベル名が間違っています。 promq 'up'が3を返せば、スクレイプは正常です。- 結果が
NaNなら、分母が0の区間を見ています。
どんな時系列があるかを先に見る
http_requests_totalにどんなラベルがあるか調べて/root/obs/01-labels.txt
クエリを書く前に、まず何があるのかを見ます。promq 'count by (__name__)({__name__=~".+"})'でメトリクス名を一通り見て、promq 'http_requests_total'でラベルを確認します。/root/obs/01-labels.txtに、http_requests_totalのラベル名を1行に1つずつ書いてください(値ではなく名前だけです)。
1秒あたりのリクエスト率
1秒あたりのリクエスト率のクエリを/root/obs/02-rate.promql
/root/obs/02-rate.promqlにクエリを書き、promq "$(cat /root/obs/02-rate.promql)"で直接確認してください。スクレイプ間隔が15秒なので、範囲をその4倍以上にしておくと、サンプルが1つしか拾えない瞬間がなくなります。rateはsumの内側になければなりません。外に置くと、カウンターのリセットを誤って処理します。
5xxの比率
5xxの比率のクエリを/root/obs/03-errrate.promql
/root/obs/03-errrate.promqlに書きます。比率なので割り算で、分子と分母の両方にrateをかけないと単位が合いません。結果が0.004付近なら平常時、0.1を超えていれば障害の区間を見ています。この環境にはエラーが急増する区間が2回入っています。
p95レイテンシ
p95レイテンシのクエリを/root/obs/04-p95.promql
/root/obs/04-p95.promqlに書きます。_sumと_countでは分位数を求められません。バケットにrateをかけ、leラベルを残したまま合算してからhistogram_quantileに渡します。by (le)を抜くと、エラーなしに間違った数字が出ます。だからこそ、より危険です。
時系列が最も多いメトリクスを探す
時系列が最も多いメトリクス5つを이름 시계열수の形式で/root/obs/05-top.txt(プレースホルダーは名前と時系列数です)
カーディナリティは測ってみないとわかりません。promq 'topk(5, count by (__name__)({__name__=~".+"}))'を投げてみて、出てきた表を/root/obs/05-top.txtに5行で書き写してください。1行に이름 시계열수の形式で、多いものから並べます(プレースホルダーは名前と時系列数です)。順位は、対象が増えると変わります。そのため、名前1つではなくそのとき測った表を残します。
レコーディングルールのファイルを書く
レコーディングルールを/etc/prometheus/rules/labhub.yml
/etc/prometheus/rules/labhub.ymlを作ります。groups → rules → record/exprの構造です。recordの名前はjob:http_requests:rate5mのように、수준:메트릭:연산の規約に従います(プレースホルダーはレベル、メトリクス、演算です)。保存したら、必ずpromtool check rules /etc/prometheus/rules/labhub.ymlで検査してください。
ルールを反映して新しい時系列を確認する
設定を反映して、新しい時系列が出てくるか確認
Prometheusを再起動せずに反映します。curl -X POST http://127.0.0.1:9090/-/reloadを実行してください。15秒ほど待ってから、promq 'job:http_requests:rate5m'で新しい時系列ができたかを見ます。ルールは評価間隔ごとに計算されるので、すぐには出てきません。
ディスクがいつ満杯になるかを計算する
ディスク枯渇の予測クエリを/root/obs/08-predict.promql
/root/obs/08-predict.promqlに書きます。predict_linearは「今の傾向が続いたらN秒後の値」を返します。node_filesystem_avail_bytesが6時間後に0を下回るかを尋ねるクエリを書いてください。この環境のディスクは、実際に単調に減少するように作ってあります。