log_weasel 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.
- data/.gitignore +1 -0
- data/Gemfile.lock +6 -1
- data/Rakefile +2 -0
- data/lib/log_weasel/buffered_logger.rb +15 -0
- data/lib/log_weasel/hoptoad_notifier.rb +23 -0
- data/lib/log_weasel/middleware.rb +13 -0
- data/lib/log_weasel/resque.rb +67 -0
- data/lib/log_weasel/transaction.rb +4 -4
- data/lib/log_weasel/version.rb +1 -1
- data/lib/log_weasel.rb +8 -0
- data/log_weasel.gemspec +1 -0
- data/spec/log_weasel/buffered_logger_spec.rb +15 -0
- data/spec/log_weasel/hoptoad_notifier_spec.rb +22 -0
- data/spec/log_weasel/resque_spec.rb +48 -0
- data/spec/log_weasel/transaction_spec.rb +0 -1
- data/spec/spec_helper.rb +3 -1
- metadata +28 -5
data/.gitignore
CHANGED
data/Gemfile.lock
CHANGED
@@ -1,13 +1,17 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
log_weasel (0.0.
|
4
|
+
log_weasel (0.0.3)
|
5
5
|
|
6
6
|
GEM
|
7
7
|
remote: http://rubygems.org/
|
8
8
|
specs:
|
9
9
|
activesupport (3.0.4)
|
10
|
+
builder (3.0.0)
|
10
11
|
diff-lcs (1.1.2)
|
12
|
+
hoptoad_notifier (2.4.5)
|
13
|
+
activesupport
|
14
|
+
builder
|
11
15
|
json (1.4.6)
|
12
16
|
mocha (0.9.11)
|
13
17
|
rake
|
@@ -41,6 +45,7 @@ PLATFORMS
|
|
41
45
|
|
42
46
|
DEPENDENCIES
|
43
47
|
activesupport (~> 3.0)
|
48
|
+
hoptoad_notifier
|
44
49
|
log_weasel!
|
45
50
|
mocha
|
46
51
|
resque (~> 1.0)
|
data/Rakefile
CHANGED
@@ -0,0 +1,15 @@
|
|
1
|
+
require 'active_support/buffered_logger'
|
2
|
+
|
3
|
+
class LogWeasel::BufferedLogger < ::ActiveSupport::BufferedLogger
|
4
|
+
def add(severity, message = nil, progname = nil, &block)
|
5
|
+
super(severity, "[#{LogWeasel::Transaction.id}] #$$: #{format_severity(severity)} #{message}", progname, &block)
|
6
|
+
end
|
7
|
+
|
8
|
+
private
|
9
|
+
# Severity label for logging. (max 5 char)
|
10
|
+
SEV_LABEL = %w(DEBUG INFO WARN ERROR FATAL ANY)
|
11
|
+
|
12
|
+
def format_severity(severity)
|
13
|
+
SEV_LABEL[severity] || 'ANY'
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module LogWeasel::HoptoadNotifier
|
2
|
+
def notify_with_transaction_id(exception, opts = {})
|
3
|
+
add_transaction_id(opts) if LogWeasel::Transaction.id
|
4
|
+
notify_without_transaction_id exception, opts
|
5
|
+
end
|
6
|
+
|
7
|
+
def notify_or_ignore_with_transaction_id(exception, opts = {})
|
8
|
+
add_transaction_id(opts) if LogWeasel::Transaction.id
|
9
|
+
notify_or_ignore_without_transaction_id exception, opts
|
10
|
+
end
|
11
|
+
|
12
|
+
def add_transaction_id(opts)
|
13
|
+
opts[:parameters] ||= {}
|
14
|
+
opts[:parameters]['log_weasel_id'] = LogWeasel::Transaction.id
|
15
|
+
end
|
16
|
+
|
17
|
+
def self.included(base)
|
18
|
+
base.send :alias_method, :notify_without_transaction_id, :notify
|
19
|
+
base.send :alias_method, :notify, :notify_with_transaction_id
|
20
|
+
base.send :alias_method, :notify_or_ignore_without_transaction_id, :notify_or_ignore
|
21
|
+
base.send :alias_method, :notify_or_ignore, :notify_or_ignore_with_transaction_id
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
class LogWeasel::Middleware
|
2
|
+
def initialize(app, options = {})
|
3
|
+
@app = app
|
4
|
+
@key = options[:key] || 'RAILS'
|
5
|
+
end
|
6
|
+
|
7
|
+
def call(env)
|
8
|
+
LogWeasel::Transaction.create "#{@key}-WEB"
|
9
|
+
@app.call(env)
|
10
|
+
ensure
|
11
|
+
LogWeasel::Transaction.destroy
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,67 @@
|
|
1
|
+
module LogWeasel::Resque
|
2
|
+
|
3
|
+
def self.initialize!(key)
|
4
|
+
::Resque::Worker.send(:include, LogWeasel::Resque::Worker)
|
5
|
+
::Resque::Job.send(:include, LogWeasel::Resque::Job)
|
6
|
+
::Resque.extend(LogWeasel::Resque::ClassMethods)
|
7
|
+
|
8
|
+
::Resque.after_fork do |job|
|
9
|
+
LogWeasel::Resque::Callbacks.after_fork job, key
|
10
|
+
end
|
11
|
+
|
12
|
+
::Resque.before_push do |queue, item|
|
13
|
+
LogWeasel::Resque::Callbacks.before_push queue, item, key
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
module Callbacks
|
18
|
+
def self.after_fork(job, key)
|
19
|
+
if job.context && job.context.has_key?('log_weasel_id')
|
20
|
+
LogWeasel::Transaction.id = job.context['log_weasel_id']
|
21
|
+
else
|
22
|
+
LogWeasel::Transaction.create "#{key}-RESQUE"
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def self.before_push(queue, item, key)
|
27
|
+
item['context'] = {'log_weasel_id' => (LogWeasel::Transaction.id || LogWeasel::Transaction.create("#{key}-RESQUE"))}
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
module ClassMethods
|
32
|
+
def before_push(&block)
|
33
|
+
block ? (@before_push = block) : @before_push
|
34
|
+
end
|
35
|
+
|
36
|
+
def push(queue, item)
|
37
|
+
self.before_push.call(queue, item) if self.before_push
|
38
|
+
super
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
module Job
|
43
|
+
def context
|
44
|
+
@payload['context']
|
45
|
+
end
|
46
|
+
|
47
|
+
def inspect_with_context
|
48
|
+
inspect_without_context.gsub /\)$/, " | #{context.inspect})"
|
49
|
+
end
|
50
|
+
|
51
|
+
def self.included(base)
|
52
|
+
base.send :alias_method, :inspect_without_context, :inspect
|
53
|
+
base.send :alias_method, :inspect, :inspect_with_context
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
module Worker
|
58
|
+
def log_with_transaction_id(message)
|
59
|
+
log_without_transaction_id "[#{LogWeasel::Transaction.id}] #{message}"
|
60
|
+
end
|
61
|
+
|
62
|
+
def self.included(base)
|
63
|
+
base.send :alias_method, :log_without_transaction_id, :log
|
64
|
+
base.send :alias_method, :log, :log_with_transaction_id
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
@@ -2,19 +2,19 @@ module LogWeasel
|
|
2
2
|
module Transaction
|
3
3
|
|
4
4
|
def self.create(key = nil)
|
5
|
-
Thread.current[:
|
5
|
+
Thread.current[:log_weasel_id] = "#{key ? "#{key}_" : ""}#{SecureRandom.hex(10)}"
|
6
6
|
end
|
7
7
|
|
8
8
|
def self.destroy
|
9
|
-
Thread.current[:
|
9
|
+
Thread.current[:log_weasel_id] = nil
|
10
10
|
end
|
11
11
|
|
12
12
|
def self.id=(id)
|
13
|
-
Thread.current[:
|
13
|
+
Thread.current[:log_weasel_id] = id
|
14
14
|
end
|
15
15
|
|
16
16
|
def self.id
|
17
|
-
Thread.current[:
|
17
|
+
Thread.current[:log_weasel_id]
|
18
18
|
end
|
19
19
|
end
|
20
20
|
|
data/lib/log_weasel/version.rb
CHANGED
data/lib/log_weasel.rb
CHANGED
@@ -1 +1,9 @@
|
|
1
1
|
require 'log_weasel/transaction'
|
2
|
+
require 'log_weasel/buffered_logger'
|
3
|
+
require 'log_weasel/hoptoad_notifier'
|
4
|
+
require 'log_weasel/middleware'
|
5
|
+
require 'log_weasel/resque'
|
6
|
+
|
7
|
+
class << ::HoptoadNotifier
|
8
|
+
include LogWeasel::HoptoadNotifier;
|
9
|
+
end if defined? ::HoptoadNotifier
|
data/log_weasel.gemspec
CHANGED
@@ -18,6 +18,7 @@ Gem::Specification.new do |s|
|
|
18
18
|
s.add_development_dependency('mocha')
|
19
19
|
s.add_development_dependency('resque', ['~> 1.0'])
|
20
20
|
s.add_development_dependency('activesupport', ['~> 3.0'])
|
21
|
+
s.add_development_dependency('hoptoad_notifier',)
|
21
22
|
|
22
23
|
s.files = `git ls-files`.split("\n")
|
23
24
|
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
@@ -0,0 +1,15 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
|
2
|
+
require 'log_weasel/buffered_logger'
|
3
|
+
|
4
|
+
describe LogWeasel::BufferedLogger do
|
5
|
+
before do
|
6
|
+
@stringio = StringIO.new
|
7
|
+
@logger = LogWeasel::BufferedLogger.new @stringio
|
8
|
+
LogWeasel::Transaction.stubs(:id).returns('123')
|
9
|
+
end
|
10
|
+
|
11
|
+
it "logs transaction id" do
|
12
|
+
@logger.info 'message'
|
13
|
+
@stringio.string.should =~ /\[123\]/
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
|
2
|
+
require 'hoptoad_notifier'
|
3
|
+
require 'log_weasel/hoptoad_notifier'
|
4
|
+
|
5
|
+
describe LogWeasel::HoptoadNotifier do
|
6
|
+
before do
|
7
|
+
class << ::HoptoadNotifier
|
8
|
+
include LogWeasel::HoptoadNotifier;
|
9
|
+
end if defined? ::HoptoadNotifier
|
10
|
+
|
11
|
+
HoptoadNotifier.configure {}
|
12
|
+
LogWeasel::Transaction.stubs(:id).returns('123')
|
13
|
+
end
|
14
|
+
|
15
|
+
it "adds transaction id to parameters with no parameters" do
|
16
|
+
HoptoadNotifier.expects(:send_notice).with do |notice|
|
17
|
+
notice.parameters.should have_key('log_weasel_id')
|
18
|
+
end
|
19
|
+
HoptoadNotifier.notify(RuntimeError.new('failure'))
|
20
|
+
end
|
21
|
+
|
22
|
+
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
|
2
|
+
require 'resque'
|
3
|
+
require 'log_weasel/resque'
|
4
|
+
|
5
|
+
describe LogWeasel::Resque do
|
6
|
+
|
7
|
+
before do
|
8
|
+
LogWeasel::Resque.initialize! 'FOO'
|
9
|
+
end
|
10
|
+
|
11
|
+
after do
|
12
|
+
LogWeasel::Transaction.destroy
|
13
|
+
end
|
14
|
+
|
15
|
+
it "pushes with log_weasel_id in context" do
|
16
|
+
Resque.stubs(:redis).returns(stub(:sadd => nil, :rpush => nil))
|
17
|
+
Resque.expects(:encode).with do |item|
|
18
|
+
item['context'].should_not be_nil
|
19
|
+
item['context'].should have_key('log_weasel_id')
|
20
|
+
item['context']['log_weasel_id'].should =~ /^FOO-RESQUE/
|
21
|
+
end
|
22
|
+
Resque.push('queue', {'args' => [1]})
|
23
|
+
end
|
24
|
+
|
25
|
+
describe ".after_fork" do
|
26
|
+
context "with log_weasel_id" do
|
27
|
+
before do
|
28
|
+
@job = Resque::Job.new 'queue', {'args' =>[{}], 'context' => {'log_weasel_id' => "123"}}
|
29
|
+
end
|
30
|
+
|
31
|
+
it "sets transaction id from args" do
|
32
|
+
LogWeasel::Transaction.expects(:id=).with('123')
|
33
|
+
LogWeasel::Resque::Callbacks.after_fork @job, nil
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
context "without log_weasel_id" do
|
38
|
+
before do
|
39
|
+
@job = Resque::Job.new 'queue', {'args' =>[1]}
|
40
|
+
end
|
41
|
+
|
42
|
+
it "creates a new log_weasel_id" do
|
43
|
+
LogWeasel::Transaction.expects(:create)
|
44
|
+
LogWeasel::Resque::Callbacks.after_fork @job, nil
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
data/spec/spec_helper.rb
CHANGED
@@ -1,9 +1,11 @@
|
|
1
1
|
$LOAD_PATH.unshift(File.dirname(__FILE__))
|
2
2
|
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
|
3
3
|
|
4
|
-
require 'log_weasel'
|
4
|
+
require 'log_weasel/transaction'
|
5
5
|
require 'rspec'
|
6
6
|
|
7
|
+
require 'active_support/secure_random'
|
8
|
+
|
7
9
|
Rspec.configure do |config|
|
8
10
|
config.mock_with :mocha
|
9
11
|
end
|
metadata
CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
|
|
5
5
|
segments:
|
6
6
|
- 0
|
7
7
|
- 0
|
8
|
-
-
|
9
|
-
version: 0.0.
|
8
|
+
- 3
|
9
|
+
version: 0.0.3
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- Alon Salant
|
@@ -71,6 +71,19 @@ dependencies:
|
|
71
71
|
type: :development
|
72
72
|
prerelease: false
|
73
73
|
version_requirements: *id004
|
74
|
+
- !ruby/object:Gem::Dependency
|
75
|
+
name: hoptoad_notifier
|
76
|
+
requirement: &id005 !ruby/object:Gem::Requirement
|
77
|
+
none: false
|
78
|
+
requirements:
|
79
|
+
- - ">="
|
80
|
+
- !ruby/object:Gem::Version
|
81
|
+
segments:
|
82
|
+
- 0
|
83
|
+
version: "0"
|
84
|
+
type: :development
|
85
|
+
prerelease: false
|
86
|
+
version_requirements: *id005
|
74
87
|
description: Instrument Rails and Resque with shared transaction IDs so that you trace execution across instances.
|
75
88
|
email:
|
76
89
|
- alon@salant.org
|
@@ -89,9 +102,16 @@ files:
|
|
89
102
|
- README.md
|
90
103
|
- Rakefile
|
91
104
|
- lib/log_weasel.rb
|
105
|
+
- lib/log_weasel/buffered_logger.rb
|
106
|
+
- lib/log_weasel/hoptoad_notifier.rb
|
107
|
+
- lib/log_weasel/middleware.rb
|
108
|
+
- lib/log_weasel/resque.rb
|
92
109
|
- lib/log_weasel/transaction.rb
|
93
110
|
- lib/log_weasel/version.rb
|
94
111
|
- log_weasel.gemspec
|
112
|
+
- spec/log_weasel/buffered_logger_spec.rb
|
113
|
+
- spec/log_weasel/hoptoad_notifier_spec.rb
|
114
|
+
- spec/log_weasel/resque_spec.rb
|
95
115
|
- spec/log_weasel/transaction_spec.rb
|
96
116
|
- spec/spec_helper.rb
|
97
117
|
has_rdoc: true
|
@@ -108,7 +128,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
108
128
|
requirements:
|
109
129
|
- - ">="
|
110
130
|
- !ruby/object:Gem::Version
|
111
|
-
hash: -
|
131
|
+
hash: -3932380171388894158
|
112
132
|
segments:
|
113
133
|
- 0
|
114
134
|
version: "0"
|
@@ -117,7 +137,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
117
137
|
requirements:
|
118
138
|
- - ">="
|
119
139
|
- !ruby/object:Gem::Version
|
120
|
-
hash: -
|
140
|
+
hash: -3932380171388894158
|
121
141
|
segments:
|
122
142
|
- 0
|
123
143
|
version: "0"
|
@@ -127,7 +147,10 @@ rubyforge_project: log_weasel
|
|
127
147
|
rubygems_version: 1.3.7
|
128
148
|
signing_key:
|
129
149
|
specification_version: 3
|
130
|
-
summary: log_weasel-0.0.
|
150
|
+
summary: log_weasel-0.0.3
|
131
151
|
test_files:
|
152
|
+
- spec/log_weasel/buffered_logger_spec.rb
|
153
|
+
- spec/log_weasel/hoptoad_notifier_spec.rb
|
154
|
+
- spec/log_weasel/resque_spec.rb
|
132
155
|
- spec/log_weasel/transaction_spec.rb
|
133
156
|
- spec/spec_helper.rb
|