ramon 0.3.3 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,28 +1,71 @@
1
1
  def require_local(file)
2
- require File.join(File.dirname(__FILE__), 'ramon', file)
2
+ require File.join(File.dirname(__FILE__), "ramon", file)
3
3
  end
4
4
 
5
- require_local "version"
6
- require_local "log_factory"
7
- require_local "remote"
8
- require_local "catcher"
5
+ require_local "version"
6
+ require_local "sender"
7
+ require_local "configuration"
8
+ require_local "catcher"
9
9
  require_local "exception_data"
10
10
  require_local "controller_exception_data"
11
11
  require_local "enviroment_data"
12
12
 
13
- require_local 'integration/rails' if defined?(Rails)
14
- require_local 'railtie' if defined?(Rails)
13
+ require_local "integration/rails" if defined?(Rails)
14
+ require_local "railtie" if defined?(Rails)
15
15
 
16
16
  module Ramon
17
17
 
18
- def self.log(message, tags=nil)
19
- log_hash = Log.log(message, tags)
20
- Remote.post('log', log_hash)
21
- end
18
+ class << self
22
19
 
23
- def self.post(type, data)
24
- Remote.post(type, data)
25
- end
20
+ # The sender object is responsible for delivering formatted data to the Amon server.
21
+ attr_accessor :sender
26
22
 
27
- end
23
+ # Ramon configuration object. Must act like a hash and return sensible
24
+ # values for all configuration options.
25
+ attr_writer :configuration
26
+
27
+ # Call this method to modify defaults in your initializers.
28
+ #
29
+ # @example
30
+ # Ramon.configure do |config|
31
+ # config.app_key = '1234567890abcdef'
32
+ # config.host = 'http://127.0.0.1'
33
+ # config.port = 2464
34
+ # end
35
+ def configure()
36
+ yield(configuration)
37
+ self.sender = Sender.new(configuration)
38
+ self.sender
39
+ end
40
+
41
+ # The configuration object.
42
+ # @see Ramon.configure
43
+ def configuration
44
+ @configuration ||= Configuration.new
45
+ end
46
+
47
+
48
+ # Look for the Rails logger currently defined
49
+ def logger
50
+ self.configuration.logger
51
+ end
52
+
53
+ def format_log(message, tags=nil)
54
+ tags ||= 'notset'
55
+ log = {"message" => message, "tags" => tags}
56
+ log
57
+ end
58
+
59
+ def log(message, tags=nil)
60
+ log = format_log(message, tags)
61
+ sender.post('log', log)
62
+ end
63
+
64
+ def post(type, data)
65
+ sender.post(type, data)
66
+ end
67
+
68
+ end # self end
69
+
70
+ end # module end
28
71
 
@@ -1,22 +1,22 @@
1
1
  module Ramon
2
- class Catcher
3
- class << self
4
-
5
- def handle_with_controller(exception, controller=nil, request=nil)
6
- data = ControllerExceptionData.new(exception, controller, request)
7
- Ramon.post('exception', data)
8
- end
9
-
10
- def handle_with_rack(exception, environment, request)
11
- data = RackExceptionData.new(exception, environment, request)
12
- Ramon.post('exception', data)
13
- end
2
+ class Catcher
3
+ class << self
14
4
 
15
- def handle(exception, name=nil)
16
- data = ExceptionData.new(exception, name)
17
- Ramon.post('exception', data)
18
- end
5
+ def handle_with_controller(exception, controller=nil, request=nil)
6
+ data = ControllerExceptionData.new(exception, controller, request)
7
+ Ramon.post('exception', data)
8
+ end
19
9
 
20
- end
21
- end # class end
10
+ def handle_with_rack(exception, environment, request)
11
+ data = RackExceptionData.new(exception, environment, request)
12
+ Ramon.post('exception', data)
13
+ end
14
+
15
+ def handle(exception, name=nil)
16
+ data = ExceptionData.new(exception, name)
17
+ Ramon.post('exception', data)
18
+ end
19
+
20
+ end
21
+ end # class end
22
22
  end # module end
