逆説:ダッシュボードは正常(緑色)なのに顧客から苦情が来る理由
PrometheusのダッシュボードでCPUやRAMの使用率が非常に安定しているのに、ユーザーから「アプリが重い」という苦情が出てSlackの通知が鳴り止まない、という状況に陥ったことはありませんか?以前、私は15台のサーバーを管理し、基本的なアラートをすべて設定していました。しかし、実際にはユーザーの体験ではなく、マシンの状態ばかりを測定していることに気づきました。
そこで鍵となるのがSLO(Service Level Objectives:サービスレベル目標)です。サーバーの死活監視だけでなく、「過去30日間でリクエストの何%が成功したか?」を測定します。しかし、Error BudgetやBurn Rateを計算するために何百行ものPromQLを自分で書くのは苦行です。Pyrraは、まさにこの複雑さを解決するために誕生しました。
システム運用における4つの重要な概念
Pyrraを効果的に使うには、以下の4つの用語を明確に区別する必要があります。
- SLI (Indicator): 実際の測定指標。例:ステータスコード200を返したリクエストの割合。
- SLO (Objective): 目指すべき目標。例:リクエストの99.9%が成功すること。この基準では、月間のダウンタイムは43.2分まで許容されます。
- Error Budget (エラー予算): 許容されるエラーの範囲(0.1%)。これは、メンテナンスや新機能のテストに使用できる「枠」です。
- Burn Rate (燃焼率): エラー予算を消費するスピード。Burn Rateが14.4の場合、1ヶ月分の予算をわずか2日間で使い果たしてしまうことになります。
Pyrraを使用すると、簡潔なYAMLファイルでSLOを定義できます。その後、Pyrraが非常に複雑なPrometheusのRecording Rulesを自動的に生成してくれます。
Docker ComposeによるPyrra deデプロイ
最も素早く試す方法は、Docker Composeを使用することです。PyrraはPrometheusサーバーに直接接続する必要があります。
version: '3.8'
services:
pyrra:
image: ghcr.io/pyrra-dev/pyrra:v0.7.0
container_name: pyrra
ports:
- "9099:9099"
command:
- api
- --prometheus-url=http://prometheus:9090
restart: always
pyrra-filesystem:
image: ghcr.io/pyrra-dev/pyrra:v0.7.0
container_name: pyrra-filesystem
volumes:
- ./slo-definitions:/etc/pyrra/slo
command:
- filesystem
- --prometheus-url=http://prometheus:9090
- --config-files=/etc/pyrra/slo/*.yaml
restart: always
この構成では、apiコンポーネントがUIインターフェースを担当します。filesystemコンポーネントは、ローカルディレクトリからSLO定義ファイルをスキャンして読み込みます。
最初のSLOを定義する
例えば、http_requests_totalメトリクスを返すサービスがあるとします。リクエスト成功率99%のSLOを設定したい場合、slo-definitions/api-success-rate.yamlファイルを作成します。
apiVersion: pyrra.dev/v1alpha1
kind: ServiceLevelObjective
metadata:
name: api-success-rate
labels:
service: backend-api
spec:
description: バックエンドAPIの成功率は99%以上である必要があります。
target: "99"
window: 28d
indicator:
ratio:
errors:
metric: http_requests_total{job="backend", code=~"5.."}
total:
metric: http_requests_total{job="backend"}
この構造は、手動でPromQLを書いて28日間のレートを計算するよりもはるかに明快です。
統合と実際のモニタリング
Pyrraはデータを保存せず、Ruleを生成するだけです。Kubernetesを使用している場合、PyrraはOperatorを介してPrometheusRuleオブジェクトを自動生成します。従来のサーバー構成では、PyrraのUIからRuleをコピーしてPrometheusの設定ファイルに貼り付けるだけです。
http://localhost:9099にアクセスすると、以下の重要な指標が表示されます。
- Objective: 目標値(99%)。
- Availability: 現在稼働しているシステムの実際のパフォーマンス。
- Error Budget Remaining: SLAに違反するまでに残っているエラー予算の割合。
この仕組みにより、障害を早期に発見できるようになります。Burn Rateを確認するだけで、システムが完全にダウンしていなくても、予算が「流出」していることがすぐにわかります。
Google標準に基づいたアラートの自動化
PyrraはGoogleの「Multi-window Multi-burn-rate」の哲学を採用しています。1つのリクエストエラーで即座にアラートを出すのではなく、予算の消費速度に基づいてアラートを送信します。
- Critical Alert: 予算の消費が非常に速く、対処しないと数時間以内に予算を使い果たしてしまう場合.
- Warning Alert: 消費速度は遅いものの、数日以内にSLOに影響を与える可能性がある場合。
このアプローチにより、オンコールエンジニアを疲弊させる「フラッピングアラート(頻繁に発生・解消を繰り返す不要なアラート)」を完全に排除できます。
終わりに
SLOを導入することで、DevチームとOpsチームが共通の言語で話せるようになります。「CPU使用率80%は重要か?」と議論する代わりに、Error Budgetを確認しましょう。予算が残っていれば自信を持ってデプロイし、枯渇しそうであれば一旦止めてシステムの最適化に注力します。
Pyrraは、PromQLに精通していなくても運用を標準化できる強力なツールです。10個以上のマイクロサービスを管理しているなら、ぜひ今日から試してみてください。

