ようへいの日々精進XP

よかろうもん

BitBar で CloudWatch Alarm の状態を確認したいと思ったのでプラグインを作ってみた

tl;dr

もりごんさんに BitBar というナウでヤングなツールを教えて頂いたので, CloudWatch Alarm の状態 (OK とか, ALARM の数) を確認するプラグインを作ってみました.

github.com

BitBar のプラグイン探し

まずは, BitBar でどのようなプラグインが配布されているのか確認してみたいと思います.

getbitbar.com

CloudWatch Alarm に関連するプラグインは 2019 年の 1 月時点では登録されていないようです.

f:id:inokara:20190127083301g:plain

であれば, 作ろう

リポジトリ

以下, 作ったプラグインリポジトリ.

github.com

勉強を兼ねて Go 言語で作成しました. コマンドラインで実行すると以下のような出力が得られます.

 ~/g/s/alarmz   master   ~/bin/alarmz
| image=iVBORw0KGgoAAAANSUhEUgAAACQAAAAkCAYAAADhAJiYAAAAAXNSR0IArs4c6QAAAAlwSFlzAAAWJQAAFiUBSVIk8AAAAVlpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IlhNUCBDb3JlIDUuNC4wIj4KICAgPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4KICAgICAgPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIKICAgICAgICAgICAgeG1sbnM6dGlmZj0iaHR0cDovL25zLmFkb2JlLmNvbS90aWZmLzEuMC8iPgogICAgICAgICA8dGlmZjpPcmllbnRhdGlvbj4xPC90aWZmOk9yaWVudGF0aW9uPgogICAgICA8L3JkZjpEZXNjcmlwdGlvbj4KICAgPC9yZGY6UkRGPgo8L3g6eG1wbWV0YT4KTMInWQAAA89JREFUWAntl79rU1EUx/OzSZsWLUqgsXQqOGRwEBGnFtqpg04RB3Vw8A9w6FxwEwQd+w+4ZKxjoQV1LIgSsEuHIAhFoVrStPn1/Hxv3328l5e0SdpGBQ+cnHPuO/ec7zv3vHtvIpG/jKJDwKMccV+eFrr4j1CsS1Y/wIBL1wcBr8EMgVElJB/DT+Ab8A78C1ZuBx4K2VYYJ9sHWIktC8xtWHSRBTnO4P4mXPkaKSBVuO5K2V9gC9pKhi6G/AmUWAAarvTrN930gSp1azrX90KFwA2N7JK9JKMSa8lqrpRdgodKdtnGyPoOFgjLP9FvwaLAcmnATpR+3mQ/e8W9B9+Bv8KrsBpcVVRv9UwC2869TjYvmsvlxhYXF58uLy9P24lLS0v35+bmCrJXVlZCPWzX2vr7pUp8Jpqamqo7jvN8a2trdX5+/jvBkvClRCLxAlnc3Nz0V9HkOgmQcTiHnx+xWCwbjUavAs5pNpsKqT7qSAFAKiHcWlhY0BvcJcgeMWzjxVut1qONjY2S66cKamn8lWy3ldTMJ05DgIiZRISWSo6iAKBSqWTWngn5dDp9vVarRXg74yjJ203IcEttNzvz3P2x4Ewc/wP0GGBOPeUDgGwAJh40Go0IwI5g84ZUR76m3vRDa3R0NAXIsUqlYkFEMplMlLGjtbW1AxurX9mxdCopoBRLYMQJ19ZYRMtK9R4eHh5+i8fjJXhbUjYAXxmn41PeVXsXHQF1mO5VwfdsfGRkJIWdA2xW0rWvyAfQEn1Tr4BCPUEVmyyjEtbQpdRkA06b3sDUK6CTEihGjIYzsQAXAn/S5PZn5wGoPeaZ7P+ATitfrxXq9JWdFnug5x03xrZIvTXp8b7VNrV/s2OF+HRbfC2Kpp1ZR4TOIdke4cOQ5yO/pmzN9ZxQGDOxkF19/P7dKpRJJpMKliKB8ZfkLDPHiAbYc1Kcd54PvnHNYVy3RI+YN6FxjiJdPSJcPaSnPYc2JQAon887xWJRLh85Bq4hdU0wIAgcJ6n+UxnizCrj8xljD5ZPE/syPp/kYA9q1Pf1en2Wcd2rnWq1Ooncgf8NCjUsJ3mCk9xbGv9rlMtlh2UyjUM1ojMzM6H58t/d3fX6KJvNhvpUceRXKBQaOqilW7IBJY0Tl7O3lFf/wSssUyiYnTioJLZyNYg9CT9bX19/oyJwxzIX/kAPuUlmacJpXTWZ0HdeEnrzuuk6hLkZROgtczPY39/3EvVVASWw1E23zweVtkJeJr6eB3yWE1y4tK94yJXAX7Gz6MR1tA3A24rLvxKzXNL/Bgq89G+3jofPCxhIKgAAAABJRU5ErkJggg==
---
OK: 2 | color=green
ALARM: 1 | color=red
INSUFFICIENT_DATA: 1 | color=purple
---
Test Alarm | color=red
---
Test Alarm2 | color=purple

