dlogger 0.0.2 → 0.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/ChangeLog ADDED
@@ -0,0 +1,4 @@
1
+
2
+ = 0.0.3
3
+
4
+ - Added SplunkStorm output
data/Gemfile CHANGED
@@ -3,11 +3,17 @@ source 'https://rubygems.org'
3
3
  # Specify your gem's dependencies in dlogger.gemspec
4
4
  gemspec
5
5
 
6
- gem 'eventmachine', '~> 1.0.0.beta'
6
+ gem 'eventmachine', '~> 1.0.0.rc.1'
7
+ gem 'em-http-request'
7
8
  gem 'yajl-ruby'
8
9
 
9
10
  group(:test) do
10
- gem 'schmurfy-bacon', '~> 1.2.1'
11
+ gem 'rake'
12
+
13
+ gem 'thin'
14
+ gem 'em-synchrony'
15
+
16
+ gem 'schmurfy-bacon', '~> 1.4.1'
11
17
  gem 'mocha', '~> 0.10.0'
12
18
  gem 'simplecov'
13
19
  gem 'schmurfy-em-spec'
@@ -15,5 +21,8 @@ group(:test) do
15
21
  gem 'guard-bacon'
16
22
  gem 'rb-fsevent'
17
23
  gem 'growl'
24
+
25
+ gem 'tilt'
26
+ gem 'guard-tilt'
18
27
  end
19
28
 
data/dlogger.gemspec CHANGED
@@ -14,8 +14,4 @@ Gem::Specification.new do |gem|
14
14
  gem.name = "dlogger"
15
15
  gem.require_paths = ["lib"]
16
16
  gem.version = Dlogger::VERSION
17
-
18
- gem.add_development_dependency('rake')
19
- gem.add_development_dependency('tilt')
20
- gem.add_development_dependency('guard-tilt')
21
17
  end
@@ -0,0 +1,27 @@
1
+ require 'rubygems'
2
+ require 'eventmachine'
3
+ require 'em-http-request'
4
+ require 'yajl'
5
+
6
+ require 'bundler/setup'
7
+
8
+ require 'dlogger'
9
+ require 'dlogger/outputs/em/splunkstorm'
10
+
11
+ logger = DLogger::Logger.new
12
+ logger.add_output( DLogger::Output::Stdout.new )
13
+
14
+ EM::run do
15
+
16
+ logger.add_output( DLogger::Output::SplunkStorm.new('http://api.splunkstorm.com',
17
+ :host => 'test.local',
18
+ :project => 'xxx',
19
+ :access_token => 'yyy'
20
+ ))
21
+
22
+ n = 0
23
+ EM::add_periodic_timer(2) do
24
+ logger.log("yeah it worked", :n => n+= 1)
25
+ end
26
+ end
27
+
@@ -4,7 +4,6 @@ module DLogger
4
4
  class Logger
5
5
  def initialize(name = "_default")
6
6
  @name = name
7
- @mutex = Mutex.new
8
7
  @outputs = []
9
8
 
10
9
  # initialize context
@@ -19,38 +18,40 @@ module DLogger
19
18
  # @param [Hash] metadata Additional data
20
19
  #
21
20
  def log(msg, metadata = {})
22
- @mutex.synchronize do
23
- # clearing a small hash is slightly faster than creating a new
24
- # one each time.
25
- merged_metadata.clear
26
-
27
- # first load context data
28
- context.each do |ctx_data|
29
- case ctx_data
30
- when Hash
31
- merged_metadata.merge!(ctx_data)
32
-
33
- when Extension
34
- ctx_data.class.properties.each do |attr_name|
35
- merged_metadata[attr_name] = ctx_data.send(attr_name)
36
- end
37
-
21
+ # clearing a small hash is slightly faster than creating a new
22
+ # one each time.
23
+ merged_metadata.clear
24
+
25
+ # first load context data
26
+ context.each do |ctx_data|
27
+ case ctx_data
28
+ when Hash
29
+ merged_metadata.merge!(ctx_data)
30
+
31
+ when Extension
32
+ ctx_data.class.properties.each do |attr_name|
33
+ merged_metadata[attr_name] = ctx_data.send(attr_name)
38
34
  end
