logstash_rails 0.0.16 → 0.1.0

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/.travis.yml CHANGED
@@ -1,4 +1,5 @@
1
1
  language: ruby
2
2
  rvm:
3
3
  - 1.9.3
4
+ - 2.0
4
5
  script: rake test
data/README.md CHANGED
@@ -47,6 +47,11 @@ and provide an initializer for configuration.
47
47
 
48
48
  list of event name patterns to subscribe to. `Regex` and `String` is
49
49
  supported.
50
+
51
+ * __flatten_params__
52
+
53
+ true, false
54
+ Flatten params hash. This gets rid of collisions in dynamic mappings in ElasticSearch.
50
55
 
51
56
  * __transport options__
52
57
 
@@ -17,6 +17,7 @@ module LogstashRails
17
17
  # @option options [Symbol] :transport The transport to use.
18
18
  # @option options [Array<String, Regexp>] :events The list of events to subscribe
19
19
  # @option options [Logger] :logger The logger for exceptions
20
+ # @option options [Boolean] :flatten_params Flatten params hash of process_action.action_controller events (Hash with only one level). Defaults to true
20
21
  #
21
22
  # @return the configured transport
22
23
  #
@@ -2,31 +2,68 @@ require 'logstash-event'
2
2
  require 'socket'
3
3
 
4
4
  module LogstashRails
5
- module Formatter
6
5
 
7
- def self.format(event_type, start, finish, id, payload)
8
- fields = {
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!(
9
15
  process_id: $$,
10
- host: Socket.gethostname
11
- }
16
+ host: Socket.gethostname,
17
+ message: event_type,
18
+ source: application_name
19
+ )
12
20
 
13
21
  # process_action.action_controller events
14
22
  # from Rails4 contain Rack::Request instances
15
23
  # that are not serializable
16
24
  payload.delete(:request)
17
25
 
26
+ flatten_params(payload)
27
+
18
28
  event = LogStash::Event.new(payload)
19
29
 
20
30
  event.timestamp = start
21
- event.message = event_type
22
- event.source = application_name
23
31
 
24
32
  event.to_json
25
33
  end
26
34
 
27
35
  private
28
36
 
29
- def self.application_name
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
48
+
49
+ current.to_s
50
+ end
51
+
52
+ def flatten_hash(h, last = nil, accu = {})
53
+ h.each do |k, v|
54
+ prefix = prefix(k, last)
55
+
56
+ if v.is_a?(Hash)
57
+ flatten_hash(v, prefix, accu)
58
+ else
59
+ accu[prefix] = v
60
+ end
61
+ end
62
+
63
+ accu
64
+ end
65
+
66
+ def application_name
30
67
  if defined?(Rails)
31
68
  Rails.application.class.parent_name
32
69
  end
@@ -1,5 +1,4 @@
1
1
  require 'celluloid/io'
2
- require 'celluloid/io'
3
2
 
4
3
  module LogstashRails
5
4
  module Transport
@@ -8,6 +8,7 @@ module LogstashRails
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
12
 
12
13
  if defined?(Rails)
13
14
  @error_logger ||= Rails.logger
@@ -37,7 +38,7 @@ module LogstashRails
37
38
  end
38
39
 
39
40
  def event_handler(*args)
40
- json_event = Formatter.format(*args)
41
+ json_event = @formatter.format(*args)
41
42
 
42
43
  begin
43
44
  push(json_event)
@@ -1,3 +1,3 @@
1
1
  module LogstashRails
2
- VERSION = "0.0.16"
2
+ VERSION = "0.1.0"
3
3
  end
@@ -1,17 +1,32 @@
1
- describe 'generated logstash event' do
1
+ describe LogstashRails::Formatter do
2
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")
3
+ subject do
4
+ lambda do |payload|
5
+ LogstashRails::Formatter.new.format('event', Time.now, Time.now, 1, payload)
6
+ end
7
7
  end
8
8
 
