logstash_rails 0.1.0 → 0.1.1

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.
checksums.yaml ADDED
@@ -0,0 +1,15 @@
1
+ ---
2
+ !binary "U0hBMQ==":
3
+ metadata.gz: !binary |-
4
+ MWY4MGJiY2U4YzM1NzYyMGQyM2U3MmU5YTQyOTlmYmMwMGUxNWYwNg==
5
+ data.tar.gz: !binary |-
6
+ ZThhM2NlNzczYjI2OTdkOGU5NTZiNTM2OTdkM2ViZjdiMmI5N2ZmMA==
7
+ !binary "U0hBNTEy":
8
+ metadata.gz: !binary |-
9
+ ZWI4Y2MwMzk5NTk4MGQ2YWQzZmQxOWNjOGVjOGRmYzNhZDkyMGE1ZWFlYjQx
10
+ MjQ0MTVkNWU1Yjc1OTZkNjE4ZGEwNGQ5ZDczYTQ1YzM5YWMwMmVhMDc5NmI2
11
+ MjAzZmVlYzAzYjQyZThmNTM3OWY5ZGY2YjgyNzcyODJmZTA2ZDE=
12
+ data.tar.gz: !binary |-
13
+ OWJmNjAyYzI2NThmMTNjNjYxYjk5NmI0ZjMzOTdjMzRhMjJmMTEwOTg5YzFj
14
+ YzllMGYzMGFhMzkyMGQ0YTM4YWEwNmFjMTE0MTg3MmM5MjlmYmM3YzJmOTU1
15
+ NmExY2M3NTcyNTEwYTJkMTZlZDM2M2E1Nzg3ZTgwYTAwZWIyM2M=
data/Gemfile CHANGED
@@ -2,16 +2,11 @@ source 'https://rubygems.org'
2
2
 
3
3
  gemspec
4
4
 
5
- group :development do
6
- gem 'coveralls', require: false
7
- gem 'pry'
8
- gem 'yard'
9
- gem 'rake'
10
- gem 'redcarpet'
11
- gem 'tailor'
12
- end
13
-
14
- group :test do
15
- gem 'rspec'
16
- gem 'fakeredis'
17
- end
5
+ gem 'coveralls', require: false
6
+ gem 'fakeredis'
7
+ gem 'pry'
8
+ gem 'rake'
9
+ gem 'redcarpet'
10
+ gem 'rspec'
11
+ gem 'tailor'
12
+ gem 'yard'
@@ -0,0 +1,30 @@
1
+ require 'socket'
2
+
3
+ module LogstashRails
4
+ module Formatter
5
+ module Basic
6
+
7
+ def self.decorate(target, options)
8
+ target.extend(self)
9
+ end
10
+
11
+ def format(event_type, start, finish, id, payload)
12
+ event_hash = super
13
+
14
+ event_hash.merge!(
15
+ process_id: $$,
16
+ host: Socket.gethostname,
17
+ message: event_type
18
+ )
19
+
20
+ # process_action.action_controller events
21
+ # from Rails4 contain Rack::Request instances
22
+ # that are not serializable
23
+ event_hash.delete(:request)
24
+
25
+ event_hash
26
+ end
27
+
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,48 @@
1
+ module LogstashRails
2
+ module Formatter
3
+ module FlattenParams
4
+
5
+ def format(event_type, start, finish, id, payload)
6
+ flatten_params(super)
7
+ end
8
+
9
+ def self.decorate(target, options)
10
+ if options[:flatten_params] != false
11
+ target.extend(self)
12
+ end
13
+ end
14
+
15
+ private
16
+
17
+ def flatten_params(event_hash)
18
+ params = event_hash[:params]
19
+ return event_hash unless params
20
+
21
+ event_hash[:params] = flatten_hash(params)
22
+
23
+ event_hash
24
+ end
25
+
26
+ def prefix(current, last)
27
+ return "#{last}__#{current}" if last
28
+
29
+ current.to_s
30
+ end
31
+
32
+ def flatten_hash(h, last = nil, accu = {})
33
+ h.each do |k, v|
34
+ prefix = prefix(k, last)
35
+
36
+ if v.is_a?(Hash)
37
+ flatten_hash(v, prefix, accu)
38
+ else
39
+ accu[prefix] = v
40
+ end
41
+ end
42
+
43
+ accu
44
+ end
45
+
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,37 @@
1
+ module LogstashRails
2
+ module Formatter
3
+ module Source
4
+
5
+ attr_accessor :source
6
+
7
+ def format(event_type, start, finish, id, payload)
8
+ add_source(super)
9
+ end
10
+
11
+ def self.decorate(target, options)
12
+ source = options[:source]
13
+ if source != false
14
+ target.extend(self)
15
+ target.source = get_source(source)
16
+ end
17
+ end
18
+
19
+ private
20
+
21
+ def self.get_source(source_option)
22
+ if source_option != true
23
+ source_option
24
+ elsif defined?(Rails)
25
+ Rails.application.class.parent_name
26
+ else
27
+ ''
28
+ end
29
+ end
30
+
31
+ def add_source(event_hash)
32
+ event_hash.merge!(source: source)
33
+ end
34
+
35
+ end
36
+ end
37
+ end
@@ -1,72 +1,22 @@
1
- require 'logstash-event'
2
- require 'socket'
1
+ require 'logstash_rails/formatter_base'
3
2
 
