Zabbix+さくらのクラウドAPIでクラウド上のリソースを監視する

はじめに

先日teratailに以下のような質問が投稿されていました。

teratail.com

回答を書きながらいくつか資料を探してみたのですが、さくらのクラウド+Zabbix 4系の記事があまり見当たりませんでしたので自分で試した時のメモを残しておくことにしました。

この記事で扱う内容

この記事ではさくらのクラウド上のリソースをZabbix+さくらのクラウドAPIを利用して監視する方法について取り扱います。
具体的には以下のような内容となっています。

Zabbixのインストールや、そもそもの監視設計(監視対象の選択や通知の設計など)については扱いませんので他サイトなどを参照してください。

それでは早速本題に入っていきます。

ZabbixでさくらのクラウドAPIを通じてクラウド上のリソースを監視する

ZabbixからさくらのクラウドAPIを通じてクラウド上のリソースを監視するにはいくつかの方法があります。

  • 1: 外部チェック/ユーザーパラメータ
  • 2: HTTP agent(Zabbix 4.0以降)
  • 3: PrometheusのExporter + Prometheusチェック(Zabbix 4.2以降)

順番にみていきます。

1. 外部チェック/ユーザーパラメータ

Zabbixサーバ上、またはエージェント上でスクリプト/バイナリを実行じその結果を受け取る方法です。
少々古いバージョンのZabbix(2.2とか)でも利用できます。

参考:

標準出力に何か出力しておけばそれを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トークン/シークレットを入力します。

f:id:febc_yamamoto:20200123224743p:plain

f:id:febc_yamamoto:20200123224956p:plain

次にこのアイテムをマスターにした依存アイテムを作成します。

f:id:febc_yamamoto:20200123225035p:plain

ポイントは「保存前処理」を追加する部分ですね。 単純なJSONならJSONPathが使えるのですが、前述のアクティビティグラフAPIのレスポンスのような複雑なものを扱う場合はJavaScriptを使うのが良いと思います。

ここでは取得したJSONからCPU-TIMEの値を抜き出し、nullでない末尾の値を抽出するスクリプトを記載しておきます。

f:id:febc_yamamoto:20200123225306p:plain

// コピペ用
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と組み合わせる方法です。

github.com

設定自体も簡単で、以下の記事などを参考にすれば設定で迷うことはないと思います。

blog.zabbix.com

tech-lab.sios.jp

Exporterを別途起動しておく必要がある点には注意してください。


ということでZabbix+さくらのクラウドAPIを利用するための3つの方法について紹介しました。

終わりに

今回はZabbix+さくらのクラウドAPIクラウド上のリソースを監視する方法を紹介しました。
これだけで全ての監視を賄えるわけではないですが、多様な角度から監視する上での選択肢の1つにはなると思います。

以上です。