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 +1 -0
- data/README.md +5 -0
- data/lib/logstash_rails.rb +1 -0
- data/lib/logstash_rails/formatter.rb +45 -8
- data/lib/logstash_rails/transport/logstash_tcp.rb +0 -1
- data/lib/logstash_rails/transport_base.rb +2 -1
- data/lib/logstash_rails/version.rb +1 -1
- data/spec/lib/logstash_rails/formatter_spec.rb +24 -9
- data/spec/lib/logstash_rails/generated_event_spec.rb +23 -0
- data/spec/lib/logstash_rails/transport/logfile_spec.rb +1 -1
- data/spec/lib/logstash_rails/transport/logstash_tcp_spec.rb +1 -0
- data/spec/lib/logstash_rails/transport_base_spec.rb +1 -1
- metadata +7 -5
data/.travis.yml
CHANGED
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
|
|
data/lib/logstash_rails.rb
CHANGED
@@ -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
|
-
|
8
|
-
|
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:
|
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
|
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
|
@@ -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 =
|
41
|
+
json_event = @formatter.format(*args)
|
41
42
|
|
42
43
|
begin
|
43
44
|
push(json_event)
|
@@ -1,17 +1,32 @@
|
|
1
|
-
describe
|
1
|
+
describe LogstashRails::Formatter do
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
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 '
|
10
|
-
|
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 '
|
14
|
-
|
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
|
@@ -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 =
|
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
|
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-
|
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:
|
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:
|
135
|
+
hash: -1320401809956164612
|
135
136
|
requirements: []
|
136
137
|
rubyforge_project:
|
137
|
-
rubygems_version: 1.8.
|
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
|