この記事は Mackerel Advent Calendar 2017 の22日目の記事です。
今年の2月頃から仕事で Mackerel を使い出して、下記のプラグインを作成した。
プラグインの作成を振り返ってみても良かったけど、仕事で携わっているサービスは Ruby on Rails で開発しており、デプロイに Capistrano を使っているので、Mackerel と Capistrano の連携方法について書くことにした。
デプロイ対象のホストを Mackerel から取得
Mackerel のヘルプにも連携方法が書かれているが、Capistrano 2.x を前提としているため Capistrano 3.x で同じことをやろうとすると、少し修正が必要である。
まずは Capfile
で mackerel-client を読み込むようにする。
require "capistrano/setup" require "capistrano/deploy" require "capistrano/scm/git" install_plugin Capistrano::SCM::Git require "capistrano/rbenv" require "capistrano/bundler" require "capistrano/rails/assets" require "capistrano/rails/migrations" require 'mackerel/client' Dir.glob("lib/capistrano/tasks/*.rake").each { |r| import r }
そして、config/deploy/production.rb
で Mackerel からデプロイ対象のホストを取得するようにする。
set :mackerel_api_key, ENV.fetch('MACKEREL_API_KEY') def host_ip_addrs(role) client = Mackerel::Client.new(mackerel_api_key: fetch(:mackerel_api_key)) hosts = client.get_hosts(service: fetch(:application), roles: role).select do |host| host.status == 'standby' || host.status == 'working' end hosts.map do |host| interface = host.interfaces.find { |i| i['name'].match(/^eth/) } interface['ipAddress'] if interface end.compact end role :app, host_ip_addrs(:app) role :web, host_ip_addrs(:app) role :db, host_ip_addrs(:app)
これで、ステータスが working または standby になっているホストに対してデプロイが実行されるようになる。
デプロイ時に Mackerel のグラフアノテーションへ投稿
config/deploy/production.rb
に下記をすると、グラフアノテーションへ投稿することが出来る。
namespace :deploy do task :starting do set :deploy_started_at, Time.now.to_i end task :finished do deploy_finished_at = Time.now.to_i annotation = { title: 'deploy application', description: "link: https://github.com/holidayworking/#{fetch(:application)}/commit/#{fetch(:current_revision)}", from: fetch(:deploy_started_at), to: deploy_finished_at, service: fetch(:application) } client = Mackerel::Client.new(mackerel_api_key: fetch(:mackerel_api_key)) client.post_graph_annotation(annotation) end end
この状態でデプロイすると、下記のようにグラフアノテーションが投稿される。
デプロイしたリビジョンをもとに GitHub のコミットログへのリンクを生成しているので、どの時点で何をデプロイしたかも分かるので便利である。