9
- it 'is parsebale json' do
10
- JSON.parse(Redis.new.lpop('logstash'))
9
+ it 'flattens params' do
10
+ payload = {params:{a: {b: 1}, c: 2}}
11
+
12
+ result = subject.call(payload)
13
+
14
+ JSON.parse(result).should include({'params' => {'a__b' => 1, 'c' => 2}})
11
15
  end
12
16
 
13
- it 'has the event type as message' do
14
- JSON.parse(Redis.new.lpop('logstash'))['message'].should eq "process_action.action_controller"
17
+ it 'does not flatten params' do
18
+ formatter = LogstashRails::Formatter.new(flatten_params: false)
19
+ payload = {params:{a: {b: 1}, c: 2}}
20
+
21
+ result = formatter.format('event', Time.now, Time.now, 1, payload)
22
+
23
+ JSON.parse(result).should include({'params' => {'a' => {'b' => 1}, 'c' => 2}})
24
+ end
25
+
26
+ it 'deletes Rack::Request' do
27
+ payload = {request: 'toto'}
28
+
29
+ subject.call(payload).should_not include('request')
15
30
  end
16
31
 
17
32
  end
@@ -0,0 +1,23 @@
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
@@ -1,7 +1,7 @@
1
1
  describe LogstashRails::Transport::Logfile do
2
2
 
3
3
  let :logfile do
4
- Tempfile.new(__FILE__)
4
+ Tempfile.new(File.basename(__FILE__))
5
5
  end
6
6
 
7
7
  subject do
@@ -11,6 +11,7 @@ describe LogstashRails::Transport::LogstashTcp do
11
11
  end
12
12
 
13
13
  after do
14
+ @thread.kill
14
15
  @server.close
15
16
  end
16
17
 
@@ -19,7 +19,7 @@ describe LogstashRails::TransportBase do
19
19
  end
20
20
 
21
21
  it 'logs exceptions if a logger is given' do
22
- logger = mock(:logger)
22
+ logger = double(:logger)
23
23
  config = subject.config(transport: :redis, logger: logger)
24
24
  config.stub(:push).and_raise(ArgumentError.new)
25
25
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: logstash_rails
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.16
4
+ version: 0.1.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-10-06 00:00:00.000000000 Z
12
+ date: 2013-10-07 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: logstash-event
@@ -101,6 +101,7 @@ files:
101
101
  - lib/logstash_rails/version.rb
102
102
  - logstash_rails.gemspec
103
103
  - spec/lib/logstash_rails/formatter_spec.rb
104
+ - spec/lib/logstash_rails/generated_event_spec.rb
104
105
  - spec/lib/logstash_rails/transport/logfile_spec.rb
105
106
  - spec/lib/logstash_rails/transport/logstash_tcp_spec.rb
106
107
  - spec/lib/logstash_rails/transport/logstash_udp_spec.rb
@@ -122,7 +123,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
122
123
  version: '0'
123
124
  segments:
124
125
  - 0
125
- hash: 4605437770903519809
126
+ hash: -1320401809956164612
126
127
  required_rubygems_version: !ruby/object:Gem::Requirement
127
128
  none: false
128
129
  requirements:
@@ -131,15 +132,16 @@ required_rubygems_version: !ruby/object:Gem::Requirement
131
132
  version: '0'
132
133
  segments:
133
134
  - 0
134
- hash: 4605437770903519809
135
+ hash: -1320401809956164612
135
136
  requirements: []
136
137
  rubyforge_project:
137
- rubygems_version: 1.8.24
138
+ rubygems_version: 1.8.25
138
139
  signing_key:
139
140
  specification_version: 3
140
141
  summary: Send events from Rails to Logstash without logger foo.
141
142
  test_files:
142
143
  - spec/lib/logstash_rails/formatter_spec.rb
144
+ - spec/lib/logstash_rails/generated_event_spec.rb
143
145
  - spec/lib/logstash_rails/transport/logfile_spec.rb
144
146
  - spec/lib/logstash_rails/transport/logstash_tcp_spec.rb
145
147
  - spec/lib/logstash_rails/transport/logstash_udp_spec.rb