cloudpack自称 Sensu芸人 の かっぱこと 川原 洋平@inokara)です。


はじめに

Sensu 芸人としては Sensu API を使った何かしらのネタをやらないといけません。ということで、まずは Sensu APIcurljq で追っかけてみたいと思います。



参考

この記事を書き始めてから気づきましたが、以下の記事がシンプルに纏まっていて良いと思います!



ドキュメントにしたがって…


アクセスしてみる

  • 合わせて jq にパイプで渡しながら見ていく
  • ホストは localhost
  • ポートは 4567

API の設定は config.json の以下の部分。

  "api": {
    "host": "localhost",
    "port": 4567
  },

so simple!!

ということで早速触ってみる。


Aggregates

Aggregates は監視項目ごとの集計に利用する API かと思われるが…すんません、検証した環境で試したところ…

curl -s http://localhost:4567/aggregates | jq .

シーン…

[ ]

あれ…ということで、引き続き調べる。


Checks

Checks は読んで字の如く Sensu にてチェックしている項目。

sensu-api-dashboard-curl-jq_01

早速 curl してみる。

curl -s http://localhost:4567/checks | jq .

結果は以下のように出力される・

[
  {
    "name": "test",
    "interval": 60,
    "subscribers": [
      "test"
    ],
    "command": "echo -n OK"
  },
  {
    "name": "vmstat_metrics",
    "subscribers": [
      "test"
    ],
    "interval": 60,
    "command": "/etc/sensu/plugins/vmstat-metrics.rb --scheme stats.:::name:::",
    "handlers": [
      "graphite"
    ],
    "type": "metric"
  }
]

以下のように name を指定すれば個別のチェック(監視)項目を確認することが出来る。

curl -s http://localhost:4567/checks/vmstat_metrics | jq .

また、エンドポイントを /request にして以下のように POST すると個別にチェックさせることも可能。

curl -X POST http://localhost:4567/request -d '
{
  "check": "test",
  "subscribers": [
    "test"
  ]
}'

sensu-client.log に以下のようにチェックのログが残る。

{"timestamp":"2014-06-07T01:40:29.651193+0000","level":"info","message":"received check request","check":{"name":"test","command":"echo -n OK","issued":1402105229}}
{"timestamp":"2014-06-07T01:40:29.832690+0000","level":"info","message":"publishing check result","payload":{"client":"localhost","check":{"name":"test","command":"echo -n OK","issued":1402105229,"subscribers":["test"],"interval":60,"executed":1402105229,"output":"OK","status":0,"duration":0.181}}}

おお。


Clients

もう、言葉は要らない。

sensu-api-dashboard-curl-jq_02

以下で監視対象のクライアント一覧を取得することが出来る。

curl -s http://localhost:4567/clients | jq .

以下のようにレスポンスがかえってくる。

  {
    "timestamp": 1402105730,
    "subscriptions": [
      "test"
    ],
    "address": "127.0.0.1",
    "name": "localhost"
  }

Checks 同様に個別に指定することも可能。

curl -s http://localhost:4567/clients/localhost | jq .

また DELETE メソッドを使えばクライアントの削除も出来る。

curl -X DELETE http://localhost:4567/clients/${Client}

さらに /clients/${Client}/history${Client} のチェック履歴を確認することが出来る。

  {
    "last_status": 0,
    "last_execution": 1402105871,
    "history": [
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0
    ],
    "check": "vmstat_metrics"
  }


Events

普通、以下のような状態だと上司に怒られます。きっと。

sensu-api-dashboard-curl-jq_03

以下のように実行すると…

curl -s http://localhost:4567/events | jq .

以下のように結果が出力される。

  {
    "check": "keepalive",
    "client": "sensu-client6",
    "occurrences": 2150,
    "flapping": false,
    "handlers": [
      "default"
    ],
    "issued": 1402106206,
    "status": 2,
    "output": "No keep-alive sent from client in over 180 seconds"
  }

/events/${Client} とするとクライアント毎のイベントを確認することが出来る。また、/events/${Client}/${Check} を指定するとクライアントのチェック項目毎のイベントを確認することが出来る。