シンプル出力を行う -simple オプションを付与すると以下のような出力が得られます.

 ~/g/s/alarmz   master   ~/bin/alarmz -simple2 x 1 ? 1| image=iVBORw0KGgoAAAANSUhEUgAAACQAAAAkCAYAAADhAJiYAAAAAXNSR0IArs4c6QAAAAlwSFlzAAAWJQAAFiUBSVIk8AAAAVlpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IlhNUCBDb3JlIDUuNC4wIj4KICAgPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4KICAgICAgPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIKICAgICAgICAgICAgeG1sbnM6dGlmZj0iaHR0cDovL25zLmFkb2JlLmNvbS90aWZmLzEuMC8iPgogICAgICAgICA8dGlmZjpPcmllbnRhdGlvbj4xPC90aWZmOk9yaWVudGF0aW9uPgogICAgICA8L3JkZjpEZXNjcmlwdGlvbj4KICAgPC9yZGY6UkRGPgo8L3g6eG1wbWV0YT4KTMInWQAAA89JREFUWAntl79rU1EUx/OzSZsWLUqgsXQqOGRwEBGnFtqpg04RB3Vw8A9w6FxwEwQd+w+4ZKxjoQV1LIgSsEuHIAhFoVrStPn1/Hxv3328l5e0SdpGBQ+cnHPuO/ec7zv3vHtvIpG/jKJDwKMccV+eFrr4j1CsS1Y/wIBL1wcBr8EMgVElJB/DT+Ab8A78C1ZuBx4K2VYYJ9sHWIktC8xtWHSRBTnO4P4mXPkaKSBVuO5K2V9gC9pKhi6G/AmUWAAarvTrN930gSp1azrX90KFwA2N7JK9JKMSa8lqrpRdgodKdtnGyPoOFgjLP9FvwaLAcmnATpR+3mQ/e8W9B9+Bv8KrsBpcVVRv9UwC2869TjYvmsvlxhYXF58uLy9P24lLS0v35+bmCrJXVlZCPWzX2vr7pUp8Jpqamqo7jvN8a2trdX5+/jvBkvClRCLxAlnc3Nz0V9HkOgmQcTiHnx+xWCwbjUavAs5pNpsKqT7qSAFAKiHcWlhY0BvcJcgeMWzjxVut1qONjY2S66cKamn8lWy3ldTMJ05DgIiZRISWSo6iAKBSqWTWngn5dDp9vVarRXg74yjJ203IcEttNzvz3P2x4Ewc/wP0GGBOPeUDgGwAJh40Go0IwI5g84ZUR76m3vRDa3R0NAXIsUqlYkFEMplMlLGjtbW1AxurX9mxdCopoBRLYMQJ19ZYRMtK9R4eHh5+i8fjJXhbUjYAXxmn41PeVXsXHQF1mO5VwfdsfGRkJIWdA2xW0rWvyAfQEn1Tr4BCPUEVmyyjEtbQpdRkA06b3sDUK6CTEihGjIYzsQAXAn/S5PZn5wGoPeaZ7P+ATitfrxXq9JWdFnug5x03xrZIvTXp8b7VNrV/s2OF+HRbfC2Kpp1ZR4TOIdke4cOQ5yO/pmzN9ZxQGDOxkF19/P7dKpRJJpMKliKB8ZfkLDPHiAbYc1Kcd54PvnHNYVy3RI+YN6FxjiJdPSJcPaSnPYc2JQAon887xWJRLh85Bq4hdU0wIAgcJ6n+UxnizCrj8xljD5ZPE/syPp/kYA9q1Pf1en2Wcd2rnWq1Ooncgf8NCjUsJ3mCk9xbGv9rlMtlh2UyjUM1ojMzM6H58t/d3fX6KJvNhvpUceRXKBQaOqilW7IBJY0Tl7O3lFf/wSssUyiYnTioJLZyNYg9CT9bX19/oyJwxzIX/kAPuUlmacJpXTWZ0HdeEnrzuuk6hLkZROgtczPY39/3EvVVASWw1E23zweVtkJeJr6eB3yWE1y4tK94yJXAX7Gz6MR1tA3A24rLvxKzXNL/Bgq89G+3jofPCxhIKgAAAABJRU5ErkJggg==
