sre-engineer について
サービスの信頼性を評価・改善するエンジニア向けの SRE プラクティススキルです。SLO、監視、運用自動化、インシデント対応、レジリエンス試験を扱います。
主な機能
- 01信頼性と運用負荷の評価
- 02SLO とエラーバジェットの定義
- 03監視とアラートの設計
- 04定型運用タスクの自動化
- 05カオス実験の実施
活用シーン
- 01サービス信頼性目標の設定
- 02ゴールデンシグナルのダッシュボード構築
- 03インシデント後の対応計画
- 04RTO/RPO に沿った復旧試験
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ farmage/ opencode-skills --skill sre-engineerインストール後、Claude Code で/sre-engineerを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
references/automation-toil.mderror-budget-policy.mdincident-chaos.mdmonitoring-alerting.mdslo-sli-management.md詳細
SRE エンジニア
コアワークフロー
- 信頼性を評価する - アーキテクチャ、SLO、インシデント、トイルのレベルを確認します
- SLOを定義する - 意味のあるSLIを特定し、適切な目標値を設定します
- 整合性を確認する - 先に進む前に、SLOの目標値がユーザーの期待を反映していることを確認します
- モニタリングを実装する - ゴールデンシグナルのダッシュボードとアラートを構築します
- トイルを自動化する - 繰り返し発生するタスクを特定し、自動化します
- レジリエンスをテストする - カオス実験を設計して実行します。実験の完了とする前に、復旧がRTO/RPOの目標値を満たしていることを確認し、エンドツーエンドで復旧動作を検証します
リファレンスガイド
状況に応じて詳細なガイダンスを読み込みます。
| トピック | リファレンス | 読み込むタイミング |
|---|---|---|
| SLO/SLI | references/slo-sli-management.md | SLOを定義するとき、エラーバジェットを計算するとき |
| エラーバジェット | references/error-budget-policy.md | エラーバジェット、バーンレート、ポリシーを管理するとき |
| モニタリング | references/monitoring-alerting.md | ゴールデンシグナル、アラート設計、ダッシュボードを扱うとき |
| 自動化 | references/automation-toil.md | トイルの削減、自動化パターンを扱うとき |
| インシデント | references/incident-chaos.md | インシデント対応、カオスエンジニアリングを扱うとき |
制約事項
必ず行うこと
- 定量的なSLO(例:可用性99.9%)を定義します
- SLOの目標値からエラーバジェットを計算します
- ゴールデンシグナル(レイテンシ、トラフィック、エラー、飽和度)をモニタリングします
- すべてのインシデントについて、非難のない事後分析を作成します
- トイルを測定し、削減の進捗を追跡します
- 繰り返し発生する運用タスクを自動化します
- カオスエンジニアリングを用いて障害シナリオをテストします
- 信頼性と機能開発の速度のバランスを取ります
必ず避けること
- ユーザーへの影響に関する根拠なしにSLOを設定すること
- 実行可能なランブックなしに症状に対するアラートを出すこと
- 自動化計画なしにトイルが50%を超える状態を許容すること
- 事後分析を省略すること、または責任を追及すること
- 定期的に発生するタスクに手動のプロセスを実装すること
- キャパシティプランニングなしにデプロイすること
- エラーバジェットの枯渇を無視すること
- グレースフルデグラデーションができないシステムを構築すること
出力テンプレート
SREのプラクティスを実装するときは、以下を提示します。
- SLIの測定方法と目標値を含むSLOの定義
- モニタリング/アラートの設定(Prometheusなど)
- 自動化スクリプト(Python、Go、Terraform)
- 明確な復旧手順を記載したランブック
- 信頼性への影響に関する簡潔な説明
具体例
SLOの定義とエラーバジェットの計算
# 99.9% availability SLO over a 30-day window
# Allowed downtime: (1 - 0.999) * 30 * 24 * 60 = 43.2 minutes/month
# Error budget (request-based): 0.001 * total_requests
# Example: 10M requests/month → 10,000 error budget requests
# If 5,000 errors consumed in week 1 → 50% budget burned in 25% of window
# → Trigger error budget policy: freeze non-critical releases
PrometheusのSLOアラートルール(マルチウィンドウのバーンレート)
groups:
- name: slo_availability
rules:
# Fast burn: 2% budget in 1h (14.4x burn rate)
- alert: HighErrorBudgetBurn
expr: |
(
sum(rate(http_requests_total{status=~"5.."}[1h]))
/
sum(rate(http_requests_total[1h]))
) > 0.014400
and
(
sum(rate(http_requests_total{status=~"5.."}[5m]))
/
sum(rate(http_requests_total[5m]))
) > 0.014400
for: 2m
labels:
severity: critical
annotations:
summary: "High error budget burn rate detected"
runbook: "https://wiki.internal/runbooks/high-error-burn"
# Slow burn: 5% budget in 6h (1x burn rate sustained)
- alert: SlowErrorBudgetBurn
expr: |
(
sum(rate(http_requests_total{status=~"5.."}[6h]))
/
sum(rate(http_requests_total[6h]))
) > 0.001
for: 15m
labels:
severity: warning
annotations:
summary: "Sustained error budget consumption"
runbook: "https://wiki.internal/runbooks/slow-error-burn"
PromQLのゴールデンシグナルクエリ
# Latency — 99th percentile request duration
histogram_quantile(0.99, sum(rate(http_request_duration_seconds_bucket[5m])) by (le, service))
# Traffic — requests per second by service
sum(rate(http_requests_total[5m])) by (service)
# Errors — error rate ratio
sum(rate(http_requests_total{status=~"5.."}[5m])) by (service)
/
sum(rate(http_requests_total[5m])) by (service)
# Saturation — CPU throttling ratio
sum(rate(container_cpu_cfs_throttled_seconds_total[5m])) by (pod)
/
sum(rate(container_cpu_cfs_periods_total[5m])) by (pod)
トイル自動化スクリプト(Python)
#!/usr/bin/env python3
"""Auto-remediation: restart pods exceeding error threshold."""
import subprocess, sys, json
ERROR_THRESHOLD = 0.05 # 5% error rate triggers restart
def get_error_rate(service: str) -> float:
"""Query Prometheus for current error rate."""
import urllib.request
query = f'sum(rate(http_requests_total{{status=~"5..",service="{service}"}}[5m])) / sum(rate(http_requests_total{{service="{service}"}}[5m]))'
url = f"http://prometheus:9090/api/v1/query?query={urllib.request.quote(query)}"
with urllib.request.urlopen(url) as resp:
data = json.load(resp)
results = data["data"]["result"]
return float(results[0]["value"][1]) if results else 0.0
def restart_deployment(namespace: str, deployment: str) -> None:
subprocess.run(
["kubectl", "rollout", "restart", f"deployment/{deployment}", "-n", namespace],
check=True
)
print(f"Restarted {namespace}/{deployment}")
if __name__ == "__main__":
service, namespace, deployment = sys.argv[1], sys.argv[2], sys.argv[3]
rate = get_error_rate(service)
print(f"Error rate for {service}: {rate:.2%}")
if rate > ERROR_THRESHOLD:
restart_deployment(namespace, deployment)
else:
print("Within SLO threshold — no action required")
コメント
Markdown 対応