TT Lab
はじめる
学ぶ 学習パス コース

可観測性

本物のPrometheusにクエリを投げる

TT Labで続きを見る

目標

本物の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で見ます。

ステップ

  1. http_requests_totalにどんなラベルがあるか調べて/root/obs/01-labels.txt
  2. 1秒あたりのリクエスト率のクエリを/root/obs/02-rate.promql
  3. 5xxの比率のクエリを/root/obs/03-errrate.promql
  4. p95レイテンシのクエリを/root/obs/04-p95.promql
  5. 時系列が最も多いメトリクス5つを이름 시계열수の形式で/root/obs/05-top.txt(プレースホルダーは名前と時系列数です)
  6. レコーディングルールを/etc/prometheus/rules/labhub.yml
  7. 設定を反映して、新しい時系列が出てくるか確認
  8. ディスク枯渇の予測クエリを/root/obs/08-predict.promql

参考

どんな時系列があるかを先に見る

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を下回るかを尋ねるクエリを書いてください。この環境のディスクは、実際に単調に減少するように作ってあります。