こんにちは!プロダクトの裏側でシステムの健康を守り抜くオブザーバビリティの世界へようこそ。
今回は、多くのインフラエンジニアが一度は直面する「標準機能じゃ監視できないこの独自のAPI、どうやってZabbixに取り込めばいいんだ…?」という悩みを綺麗に解決するテーマをお届けします。
市販のエージェントや標準テンプレートは便利ですが、本当にビジネス価値のある独自のメトリクス(例えば、「社内APIの現在のキュー残数」や「特定のクラウドサービスの利用料金予測」「独自バッチの進捗率」など)は、自分たちの手で拾いに行く必要があります。
これをマスターすれば、「標準機能にないから監視できません」という言い訳が消え、「俺たちのシステムで見えないものはない」と言い切れる圧倒的な安心感を手に入れられますよ。さあ、一緒に扉を開けましょう!
—
1. そもそもなぜ「外部スクリプト監視」が必要なのか?
Zabbixの基本は、Zabbix AgentがOSのCPUやメモリ、ディスク使用量をモリモリと集めてくることです。しかし、世の中のシステムはOSのメトリクスだけでは動きません。
- クラウドAPIやSaaSの状態を知りたい(例:AWSの特定リソースの状態、GitHubのAPI制限残数など)
- 自社製アプリケーションの内部ロジックを監視したい(例:DBの特定テーブルに溜まった未処理データの件数)
こうした「外側」や「ピンポイントな内側」のデータをZabbixに取り込むための王道アプローチが、「外部スクリプト(External Check / UserParameter)」です。
今回は、その中でも最も柔軟性が高く、あらゆるAPI叩き職人と化す「Pythonを使ったカスタムスクリプト監視」の極意を伝授します。
—
2. 全体像を理解する:Zabbixがデータを掴むまでの流れ
外部スクリプトでメトリクスを取得する仕組みは、拍子抜けするほどシンプルです。
1. Zabbix Server / Proxy が定期的にスクリプト(Pythonなど)をキックする。
2. スクリプトが外部APIやDBにアクセスし、欲しい数値(メトリクス)をJSONや生テキストとして標準出力(stdout)に吐き出す。
3. Zabbixがその出力を受け取り、そのままデータベースに突っ込んでグラフ化・アラート判定する。
これだけです。この仕組みの美しさは、「スクリプト単体でローカル実行してテストできる」という点にあります。本番に入れる前に動作確認が完璧にできるため、デバッグで深夜に泣くことが劇的に減ります。
—
3. 実践!HelloWorld的カスタムスクリプトの作成
まずは、手を動かしてみましょう。今回は「ダミーのAPIエンドポイントから現在のユーザー数を取得する」というシチュエーションを想定し、Pythonスクリプトを書きます。
保存場所は、通常Zabbixサーバの外部スクリプト格納ディレクトリ(例: `/usr/lib/zabbix/externalscripts/`)にします。
① Pythonスクリプトの作成 (`get_active_users.py`)
!/usr/bin/env python3
import sys
import json
import urllib.request
import urllib.error
監視対象のAPIエンドポイント(今回は例としてJSONPlaceholderを使用)
API_URL = “https://jsonplaceholder.typicode.com/users”
def fetch_metrics():
try:
# APIリクエストの送信(タイムアウトは必ず設定すること!)
req = urllib.request.Request(API_URL, headers={“User-Agent”: “ZabbixCustomMonitor/1.0″})
with urllib.request.urlopen(req, timeout=5) as response:
if response.status != 200:
print(f”Error: HTTP Status {response.status}”, file=sys.stderr)
sys.exit(1)
data = json.loads(response.read().decode(“utf-8″))
# 今回は取得したリストの要素数(ユーザー数)をメトリクスとする
user_count = len(data)
# 標準出力に「数値だけ」を吐き出すのがZabbix連携の鉄則
print(user_count)
except urllib.error.URLError as e:
print(f”Connection Error: {e.reason}”, file=sys.stderr)
sys.exit(1)
except Exception as e:
print(f”Unexpected Error: {str(e)}”, file=sys.stderr)
sys.exit(1)
if __name__ == “__main__”:
fetch_metrics()
> 💡 先輩エンジニアのワンポイントアドバイス:
> スクリプトを書くときの最大の鉄則は、「正常時は標準出力(stdout)に監視したい値だけを出し、異常時は標準エラー出力(stderr)にメッセージを出して非ゼロで終了する(`sys.exit(1)`)」ことです。これを行儀よく守るだけで、Zabbix側のハンドリングが天国のように楽になります。
② 実行権限の付与と手動テスト
スクリプトを作成したら、必ずZabbix実行ユーザー(通常は `zabbix` ユーザー)権限を与え、手動で叩いて動作確認をします。
実行権限を付与
sudo chmod +x /usr/lib/zabbix/externalscripts/get_active_users.py
zabbixユーザーになりきってテスト実行
sudo -u zabbix /usr/lib/zabbix/externalscripts/get_active_users.py
ここで「`10`」のような数字が返ってきたら、HelloWorldは大成功です!
—
4. Zabbixサーバーへの組み込みと設定の極意
いよいよZabbixのフロントエンド(Web UI)にこのスクリプトを組み込みます。ここでは「外部チェック(External check)」という機能を使います。
ステップ1: ホストの設定
1. Zabbixの管理画面から [データ収集] -> [ホスト] を開きます。
2. 監視対象のホスト(またはZabbixサーバ自身)を選択します。
ステップ2: アイテムの作成
1. [アイテム] タブを開き、[アイテムの作成] をクリックします。
2. 以下のように設定します:
- 名前: `アクティブユーザー数取得`
- タイプ: `Zabbixエージェント (アクティブ)` ではなく、`Zabbix内部` でもありません。ここは `外部チェック` を選択します。(※Zabbix Server側でスクリプトを実行する場合)
- キー: スクリプトのファイル名をそのまま指定します。引数が必要な場合は `get_active_users.py[“arg1″,”arg2”]` のように書けます。今回は引数なしなので `get_active_users.py` と入力します。
- 情報のタイプ: `数値 (整数)`
- 更新間隔: `1m` (システムの負荷やAPIのレートリミットを考慮して決めてください)
3. [追加] ボタンを押して保存します。
たったこれだけで、Zabbixは毎分このPythonスクリプトを裏で実行し、APIから返ってくる数値を時系列データとして蓄積し始めます。
—
5. 現場で役立つ「絶対に押さえるべき」3つの注意点
最後に、現場でこの手法を使って数々の修羅場を潜り抜けてきた私から、絶対に知っておくべき注意点を3つ伝授します。
1. タイムアウト地獄に気をつけろ
外部APIや独自のスクリプトは、ネットワークの遅延や相手側の高負荷によって「フリーズ」することがあります。Zabbix側のタイムアウト設定(`zabbix_server.conf` の `Timeout` パラメータ、デフォルト3秒)よりも長くスクリプトが居座ると、Zabbixサーバー全体の監視プロセスが詰まる「スレッド枯渇事故」が起きます。
- 対策: スクリプト側には必ず `timeout=3` のように明示的な制限時間を設け、Zabbix側のタイムアウト値以内に必ず処理が返るように設計しましょう。
2. ログとデバッグの仕組みを最初から仕込め
「なんか動かないんだけど、Zabbix画面では『Not supported』としか出ない…」これは初心者が100回通る道です。
- 対策: スクリプト内で標準エラーに出力した内容は、Zabbixサーバーのログ(通常 `/var/log/zabbix/zabbix_server.log`)にキャプチャされます。困ったらまずこのログを見る癖をつけましょう。また、スクリプト内に簡易的なファイル出力ロジック(デバッグ用)を仕込んでおくと神のように役立ちます。
3. APIのレートリミット(回数制限)を踏み抜くな
「細かく監視したいから」といって、外部の有料APIや重いDBクエリを10秒おきに叩くスクリプトを登録すると、監視システムが原因で本番APIをハングアップさせるという本末転倒な事故(セルフDDoS攻撃)を引き起こします。
- 対策: 更新間隔は必要最小限にし、可能であればスクリプト側で結果を数分間キャッシュする(ローカルファイルやメモリに持つ)仕組みを検討してください。
—
まとめ
いかがでしたでしょうか?
Zabbixの外部スクリプト監視は、標準機能の枠を超えて「見たいものすべてを可視化する」ための強力な武器です。
Pythonなどの慣れ親しんだ言語でサクッとスクリプトを書き、それをZabbixのアイテムとして紐付けるだけ。この手法をマスターすれば、社内のどんな特殊なシステムであっても、自信を持ってオブザーバビリティを担保できるようになります。
「これをマスターすれば、毎日の作業が劇的に楽になりますよ」。
障害の予兆を誰よりも早くキャッチし、平穏な夜を取り戻しましょう。あなたの監視ライフがより素晴らしいものになることを応援しています!