curl -s http://localhost:4567/events/sensu-client1/test-hoge | jq .

sensu-client1test-hoge のイベントを確認すると以下のように出力される。

{
  "check": "test-hoge",
  "client": "sensu-client1",
  "occurrences": 336,
  "flapping": false,
  "handlers": [
    "default"
  ],
  "issued": 1401966697,
  "status": 1,
  "output": "NG"
}

また DELETE メソッドで削除することも可能。

エンドポイントに /resolve に対して以下のように POST することで発生しているイベントを強制的に解決のステータスに変更することも出来る。

curl -XPOST http://localhost:4567/resolve -d '{
  "client": "sensu-client1",
  "check": "test-hoge"
}'

一時的にアラート通知を止めたい場合に使えるかも。


Health

お、これなんだろう…って思っていたら…

The health endpoint checks to see if the api can connect to redis and rabbitmq. It takes parameters for minimum consumers and maximum messages and checks rabbitmq.

とあるように RabbitMQRedis のヘルスチェックをする API のようですな。

curl -v "http://localhost:4567/health?consumers=1&messages=10"

上記のようにアクセスすると…

sensu-api-dashboard-curl-jq_04

ステータスコード 204 が返ってくれば RabbitMQRedis は正常だと判断出来るとのこと。ちなみにソースコード的にはこちらが該当するようですな。「個人的に Sensu 自身のヘルスチェックどうすんの?」が課題なので引き続き調べよう。


Info

sensu-api-dashboard-curl-jq_05

以下のようにアクセスする。

curl -s http://localhost:4567/info | jq .

以下のようにレスポンスが返ってくる。

{
  "redis": {
    "connected": true
  },
  "rabbitmq": {
    "connected": true,
    "results": {
      "consumers": 1,
      "messages": 0
    },
    "keepalives": {
      "consumers": 1,
      "messages": 0
    }
  },
  "sensu": {
    "version": "0.12.6"
  }
}

ほうほう。ソースコードはこのあたりRabbitMQRedis への接続チェックに関しては各種チェックメソッドを呼んで true を返している。


Stashes

隠し事はよくありませんが、Staches をみてみましょう。

sensu-api-dashboard-curl-jq_06

アラートを一時的に止めておきたい時に使いましょう。

curl -s http://localhost:4567/stashes | jq .

以下のようにスタッシュしているイベントが返ってくる。

  {
    "expire": -1,
    "content": {
      "timestamp": 1401959281
    },
    "path": "silence/sensu-client5/keepalive"
  },
  {
    "expire": -1,
    "content": {
      "timestamp": 1401959281
    },
    "path": "silence/sensu-client3/keepalive"
  }

/stashes/${PATH} のように ${PATH} の個別指定で ${PATH} 毎の状態を確認出来る。

curl -s http://localhost:4567/stashes/silence/sensu-client3/keepalive | jq .

以下のように timestamp のみが返ってくる。

{
  "timestamp": 1401959281
}

以下のように POST メソッドで Stash することが出来る。

curl -XPOST localhost:4567/stashes -d '{
  "path": "silence/sensu-client4/keepalive",
  "content": {
    "reason": "test"
  }
}'

以下のように Stash された。

sensu-api-dashboard-curl-jq_07

尚、“content” 内には “expire”: 60 で期限を設定することも出来る。

一応、確認してみる。

curl -s http://localhost:4567/stashes/silence/sensu-client4/keepalive | jq .

以下のようにレスポンスが返ってきた。

{
  "reason": "test"
}

DELETE メソッドを使って削除することが可能。

curl -XDELETE http://localhost:4567/stashes/silence/sensu-client4/keepalive

削除したらもう一度確認する。

curl -s http://localhost:4567/stashes/silence/sensu-client4/keepalive | jq .

おお。



まとめ

ばばーっと触ってきて思ったこと。

  • Sensu API って Sensu Dashboard の為だけだと思っていただけど奥深い
  • /health/info 等を使って Sensu 自身の監視にも使えそう
  • 「俺のダッシュボード for Sensu」作るかな

元記事は、こちら