@@ -0,0 +1,63 @@
1
+ module Ramon
2
+ class Configuration
3
+ class ConfigurationException < StandardError; end
4
+ OPTIONS = [:app_key, :host, :port, :secret,
5
+ :environment_name, :framework, :project_root].freeze
6
+
7
+ # The Aplication key. Only in Amon Plus.
8
+ attr_accessor :app_key
9
+
10
+ # Secret key, used for securely logging in the normal Amon version
11
+ attr_accessor :secret
12
+
13
+ # The host to connect to (defaults to 127.0.0.1).
14
+ attr_accessor :host
15
+
16
+ # The port on which your Amon instance runs. Defaults to 2464
17
+ attr_accessor :port
18
+
19
+ # The name of the environment the application is running in
20
+ attr_accessor :environment_name
21
+
22
+ # The path to the project in which the error occurred, such as the RAILS_ROOT
23
+ attr_accessor :project_root
24
+
25
+ # The framework Ramon is configured to use
26
+ attr_accessor :framework
27
+
28
+ # The logger used by Amon
29
+ attr_accessor :logger
30
+
31
+ def initialize
32
+ @host = 'http://127.0.0.1'
33
+ @port = 2464
34
+ @app_key = ''
35
+ @secret = ''
36
+ @framework = 'Standalone'
37
+ end
38
+
39
+
40
+ # Allows config options to be read like a hash
41
+ #
42
+ # @param [Symbol] option Key for a given attribute
43
+ def [](option)
44
+ send(option)
45
+ end
46
+
47
+ # Returns a hash of all configurable options
48
+ def to_hash
49
+ OPTIONS.inject({}) do |hash, option|
50
+ hash.merge(option.to_sym => send(option))
51
+ end
52
+ end
53
+
54
+ # Returns a hash of all configurable options merged with +hash+
55
+ #
56
+ # @param [Hash] hash A set of configuration options that will take precedence over the defaults
57
+ def merge(hash)
58
+ to_hash.merge(hash)
59
+ end
60
+
61
+
62
+ end # Class end
63
+ end # Module end
@@ -1,59 +1,59 @@
1
1
  require 'digest/md5'
2
2
 
3
3
  module Ramon
4
- class ControllerExceptionData < ExceptionData
5
- def initialize(exception, controller=nil, request=nil)
6
- super(exception)
7
- @request = request
8
- @controller = controller
9
- end
4
+ class ControllerExceptionData < ExceptionData
5
+ def initialize(exception, controller=nil, request=nil)
6
+ super(exception)
7
+ @request = request
8
+ @controller = controller
9
+ end
10
10
 
11
- def framework
12
- "rails"
13
- end
11
+ def framework
12
+ "rails"
13
+ end
14
14
 
15
- def additional_data
16
- return {} if @request.nil?
17
- {
18
- 'request' => {
19
- 'url' => (@request.respond_to?(:url) ? @request.url : "#{@request.protocol}#{@request.host}#{@request.request_uri}"),
20
- 'controller' => @controller.class.to_s,
21
- 'action' => (@request.respond_to?(:parameters) ? @request.parameters['action'] : @request.params['action']),
22
- 'parameters' => filter_paramaters(@request.respond_to?(:parameters) ? @request.parameters : @request.params),
23
- 'request_method' => @request.request_method.to_s,
24
- 'remote_ip' => (@request.respond_to?(:remote_ip) ? @request.remote_ip : @request.ip),
25
- #'headers' => extract_http_headers(@request.env),
26
- 'session' => self.class.sanitize_session(@request)
27
- }
28
- }
29
- end
15
+ def additional_data
16
+ return {} if @request.nil?
17
+ {
18
+ 'request' => {
19
+ 'url' => (@request.respond_to?(:url) ? @request.url : "#{@request.protocol}#{@request.host}#{@request.request_uri}"),
20
+ 'controller' => @controller.class.to_s,
21
+ 'action' => (@request.respond_to?(:parameters) ? @request.parameters['action'] : @request.params['action']),
22
+ 'parameters' => filter_paramaters(@request.respond_to?(:parameters) ? @request.parameters : @request.params),
23
+ 'request_method' => @request.request_method.to_s,
24
+ 'remote_ip' => (@request.respond_to?(:remote_ip) ? @request.remote_ip : @request.ip),
25
+ #'headers' => extract_http_headers(@request.env),
26
+ 'session' => self.class.sanitize_session(@request)
27
+ }
28
+ }
29
+ end
30
30
 
