こんにちは、現場の最前線でシステムの「鼓動」を聴き続けているエンジニアです。
皆さんは、Rollbarを単なる「エラー通知ツール」だと思っていませんか? もしそうなら、あなたはRollbarが持つ真のポテンシャルの10%しか使えていないかもしれません。
多くの現場では、エラーが発生してから「通知(Slack)」が飛び、エンジニアが「火消し」に走ります。しかし、本当に優れたオブザーバビリティ(可観測性)の世界では、「火が大きくなる前に、煙の匂いを察知する」ことが求められます。
今回は、RollbarのOccurrences APIという強力な武器を使い、過去のエラー傾向から「これはいつもと違う、何かが起きようとしている」という障害の予兆を検知する、実戦的なCronスクリプトの作り方を伝授します。
これをマスターすれば、深夜の緊急呼び出しを未然に防ぎ、チームの信頼性を劇的に向上させることができますよ。さあ、一緒に始めていきましょう。
—
1. なぜ「Occurrences API」なのか?
Rollbarには「Item(エラーの種類)」と「Occurrence(発生した1回ごとの事実)」という概念があります。
- Item: 「NullPointerException」というエラーの器。
- Occurrence: そのエラーが「いつ、誰に、どのブラウザで、どんなコンテキストで」起きたかという個別の記録。
通常のダッシュボードは「Item」単位で集計されますが、Occurrences APIを叩くと、生のエラーデータが時系列で手に入ります。これを分析することで、「普段は1時間に5回しか起きない微細なエラーが、この10分で50回起きている」といった異常な密度を、統計的に割り出すことができるのです。
—
2. 事前準備:Rollbarの「鍵」を手に入れる
まずはスクリプトからRollbarにアクセスするための準備をしましょう。
1. Project Access Tokenの取得
- Rollbarのプロジェクト設定(Settings)→ [Project Access Tokens] へ進みます。
- `read` 権限を持つトークンをコピーしておいてください。
2. 環境の用意
- 今回は汎用性が高く、データ処理が得意な Python を使います。
- `requests` ライブラリを使うので、インストールしておいてください。
pip install requests
—
3. 第一歩:Occurrences APIで「Hello World」
まずは、直近のエラー生データを1件だけ取得してみましょう。これがすべての分析の基礎になります。
import requests
設定情報
ACCESS_TOKEN = ‘あなたのPROJECT_READ_TOKEN’
ENDPOINT = ‘https://api.rollbar.com/api/1/instances’ # Occurrencesを取得するエンドポイント
headers = {
‘X-Rollbar-Access-Token’: ACCESS_TOKEN
}
最新の1件を取得
response = requests.get(f”{ENDPOINT}/?page=1&per_page=1″, headers=headers)
if response.status_code == 200:
data = response.json()
# エラーの詳細(Occurrence)が表示されます
print(“接続成功!最新のエラー内容の一部:”)
print(data[‘result’][‘instances’][0][‘data’][‘body’][‘message’])
else:
print(f”エラーが発生しました: {response.status_code}”)
—
4. 実践:障害予兆検知スクリプトの実装
ここからが本番です。
「過去24時間の平均エラー発生率」をベースラインとし、「直近10分間の発生率」がその3倍(閾値)を超えた場合に、独自の警告を出すロジックを組みます。
この「移動平均との比較」こそが、静的なアラート設定では不可能な「いつもと違う」を検知する極意です。
import requests
import time
from datetime import datetime, timedelta
— 設定エリア —
ACCESS_TOKEN = ‘あなたのPROJECT_READ_TOKEN’
監視したいエラーレベル (debug, info, warning, error, critical)
TARGET_LEVEL = ‘error’
異常と判定する倍率(例:平均の3倍でアラート)
THRESHOLD_FACTOR = 3.0
def get_occurrence_count(minutes_ago):
“””指定された分前からのエラー発生件数を取得する”””
timestamp_limit = int((datetime.now() – timedelta(minutes=minutes_ago)).timestamp())
# 本来はページネーションで全件取得しますが、
# 簡易化のため件数のみをカウントするロジックとして解説します
url = f”https://api.rollbar.com/api/1/instances/?level={TARGET_LEVEL}”
headers = {‘X-Rollbar-Access-Token’: ACCESS_TOKEN}
response = requests.get(url, headers=headers)
if response.status_code != 200:
return 0
occurrences = response.json().get(‘result’, {}).get(‘instances’, [])
# 指定時間内のものだけフィルタリング
recent_events = [o for o in occurrences if o[‘timestamp’] > timestamp_limit]
return len(recent_events)
def monitor_anomaly():
print(f”[{datetime.now()}] 予兆検知スキャン開始…”)
# 1. 直近10分間の発生件数
recent_count = get_occurrence_count(10)
# 2. 過去24時間の10分あたりの平均発生件数(ベースライン)
# 本来はDB等に貯めるのが理想ですが、今回は簡易的に24時間の総数を144(10分×144=24h)で割ります
total_24h_count = get_occurrence_count(1440)
baseline = total_24h_count / 144
# 最低限のノイズを除去(ベースラインが低すぎる場合の考慮)
effective_baseline = max(baseline, 1.0)
print(f”現在の頻度(10分): {recent_count}件”)
print(f”ベースライン頻度: {effective_baseline:.2f}件”)
# 3. 判定
if recent_count > effective_baseline THRESHOLD_FACTOR:
print(“【警告】障害の予兆を検知しました!通常よりエラー頻度が高まっています。”)
# ここでSlack通知やPagerDuty連携を呼び出す
# send_slack_notification(recent_count, effective_baseline)
else:
print(“システムの状態は正常です。”)
if __name__ == “__main__”:
monitor_anomaly()
—
5. 運用への組み込み:Cronの設定
このスクリプトをサーバやGitHub Actions、AWS Lambdaなどで定期実行します。
例えば、LinuxサーバのCronであれば、`crontab -e` で以下のように設定します(5分ごとに実行)。
/5 /usr/bin/python3 /path/to/your_script.py >> /var/log/rollbar_monitor.log 2>&1
—
6. このアプローチが「劇的に楽」にする理由
このスクリプトを導入すると、あなたの運用スタイルは以下のように変わります。
1. 「静かなる予兆」への気づき:
大規模なダウンに至る前、小規模なエラーがチクチクと増え始める段階で通知を受け取れます。
2. ノイズの低減:
「常に1時間に10回は起きている無害なエラー」に対してはベースラインが学習されているため、無駄なアラートに悩まされることが減ります。
3. データに基づいた意思決定:
「なんとなく調子が悪い」ではなく、「通常の3.5倍のエラーが出ているので、ロールバックしましょう」と、論理的な判断ができるようになります。
最後に
オブザーバビリティの本質は、ツールに「見せられる」ことではなく、自ら「問いを投げる」ことにあります。RollbarのOccurrences APIは、その問いに応えてくれる宝の山です。
まずはこのスクリプトを動かして、自分たちのシステムが普段どれくらいのエラーを吐いているのか、その「呼吸」を知ることから始めてみてください。それが、一流のエンジニアへの第一歩です。
何か分からないことがあれば、いつでも聞いてくださいね。応援しています!