金曜の夜だけ、通販サイトが重い
ある通販サイトが、毎週金曜の夜になると重くなります。店長は「どのくらい遅いのか、いつからか」と聞きますが、だれも答えられません。
もし数秒ごとに数字を書き残していれば、答えはグラフになります。直すのは、測ったあとです。
このレッスンのゴール
メモ
指標を読んで、サービスの様子を説明できる。
大事な言葉
| ことば | いみ | れい |
|---|---|---|
| 指標 | サービスについての数字。何度もくり返し測る(metric) | |
| カウンター | 増える一方の指標 | nginx_http_requests_total |
| ゲージ | 増えたり減ったりする指標 | nginx_connections_active |
| 毎秒の割合 | カウンターが1秒あたりどれだけ増えたか(rate) | |
| パーセンタイル | 測定値の決まった割合が、その値以下に収まる値(percentile) | |
| アラート | 指標がおかしいときに送る知らせ |
学生が入力するセルは、このプレビューでは空白です。
カウンターは登り、ゲージは揺れる
指標は、サービスが自分について出す数字です。ラボでは exporter という小さなプログラムが nginx の状態ページを読み、指標に直します。Prometheus という集め役が5秒ごとに exporter に数字を聞き、時刻といっしょにしまいます。
カウンターは増える一方です。例は、始まってからの処理した件数です。ゲージは上下します。例は、今開いている接続の数です。
ラボの Prometheus は、Web 経由で質問に答えます。最初の Run は、どの対象が答えるかを聞きます。
どの対象が答えるか
curl -s -G -w "\n" http://prometheus:9090/api/v1/query --data-urlencode 'query=up'ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
ゲージを聞く
curl -s -G -w "\n" http://prometheus:9090/api/v1/query --data-urlencode 'query=nginx_connections_active'ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
カウンターを聞く
curl -s -G -w "\n" http://prometheus:9090/api/v1/query --data-urlencode 'query=nginx_http_requests_total'ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
割合で、カウンターが速さになる
カウンターが 72 と読めても、それだけでは分かりません。1日で 72 なのか、1分で 72 なのでしょうか。
毎秒の割合は、増えた分を秒数で割ります。8秒で 19 から 72 になったなら、増えたのは 53 で、割合は 53 ÷ 8 です。
次の Run で、Web サーバーに50回アクセスします。そのあと Prometheus に、直近1分の割合を聞きます。
割合を手で計算する
before = 19
after = 72
seconds = 8
print((after - before) / seconds)
# seconds を 4 に変えてみましょう。忙しくなりましたか、静かになりましたか。50回アクセスする
curl -s -o /dev/null "http://app:8080/?n=[1-50]"ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
毎秒の割合を聞く
curl -s -G -w "\n" http://prometheus:9090/api/v1/query --data-urlencode 'query=rate(nginx_http_requests_total[1m])'ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
パーセンタイルは、遅い少数を見せる
10人のお客さんが 20、22、25、25、28、28、31、35、40、950 ミリ秒待ちました。平均は 120.4 です。こんなに待った人はいません。
90パーセンタイルは、10人中9人がその時間以内に済んだ、という時間です。小さい順に並べて、9番目の 40 を取ります。
ラボのサーバーは待ち時間を出さないので、この例は手で計算します。
例: 10人の待ち時間
| 見方 | 値 | 分かること |
|---|---|---|
| 平均 | 120.4 ms | 実際にはだれも経験していない数 |
| 中央値(50パーセンタイル) | 28 ms | 半分の人は、これ以下だった |
| 90パーセンタイル | 40 ms | 10人中9人は、これ以下だった |
| いちばん遅い | 950 ms | 1人が1秒近く待った |
学生が入力するセルは、このプレビューでは空白です。
同じ数をコードで
times = [20, 22, 25, 25, 28, 28, 31, 35, 40, 950]
total = 0
for time in times:
total = total + time
print("平均", total / len(times))
print("中央値", times[4])
print("90番", times[8])
# 950 を 45 に変えてみましょう。いちばん動く数はどれですか。よくある間違い
注意
平均の応答時間が、利用者の感じ方を表すと思う人が多いです。ごく少数の遅い処理が平均を引き上げ、たくさんの速い処理がそれを隠します。ふつうのお客さんは中央値で、運の悪いお客さんは高いパーセンタイルで見ます。
アラートは、指標にかけるルール
人は一日中グラフを見ていられません。アラートは、人の代わりに指標を見張るルールです。「これがこの時間つづいておかしければ、だれかに知らせる」と決めます。
時間が大切です。1秒だけの急上昇で、だれかを起こしてはいけません。Prometheus はルールを一覧に持ちます。新しいラボにはまだないので、次の Run は空の一覧を見せます。
Prometheus のルール一覧
curl -s -w "\n" http://prometheus:9090/api/v1/rulesここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
もう一歩先へ
同じ curl で n=[1-300] とし、300回アクセスしましょう。次に rate(nginx_http_requests_total[1m]) と rate(nginx_http_requests_total[5m]) を Prometheus に聞きます。すぐに1回、2分後にもう1回です。
4つの数を書き留めましょう。5分の割合が、はじめは低く、上がった状態が長く続くのはなぜかを説明します。