31
- def filter_hash(keys_to_filter, hash)
32
- if keys_to_filter.is_a?(Array) && !keys_to_filter.empty?
33
- hash.each do |key, value|
34
- if value.respond_to?(:to_hash)
35
- filter_hash(keys_to_filter, hash[key])
36
- elsif key_match?(key, keys_to_filter)
37
- hash[key] = "[FILTERED]"
38
- end
39
- end
40
- end
41
- hash
42
- end
31
+ def filter_hash(keys_to_filter, hash)
32
+ if keys_to_filter.is_a?(Array) && !keys_to_filter.empty?
33
+ hash.each do |key, value|
34
+ if value.respond_to?(:to_hash)
35
+ filter_hash(keys_to_filter, hash[key])
36
+ elsif key_match?(key, keys_to_filter)
37
+ hash[key] = "[FILTERED]"
38
+ end
39
+ end
40
+ end
41
+ hash
42
+ end
43
43
 
44
- def key_match?(key, keys_to_filter)
45
- keys_to_filter.map {|k| k.to_s}.include?(key.to_s)
46
- end
44
+ def key_match?(key, keys_to_filter)
45
+ keys_to_filter.map {|k| k.to_s}.include?(key.to_s)
46
+ end
47
47
 
48
- def filter_paramaters(hash)
49
- if @request.respond_to?(:env) && @request.env["action_dispatch.parameter_filter"]
50
- filter_hash(@request.env["action_dispatch.parameter_filter"], hash)
51
- elsif @controller.respond_to?(:filter_parameters)
52
- @controller.send(:filter_parameters, hash)
53
- else
54
- hash
55
- end
56
- end
48
+ def filter_paramaters(hash)
49
+ if @request.respond_to?(:env) && @request.env["action_dispatch.parameter_filter"]
50
+ filter_hash(@request.env["action_dispatch.parameter_filter"], hash)
51
+ elsif @controller.respond_to?(:filter_parameters)
52
+ @controller.send(:filter_parameters, hash)
53
+ else
54
+ hash
55
+ end
56
+ end
57
57
 
58
- end # class end
58
+ end # class end
59
59
  end # module end
@@ -1,37 +1,37 @@
1
1
  require 'digest/md5'
2
2
 
3
3
  module Ramon
4
- class ApplicationEnvironment
5
- def self.to_hash(framework)
6
- {
7
- 'language' => 'ruby',
8
- 'language_version' => language_version_string,
9
- 'framework' => framework,
10
- #'libraries_loaded' => libraries_loaded
11
- }
12
- end
4
+ class ApplicationEnvironment
5
+ def self.to_hash(framework)
6
+ {
7
+ 'language' => 'ruby',
8
+ 'language_version' => language_version_string,
9
+ 'framework' => framework,
10
+ #'libraries_loaded' => libraries_loaded
11
+ }
12
+ end
13
13
 
14
-
15
- def self.get_hostname
16
- require 'socket' unless defined?(Socket)
17
- Socket.gethostname
18
- rescue
19
- 'UNKNOWN'
20
- end
21
14
 
22
- def self.language_version_string
23
- "#{RUBY_VERSION rescue '?.?.?'} p#{RUBY_PATCHLEVEL rescue '???'}
24
- #{RUBY_RELEASE_DATE rescue '????-??-??'} #{RUBY_PLATFORM rescue '????'}"
25
- end
15
+ def self.get_hostname
16
+ require 'socket' unless defined?(Socket)
17
+ Socket.gethostname
18
+ rescue
19
+ 'UNKNOWN'
20
+ end
26
21
 