39
- end
40
-
41
- # then add our data
42
- merged_metadata.merge!(metadata)
43
35
 
44
- # and dispatch the result
45
- dispatch(msg, merged_metadata)
36
+ end
46
37
  end
38
+
39
+ # then add our data
40
+ merged_metadata.merge!(metadata)
41
+
42
+ # and dispatch the result
43
+ dispatch(msg, merged_metadata)
47
44
  end
48
45
 
49
46
  # Helper methods to mimic the standard ruby logger interface.
50
47
  %w(debug info error warn).each do |level|
51
- define_method(level) do |msg, metadata = {}|
52
- log(msg, metadata.merge(:severity => level.to_sym))
53
- end
48
+ class_eval %{
49
+ def #{level}(msg, metadata = {})
50
+ # metadata << [:severity, :#{level}]
51
+ metadata[:severity] = :#{level}
52
+ log(msg, metadata)
53
+ end
54
+ }
54
55
  end
55
56
 
56
57
  ##
@@ -0,0 +1,48 @@
1
+ gem 'eventmachine'; require 'eventmachine'
2
+ gem 'em-http-request'; require 'em-http-request'
3
+ gem 'yajl-ruby'; require 'yajl'
4
+
5
+ #
6
+ module DLogger
7
+ module Output
8
+
9
+ class SplunkStorm < Base
10
+ API_VERSION = 1
11
+ ENDPOINT = 'inputs/http'
12
+
13
+ def initialize(url, opts = {})
14
+ @url = "#{url}/#{API_VERSION}/#{ENDPOINT}"
15
+
16
+ @access_token = opts.delete(:access_token)
17
+
18
+ @event_params = {
19
+ :sourcetype => 'json_auto_timestamp',
20
+ :host => opts.delete(:host),
21
+ :project => opts.delete(:project)
22
+ }
23
+
24
+ raise ":access_token required" unless @access_token
25
+ raise ":host required" unless @event_params[:host]
26
+ raise ":project required" unless @event_params[:project]
27
+
28
+ raise "unknown options: #{opts.inspect}" unless opts.empty?
29
+ end
30
+
31
+ def dispatch(msg, metadata)
32
+ metadata = metadata.merge(:message => msg)
33
+ http = EM::HttpRequest.new(@url).post(
34
+ :query => @event_params,
35
+ :head => {'authorization' => [@access_token, 'x']},
36
+ :body => Yajl::Encoder.encode(metadata)
37
+ )
38
+
39
+ # http.errback do
40
+ # p "ERR: #{http.response_header}"
41
+ # end
42
+
43
+ end
44
+
45
+ end
46
+
47
+ end
48
+ end
@@ -1,3 +1,3 @@
1
1
  module Dlogger
2
- VERSION = "0.0.2"
2
+ VERSION = "0.0.3"
3
3
  end
data/specs/common.rb CHANGED
@@ -2,51 +2,36 @@
2
2
  require 'rubygems'
3
3
  require 'bundler/setup'
4
4
 
5
- if (RUBY_VERSION >= "1.9") && ENV['COVERAGE']
6
- require 'simplecov'
7
-
8
- puts "[[ SimpleCov enabled ]]"
5
+ require 'bacon'
6
+
7
+ if ENV['COVERAGE']
8
+ Bacon.allow_focused_run = false
9
9
 
10
- SimpleCov.start do
11
- add_filter '/specs'
10
+ require 'simplecov'
11
+ SimpleCov.start do
12
+ add_filter ".*_spec"
13
+ add_filter "/helpers/"
12
14
  end
15
+
13
16
  end
14
17
 
