Patches: Browse | Submit New | Admin

[#21783] Add ActiveRecord-style logging for facebook API calls

Date:
2008-09-03 01:46
Priority:
3
Submitted By:
Victor Costan (costan)
Assigned To:
Nobody (None)
Category:
None
State:
Open
Summary:
Add ActiveRecord-style logging for facebook API calls

Detailed description
This is incredibly useful when taking a first look at performance. I think facebook API calls are at least as eligible
for logging as ActiveRecord, as they take up a lot of time.




Index: facebooker/lib/facebooker/logging.rb
===================================================================
--- facebooker/lib/facebooker/logging.rb	(revision 0)
+++ facebooker/lib/facebooker/logging.rb	(revision 0)
@@ -0,0 +1,64 @@
+module Facebooker
+  @@logger = nil
+  def self.logger=(logger)
+    @@logger = logger
+  end
+  def self.logger
+    @logger
+  end
+
+  module Logging
+    @@row_even = false
+    def self.log_fb_api(method, params)
+      message = method # might customize later
+      dump = format_fb_params(params)
+      if block_given?
+        result = nil
+        seconds = Benchmark.realtime { result = yield }
+        log_info(message, dump, seconds)
+        result
+      else
+        log_info(message, dump)
+        nil
+      end
+    rescue Exception => e
+      # Log message and raise exception.
+      # Set last_verification to 0, so that connection gets verified
+      # upon reentering the request loop
+      exception = "#{e.class.name}: #{e.message}: #{dump}"
+      log_info(message, exception)
+      raise
+    end
+    
+    def self.format_fb_params(params)
+      filtered_params = params.reject do |k, v| 
+        %w(method api_key session_key call_id).index k.to_s
+      end
+      filtered_params.to_a.map { |kvp| "#{kvp[0]} = #{kvp[1]}" }.join(', ')
+    end
+    
+    def self.log_info(message, dump, seconds = 0)
+      logger = Facebooker.logger || ActiveRecord::Base.logger
+      logger.info format_log_entry("#{message} (#{'%f' % seconds})", dump)
+    end
+    
+    # stolen from active record  
+    def self.format_log_entry(message, dump = nil)
+      if ActiveRecord::Base.colorize_logging
+        if @@row_even
+          @@row_even = false
+          message_color, dump_color = "4;36;1", "0;1"
+        else
+          @@row_even = true
+          message_color, dump_color = "4;35;1", "0"
+        end
+  
+        log_entry = "  \e[#{message_color}m#{message}\e[0m   "
+        log_entry << "\e[#{dump_color}m%#{String === dump ? 's' : 'p'}\e[0m" % dump if dump
+        log_entry
+      else
+        "%s  %s" % [message, dump]
+      end
+    end    
+  end  
+end
\ No newline at end of file
Index: facebooker/lib/facebooker/session.rb
===================================================================
--- facebooker/lib/facebooker/session.rb	(revision 479)
+++ facebooker/lib/facebooker/session.rb	(working copy)
@@ -456,7 +456,7 @@
       BatchRun.current_batch=nil
     end
     
-    def post(method, params = {},use_session_key=true,&proc)
+    def post(method, params = {},use_session_key=true,&proc)      
       add_facebook_params(params, method)
       use_session_key && @session_key && params[:session_key] ||= @session_key
       final_params=params.merge(:sig => signature_for(params))
@@ -463,7 +463,7 @@
       if batch_request?
         add_to_batch(final_params,&proc)
       else
-        result=service.post(final_params)
+        result = Logging.log_fb_api(method, params) { service.post(final_params) }
         result = yield result if block_given?
         result
       end
@@ -470,9 +470,11 @@
     end
     
     def post_file(method, params = {})
-      add_facebook_params(params, method)
-      @session_key && params[:session_key] ||= @session_key
-      service.post_file(params.merge(:sig => signature_for(params.reject{|key, value| key.nil?})))
+      Logging.log_fb_api(method, params) do
+        add_facebook_params(params, method)
+        @session_key && params[:session_key] ||= @session_key
+        service.post_file(params.merge(:sig => signature_for(params.reject{|key, value| key.nil?})))
+      end
     end
     
     
Index: facebooker/lib/facebooker.rb
===================================================================
--- facebooker/lib/facebooker.rb	(revision 479)
+++ facebooker/lib/facebooker.rb	(working copy)
@@ -20,6 +20,7 @@
 require 'digest/md5'
 require 'facebooker/batch_request'
 require 'facebooker/feed'
+require 'facebooker/logging'
 require 'facebooker/model'
 require 'facebooker/parser'
 require 'facebooker/service'

Add A Comment: Notepad

Please login


Followup

No Followups Have Been Posted

Attached Files:

Name Description Download
No Files Currently Attached

Changes:

No Changes Have Been Made to This Item