4
- module LogstashRails
5
-
6
- # TODO needs refactoring
7
- class Formatter
8
-
9
- def initialize(options = {})
10
- @flatten_params = (options[:flatten_params] != false)
11
- end
12
-
13
- def format(event_type, start, finish, id, payload)
14
- payload.merge!(
15
- process_id: $$,
16
- host: Socket.gethostname,
17
- message: event_type,
18
- source: application_name
19
- )
20
-
21
- # process_action.action_controller events
22
- # from Rails4 contain Rack::Request instances
23
- # that are not serializable
24
- payload.delete(:request)
25
-
26
- flatten_params(payload)
27
-
28
- event = LogStash::Event.new(payload)
29
-
30
- event.timestamp = start
31
-
32
- event.to_json
33
- end
34
-
35
- private
36
-
37
- def flatten_params(payload)
38
- return unless @flatten_params
39
-
40
- params = payload[:params]
41
- return unless params
42
-
43
- payload[:params] = flatten_hash(params)
44
- end
45
-
46
- def prefix(current, last)
47
- return "#{last}__#{current}" if last
3
+ Dir[File.join(File.dirname(__FILE__), 'formatter', '*.rb')].each do |file|
4
+ require file
5
+ end
48
6
 
49
- current.to_s
50
- end
7
+ module LogstashRails
8
+ module Formatter
51
9
 
52
- def flatten_hash(h, last = nil, accu = {})
53
- h.each do |k, v|
54
- prefix = prefix(k, last)
10
+ def self.get(options = {})
11
+ formatter = FormatterBase.new
55
12
 
56
- if v.is_a?(Hash)
57
- flatten_hash(v, prefix, accu)
58
- else
59
- accu[prefix] = v
60
- end
13
+ Formatter.constants.map do |constant|
14
+ Formatter.const_get(constant)
15
+ end.each do |decorator|
16
+ decorator.decorate(formatter, options)
61
17
  end
62
18
 
63
- accu
64
- end
65
-
66
- def application_name
67
- if defined?(Rails)
68
- Rails.application.class.parent_name
69
- end
19
+ formatter
70
20
  end
71
21
 
72
22
  end
