虎の穴開発室ブログ

虎の穴ラボ株式会社所属のエンジニアが書く技術ブログです

MENU

🔴サーバーにエラーが起きた時にVSCodeを真っ赤にしよう🔴

こんにちは。虎の穴ラボのMです。

この記事は「虎の穴ラボ夏のアドベントカレンダー」15日目の記事です。
14日目はおっくんさんによる「位置情報 AR にスマホのブラウザだけでチャレンジ」が投稿されました。
18日目は古賀さんによる「Markdownでカスタム構文が使える技術同人誌の執筆環境を作ってみた!!」が投稿されます。こちらもぜひご覧ください。

はじめに

なんてこった!サーバーでエラーが起きた!Slackで通知は来ているけど見逃していて反応が遅れた!

なんてことないでしょうか。つい業務に集中していたり、一時的に離席していたり。

個人的に一番見逃すのは、コーディングに集中していた時です。

今回はエディタしか見ていなくても気付けるように、サーバーでエラーが起きた時にエディタを真っ赤にしたいと思います。

エディタは、今回はVSCodeを使います。

やる事

  1. Slackのメッセージを取得
  2. Slack通知を感知するスクリプトを作る
  3. VSCodeの色を変更
  4. crontabに設定

Slackのメッセージを取得

サーバーエラー時にSlackに通知を飛ばしている前提で、 特定のチャンネルに投稿があった時 でイベントを拾います。

SlackのAPIの種類は複数ありますが、今回はシンプルに毎回リクエストを投げて情報を取得するWebAPI形式の、 conversations.history を使います。

api.slack.com

まずはAppを作成します。

SlackAppの作成

api.slack.com

  1. Create New App からアプリを作成
  2. conversations.history に必要な権限を付与
  3. workspaceにインストール
  4. メッセージを取得したいチャンネルにアプリを参加

conversations.history に必要な権限 は、以下です

  • channels:history
  • groups:history
  • im:history
  • mpim:history

curl などで動作確認をし、チャンネル情報が返却されれば完了です。

$ curl 'https://slack.com/api/conversations.history?channel={channelID} \
  -H 'Authorization: Bearer {slackToken}'

{
  "ok": true,
  "messages": [
    {
      "client_msg_id": "***",
      "type": "message",
      "text": "***",
      ...
    },
    {...}
  ]
}

Slack通知を感知するスクリプトを作る

Slack APIを実行し、サーバーエラー通知チャンネルの新着通知を取得するようにします。

$ vi serverError.pl
#!/usr/local/bin/perl
use utf8;
use Furl;
use JSON;
use URI;
use DateTime;

# Slack APIから未読メッセージを取得
my $epoch = DateTime->now(time_zone => 'Asia/Tokyo')->epoch - 60;
my $url = URI->new('https://slack.com/api/conversations.history?channel={channelID}&oldest='.$epoch.'&limit=1');
my $furl = Furl->new(
    headers => ['Authorization' => 'Bearer {slackToken}']
);
my $res = $furl->get($url);
my $content = $res->content;
my $json = decode_json($content);
my $messages = $json->{'messages'};

# 1件以上通知があるならば通知対象とする
if (scalar(@$messages)) {
    # 通知がある場合の処理
} else {
    # 通知がない場合の処理
}

1;

1分以内に、サーバーエラー通知チャンネルに投稿がある場合trueに行くように判定を追加しました。

VSCodeの色を変える

VSCodeの設定ファイルは、デフォルトの場合 $HOMEのパス/Library/Application Support/Code/User/settings.json にあります。

ここの値を切り替えます。

{
  "workbench.colorTheme": "Monokai"
}

現在 Monokai を使っていますが、サーバーエラーが発生したときは Red にしたいと思います。

my $vscode_file_path = '$HOME/Library/Application Support/Code/User/settings.json';

# 1件以上通知があるならば通知対象とする
if (scalar(@$messages)) {
    change_setting_file("Monokai", "Red", $vscode_file_path);
} else {
    change_setting_file("Red", "Monokai", $vscode_file_path);
}

sub change_setting_file {
    my ($find, $replace, $file) = @_;
    
    open (my $read_fh, '<', $file) or die $!;
    my $content = do {local $/; <$read_fh>};
    close $read_fh;
    
    $content =~ s/$find/$replace/g;
    open (my $write_fh, '>', $file) or die $!;
    print $write_fh $content;
    close $write_fh;
}

これでサーバーに通知があった場合に、エディタが赤くなるようになりました。

crontabに設定する

あとはこれをcrontabに設定して1分毎に実行できるようにすれば完了です。

* * * * * perl $HOME/serverError.pl

試してみる

サーバーにエラーが発生!

エディタの色が無事変わりました!

コーディング途中でも問答無用で変わるので絶対気付けると思います!

P.S.

虎の穴ラボでは、私たちと一緒に新しいオタク向けサービスを作る仲間を募集しています。
詳しい採用情報は以下をご覧ください。

yumenosora.co.jp