22
+ def self.language_version_string
23
+ "#{RUBY_VERSION rescue '?.?.?'} p#{RUBY_PATCHLEVEL rescue '???'}
24
+ #{RUBY_RELEASE_DATE rescue '????-??-??'} #{RUBY_PLATFORM rescue '????'}"
25
+ end
27
26
 
28
- def self.libraries_loaded
29
- begin
30
- return Hash[*Gem.loaded_specs.map{|name, gem_specification| [name, gem_specification.version.to_s]}.flatten]
31
- rescue
32
- end
33
- {}
34
- end
35
27
 
36
- end # class end
28
+ def self.libraries_loaded
29
+ begin
30
+ return Hash[*Gem.loaded_specs.map{|name, gem_specification| [name, gem_specification.version.to_s]}.flatten]
31
+ rescue
32
+ end
33
+ {}
34
+ end
35
+
36
+ end # class end
37
37
  end # module end
@@ -1,99 +1,99 @@
1
1
  module Ramon
2
- class ExceptionData
3
-
4
- def initialize(exception, name=nil)
5
- @exception = exception
6
- @name = name
7
- end
8
-
9
- def to_hash
10
- hash = {}
11
- # We need the url before the main exception info
12
- hash['data'] = additional_data
13
-
14
- hash.merge!({
15
- 'exception_class' => @exception.class.to_s,
16
- 'message' => @exception.message,
17
- 'backtrace' => @exception.backtrace,
18
- 'url' => hash['data']['request']['url']
19
- })
20
-
21
- hash['data'].merge!(ApplicationEnvironment.to_hash(framework))
22
- hash['data'].merge!(context_stuff)
23
- hash['data'].merge!(extra_stuff)
24
- self.class.sanitize_hash(hash)
25
- end
26
-
27
- def extra_stuff
28
- if @name
29
- {'name' => @name}
30
- else
31
- {}
32
- end
33
- end
34
-
35
- def context_stuff
36
- context = Thread.current[:exceptional_context]
37
- (context.nil? || context.empty?) ? {} : {'context' => context}
38
- end
39
-
40
- def framework
41
- nil
42
- end
43
-
44
-
45
- def self.sanitize_hash(hash)
46
-
47
- case hash
48
- when Hash
49
- hash.inject({}) do |result, (key, value)|
50
- result.update(key => sanitize_hash(value))
51
- end
52
- when Array
53
- hash.collect{|value| sanitize_hash(value)}
54
- when Fixnum, String, Bignum
55
- hash
56
- else
57
- hash.to_s
58
- end
59
- rescue Exception => e
60
- {}
61
- end
62
-
63
- def extract_http_headers(env)
64
- headers = {}
65
- env.select{|k, v| k =~ /^HTTP_/}.each do |name, value|
66
- proper_name = name.sub(/^HTTP_/, '').split('_').map{|upper_case| upper_case.capitalize}.join('-')
67
- headers[proper_name] = value
68
- end
69
- unless headers['Cookie'].nil?
70
- headers['Cookie'] = headers['Cookie'].sub(/_session=\S+/, '_session=[FILTERED]')
71
- end
72
- headers
73
- end
74
-
75
- def self.sanitize_session(request)
76
-
77
- session_hash = {'session_id' => "", 'data' => {}}
78
-
79
- if request.respond_to?(:session)
80
-
81
- session = request.session
82
- session_hash['session_id'] = request.session_options ? request.session_options[:id] : nil
83
- session_hash['session_id'] ||= session.respond_to?(:session_id) ? session.session_id : session.instance_variable_get("@session_id")
84
- session_hash['data'] = session.respond_to?(:to_hash) ? session.to_hash : session.instance_variable_get("@data") || {}
85
- session_hash['session_id'] ||= session_hash['data'][:session_id]
86
- session_hash['data'].delete(:session_id)
87
- end
88
-
89
- # Don't return the session hash if there is nothing in it
90
- if session_hash['session_id'].nil? && session_hash['data'].empty?
91
- {}
92
- else
93
- self.sanitize_hash(session_hash)
94
- end
95
-
96
- end
97
-
98
- end # class end
2
+ class ExceptionData
3
+
4
+ def initialize(exception, name=nil)
5
+ @exception = exception
6
+ @name = name
7
+ end
8
+
9
+ def to_hash
10
+ hash = {}
11
+ # We need the url before the main exception info
12
+ hash['data'] = additional_data
13
+
14
+ hash.merge!({
15
+ 'exception_class' => @exception.class.to_s,
16
+ 'message' => @exception.message,
17
+ 'backtrace' => @exception.backtrace,
18
+ 'url' => hash['data']['request']['url']
19
+ })
20
+
21
+ hash['data'].merge!(ApplicationEnvironment.to_hash(framework))
22
+ hash['data'].merge!(context_stuff)
23
+ hash['data'].merge!(extra_stuff)
24
+ self.class.sanitize_hash(hash)
25
+ end
26
+
27
+ def extra_stuff
28
+ if @name
29
+ {'name' => @name}
30
+ else
31
+ {}
32
+ end
33
+ end
34
+
35
+ def context_stuff
36
+ context = Thread.current[:exceptional_context]
37
+ (context.nil? || context.empty?) ? {} : {'context' => context}
38
+ end
39
+
40
+ def framework
41
+ nil
42
+ end
43
+
44
+
45
+ def self.sanitize_hash(hash)
46
+
47
+ case hash
48
+ when Hash
49
+ hash.inject({}) do |result, (key, value)|
50
+ result.update(key => sanitize_hash(value))
51
+ end
52
+ when Array
53
+ hash.collect{|value| sanitize_hash(value)}
54
+ when Fixnum, String, Bignum
55
+ hash
56
+ else
57
+ hash.to_s
58
+ end
59
+ rescue Exception => e
60
+ {}
61
+ end
62
+
63
+ def extract_http_headers(env)
64
+ headers = {}
65
+ env.select{|k, v| k =~ /^HTTP_/}.each do |name, value|
66
+ proper_name = name.sub(/^HTTP_/, '').split('_').map{|upper_case| upper_case.capitalize}.join('-')
67
+ headers[proper_name] = value
68
+ end
69
+ unless headers['Cookie'].nil?
70
+ headers['Cookie'] = headers['Cookie'].sub(/_session=\S+/, '_session=[FILTERED]')
71
+ end
72
+ headers
73
+ end
74
+
75
+ def self.sanitize_session(request)
76
+
77
+ session_hash = {'session_id' => "", 'data' => {}}
78
+
79
+ if request.respond_to?(:session)
80
+
81
+ session = request.session
82
+ session_hash['session_id'] = request.session_options ? request.session_options[:id] : nil
83
+ session_hash['session_id'] ||= session.respond_to?(:session_id) ? session.session_id : session.instance_variable_get("@session_id")
84
+ session_hash['data'] = session.respond_to?(:to_hash) ? session.to_hash : session.instance_variable_get("@data") || {}
85
+ session_hash['session_id'] ||= session_hash['data'][:session_id]
86
+ session_hash['data'].delete(:session_id)
87
+ end
88
+
89
+ # Don't return the session hash if there is nothing in it
90
+ if session_hash['session_id'].nil? && session_hash['data'].empty?
91
+ {}
92
+ else
93
+ self.sanitize_hash(session_hash)
94
+ end
95
+
96
+ end
97
+
98
+ end # class end
99
99
  end # module end