@@ -0,0 +1,22 @@
1
+ require 'logstash-event'
2
+
3
+ module LogstashRails
4
+
5
+ class FormatterBase
6
+
7
+ def perform(event_type, start, finish, id, payload)
8
+ event_hash = format(event_type, start, finish, id, payload)
9
+
10
+ event = LogStash::Event.new(event_hash)
11
+
12
+ event.timestamp = start
13
+
14
+ event.to_json
15
+ end
16
+
17
+ def format(event_type, start, finish, id, payload)
18
+ payload.clone
19
+ end
20
+
21
+ end
22
+ end
@@ -4,7 +4,7 @@ module LogstashRails
4
4
  module Transport
5
5
  class Logfile < TransportBase
6
6
 
7
- def initialize(options = {})
7
+ def initialize(formatter, options = {})
8
8
  logfile = options[:logfile] || 'log/logstash_rails.log'
9
9
 
10
10
  @logger = ::Logger.new(logfile)
@@ -4,7 +4,7 @@ module LogstashRails
4
4
  module Transport
5
5
  class LogstashTcp < TransportBase
6
6
 
7
- def initialize(options)
7
+ def initialize(formatter, options)
8
8
  @host = options[:host] || 'localhost'
9
9
  @port = options.fetch(:port)
10
10
 
@@ -2,7 +2,7 @@ module LogstashRails
2
2
  module Transport
3
3
  class LogstashUdp < TransportBase
4
4
 
5
- def initialize(options = {})
5
+ def initialize(formatter, options = {})
6
6
  host = options[:host] || 'localhost'
7
7
  port = options[:port] || 9999
8
8
 
@@ -10,7 +10,7 @@ module LogstashRails
10
10
  # @option options [Symbol] :redis_key ('logstash') the key of the redis
11
11
  # list to which events will be pushed to
12
12
  #
13
- def initialize(options)
13
+ def initialize(formatter, options)
14
14
  host = options[:host] || '127.0.0.1'
15
15
  port = options[:port] || 6379
16
16
  redis_key = options[:redis_key] || 'logstash'
@@ -1,3 +1,5 @@
1
+ require 'logstash_rails/transport_base'
2
+
1
3
  Dir[File.join(File.dirname(__FILE__), 'transport', '*.rb')].each do |file|
2
4
  require file
3
5
  end
@@ -4,11 +4,11 @@ module LogstashRails
4
4
  class TransportBase
5
5
 
6
6
  # @see LogstashRails.config
7
- def initialize(options)
7
+ def initialize(formatter, options)
8
8
  @events = options[:events] || [/.*/]
9
9
  @error_logger = options[:logger]
10
10
  @raise_errors = options[:raise_errors] || false
11
- @formatter = Formatter.new(options)
11
+ @formatter = formatter
12
12
 
13
13
  if defined?(Rails)
14
14
  @error_logger ||= Rails.logger
@@ -38,7 +38,7 @@ module LogstashRails
38
38
  end
39
39
 
40
40
  def event_handler(*args)
41
- json_event = @formatter.format(*args)
41
+ json_event = @formatter.perform(*args)
42
42
 
43
43
  begin
44
44
  push(json_event)
@@ -1,3 +1,3 @@
1
1
  module LogstashRails
2
- VERSION = "0.1.0"
2
+ VERSION = "0.1.1"
3
3
  end
@@ -1,7 +1,6 @@
1
1
  require 'active_support'
2
2
  require 'active_support/core_ext/string'
3
3
 
4
- require 'logstash_rails/transport_base'
5
4
 
6
5
  Dir[File.join(File.dirname(__FILE__), 'logstash_rails', '*.rb')].each do |file|
7
6
  require file
@@ -30,7 +29,9 @@ module LogstashRails
30
29
  transport = options.fetch(:transport)
31
30
  transport = transport.to_s.camelize.to_sym
32
31
 
33
- LogstashRails::Transport.const_get(transport).new(options)
32
+ formatter = LogstashRails::Formatter.get(options)
33
+
34
+ LogstashRails::Transport.const_get(transport).new(formatter, options)
34
35
  end
35
36
 
36
37
  end
