課題
システムのメンテナンスを行う前に、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