@@ -6,6 +6,17 @@ class Railtie < Rails::Railtie
6
6
  initializer "amon.middleware" do |app|
7
7
  app.config.middleware.use "Rack::RailsAmonException"
8
8
  end
9
- end
10
- end
9
+
10
+
11
+ config.after_initialize do
12
+ Ramon.configure do |config|
13
+ config.logger ||= ::Rails.logger
14
+ config.environment_name ||= ::Rails.env
15
+ config.project_root ||= ::Rails.root
16
+ config.framework = "Rails: #{::Rails::VERSION::STRING}"
17
+ end
18
+ end
19
+
20
+ end # class end
21
+ end # module end
11
22
 
@@ -0,0 +1,65 @@
1
+ require 'net/http'
2
+ require 'json'
3
+ require 'zlib'
4
+
5
+ module Ramon
6
+ class Sender
7
+ def initialize(options = {})
8
+ [ :host,
9
+ :port,
10
+ :app_key,
11
+ :secret
12
+ ].each do |option|
13
+ instance_variable_set("@#{option}", options[option])
14
+ end
15
+ end
16
+
17
+
18
+ attr_reader :host,
19
+ :port,
20
+ :app_key,
21
+ :secret
22
+
23
+ def log(level, message)
24
+ logger.send level, '** Amon '+ message
25
+ end
26
+
27
+
28
+ def logger
29
+ Ramon.logger
30
+ end
31
+
32
+
33
+ def url
34
+ URI.parse("#{host}:#{port}/api/")
35
+ end
36
+
37
+ def post(type, data)
38
+
39
+ if type == 'log'
40
+ @url = "#{url}log/#{app_key}"
41
+ else
42
+ @url = "#{url}exception/#{app_key}"
43
+ end
44
+
45
+ request = Net::HTTP::Post.new(@url, initheader = {'Content-Type' =>'application/json'})
46
+ request.body = data.to_json
47
+
48
+ begin
49
+ response = Net::HTTP.new(url.host, url.port).start {|http| http.request(request) }
50
+ case response
51
+ when Net::HTTPSuccess
52
+ log :error, "#{@url} - #{response.message}"
53
+ return response
54
+ else
55
+ log :error, "#{@url} - #{response.code} - #{response.message}"
56
+ end
57
+ rescue Exception => e
58
+ log :error, "[Ramon::Sender#post] Cannot send data to #{@url} Error: #{e.class} - #{e.message}"
59
+ nil
60
+ end
61
+
62
+ end
63
+
64
+ end # Class end
65
+ end # Module end
@@ -1,3 +1,3 @@
1
1
  module Ramon
