クリーム色の背景、色付き表示、高コントラスト、大きな文字のほうが読みやすいですか?配色と文字を選ぶと、すべてのページに一度で反映されます。

無料レッスン

動いているサービスを測る(Prometheus)

このレッスンのあとで: 指標を読んで、サービスの様子を説明できる。

55分のレッスンコマンド6件可観測性のラボ:Prometheus と Grafana、アラートルールを書く

金曜の夜だけ、通販サイトが重い

ある通販サイトが、毎週金曜の夜になると重くなります。店長は「どのくらい遅いのか、いつからか」と聞きますが、だれも答えられません。

もし数秒ごとに数字を書き残していれば、答えはグラフになります。直すのは、測ったあとです。

このレッスンのゴール

メモ

指標を読んで、サービスの様子を説明できる。

大事な言葉

ことばいみれい
指標サービスについての数字。何度もくり返し測る(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分の割合を聞きます。

割合を手で計算する

コード: python
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 ms10人中9人は、これ以下だった
いちばん遅い950 ms1人が1秒近く待った

学生が入力するセルは、このプレビューでは空白です。

同じ数をコードで

コード: python
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分の割合が、はじめは低く、上がった状態が長く続くのはなぜかを説明します。

このラボとソースについて: 可観測性のラボ:Prometheus と Grafana、アラートルールを書く

授業で使いますか?このモジュールを学生に割り当てると、教員用ガイド、自動採点つきの課題、学生ごとのラボを使えます。