15
- require 'bacon'
16
- require 'mocha'
17
-
18
- $LOAD_PATH.unshift( File.expand_path('../../lib', __FILE__) )
18
+ $LOAD_PATH.unshift( File.expand_path('../../lib' , __FILE__) )
19
19
  require 'dlogger'
20
20
 
21
+ require 'bacon/ext/mocha'
22
+ require 'bacon/ext/em'
23
+ require 'bacon/ext/http'
24
+ # require 'time_units'
25
+ # Thread.abort_on_exception = true
21
26
 
22
- Bacon.summary_at_exit
27
+ Bacon.summary_on_exit()
23
28
 
24
- module Bacon
25
- module MochaRequirementsCounter
26
- def self.increment
27
- Counter[:requirements] += 1
28
- end
29
- end
30
-
31
- class Context
32
- include Mocha::API
33
-
34
- alias_method :it_before_mocha, :it
35
-
36
- def it(description)
37
- it_before_mocha(description) do
38
- # TODO: find better than that...
39
- 1.should == 1
40
- begin
41
- mocha_setup
42
- yield
43
- mocha_verify(MochaRequirementsCounter)
44
- rescue Mocha::ExpectationError => e
45
- raise Error.new(:failed, "#{e.message}\n#{e.backtrace[0...10].join("\n")}")
46
- ensure
47
- mocha_teardown
48
- end
49
- end
50
- end
29
+
30
+ def freeze_time(t = Time.now)
31
+ Time.stubs(:now).returns(t)
32
+ if block_given?
33
+ yield
34
+ Time.unstub(:now)
51
35
  end
52
36
  end
37
+
@@ -0,0 +1,34 @@
1
+ require_relative "../../../common"
2
+
3
+ require 'dlogger/outputs/em/logstash'
4
+
5
+ $n = 0
6
+
7
+ describe "LogStash Output" do
8
+ before do
9
+ @port = 4000 + ($n += 1)
10
+ @received_data = ""
11
+
12
+ tmp = @received_data
13
+
14
+ @handler_class = Class.new(EM::Connection) do
15
+ define_method(:receive_data) do |data|
16
+ tmp << data
17
+ end
18
+ end
19
+
20
+
21
+ @server = EM::start_server('127.0.0.1', @port, @handler_class)
22
+
23
+ @logger = DLogger::Output::LogStash.new('127.0.0.1', @port)
24
+ end
25
+
26
+ should 'send message to logstash' do
27
+ @logger.dispatch('a log message', {:data => "something", :n => 21})
28
+
29
+ wait(0.1) do
30
+ @received_data.should == "{\"data\":\"something\",\"n\":21,\"message\":\"a log message\"}\n"
31
+ end
32
+ end
33
+
34
+ end
@@ -0,0 +1,43 @@
1
+ require_relative "../../../common"
2
+
3
+ require 'dlogger/outputs/em/splunkstorm'
4
+
5
+ $n = 0
6
+
7
+ describe "SplunkStorm Output" do
8
+ before do
9
+ @http_port = 4000 + ($n += 1)
10
+
11
+ @request_uri = ""
12
+ @received_data = ""
13
+
14
+ received_data = @received_data
15
+ request_uri = @request_uri
16
+
17
+ start_server do |rack|
18
+ run ->(env){
19
+ request_uri << env['REQUEST_URI']
20
+ received_data << env['rack.input'].read()
21
+ [200, {}, []]
22
+ }
23
+ end
24
+
25
+
26
+ # 1/inputs/http
27
+ @logger = DLogger::Output::SplunkStorm.new("http://127.0.0.1:#{@http_port}",
28
+ :host => 'test.com',
29
+ :access_token => "TOKEN",
30
+ :project => "PR"
31
+ )
32
+ end
33
+
34
+ should 'send message to logstash' do
35
+ @logger.dispatch('a log message', {:data => "something", :n => 21})
36
+
37
+ wait(0.1) do
38
+ @request_uri.should == "/1/inputs/http?sourcetype=json_auto_timestamp&host=test.com&project=PR"
39
+ @received_data.should == "{\"data\":\"something\",\"n\":21,\"message\":\"a log message\"}"
40
+ end
41
+ end
42
+
43
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dlogger
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.0.3
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,41 +9,8 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-01-29 00:00:00.000000000 Z
13
- dependencies:
14
- - !ruby/object:Gem::Dependency
15
- name: rake
16
- requirement: &70168315282880 !ruby/object:Gem::Requirement
17
- none: false
18
- requirements:
19
- - - ! '>='
20
- - !ruby/object:Gem::Version
21
- version: '0'
22
- type: :development
23
- prerelease: false
24
- version_requirements: *70168315282880
25
- - !ruby/object:Gem::Dependency
26
- name: tilt
27
- requirement: &70168315298480 !ruby/object:Gem::Requirement
28
- none: false
29
- requirements:
30
- - - ! '>='
31
- - !ruby/object:Gem::Version
32
- version: '0'
33
- type: :development
34
- prerelease: false
35
- version_requirements: *70168315298480
36
- - !ruby/object:Gem::Dependency
37
- name: guard-tilt
38
- requirement: &70168315297920 !ruby/object:Gem::Requirement
39
- none: false
40
- requirements:
41
- - - ! '>='
42
- - !ruby/object:Gem::Version
43
- version: '0'
44
- type: :development
45
- prerelease: false
46
- version_requirements: *70168315297920
12
+ date: 2012-06-25 00:00:00.000000000 Z
13
+ dependencies: []
47
14
  description: Advanced logger allowing you to include metadata with your messages