---
Test Alarm | color=red
---
Test Alarm2 | color=purple

こんな感じ

実際に BitBar 上で動かしてみると, 以下のように出力されます. 通常の出力とシンプル出力では, 以下のような違いがあります.

f:id:inokara:20190127084440g:plain

上図は通常の出力です. CloudWatch Alarm のアイコン (後述) をクリックすると, 現在の OK, ALARM 等の数を確認することが出来ます. また, ARARM と INSUFFICIENT_DATA のアラーム名を確認することが出来ます.

f:id:inokara:20190127085753g:plain

これはシンプル出力モードです. は OK, x は ALARM, ? は INSUFFICIENT_DATA を示しています. CloudWatch Alarm のアイコンをクリックすると, 通常の出力と同様に ARARM と INSUFFICIENT_DATA のアラーム名を確認することが出来ます.

文字に色をつける

CloudWatch Alarm のアイコンをクリックすると, ARARM と INSUFFICIENT_DATA のアラーム名について, それぞれ赤色と紫色の文字色で出力するようにしています. これは, BitBar プラグインを実行した場合, 以下のように標準出力に出力されるように実装しています.

     fmt.Printf("OK: " + strconv.Itoa(len(oks)) + " | color=green\n")
        fmt.Printf("ALARM: " + strconv.Itoa(len(alarms)) + " | color=red\n")
        fmt.Printf("INSUFFICIENT_DATA: " + strconv.Itoa(len(insufficients)) + " | color=purple\n")

出力は以下のような感じになります.

...
---
Test Alarm | color=red
---
Test Alarm2 | color=purple

これについては, BitBar の README に以下のようなサンプルコードで紹介されています.

#!/bin/bash
curl -m 1 http://example.com -I >/dev/null 2>&1
[ $? -gt 0 ] && echo "FAIL | color=red" || echo "OK | color=green"
echo "---"
echo "Show Graphs | color=#123def href=http://example.com/graph?foo=bar"
echo "Show KPI Report | color=purple href=http://example.com/report"

任意のフォントやフォントサイズも指定が可能とのことです.

アイコンをつける

せっかくなので, CloudWatch Alarm のアイコンを付けてみたいと思います. BitBar でアイコンをつける場合, 以下のようにアイコンのイメージを用意してプラグインに実装する必要があります.

  • Base64エンコードする
  • Retina ディスプレイに対応する為には, 解像度を 144DPI で 36x36 ピクセルで用意する (意訳なので間違っていたらすいません)

