Ruby
Rails
Mackerel

Mackerelの通知設定の切り替えを行うrake taskを定義した

課題

システムのメンテナンスを行う前に、Mackerelの通知をOFFにしたい、終わったらONにしたいという要望がチームから上がっていた。

解決策

MackerelはAPIが公開されているので、それを使えばできるが、簡単にやりたかったのでgem mackerel-clientを使うことにして、rake taskを作った。

実装

gemのインストール

Gemfileに以下を追加する。

Gemfile
gem 'mackerel-client'

そしてbundle installを実行。

rake taskの設定

  • MackerelのAPI KEYは環境変数に持つ
  • monitor_idはrake taskの引数、もしくは環境変数に持つ

という方向で実装した。

lib/tasks/mackerel.rake
require 'mackerel/client'

namespace :mackerel do
  namespace :notification do

    # Mackerelで指定されたmonitor_idの通知を変更する
    # @param [String] monitor_id Mackerelで設定されているmonitor_id
    # @param [Boolean] is_mute 通知を切る場合はtrue、行う場合はfalseを指定する
    def change_mute(monitor_id:, is_mute:)
      client = Mackerel::Client.new(mackerel_api_key: ENV['MACKEREL_API_KEY'])
      monitor = client.get_monitors.find { |monitor| monitor.id == monitor_id}
      if monitor.nil?
        puts 'Please set existing monitor_id.'
      else
        monitor.isMute = is_mute
        client.update_monitor(monitor.id, monitor)
      end
    end

    desc "Mute notification from mackerel by monitor_id"
    task :mute, 'monitor_id'
    task mute: :environment do |x, args|
      monitor_id = args.monitor_id || ENV['MACKEREL_MONITOR_ID']
      if monitor_id.nil?
        puts 'Please set monitor_id.'
      else
        change_mute(monitor_id: monitor_id, is_mute: true)
      end
    end

    desc "Unmute notification from mackerel by monitor_id"
    task :unmute, 'monitor_id'
    task unmute: :environment do |x, args|
      monitor_id = args.monitor_id || ENV['MACKEREL_MONITOR_ID']
      if monitor_id.nil?
        puts 'Please set monitor_id.'
      else
        change_mute(monitor_id: monitor_id, is_mute: false)
      end
    end
  end
end

実行する

dot_envを使っている場合は、.envファイルに追加すると指定が楽になる。

MACKEREL_API_KEY="PLEASE_INPUT_MACKEREL_API_KEY"
MACKEREL_MONITOR_ID="PLEASE_INPUT_MACKEREL_MONITOR_ID"

通知をオフにする場合

$ bin/rake mackerel:notification:mute

通知をオンにする場合

$ bin/rake mackerel:notification:unmute