Enjoy mackerel metadata

先日のmackerelミートアップでメタデータなる新機能が発表されました。

後日談として、この機能がどんな感じか試してみます。まずは一通りメタデータの入出力を試してから、メタデータと何かしらを連携させて遊んでみるところまでやってみます。

ホストメタデータの登録・更新

APIキーとホストIDは面倒なので環境変数に入れています。

環境の情報をメタデータで持たせてみます。

$ curl -X PUT -H "X-Api-Key: $MACKEREL_APIKEY" -H "Content-Type:application/json" -d "{\"environment\": \"production\"}" https://mackerel.io/api/v0/hosts/$MACKEREL_HOSTID/metadata/environment
{"success":true}

ホストメタデータの取得

うむ。

$ curl -s -X GET -H "X-Api-Key: $MACKEREL_APIKEY" https://mackerel.io/api/v0/hosts/$MACKEREL_HOSTID/metadata/environment | jq .
{
  "environment": "production"
}

ホストメタデータの削除

error! 消す場合でもContent-Typeの指定が必要みたいです。

$ curl -s -X DELETE -H "X-Api-Key: $MACKEREL_APIKEY" https://mackerel.io/api/v0/hosts/$MACKEREL_HOSTID/metadata/environment
{"error":"Illegal Content-Type. Please try with \"Content-Type: application/json\""}

消えました。

$ curl -s -X DELETE -H "X-Api-Key: $MACKEREL_APIKEY" -H "Content-Type:application/json" https://mackerel.io/api/v0/hosts/$MACKEREL_HOSTID/metadata/environment
{"success":true}

$ curl -s -X GET -H "X-Api-Key: $MACKEREL_APIKEY" https://mackerel.io/api/v0/hosts/$MACKEREL_HOSTID/metadata/environment
{"error":{"message":"Metadata not found."}}

次にメタデータと何かを連携させてみます。

メタデータで○○する

とりあえずメタデータをどんな感じで使うと良さそうかティンときてないので思いつきで使ってみるわよ。

メタデータがproductionなのにホストのstatusがworking以外だったらNGを出す

NGだったらSlackに飛ばしたり、プロビジョニング(knifeとかansible-playbook)の実行可否を判断したりとか?(↓コピーすると\の後ろにスペースが入ってエラーになるので注意)

test $(mkr status $MACKEREL_HOSTID | jq -r .status) = working && \  
test $(curl -s -X GET -H "X-Api-Key: $MACKEREL_APIKEY" https://mackerel.io/api/v0/hosts/$MACKEREL_HOSTID/metadata/environment | jq -r .environment) = production && \  
echo OK || \  
echo NG  

サーバのヒットポイントが0になったらシャットダウンする

準備

とりあえずHP: 999にしておく。

$ curl -X PUT -H "X-Api-Key: $MACKEREL_APIKEY" -H "Content-Type:application/json" -d "{\"HP\": \"999\"}" https://mackerel.io/api/v0/hosts/$MACKEREL_HOSTID/metadata/HP

スクリプト

適当にダメージを与えてHPが0以下になったらシャットダウン!!メタデータはmackerel上にあるので、異なる環境で実行してもちゃんとHPが反映されるのが良いですね。

(echoで許して...)

デモ

こんな感じで遊べます。

$ ./attack.sh ponpokopon.me
HP is 999  
12 damage!  
remaining HP is 987

$ ./attack.sh ponpokopon.me
HP is 987  
349 damage!  
remaining HP is 638

$ ./attack.sh ponpokopon.me
HP is 638  
285 damage!  
remaining HP is 353

$ ./attack.sh ponpokopon.me
HP is 353  
222 damage!  
remaining HP is 131

$ ./attack.sh ponpokopon.me
HP is 131  
294 damage!  
remaining HP is -163

ponpokopon.me is shutting down...  

一度死んだら、HPは999に回復します。

$ ./attack.sh ponpokopon.me
HP is 999  
425 damage!  
remaining HP is 574

$ ./attack.sh ponpokopon.me
HP is 574  
67 damage!  
remaining HP is 507

$ ./attack.sh ponpokopon.me
HP is 507  
139 damage!  
remaining HP is 368

$ ./attack.sh ponpokopon.me
HP is 368  
264 damage!  
remaining HP is 104

$ ./attack.sh ponpokopon.me
HP is 104  
104 damage!  
remaining HP is 0

ponpokopon.me is shutting down...  

使い所

使い所としては、CIがコケるたびにペナルティとしてダメージを加算していく、などが考えられます。

感想

メタデータを触ってみて、

  • メトリクスとして扱うような数値やデータではないけど、
  • 動的に変化させたいデータで、
  • 1分毎などではなく好きなタイミングで更新したいような、
  • ホストが持つ「状態」

を扱うのに適したものなのかな?と思いました(まだふわっとしてる)。

なんというか、mackerelはSaaS上にホストのメトリクスや状態が集まる場所となっているので、各ホストが互いにメタデータを介して状態を変化させ合うことでより人間を介さない監視体系を作っていくのに役立ちそうみたいな感じだろうか。どうだろうか。

引き続きなんかいい感じの使い方がないか調べたり考えたりしてみます。