class Capistrano::Datadog::Reporter

Collects info about the tasks that ran in order to submit to Datadog

Attributes

current_task[RW]

Public Class Methods

new() click to toggle source
# File lib/capistrano/datadog.rb, line 46
def initialize()
  @tasks = []
  @current_task = nil
  @logging_output = {}
end

Public Instance Methods

record_log(message) click to toggle source
# File lib/capistrano/datadog.rb, line 62
def record_log(message)
  if not @logging_output[@current_task]
    @logging_output[@current_task] = []
  end
  @logging_output[@current_task] << message
end
record_task(task_name, timing, roles, stage=nil, application_name=nil) click to toggle source
# File lib/capistrano/datadog.rb, line 52
def record_task(task_name, timing, roles, stage=nil, application_name=nil)
  @tasks << {
    :name   => task_name,
    :timing => timing,
    :roles  => roles,
    :stage  => stage,
    :application => application_name
  }
end
report() click to toggle source
# File lib/capistrano/datadog.rb, line 69
def report()
  hostname = %x[hostname -f].strip
  user = Etc.getlogin

  # Lazy randomness
  aggregation_key = Digest::MD5.hexdigest "#{Time.new}|#{rand}"

  # Convert the tasks into Datadog events
  @tasks.map do |task|
    name  = task[:name]
    roles = Array(task[:roles]).map(&:to_s).sort
    tags  = ["#capistrano"] + (roles.map { |t| '#role:' + t })
    if !task[:stage].nil? and !task[:stage].empty? then
      tags << "#stage:#{task[:stage]}"
    end
    application = ''
    if !task[:application].nil? and !task[:application].empty? then
      application = ' for ' + task[:application]
    end
    title = "%s@%s ran %s%s on %s with capistrano in %.2f secs" % [user, hostname, name, application, roles.join(', '), task[:timing]]
    type  = "deploy"
    alert_type = "success"
    source_type = "capistrano"
    message_content = (@logging_output[name] || []).join('')
    message = if !message_content.empty? then
      # Strip out color control characters
      message_content = sanitize_encoding(message_content).gsub(/\e\[(\d+)m/, '')
      "@@@\n#{message_content}@@@" else "" end

    Dogapi::Event.new(message,
      :msg_title        => title,
      :event_type       => type,
      :event_object     => aggregation_key,
      :alert_type       => alert_type,
      :source_type_name => source_type,
      :tags             => tags
    )
  end
end
sanitize_encoding(string) click to toggle source
# File lib/capistrano/datadog.rb, line 109
def sanitize_encoding(string)
  return string unless defined?(::Encoding) && string.encoding == Encoding::BINARY
  string.encode(Encoding::UTF_8, Encoding::BINARY, invalid: :replace, undef: :replace, replace: '')
end