2
- VERSION = "0.3.3"
2
+ VERSION = "0.4.0"
3
3
  end
@@ -0,0 +1,13 @@
1
+ require 'spec_helper'
2
+
3
+ module Ramon
4
+ describe Configuration do
5
+
6
+ it "should provide default values" do
7
+ config = Ramon::Configuration.new
8
+ config.port.should == 2464
9
+ config.host.should == 'http://127.0.0.1'
10
+ end
11
+
12
+ end
13
+ end # end module
@@ -1,40 +1,40 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  module Ramon
4
- describe Log do
4
+ describe "log" do
5
5
 
6
6
  it "should return a hash with tags - debug and message - test" do
7
- @log = Log.log('test', 'debug')
7
+ @log = Ramon.format_log('test', 'debug')
8
8
  @log.should == {"tags" => "debug", "message" => "test"}
9
9
  end
10
10
 
11
11
  it "should return a hash with tags - info and message - test" do
12
- @log = Log.log('test', 'info')
12
+ @log = Ramon.format_log('test', 'info')
13
13
  @log.should == {"tags" => "info", "message" => "test"}
14
14
  end
15
15
 
16
16
  it "should return a hash with tags - notset and message - test" do
17
- @log = Log.log('test')
17
+ @log = Ramon.format_log('test')
18
18
  @log.should == {"tags" => "notset", "message" => "test"}
19
19
  end
20
20
 
21
21
  it "should return a hash with tags - notset and a message hash" do
22
- @log = Log.log({:test => "test value", :more => "even more value"})
22
+ @log = Ramon.format_log({:test => "test value", :more => "even more value"})
23
23
  @log.should == {"tags" => "notset", "message"=>{:more=>"even more value", :test=>"test value"}}
24
24
  end
25
25
 
26
26
  it "should return a hash with tags - debug and a message hash" do
27
- @log = Log.log({:test => "test value", :more => "even more value"},'debug')
27
+ @log = Ramon.format_log({:test => "test value", :more => "even more value"},'debug')
28
28
  @log.should == {"tags" => "debug", "message"=>{:more=>"even more value", :test=>"test value"}}
