logstash_rails 0.0.16 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
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