@@ -0,0 +1,21 @@
1
+ describe LogstashRails::Formatter::Basic do
2
+
3
+ subject do
4
+ LogstashRails::Formatter.get.perform('event', Time.now, Time.now, 1, {request: 'toto'})
5
+ end
6
+
7
+ it 'deletes Rack::Request' do
8
+ subject.should_not include('request')
9
+ end
10
+
11
+ %w(message host process_id source).each do |field|
12
+ it "adds #{field}" do
13
+ subject.should include(field)
14
+ end
15
+ end
16
+
17
+ it 'has the event type as message' do
18
+ JSON.parse(subject)["message"].should eq 'event'
19
+ end
20
+
21
+ end
@@ -1,8 +1,8 @@
1
- describe LogstashRails::Formatter do
1
+ describe LogstashRails::Formatter::FlattenParams do
2
2
 
3
3
  subject do
4
4
  lambda do |payload|
5
- LogstashRails::Formatter.new.format('event', Time.now, Time.now, 1, payload)
5
+ LogstashRails::Formatter.get.perform('event', Time.now, Time.now, 1, payload)
6
6
  end
7
7
  end
8
8
 
@@ -15,18 +15,12 @@ describe LogstashRails::Formatter do
15
15
  end
16
16
 
17
17
  it 'does not flatten params' do
18
- formatter = LogstashRails::Formatter.new(flatten_params: false)
18
+ formatter = LogstashRails::Formatter.get(flatten_params: false)
19
19
  payload = {params:{a: {b: 1}, c: 2}}
20
20
 
21
- result = formatter.format('event', Time.now, Time.now, 1, payload)
21
+ result = formatter.perform('event', Time.now, Time.now, 1, payload)
22
22
 
23
23
  JSON.parse(result).should include({'params' => {'a' => {'b' => 1}, 'c' => 2}})
24
24
  end
25
25
 
26
- it 'deletes Rack::Request' do
27
- payload = {request: 'toto'}
28
-
29
- subject.call(payload).should_not include('request')
30
- end
31
-
32
26
  end
@@ -0,0 +1,19 @@
1
+ describe LogstashRails::Formatter::Source do
2
+
3
+ subject do
4
+ lambda do |options, payload|
5
+ LogstashRails::Formatter.get(options).perform('event', Time.now, Time.now, 1, payload)
6
+ end
7
+ end
8
+
9
+ it 'knows its source' do
10
+ result = subject.call({source: 'test'}, {})
11
+ JSON.parse(result).should include({'source' => 'test'})
12
+ end
13
+
14
+ it 'can be disabled' do
15
+ result = subject.call({source: false}, {})
16
+ JSON.parse(result).keys.should_not include('source')
17
+ end
18
+
19
+ end
@@ -5,7 +5,8 @@ describe LogstashRails::Transport::Logfile do
5
5
  end
6
6
 
7
7
  subject do
8
- LogstashRails::Transport::Logfile.new(logfile: logfile)
8
+ formatter = LogstashRails::Formatter.get
9
+ LogstashRails::Transport::Logfile.new(formatter, logfile: logfile)
9
10
  end
10
11
 
11
12
  it { should respond_to :push }
@@ -16,7 +16,8 @@ describe LogstashRails::Transport::LogstashTcp do
16
16
  end
17
17
 
18
18
  let :logstash_tcp do
19
- LogstashRails::Transport::LogstashTcp.new(port: 9000)
19
+ formatter = LogstashRails::Formatter.get
20
+ LogstashRails::Transport::LogstashTcp.new(formatter, port: 9000)
20
21
  end
21
22
 
22
23
  it do
@@ -1,7 +1,8 @@
1
1
  describe LogstashRails::Transport::LogstashUdp do
2
2
 
3
3
  subject do
4
- LogstashRails::Transport::LogstashUdp.new(port: 9001)
4
+ formatter = LogstashRails::Formatter.get
5
+ LogstashRails::Transport::LogstashUdp.new(formatter, port: 9001)
5
6
  end
