logstash_rails 0.1.0 → 0.1.1

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