require “etc” require “instrumental_agent”

namespace :load do

task :defaults do
  set :instrumental_hooks, true
  set :instrumental_key,   nil
  set :deployer,           Etc.getlogin.chomp
end

end

namespace :deploy do

before :starting, :check_instrumental_hooks do
  invoke "instrumental:util:add_hooks" if fetch(:instrumental_hooks)
end

end

namespace :instrumental do

namespace :util do
  desc "add instrumental hooks to deploy"
  task :add_hooks do
    before "deploy", "instrumental:util:deploy_start"
    after  "deploy", "instrumental:util:deploy_end"
    after  "instrumental:util:deploy_end", "instrumental:record_deploy_notice"
  end

  desc "marker for beginning of deploy"
  task :deploy_start do
    set :instrumental_deploy_start, Time.now
  end

  desc "marker for end of deploy"
  task :deploy_end do
    set :instrumental_deploy_end, Time.now
  end
end

desc "send a notice to instrumental about the deploy"
task :record_deploy_notice do
  start_at                   = fetch(:instrumental_deploy_start, Time.now)
  end_at                     = fetch(:instrumental_deploy_end, start_at)
  deploy_duration_in_seconds = end_at - start_at
  deployer                   = fetch(:deployer)
  agent_options              = { :synchronous => true }
  agent_options[:collector]  = instrumental_host if fetch(:instrumental_host, false)
  message                    = fetch(:deploy_message, "#{deployer} deployed #{fetch(:current_revision)}".strip)

  if fetch(:instrumental_key)
    agent = Instrumental::Agent.new(fetch(:instrumental_key), agent_options)
    agent.notice(message,
                 start_at,
                 deploy_duration_in_seconds)
    puts "Notified Instrumental of deployment"
  end
end

end