6
7
 
7
8
  it { should respond_to :push }
@@ -5,7 +5,9 @@ describe LogstashRails::Transport::Redis do
5
5
  end
6
6
 
7
7
  subject do
8
+ formatter = LogstashRails::Formatter.get
8
9
  LogstashRails::Transport::Redis.new(
10
+ formatter,
9
11
  redis: Redis.new,
10
12
  redis_key: 'logstash',
11
13
  raise_errors: true
data/spec/spec_helper.rb CHANGED
@@ -11,6 +11,6 @@ SimpleCov.start do
11
11
  end
12
12
 
13
13
  require 'bundler'
14
- Bundler.require :default, :development, :test
14
+ Bundler.require
15
15
 
16
16
  require 'logstash_rails'
metadata CHANGED
@@ -1,20 +1,18 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: logstash_rails
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
5
- prerelease:
4
+ version: 0.1.1
6
5
  platform: ruby
7
6
  authors:
8
7
  - cmertz
9
8
  autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2013-10-07 00:00:00.000000000 Z
11
+ date: 2013-10-30 00:00:00.000000000 Z
13
12
  dependencies:
14
13
  - !ruby/object:Gem::Dependency
15
14
  name: logstash-event
16
15
  requirement: !ruby/object:Gem::Requirement
17
- none: false
18
16
  requirements:
19
17
  - - ~>
20
18
  - !ruby/object:Gem::Version
@@ -22,7 +20,6 @@ dependencies:
22
20
  type: :runtime
23
21
  prerelease: false
24
22
  version_requirements: !ruby/object:Gem::Requirement
25
- none: false
26
23
  requirements:
27
24
  - - ~>
28
25
  - !ruby/object:Gem::Version
@@ -30,7 +27,6 @@ dependencies:
30
27
  - !ruby/object:Gem::Dependency
31
28
  name: activesupport
32
29
  requirement: !ruby/object:Gem::Requirement
33
- none: false
34
30
  requirements:
35
31
  - - ! '>='
36
32
  - !ruby/object:Gem::Version
@@ -38,7 +34,6 @@ dependencies:
38
34
  type: :runtime
39
35
  prerelease: false
40
36
  version_requirements: !ruby/object:Gem::Requirement
41
- none: false
42
37
  requirements:
43
38
  - - ! '>='
44
39
  - !ruby/object:Gem::Version
@@ -46,7 +41,6 @@ dependencies:
46
41
  - !ruby/object:Gem::Dependency
47
42
  name: redis
48
43
  requirement: !ruby/object:Gem::Requirement
49
- none: false
50
44
  requirements:
51
45
  - - ! '>='
52
46
  - !ruby/object:Gem::Version
@@ -54,7 +48,6 @@ dependencies:
54
48
  type: :runtime
55
49
  prerelease: false
56
50
  version_requirements: !ruby/object:Gem::Requirement
57
- none: false
58
51
  requirements:
59
52
  - - ! '>='
60
53
  - !ruby/object:Gem::Version
@@ -62,7 +55,6 @@ dependencies:
62
55
  - !ruby/object:Gem::Dependency
63
56
  name: celluloid-io
64
57
  requirement: !ruby/object:Gem::Requirement
65
- none: false
66
58
  requirements:
67
59
  - - ! '>='
68
60
  - !ruby/object:Gem::Version
@@ -70,7 +62,6 @@ dependencies:
70
62
  type: :runtime
71
63
  prerelease: false
72
64
  version_requirements: !ruby/object:Gem::Requirement
73
- none: false
74
65
  requirements:
75
66
  - - ! '>='
76
67
  - !ruby/object:Gem::Version
@@ -92,6 +83,10 @@ files:
92
83
  - Rakefile
93
84
  - lib/logstash_rails.rb
94
85
  - lib/logstash_rails/formatter.rb
86
+ - lib/logstash_rails/formatter/basic.rb
87
+ - lib/logstash_rails/formatter/flatten_params.rb
88
+ - lib/logstash_rails/formatter/source.rb
89
+ - lib/logstash_rails/formatter_base.rb
95
90
  - lib/logstash_rails/transport.rb
96
91
  - lib/logstash_rails/transport/logfile.rb
97
92
  - lib/logstash_rails/transport/logstash_tcp.rb
@@ -100,8 +95,9 @@ files:
100
95
  - lib/logstash_rails/transport_base.rb
101
96
  - lib/logstash_rails/version.rb
102
97
  - logstash_rails.gemspec
103
- - spec/lib/logstash_rails/formatter_spec.rb
104
- - spec/lib/logstash_rails/generated_event_spec.rb
98
+ - spec/lib/logstash_rails/formatter/basic_spec.rb
99
+ - spec/lib/logstash_rails/formatter/flatten_params_spec.rb
100
+ - spec/lib/logstash_rails/formatter/source_spec.rb
105
101
  - spec/lib/logstash_rails/transport/logfile_spec.rb
106
102
  - spec/lib/logstash_rails/transport/logstash_tcp_spec.rb
107
103
  - spec/lib/logstash_rails/transport/logstash_udp_spec.rb
@@ -111,37 +107,31 @@ files:
111
107
  homepage: https://github.com/cmertz/logstash_rails
112
108
  licenses:
113
109
  - GPL
110
+ metadata: {}
114
111
  post_install_message:
115
112
  rdoc_options: []
116
113
  require_paths:
117
114
  - lib
118
115
  required_ruby_version: !ruby/object:Gem::Requirement
119
- none: false
120
116
  requirements:
121
117
  - - ! '>='
122
118
  - !ruby/object:Gem::Version
123
119
  version: '0'
124
- segments:
125
- - 0
126
- hash: -1320401809956164612
127
120
  required_rubygems_version: !ruby/object:Gem::Requirement
128
- none: false
129
121
  requirements:
130
122
  - - ! '>='
131
123
  - !ruby/object:Gem::Version
132
124
  version: '0'
133
- segments:
134
- - 0
135
- hash: -1320401809956164612
136
125
  requirements: []
137
126
  rubyforge_project:
138
- rubygems_version: 1.8.25
127
+ rubygems_version: 2.0.7
139
128
  signing_key:
140
- specification_version: 3
129
+ specification_version: 4
141
130
  summary: Send events from Rails to Logstash without logger foo.
142
131
  test_files:
143
- - spec/lib/logstash_rails/formatter_spec.rb
144
- - spec/lib/logstash_rails/generated_event_spec.rb
132
+ - spec/lib/logstash_rails/formatter/basic_spec.rb
133
+ - spec/lib/logstash_rails/formatter/flatten_params_spec.rb
134
+ - spec/lib/logstash_rails/formatter/source_spec.rb
145
135
  - spec/lib/logstash_rails/transport/logfile_spec.rb
146
136
  - spec/lib/logstash_rails/transport/logstash_tcp_spec.rb
147
137
  - spec/lib/logstash_rails/transport/logstash_udp_spec.rb
@@ -1,23 +0,0 @@
1
- describe 'generated logstash event' do
2
-
3
- before do
4
- Redis::Connection::Memory.reset_all_databases
5
- LogstashRails.config(transport: :redis, redis: Redis.new, redis_key: 'logstash')
6
- ActiveSupport::Notifications.instrument("process_action.action_controller")
7
- end
8
-
9
- subject do
10
- JSON.parse(Redis.new.lpop('logstash'))
11
- end
12
-
13
- it 'has the event type as message' do
14
- subject['message'].should eq "process_action.action_controller"
15
- end
16
-
17
- it 'contains additional fields' do
18
- %w(message host process_id source).each do |field|
19
- subject.should include(field)
20
- end
21
- end
22
-
23
- end