29
29
  end
30
30
 
31
31
  it "should return a hash with tags - notset and a message array" do
32
- @log = Log.log([1,2,3,4])
32
+ @log = Ramon.format_log([1,2,3,4])
33
33
  @log.should == {"tags" => "notset", "message"=>[1,2,3,4]}
34
34
  end
35
35
 
36
36
  it "should return an array with tags - debug, benchmark and a message string" do
37
- @log = Log.log("test", ["debug", "benchmark"])
37
+ @log = Ramon.format_log("test", ["debug", "benchmark"])
38
38
  @log.should == {"tags" => ["debug", "benchmark"], "message"=>"test"}
39
39
  end
40
40
 
@@ -1,22 +1,30 @@
1
1
  require 'spec_helper'
2
2
 
3
- # Works only when the Amon application is started
4
- describe 'Web app test' do
3
+ module Ramon
4
+ # Works only when the Amon application is started
5
+ describe 'Web app test' do
5
6
 
6
- it 'Test logging' do
7
- Ramon.log([1,2,3,4]).response.code.should == "200"
8
- Ramon.log({:test => 'data', :more_test => 'more_data'}).response.code.should == "200"
9
- end
10
-
11
- it 'Test logging with multiple tags' do
12
- Ramon.log("test", ['debug', 'benchmark']).response.code.should == "200"
13
- Ramon.log({:test => 'data', :more_test => 'more_data'}, ['info','warning','user']).response.code.should == "200"
14
- end
7
+ it 'Test logging' do
15
8
 
9
+ Ramon.configure do |config|
10
+ config.host = 'http://127.0.0.1'
11
+ config.port = 2464
12
+ end
13
+
14
+ Ramon.log([1,2,3,4]).response.code.should == "200"
15
+ Ramon.log({:test => 'data', :more_test => 'more_data'}).response.code.should == "200"
16
+ end
16
17
 
17
- it 'Test Exceptions' do
18
- Ramon.post('exception', {:url => 'test', :exception_class => 'test_me'}).response.code.should == "200"
19
- end
18
+ it 'Test logging with multiple tags' do
19
+ Ramon.log("test", ['debug', 'benchmark']).response.code.should == "200"
20
+ Ramon.log({:test => 'data', :more_test => 'more_data'}, ['info','warning','user']).response.code.should == "200"
21
+ end
20
22
 
21
- end
23
+
24
+ it 'Test Exceptions' do
25
+ Ramon.post('exception', {:url => 'test', :exception_class => 'test_me'}).response.code.should == "200"
26
+ end
27
+
28
+ end
29
+ end
22
30
 
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ramon
3
3
  version: !ruby/object:Gem::Version
4
- hash: 21
4
+ hash: 15
5
5
  prerelease: false
6
6
  segments:
7
7
  - 0
8
- - 3
9
- - 3
10
- version: 0.3.3
8
+ - 4
9
+ - 0
10
+ version: 0.4.0
11
11
  platform: ruby
12
12
  authors:
13
13
  - martinrusev
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2012-01-03 00:00:00 +00:00
18
+ date: 2012-02-23 00:00:00 +00:00
19
19
  default_executable:
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
@@ -47,21 +47,19 @@ files:
47
47
  - Rakefile
48
48
  - lib/ramon.rb
49
49
  - lib/ramon/catcher.rb
50
- - lib/ramon/config.rb
50
+ - lib/ramon/configuration.rb
51
51
  - lib/ramon/controller_exception_data.rb
52
52
  - lib/ramon/enviroment_data.rb
53
53
  - lib/ramon/exception_data.rb
54
54
  - lib/ramon/integration/rails.rb
55
- - lib/ramon/log_factory.rb
56
55
  - lib/ramon/railtie.rb
57
- - lib/ramon/remote.rb
56
+ - lib/ramon/sender.rb
58
57
  - lib/ramon/version.rb
59
58
  - ramon.gemspec
