lib/rackamole/alert/emole.rb in rackamole-0.2.7 vs lib/rackamole/alert/emole.rb in rackamole-0.2.8

- old
+ new

@@ -15,41 +15,111 @@ # so you will need to make sure it is properly configured for your domain. # NOTE: This is just a notification mechanism. All moled event will be either logged # or persisted in the db regardless. # # === Parameters: - # options :: Hash minimaly containing :from for the from address. Must be a valid domain. + # options :: Mole options. The :email key minimaly contains :from for the from address. Must be a valid domain. # :: And a :to, n array of email addresses for recipients to be notified. # args :: The gathered information from the mole. # def self.deliver_alert( logger, options, args ) - params = options.clone - params[:to] = options[:to].join( ", " ) - params[:subject] = "[M()le] (#{alert_type( args )}#{request_time?( args )}) -#{args[:app_name]}@#{args[:host]}- for user #{args[:user_name]}" + @options = options + opts = options[:email] + params = opts.clone + params[:to] = opts[:to].join( ", " ) + params[:subject] = "RackAmole <#{alert_type( args )}> #{request_time?( args )} on #{args[:app_name]}.#{args[:host]} for user #{args[:user_name]}" - content = [] - dump( content, args, 0 ) - content = content.join( "\n" ) - + @args = args + tmpl = File.join( template_root, %w[alert.erb] ) template = Erubis::Eruby.new( IO.read( tmpl ), :trim => true ) output = template.result( binding ) params[:body] = output Pony.mail( params ) output rescue => boom + puts boom + boom.backtrace.each { |l| puts l } logger.error( "Rackamole email alert failed with error `#{boom}" ) end - # ========================================================================= + def self.section( title ) + buff = [] + # buff << "-"*80 + buff << "-"*40 + buff << "o #{title.capitalize}\n" + buff << self.send( title.downcase ) + buff << "\n" + buff.join( "\n" ) + end + + # ========================================================================= private - + + def self.args + @args + end + + def self.humanize( key ) + key + end + + def self.feature_type + case args[:type] + when Rackamole.feature + "Feature" + when Rackamole.perf + "Performance" + when Rackamole.fault + "Fault" + end + end + + # Format args and spit out into buffer + def self.spew( key, silent=false ) + buff = [] + + _spew( buff, '--', (silent ? '' : ' '), key, args[key], silent ) + buff.join( "\n" ) + end + def self._spew( buff, sep, indent, key, value, silent ) + if value.is_a?( Hash ) + buff << "#{indent}#{humanize( key )}:" unless silent + value.each_pair{ |k,v| _spew( buff, sep, indent+" ", k, v, false ) } + elsif value.is_a?( Array ) + buff << "#{indent}#{humanize( key )}:" unless silent + value.each { |s| _spew( buff, sep, indent+" ", '', s, false ) } + else + buff << "#{indent}#{humanize( key )}: #{value}" + end + end + + # What just happened? + def self.what + buff = [] + case args[:type] + when Rackamole.fault + buff << spew( :fault ) << spew( :stack ) + "\n" + when Rackamole.perf + buff << "#{spew( :request_time )}/#{@options[:perf_threshold]}" + end + buff << spew( :url ) << spew( :path ) << spew( :status ) + buff << spew( :method ) << spew( :request_time ) << spew( :ip ) + buff.join( "\n" ) + end + def self.server() [ spew( :host ), spew( :software ), spew( :ruby_version ) ]; end + def self.client() [ spew( :machine, true ) ]; end + def self.params() [ spew( :params, true ) ]; end + def self.session() [ spew( :session, true ) ]; end + def self.browser() [ spew( :browser, true ) ]; end + def self.headers() [ spew( :headers, true ) ]; end + # Dump request time if any... def self.request_time?( args ) - args[:type] == Rackamole.perf ? ":#{args[:request_time]}" : '' + args[:type] == Rackamole.perf ? ("%5.2f" % args[:request_time] ) : '' end # Identify the type of alert... def self.alert_type( args ) case args[:type] @@ -60,23 +130,23 @@ when Rackamole.fault "Fault" end end - # Dump args... - def self.dump( buff, env, level=0 ) - env.each_pair do |k,value| - if value.respond_to?(:each_pair) - buff << "%s %-#{40-level}s" % [' '*level,k] - dump( buff, env[k], level+1 ) - elsif value.instance_of?(Array) - buff << "%s %-#{40-level}s" % [' '*level,k] - value.each do |v| - buff << "%s %-#{40-(level+1)}s" % [' '*(level+1),v] - end - else - buff << "%s %-#{40-level}s %s" % [ ' '*level, k, value.inspect ] - end - end - end + # # Dump args... + # def self.dump( buff, env, level=0 ) + # env.each_pair do |k,value| + # if value.respond_to?(:each_pair) + # buff << "%s %-#{40-level}s" % [' '*level,k] + # dump( buff, env[k], level+1 ) + # elsif value.instance_of?(Array) + # buff << "%s %-#{40-level}s" % [' '*level,k] + # value.each do |v| + # buff << "%s %-#{40-(level+1)}s" % [' '*(level+1),v] + # end + # else + # buff << "%s %-#{40-level}s %s" % [ ' '*level, k, value.inspect ] + # end + # end + # end end end \ No newline at end of file