はじめに
先日teratailに以下のような質問が投稿されていました。
回答を書きながらいくつか資料を探してみたのですが、さくらのクラウド+Zabbix 4系の記事があまり見当たりませんでしたので自分で試した時のメモを残しておくことにしました。
この記事で扱う内容
この記事ではさくらのクラウド上のリソースをZabbix+さくらのクラウドAPIを利用して監視する方法について取り扱います。
具体的には以下のような内容となっています。
- 外部チェック/ユーザーパラメータなどを通じてcurl/usacloudコマンドでさくらのクラウドAPIを叩く
- HTTP agentを利用してさくらのクラウドAPIを叩く
- ZabbixとPrometheusのExporterを組み合わせる
Zabbixのインストールや、そもそもの監視設計(監視対象の選択や通知の設計など)については扱いませんので他サイトなどを参照してください。
それでは早速本題に入っていきます。
ZabbixでさくらのクラウドAPIを通じてクラウド上のリソースを監視する
ZabbixからさくらのクラウドAPIを通じてクラウド上のリソースを監視するにはいくつかの方法があります。
- 1: 外部チェック/ユーザーパラメータ
- 2: HTTP agent(Zabbix 4.0以降)
- 3: PrometheusのExporter + Prometheusチェック(Zabbix 4.2以降)
順番にみていきます。
1. 外部チェック/ユーザーパラメータ
Zabbixサーバ上、またはエージェント上でスクリプト/バイナリを実行じその結果を受け取る方法です。
少々古いバージョンのZabbix(2.2とか)でも利用できます。
参考:
- 外部チェック(External checks): https://www.zabbix.com/documentation/current/manual/config/items/itemtypes/external
- ユーザーパラメータ: https://www.zabbix.com/documentation/current/manual/config/items/userparameters
標準出力に何か出力しておけばそれをZabbixから参照できるということですね。
さくらのクラウドAPIを叩く場合はcurl
コマンド、またはCLIであるUsacloudを利用し、
出力をjq
コマンドなどで加工してあげると良いと思います。
単純な値をcurlで取得する
# curlでサーバのメモリサイズを取得 $ export TOKEN="さくらのクラウドAPIトークン" $ export SECRET="さくらのクラウドAPIシークレット" $ export ZONE=is1a $ export SERVER_ID=123456789012 # サーバのID $ curl --user "$TOKEN":"$SECRET" https://secure.sakura.ad.jp/cloud/zone/$ZONE/api/cloud/1.1/server/$SERVER_ID | jq ".Server.ServerPlan.MemoryMB" 4096
2020/01/23 コード誤りを修正
アクティビティグラフの値をcurlで取得する
スペックなどを取得する場合はjq
コマンドが単純で済むのですが、アクティビティグラフAPIを使用してCPU利用時間やディスクの読み書き量を取得するとなるとちょっと難易度が上がります。
具体的には、アクティビティグラフAPIは以下のようなJSONを返します。
# サーバのCPU-TIMEを取得 $ curl -s --user "$TOKEN":"$SECRET" https://secure.sakura.ad.jp/cloud/zone/is1a/api/cloud/1.1/server/$SERVER_ID/monitor | jq . { "Data": { "2020-01-17T16:45:00+09:00": { "CPU-TIME": 0.043333333333 }, "2020-01-17T16:50:00+09:00": { "CPU-TIME": 0.046666666667 }, "2020-01-17T16:55:00+09:00": { "CPU-TIME": null }, "2020-01-17T17:00:00+09:00": { "CPU-TIME": null }, "2020-01-17T17:05:00+09:00": { "CPU-TIME": null }, "2020-01-17T17:10:00+09:00": { "CPU-TIME": null }, "2020-01-17T17:15:00+09:00": { "CPU-TIME": null }, "2020-01-17T17:20:00+09:00": { "CPU-TIME": null } }, "is_ok": true }
日付がキーとなっていること、値にnullが入っていることでjq
コマンドの書き方が難しいですね。
これを処理する場合、
Data
配下の要素からCPU-TIME
の値を抜き出し- nullを除去
- 配列の最後の値を取得(昇順になっているため、最新の値は末尾にある)
という感じになります。面倒ですね…
ひとまず手元で確認したところ、jq '[.Data[]["CPU-TIME"]] | del(.[] | nulls) | .[-1]'
でいけました。
# curlでアクティビティグラフAPIを叩き値を抽出 $ curl --user "$TOKEN":"$SECRET" https://secure.sakura.ad.jp/cloud/zone/is1a/api/cloud/1.1/server/$SERVER_ID/monitor | jq '[.Data[]["CPU-TIME"]] | del(.[] | nulls) | .[-1]' 0.046666666667
これで外部チェック/ユーザーパラメータからアクティビティグラフAPIの値を活用できそうですね。
アクティビティグラフの値をusacloudで取得する
usacloudコマンドを利用すればさらに楽に値を抽出できます。
というのも、usacloudコマンドは以下のようにAPIから返されるJSONを変換し、単純な配列にしてから出力するからです。null値のフィルタリングもしてくれてます。
こちらの形の方がjq
などで加工しやすいですよね。
$ usacloud server monitor-cpu -o json $SERVER_ID [ { "CPUTime": "0.043333333333", "Key": "sakuracloud.server.123456789012.cpu", "TimeStamp": "2020-01-17 16:45:00 +0900 JST" }, { "CPUTime": "0.046666666667", "Key": "sakuracloud.server.123456789012.cpu", "TimeStamp": "2020-01-17 16:50:00 +0900 JST" } ]
これを利用すると、先ほどのcurlコマンドの例は以下のように書き直せます。
# usacloudでアクティビティグラフAPIを叩き値を抽出 $ usacloud server monitor-cpu -o json $SERVER_ID | jq '.[-1].CPUTime|tonumber' 0.046666666667
2. HTTP agent(Zabbix 4.0以降)
Zabbix 4.0以降で利用できるHTTP agentを利用する方法です。
参考:
とりあえずAPIを叩くだけであれば簡単にできます。
まずアイテム作成画面でタイプがHTTPエージェントなアイテムを作成します。 この時、URLにはさくらのクラウドAPIのURLを入力し、http認証をBasicにしてユーザー名/パスワード欄にそれぞれAPIトークン/シークレットを入力します。
次にこのアイテムをマスターにした依存アイテムを作成します。
ポイントは「保存前処理」を追加する部分ですね。 単純なJSONならJSONPathが使えるのですが、前述のアクティビティグラフAPIのレスポンスのような複雑なものを扱う場合はJavaScriptを使うのが良いと思います。
ここでは取得したJSONからCPU-TIME
の値を抜き出し、nullでない末尾の値を抽出するスクリプトを記載しておきます。
// コピペ用 const data = JSON.parse(value).Data; return Object.keys(data).map(function(v){return data[v]["CPU-TIME"]}).filter(function(v){ return v}).pop()
少々回りくどい書き方になっているのはZabbix 4.4の時点でもES6/ES7は部分的なサポートのみだからです。
なのでObject.values()やアロー関数が使えないんですよね。。。
これはZabbixが採用しているJavaScriptのエンジンDuktape由来です https://duktape.org/
ともあれこれでHTTP agentを利用してアクティビティグラフAPIを叩くことができました。 テンプレート化して汎用化する必要はありますが、単体のリソースを監視する程度であればこの方法だけでも十分使えると思います。
PrometheusのExporter + Prometheusチェック(Zabbix 4.2以降)
Zabbix 4.2以降というのをクリアできれば正直この方法が一番楽だと思います。
さくらのクラウド向けのPrometheus Exporterであるsakuracloud_exporterと組み合わせる方法です。
設定自体も簡単で、以下の記事などを参考にすれば設定で迷うことはないと思います。
Exporterを別途起動しておく必要がある点には注意してください。
ということでZabbix+さくらのクラウドAPIを利用するための3つの方法について紹介しました。
終わりに
今回はZabbix+さくらのクラウドAPIでクラウド上のリソースを監視する方法を紹介しました。
これだけで全ての監視を賄えるわけではないですが、多様な角度から監視する上での選択肢の1つにはなると思います。
以上です。