60
59
  - spec/config_spec.rb
61
60
  - spec/exception_data_spec.rb
62
- - spec/logger_spec.rb
61
+ - spec/log_spec.rb
63
62
  - spec/rails_integration_spec.rb
64
- - spec/remote_spec.rb
65
63
  - spec/spec_helper.rb
66
64
  - spec/web_spec.rb
67
65
  has_rdoc: true
@@ -1,48 +0,0 @@
1
- require 'json'
2
-
3
- module Ramon
4
- class Config
5
- class ConfigurationException < StandardError; end
6
-
7
- class << self
8
- DEFAULTS = {
9
- :host => '127.0.0.1',
10
- :port => 2464
11
- }
12
-
13
- def load
14
- config_file ||= "/etc/amon.conf"
15
-
16
- if File.file?(config_file)
17
- begin
18
- f = File.read(config_file)
19
- config = JSON.parse(f)
20
-
21
- @app_key = config['application_key'] unless config['application_key'].nil?
22
- @port = config['web_app']['port'].to_i unless config['web_app']['port'].nil?
23
- @host = config['web_app']['host'].to_s unless config['web_app']['host'].nil?
24
-
25
- rescue Exception => e
26
- raise ConfigurationException.new("Unable to load configuration file: #{config_file}")
27
- end
28
- else
29
- puts "Amon::Config.load - /etc/amon.conf not found"
30
- end
31
- end
32
-
33
- def application_root
34
- (defined?(Rails) && Rails.respond_to?(:root)) ? Rails.root : Dir.pwd
35
- end
36
-
37
- def port
38
- @port ||= DEFAULTS[:port]
39
- end
40
-
41
- def host
42
- @host ||= DEFAULTS[:host]
43
- end
44
-
45
- end # self end
46
- load
47
- end # Config end
48
- end # Module end
@@ -1,46 +0,0 @@
1
- require 'logger'
2
- require 'date'
3
-
4
- module Ramon
5
- class Log
6
-
7
- def self.log(message, tags=nil)
8
- tags ||= 'notset'
9
- log = {"message" => message, "tags" => tags}
10
-
11
- log
12
- end
13
-
14
- end # class end
15
-
16
- # Used internally
17
- class LogFactory
18
-
19
- def self.log
20
- @logger ||= define_internal_logger
21
- end
22
-
23
- private
24
- def self.define_internal_logger
25
- log_dir = File.join(Config.application_root, 'log')
26
- Dir.mkdir(log_dir) unless File.directory?(log_dir)
27
- log_path = File.join(log_dir, "/ramon.log")
28
-
29
- log = Logger.new(log_path)
30
- log.level = Logger::INFO
31
-
32
- log.formatter = proc do |severity, datetime, progname, msg|
33
- "#{datetime}: #{msg} -- #{severity}\n"
34
- end
35
-
36
- log
37
- end
38
-
39
- end # class end
40
-
41
- end # module end
42
-
43
-
44
-
45
-
46
-
@@ -1,35 +0,0 @@
1
- require 'net/http'
2
- require 'json'
3
- require 'zlib'
4
- require "#{File.dirname(__FILE__)}/config"
5
-
6
- module Ramon
7
- class Remote
8
- def self.post(type, data)
9
-
10
- if type == 'log'
11
- @url = '/api/log'
12
- else
13
- @url = '/api/exception'
14
- end
15
-
16
- request = Net::HTTP::Post.new(@url, initheader = {'Content-Type' =>'application/json'})
17
- request.body = data.to_json
18
-
19
- begin
20
- response = Net::HTTP.new(Config::host, Config::port).start {|http| http.request(request) }
21
- case response
22
- when Net::HTTPSuccess
23
- LogFactory.log.info( "#{@url} - #{response.message}")
24
- return response
25
- else
26
- LogFactory.log.error("#{@url} - #{response.code} - #{response.message}")
27
- end
28
- rescue Exception => e
29
- LogFactory.log.error(e)
30
- end
31
-
32
- end
33
- end # class end
34
- end # module end
35
-
File without changes