48
15
  email:
49
16
  - schmurfy@gmail.com
@@ -52,6 +19,7 @@ extensions: []
52
19
  extra_rdoc_files: []
53
20
  files:
54
21
  - .gitignore
22
+ - ChangeLog
55
23
  - Gemfile
56
24
  - Guardfile
57
25
  - LICENSE
@@ -64,18 +32,22 @@ files:
64
32
  - examples/hash_context.rb
65
33
  - examples/logstash.rb
66
34
  - examples/nested_context.rb
35
+ - examples/splunk.rb
67
36
  - examples/threads.rb
68
37
  - lib/dlogger.rb
69
38
  - lib/dlogger/extension.rb
70
39
  - lib/dlogger/logger.rb
71
40
  - lib/dlogger/outputs/base.rb
72
41
  - lib/dlogger/outputs/em/logstash.rb
42
+ - lib/dlogger/outputs/em/splunkstorm.rb
73
43
  - lib/dlogger/outputs/stdlib_logger.rb
74
44
  - lib/dlogger/outputs/stdout.rb
75
45
  - lib/dlogger/version.rb
76
46
  - specs/common.rb
77
47
  - specs/lib/extension_spec.rb
78
48
  - specs/lib/logger_spec.rb
49
+ - specs/lib/outputs/em/logstash_spec.rb
50
+ - specs/lib/outputs/em/splunkstorm_spec.rb
79
51
  - specs/lib/outputs/stdlib_logger_spec.rb
80
52
  - specs/lib/outputs/stdout_spec.rb
81
53
  homepage: ''
@@ -92,7 +64,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
92
64
  version: '0'
93
65
  segments:
94
66
  - 0
95
- hash: 738648334169580825
67
+ hash: -981071182900887075
96
68
  required_rubygems_version: !ruby/object:Gem::Requirement
97
69
  none: false
98
70
  requirements:
@@ -101,10 +73,10 @@ required_rubygems_version: !ruby/object:Gem::Requirement
101
73
  version: '0'
102
74
  segments:
103
75
  - 0
104
- hash: 738648334169580825
76
+ hash: -981071182900887075
105
77
  requirements: []
106
78
  rubyforge_project:
107
- rubygems_version: 1.8.15
79
+ rubygems_version: 1.8.24
108
80
  signing_key:
109
81
  specification_version: 3
110
82
  summary: ! 'Dynamic logger: add a context to your log messages'