今回, プレビュー.app を利用して CloudWatch Alarm のアイコンをモノクロ化した上で, サイズや解像度の変更を行いました. そして, この画像を Base64エンコードして文字列を用意し, プラグインのコードにハードコーディングしています.

...
    icon_data := "| image=iVBORw0KGgoAAAANSUhEUgAAACQAAAAkCAYAAADhAJiYAAAAAXNSR0IArs4c6QAAAAlwSFlzAAAWJQAAFiUBSVIk8AAAAVlpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IlhNUCBDb3JlIDUuNC4wIj4KICAgPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4KICAgICAgPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIKICAgICAgICAgICAgeG1sbnM6dGlmZj0iaHR0cDovL25zLmFkb2JlLmNvbS90aWZmLzEuMC8iPgogICAgICAgICA8dGlmZjpPcmllbnRhdGlvbj4xPC90aWZmOk9yaWVudGF0aW9uPgogICAgICA8L3JkZjpEZXNjcmlwdGlvbj4KICAgPC9yZGY6UkRGPgo8L3g6eG1wbWV0YT4KTMInWQAAA89JREFUWAntl79rU1EUx/OzSZsWLUqgsXQqOGRwEBGnFtqpg04RB3Vw8A9w6FxwEwQd+w+4ZKxjoQV1LIgSsEuHIAhFoVrStPn1/Hxv3328l5e0SdpGBQ+cnHPuO/ec7zv3vHtvIpG/jKJDwKMccV+eFrr4j1CsS1Y/wIBL1wcBr8EMgVElJB/DT+Ab8A78C1ZuBx4K2VYYJ9sHWIktC8xtWHSRBTnO4P4mXPkaKSBVuO5K2V9gC9pKhi6G/AmUWAAarvTrN930gSp1azrX90KFwA2N7JK9JKMSa8lqrpRdgodKdtnGyPoOFgjLP9FvwaLAcmnATpR+3mQ/e8W9B9+Bv8KrsBpcVVRv9UwC2869TjYvmsvlxhYXF58uLy9P24lLS0v35+bmCrJXVlZCPWzX2vr7pUp8Jpqamqo7jvN8a2trdX5+/jvBkvClRCLxAlnc3Nz0V9HkOgmQcTiHnx+xWCwbjUavAs5pNpsKqT7qSAFAKiHcWlhY0BvcJcgeMWzjxVut1qONjY2S66cKamn8lWy3ldTMJ05DgIiZRISWSo6iAKBSqWTWngn5dDp9vVarRXg74yjJ203IcEttNzvz3P2x4Ewc/wP0GGBOPeUDgGwAJh40Go0IwI5g84ZUR76m3vRDa3R0NAXIsUqlYkFEMplMlLGjtbW1AxurX9mxdCopoBRLYMQJ19ZYRMtK9R4eHh5+i8fjJXhbUjYAXxmn41PeVXsXHQF1mO5VwfdsfGRkJIWdA2xW0rWvyAfQEn1Tr4BCPUEVmyyjEtbQpdRkA06b3sDUK6CTEihGjIYzsQAXAn/S5PZn5wGoPeaZ7P+ATitfrxXq9JWdFnug5x03xrZIvTXp8b7VNrV/s2OF+HRbfC2Kpp1ZR4TOIdke4cOQ5yO/pmzN9ZxQGDOxkF19/P7dKpRJJpMKliKB8ZfkLDPHiAbYc1Kcd54PvnHNYVy3RI+YN6FxjiJdPSJcPaSnPYc2JQAon887xWJRLh85Bq4hdU0wIAgcJ6n+UxnizCrj8xljD5ZPE/syPp/kYA9q1Pf1en2Wcd2rnWq1Ooncgf8NCjUsJ3mCk9xbGv9rlMtlh2UyjUM1ojMzM6H58t/d3fX6KJvNhvpUceRXKBQaOqilW7IBJY0Tl7O3lFf/wSssUyiYnTioJLZyNYg9CT9bX19/oyJwxzIX/kAPuUlmacJpXTWZ0HdeEnrzuuk6hLkZROgtczPY39/3EvVVASWw1E23zweVtkJeJr6eB3yWE1y4tK94yJXAX7Gz6MR1tA3A24rLvxKzXNL/Bgq89G+3jofPCxhIKgAAAABJRU5ErkJggg=="
    simple_output := "○ " + strconv.Itoa(len(oks)) + " x " + strconv.Itoa(len(alarms)) + " ? " + strconv.Itoa(len(insufficients))
    alarms_output := "---\n" + strings.Join(alarms, "\n") + "\n---\n" + strings.Join(insufficients, "\n")
