resque-logstash 0.0.2 → 0.0.3
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 +4 -4
- data/lib/resque/logstash.rb +20 -5
- data/lib/resque/logstash/transport/redis.rb +26 -5
- data/lib/resque/logstash/version.rb +1 -1
- data/spec/logstash_spec.rb +35 -6
- data/spec/transport/redis_spec.rb +14 -0
- metadata +17 -17
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA1:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 8d7683274d9a2840ce11a0c75b7ccd636deed5f1
|
|
4
|
+
data.tar.gz: 2c06920d8aa5ef793360abc0d65d117ad0638466
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 45f909fdba3149e175c47eb371444816e79a97bfaca0a2b533f6d79455781c3eda46289cd5e7cee91ea4a02a2733ae871ddd66446e727d2febd34b0886b99084
|
|
7
|
+
data.tar.gz: a527be77f93cc7bc6b9f746277d482ef139ccbc1f6c3cefede2e1cac616d67e271a450b3eabe8f6c01c50f047cfe7dde2172fdd08d961e95463e9cff928dede7
|
data/lib/resque/logstash.rb
CHANGED
|
@@ -27,21 +27,36 @@ module Resque::Plugins
|
|
|
27
27
|
def around_perform_logstash_measure(*args)
|
|
28
28
|
started_at = Time.now
|
|
29
29
|
yield
|
|
30
|
+
rescue Exception => e
|
|
31
|
+
raise
|
|
30
32
|
ensure
|
|
31
|
-
logstash_push_duration Time.now - started_at, args
|
|
33
|
+
logstash_push_duration Time.now - started_at, args, e
|
|
32
34
|
end
|
|
33
35
|
|
|
34
|
-
def logstash_push_duration(duration, args)
|
|
36
|
+
def logstash_push_duration(duration, args, exception)
|
|
35
37
|
return if Logstash.config.disabled?
|
|
36
|
-
Logstash.config.transport.push logstash_create_event(duration, args)
|
|
38
|
+
Logstash.config.transport.push logstash_create_event(duration, args, exception)
|
|
37
39
|
end
|
|
38
40
|
|
|
39
|
-
def logstash_create_event(duration, args)
|
|
40
|
-
|
|
41
|
+
def logstash_create_event(duration, args, exception)
|
|
42
|
+
if exception.nil?
|
|
43
|
+
params = {'status' => 'success'}
|
|
44
|
+
verb = 'finished'
|
|
45
|
+
else
|
|
46
|
+
params = {
|
|
47
|
+
'status' => 'failure',
|
|
48
|
+
'exception' => "#{exception.class}: #{exception.message}"
|
|
49
|
+
}
|
|
50
|
+
verb = 'failed'
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
params = params.merge "message" => "Job #{self.name} #{verb} in #{duration}s",
|
|
41
54
|
"job" => self.name,
|
|
42
55
|
"duration" => duration,
|
|
43
56
|
"job_arguments" => args.map { |a| a.to_s },
|
|
44
57
|
"tags" => Logstash.config.tags
|
|
58
|
+
|
|
59
|
+
LogStash::Event.new params
|
|
45
60
|
end
|
|
46
61
|
end
|
|
47
62
|
end
|
|
@@ -2,16 +2,37 @@ module Resque::Plugins
|
|
|
2
2
|
module Logstash
|
|
3
3
|
module Transport
|
|
4
4
|
class Redis
|
|
5
|
-
def initialize(host, port, key = 'logstash')
|
|
6
|
-
|
|
7
|
-
|
|
5
|
+
def initialize(host, port = nil, key = 'logstash')
|
|
6
|
+
if host.is_a?(Hash)
|
|
7
|
+
initialize_with_keyword_arguments(host)
|
|
8
|
+
else
|
|
9
|
+
@redis_options = { host: host, port: port }
|
|
10
|
+
@key = key
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def initialize_with_keyword_arguments(key: 'logstash', redis: nil, **redis_options)
|
|
8
15
|
@key = key
|
|
16
|
+
|
|
17
|
+
if redis
|
|
18
|
+
@redis = redis
|
|
19
|
+
else
|
|
20
|
+
@redis_options = redis_options
|
|
21
|
+
end
|
|
9
22
|
end
|
|
10
23
|
|
|
11
|
-
|
|
24
|
+
attr_reader :key
|
|
12
25
|
|
|
13
26
|
def redis
|
|
14
|
-
@redis ||= ::Redis.new(
|
|
27
|
+
@redis ||= ::Redis.new(@redis_options)
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def host
|
|
31
|
+
@redis_options[:host]
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def port
|
|
35
|
+
@redis_options[:port]
|
|
15
36
|
end
|
|
16
37
|
|
|
17
38
|
def push(value)
|
data/spec/logstash_spec.rb
CHANGED
|
@@ -17,19 +17,24 @@ describe Resque::Plugins::Logstash do
|
|
|
17
17
|
|
|
18
18
|
describe '#around_perform_logstash_measure' do
|
|
19
19
|
it 'calls logstash_push_time with the duration' do
|
|
20
|
-
expect(job).to receive(:logstash_push_duration).with(be_within(0.01).of(0.3), [])
|
|
20
|
+
expect(job).to receive(:logstash_push_duration).with(be_within(0.01).of(0.3), [], nil)
|
|
21
21
|
|
|
22
22
|
job.around_perform_logstash_measure { sleep 0.3 }
|
|
23
23
|
end
|
|
24
24
|
|
|
25
25
|
it 'logs job arguments' do
|
|
26
|
-
expect(job).to receive(:logstash_push_duration).with(kind_of(Numeric), [:test, "blah"])
|
|
26
|
+
expect(job).to receive(:logstash_push_duration).with(kind_of(Numeric), [:test, "blah"], nil)
|
|
27
27
|
expect { job.around_perform_logstash_measure(:test, "blah") {} }.not_to raise_error
|
|
28
28
|
end
|
|
29
|
+
|
|
30
|
+
it 'logs errors' do
|
|
31
|
+
expect(job).to receive(:logstash_push_duration).with(anything, anything, kind_of(Exception))
|
|
32
|
+
expect { job.around_perform_logstash_measure { raise "hello" } }.to raise_error
|
|
33
|
+
end
|
|
29
34
|
end
|
|
30
35
|
|
|
31
36
|
describe '#logstash_create_event' do
|
|
32
|
-
let(:event) { job.logstash_create_event 0.3, [:arg1, "arg2"] }
|
|
37
|
+
let(:event) { job.logstash_create_event 0.3, [:arg1, "arg2"], nil }
|
|
33
38
|
|
|
34
39
|
it 'puts classname as the job field' do
|
|
35
40
|
expect(event.fields['job']).to eq('JobLike')
|
|
@@ -52,6 +57,30 @@ describe Resque::Plugins::Logstash do
|
|
|
52
57
|
it 'adds job arguments as Strings' do
|
|
53
58
|
expect(event.fields['job_arguments']).to eq(%w{arg1 arg2})
|
|
54
59
|
end
|
|
60
|
+
|
|
61
|
+
it 'includes status' do
|
|
62
|
+
expect(event.fields['status']).to eq('success')
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
it 'does not include exception key' do
|
|
66
|
+
expect(event.fields).not_to include('exception')
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
context 'when called with an exception' do
|
|
70
|
+
let(:event) { job.logstash_create_event 0.3, [:arg1, "arg2"], ArgumentError.new("test") }
|
|
71
|
+
|
|
72
|
+
it 'includes status' do
|
|
73
|
+
expect(event.fields['status']).to eq('failure')
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
it 'includes the exception' do
|
|
77
|
+
expect(event.fields['exception']).to eq("ArgumentError: test")
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
it 'provides a nice message' do
|
|
81
|
+
expect(event['message']).to eq("Job JobLike failed in 0.3s")
|
|
82
|
+
end
|
|
83
|
+
end
|
|
55
84
|
end
|
|
56
85
|
|
|
57
86
|
describe '#logstash_push_duration' do
|
|
@@ -59,14 +88,14 @@ describe Resque::Plugins::Logstash do
|
|
|
59
88
|
Resque::Plugins::Logstash.transport = double
|
|
60
89
|
expect(Resque::Plugins::Logstash.transport).to receive(:push)
|
|
61
90
|
|
|
62
|
-
job.logstash_push_duration(0.3, [])
|
|
91
|
+
job.logstash_push_duration(0.3, [], nil)
|
|
63
92
|
end
|
|
64
93
|
|
|
65
94
|
it 'does not push if disabled' do
|
|
66
95
|
Resque::Plugins::Logstash.configure { |c| c.disabled = true }
|
|
67
96
|
|
|
68
97
|
expect(Resque::Plugins::Logstash.transport).not_to receive(:push)
|
|
69
|
-
job.logstash_push_duration(0.3, [])
|
|
98
|
+
job.logstash_push_duration(0.3, [], nil)
|
|
70
99
|
|
|
71
100
|
Resque::Plugins::Logstash.configure { |c| c.disabled = false }
|
|
72
101
|
end
|
|
@@ -76,7 +105,7 @@ describe Resque::Plugins::Logstash do
|
|
|
76
105
|
it 'yields' do
|
|
77
106
|
yielded = false
|
|
78
107
|
Resque::Plugins::Logstash.configure { yielded = true }
|
|
79
|
-
expect(yielded).to
|
|
108
|
+
expect(yielded).to be true
|
|
80
109
|
end
|
|
81
110
|
|
|
82
111
|
it 'yield config object' do
|
|
@@ -10,6 +10,20 @@ describe Resque::Plugins::Logstash::Transport::Redis do
|
|
|
10
10
|
expect(transport.port).to eq(42)
|
|
11
11
|
expect(transport.key).to eq('key')
|
|
12
12
|
end
|
|
13
|
+
|
|
14
|
+
it 'accepts host, port and the key as keyword arguments' do
|
|
15
|
+
transport = Resque::Plugins::Logstash::Transport::Redis.new(host: 'host', port: 42, key: 'key')
|
|
16
|
+
expect(transport.host).to eq('host')
|
|
17
|
+
expect(transport.port).to eq(42)
|
|
18
|
+
expect(transport.key).to eq('key')
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
it 'accepts redis and key as the parameters' do
|
|
22
|
+
transport = Resque::Plugins::Logstash::Transport::Redis.new(redis: double(rpush: 1), key: 'key')
|
|
23
|
+
expect(transport.key).to eq('key')
|
|
24
|
+
|
|
25
|
+
transport.push(a: 1)
|
|
26
|
+
end
|
|
13
27
|
end
|
|
14
28
|
|
|
15
29
|
describe '#push' do
|
metadata
CHANGED
|
@@ -1,83 +1,83 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: resque-logstash
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.0.
|
|
4
|
+
version: 0.0.3
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Eugene Pimenov
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date:
|
|
11
|
+
date: 2015-03-11 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: bundler
|
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
|
16
16
|
requirements:
|
|
17
|
-
- - ~>
|
|
17
|
+
- - "~>"
|
|
18
18
|
- !ruby/object:Gem::Version
|
|
19
19
|
version: '1.3'
|
|
20
20
|
type: :development
|
|
21
21
|
prerelease: false
|
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
|
23
23
|
requirements:
|
|
24
|
-
- - ~>
|
|
24
|
+
- - "~>"
|
|
25
25
|
- !ruby/object:Gem::Version
|
|
26
26
|
version: '1.3'
|
|
27
27
|
- !ruby/object:Gem::Dependency
|
|
28
28
|
name: rake
|
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
|
30
30
|
requirements:
|
|
31
|
-
- -
|
|
31
|
+
- - ">="
|
|
32
32
|
- !ruby/object:Gem::Version
|
|
33
33
|
version: '0'
|
|
34
34
|
type: :development
|
|
35
35
|
prerelease: false
|
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
|
37
37
|
requirements:
|
|
38
|
-
- -
|
|
38
|
+
- - ">="
|
|
39
39
|
- !ruby/object:Gem::Version
|
|
40
40
|
version: '0'
|
|
41
41
|
- !ruby/object:Gem::Dependency
|
|
42
42
|
name: rspec
|
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
|
44
44
|
requirements:
|
|
45
|
-
- -
|
|
45
|
+
- - ">="
|
|
46
46
|
- !ruby/object:Gem::Version
|
|
47
47
|
version: '0'
|
|
48
48
|
type: :development
|
|
49
49
|
prerelease: false
|
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
|
51
51
|
requirements:
|
|
52
|
-
- -
|
|
52
|
+
- - ">="
|
|
53
53
|
- !ruby/object:Gem::Version
|
|
54
54
|
version: '0'
|
|
55
55
|
- !ruby/object:Gem::Dependency
|
|
56
56
|
name: resque
|
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
|
58
58
|
requirements:
|
|
59
|
-
- - ~>
|
|
59
|
+
- - "~>"
|
|
60
60
|
- !ruby/object:Gem::Version
|
|
61
61
|
version: '1.24'
|
|
62
62
|
type: :runtime
|
|
63
63
|
prerelease: false
|
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
|
65
65
|
requirements:
|
|
66
|
-
- - ~>
|
|
66
|
+
- - "~>"
|
|
67
67
|
- !ruby/object:Gem::Version
|
|
68
68
|
version: '1.24'
|
|
69
69
|
- !ruby/object:Gem::Dependency
|
|
70
70
|
name: logstash-event
|
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|
|
72
72
|
requirements:
|
|
73
|
-
- - ~>
|
|
73
|
+
- - "~>"
|
|
74
74
|
- !ruby/object:Gem::Version
|
|
75
75
|
version: '1.2'
|
|
76
76
|
type: :runtime
|
|
77
77
|
prerelease: false
|
|
78
78
|
version_requirements: !ruby/object:Gem::Requirement
|
|
79
79
|
requirements:
|
|
80
|
-
- - ~>
|
|
80
|
+
- - "~>"
|
|
81
81
|
- !ruby/object:Gem::Version
|
|
82
82
|
version: '1.2'
|
|
83
83
|
description: Measure duration of a resque job and log it in the logstash
|
|
@@ -87,8 +87,8 @@ executables: []
|
|
|
87
87
|
extensions: []
|
|
88
88
|
extra_rdoc_files: []
|
|
89
89
|
files:
|
|
90
|
-
- .gitignore
|
|
91
|
-
- .rspec
|
|
90
|
+
- ".gitignore"
|
|
91
|
+
- ".rspec"
|
|
92
92
|
- Gemfile
|
|
93
93
|
- LICENSE.txt
|
|
94
94
|
- README.md
|
|
@@ -111,17 +111,17 @@ require_paths:
|
|
|
111
111
|
- lib
|
|
112
112
|
required_ruby_version: !ruby/object:Gem::Requirement
|
|
113
113
|
requirements:
|
|
114
|
-
- -
|
|
114
|
+
- - ">="
|
|
115
115
|
- !ruby/object:Gem::Version
|
|
116
116
|
version: '0'
|
|
117
117
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
118
118
|
requirements:
|
|
119
|
-
- -
|
|
119
|
+
- - ">="
|
|
120
120
|
- !ruby/object:Gem::Version
|
|
121
121
|
version: '0'
|
|
122
122
|
requirements: []
|
|
123
123
|
rubyforge_project:
|
|
124
|
-
rubygems_version: 2.
|
|
124
|
+
rubygems_version: 2.4.5
|
|
125
125
|
signing_key:
|
|
126
126
|
specification_version: 4
|
|
127
127
|
summary: A really simple logstash logger for resque
|