...

プラグインとして登録する

プラグインディレクトリに以下のようなシェルスクリプトを用意しました. ファイル名は, alarmz.1m.sh です.

#!/usr/bin/env bash

~/bin/alarmz -simple -output=/tmp/tmux-powerline-segments-cloudwatch_alarm_result.txt

このシェルスクリプトのファイル名には以下のような意味があります.

{name}.{time}.{ext}

{name} は任意の名前で良いと思いますが, 次の {time} にはプラグインの実行間隔が指定されます. 以下, 指定例です.

  • 10s ... 10 秒ごと
  • 1m ... 1 分ごと
  • 2h ... 2 時間ごと
  • 1d ... 1 日ごと

今回は, alarmz.1m.sh というファイル名ですので, プラグインは 1 分ごとに実行されます (1 分ごとに API リクエストが発行されます)

One more thing...

わたくしごとになりますが, ターミナル環境において tmux を利用しており, tmux をよりナウでヤングな見た目にしてくれる tmux-powerline を利用しはじめました.

github.com

この tmux-powerline の端っこにも, 今回作ったプラグインの結果を出力しておきたいと思ったので, BitBar プラグイン側と tmux-powerline のセグメント (プラグインみたいなものだと思う) を以下のように駆使してみました.

BitBar プラグイン側では, -ouput オプションを利用してシンプル出力の結果をファイルに出力しています.

 ~  ~/bin/alarmz -simple -output=/tmp/tmux-powerline-segments-cloudwatch_alarm_result.txt
○ 2 x 1 ? 1| image=iVBORw0KGgoAAAANSUhEUgAAACQAAAAkCAYAAADhAJiYAAAAAXNSR0IArs4c6QAAAAlwSFlzAAAWJQAAFiUBSVIk8AAAAVlpVFh0WE1MOmNv
...
---
Test Alarm | color=red
---
Test Alarm2 | color=purple
 ~  cat /tmp/tmux-powerline-segments-cloudwatch_alarm_result.txt
○ 2 x 1 ? 1

tmux-powerline のセグメントでは以下のようなスクリプトを用意しました.

 ~/g/t/segments   master ±  pwd
/path/to/tmux-powerline/segments
 ~/p/t/segments   master ±  cat cloudwatch_alarm.sh
# Print the cloudwatch Alarm.

RESULT=/tmp/tmux-powerline-segments-cloudwatch_alarm_result.txt
run_segment() {
  cat ${RESULT}
        exit 0
}

また, tmux-powerline のテーマを指定するスクリプト (themes/default.sh) で以下のように指定しました.

...
if [ -z $TMUX_POWERLINE_RIGHT_STATUS_SEGMENTS ]; then
    TMUX_POWERLINE_RIGHT_STATUS_SEGMENTS=(
        "cloudwatch_alarm 9 255" \
        "date_day 235 136" \
        "date 235 136 ${TMUX_POWERLINE_SEPARATOR_LEFT_THIN}" \
        "time 235 136 ${TMUX_POWERLINE_SEPARATOR_LEFT_THIN}" \
    )
fi
...

で, 以下のように tmux のステータスバーの端っこでも CloudWatch Alarm の状態を確認することが出来るようになりました.

f:id:inokara:20190127094322p:plain

以上

BitBar と tmux-powerline で素敵な Mac 生活とターミナル生活をお過ごし下さい.