logglier 0.2.7 → 0.2.8
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/lib/logglier/client/http/sync.rb +2 -0
- data/lib/logglier/client/http/threaded.rb +28 -2
- data/lib/logglier/client/http.rb +1 -1
- data/lib/logglier/client/syslog.rb +2 -1
- data/lib/logglier/client.rb +2 -2
- data/lib/logglier/version.rb +1 -1
- data/logglier.gemspec +1 -1
- data/spec/client/syslog_spec.rb +14 -0
- data/spec/http_spec.rb +5 -0
- data/spec/threaded_spec.rb +40 -0
- metadata +21 -8
@@ -4,7 +4,34 @@ module Logglier
|
|
4
4
|
module Client
|
5
5
|
class HTTP
|
6
6
|
|
7
|
-
# Used by the Threaded client to
|
7
|
+
# Used by the Threaded client to manage the delivery thread
|
8
|
+
# recreating it if is lost due to a fork.
|
9
|
+
#
|
10
|
+
class DeliveryThreadManager
|
11
|
+
def initialize(input_uri, opts={})
|
12
|
+
@input_uri, @opts = input_uri, opts
|
13
|
+
start_thread
|
14
|
+
end
|
15
|
+
|
16
|
+
# Pushes a message to the delivery thread, starting one if necessary
|
17
|
+
def deliver(message)
|
18
|
+
start_thread unless @thread.alive?
|
19
|
+
@thread.deliver(message)
|
20
|
+
#Race condition? Sometimes we need to rescue this and start a new thread
|
21
|
+
rescue NoMethodError
|
22
|
+
@thread.kill #Try not to leak threads, should already be dead anyway
|
23
|
+
start_thread
|
24
|
+
retry
|
25
|
+
end
|
26
|
+
|
27
|
+
private
|
28
|
+
|
29
|
+
def start_thread
|
30
|
+
@thread = DeliveryThread.new(@input_uri, @opts)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
# Used by the DeliveryThreadManager to hold a queue, deliver messsages from it
|
8
35
|
# and to ensure it's flushed on program exit.
|
9
36
|
#
|
10
37
|
# @note Uses NetHTTPProxy
|
@@ -19,7 +46,6 @@ module Logglier
|
|
19
46
|
# @note See NetHTTPProxy for further option processing of opts
|
20
47
|
# @note registers an at_exit handler that signals exit intent and joins the thread.
|
21
48
|
def initialize(input_uri, opts={})
|
22
|
-
|
23
49
|
@input_uri = input_uri
|
24
50
|
|
25
51
|
opts[:read_timeout] = opts[:read_timeout] || 120
|
data/lib/logglier/client/http.rb
CHANGED
@@ -14,7 +14,7 @@ module Logglier
|
|
14
14
|
setup_input_uri(opts)
|
15
15
|
@format = opts[:format] ? opts[:format].to_sym : nil
|
16
16
|
@deliverer = if opts[:threaded]
|
17
|
-
Logglier::Client::HTTP::
|
17
|
+
Logglier::Client::HTTP::DeliveryThreadManager.new(@input_uri, opts)
|
18
18
|
else
|
19
19
|
Logglier::Client::HTTP::NetHTTPProxy.new(@input_uri, opts)
|
20
20
|
end
|
@@ -60,7 +60,7 @@ module Logglier
|
|
60
60
|
# Syslog specific PRI calculation.
|
61
61
|
# See RFC3164 4.1.1
|
62
62
|
def pri(severity)
|
63
|
-
|
63
|
+
severity_value = case severity
|
64
64
|
when "FATAL"
|
65
65
|
0
|
66
66
|
when "ERROR"
|
@@ -72,6 +72,7 @@ module Logglier
|
|
72
72
|
when "DEBUG"
|
73
73
|
7
|
74
74
|
end
|
75
|
+
(@facility << 3) + severity_value
|
75
76
|
end
|
76
77
|
|
77
78
|
# Generate a syslog compat message
|
data/lib/logglier/client.rb
CHANGED
@@ -14,7 +14,7 @@ module Logglier
|
|
14
14
|
# @return [Logglier::Client::HTTP, Logglier::Client::Syslog] returns an instance of the Logglier Client class
|
15
15
|
def self.new(input_url, opts={})
|
16
16
|
unless input_url
|
17
|
-
raise
|
17
|
+
raise InputURLRequired.new
|
18
18
|
end
|
19
19
|
|
20
20
|
opts.merge!({ :input_url => input_url })
|
@@ -90,7 +90,7 @@ module Logglier
|
|
90
90
|
begin
|
91
91
|
@input_uri = URI.parse(@input_uri)
|
92
92
|
rescue URI::InvalidURIError => e
|
93
|
-
raise
|
93
|
+
raise InputURLRequired.new("Invalid Input URL: #{@input_uri}")
|
94
94
|
end
|
95
95
|
end
|
96
96
|
|
data/lib/logglier/version.rb
CHANGED
data/logglier.gemspec
CHANGED
@@ -0,0 +1,14 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Logglier::Client::Syslog do
|
4
|
+
describe "PRI calculation conforms to RFC3164 4.1.1" do
|
5
|
+
before do
|
6
|
+
UDPSocket.stub(:new).and_return(mock("socket").as_null_object)
|
7
|
+
TCPSocket.stub(:new).and_return(mock("Socket").as_null_object)
|
8
|
+
end
|
9
|
+
it "calculates a number with the lowest 3 bits representing the severity and the higher bits representing the facility" do
|
10
|
+
client = described_class.new(:input_url => "udp://127.0.0.1:514/17")
|
11
|
+
client.pri("WARN").should == (17 << 3) + 4
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
data/spec/http_spec.rb
CHANGED
@@ -23,6 +23,11 @@ describe 'HTTP' do
|
|
23
23
|
proxy.failsafe.should == $stderr
|
24
24
|
end
|
25
25
|
|
26
|
+
it "defaults Content-Type header to text/plain" do
|
27
|
+
@http.should_receive(:request_post).with(anything(), anything(), hash_including('Content-Type' => 'text/plain'))
|
28
|
+
@proxy.deliver('message')
|
29
|
+
end
|
30
|
+
|
26
31
|
describe "error handling" do
|
27
32
|
Logglier::Client::HTTP::NetHTTPProxy::RETRY_EXCEPTIONS.each do |error|
|
28
33
|
context "for #{error}" do
|
data/spec/threaded_spec.rb
CHANGED
@@ -19,3 +19,43 @@ describe Logglier::Client::HTTP::DeliveryThread do
|
|
19
19
|
subject.join
|
20
20
|
end
|
21
21
|
end
|
22
|
+
|
23
|
+
describe Logglier::Client::HTTP::DeliveryThreadManager do
|
24
|
+
before do
|
25
|
+
@mock_http = MockNetHTTPProxy.new
|
26
|
+
Logglier::Client::HTTP::NetHTTPProxy.stub(:new) { @mock_http }
|
27
|
+
end
|
28
|
+
|
29
|
+
subject { described_class.new(URI.parse('http://localhost')) }
|
30
|
+
|
31
|
+
it "should instantiate a delivery_thread" do
|
32
|
+
Logglier::Client::HTTP::DeliveryThread.should_receive(:new).once
|
33
|
+
subject
|
34
|
+
end
|
35
|
+
|
36
|
+
it "should deliver messages via delivery_thread" do
|
37
|
+
@mock_thread = Object.new
|
38
|
+
@mock_thread.stub(:alive?) { true }
|
39
|
+
@mock_thread.should_receive(:deliver).once.with('foo')
|
40
|
+
Logglier::Client::HTTP::DeliveryThread.should_receive(:new).once.and_return(@mock_thread)
|
41
|
+
|
42
|
+
subject.deliver('foo')
|
43
|
+
end
|
44
|
+
|
45
|
+
it "should respawn a dead delivery_thread" do
|
46
|
+
@first_thread = subject.instance_variable_get(:@thread)
|
47
|
+
@first_thread.should_receive(:deliver).once.with('first')
|
48
|
+
|
49
|
+
subject.deliver('first')
|
50
|
+
|
51
|
+
@first_thread.kill
|
52
|
+
|
53
|
+
subject.deliver('force respawn')
|
54
|
+
|
55
|
+
@second_thread = subject.instance_variable_get(:@thread)
|
56
|
+
@second_thread.should_not eql(@first_thread)
|
57
|
+
@second_thread.should_receive(:deliver).once.with('second')
|
58
|
+
|
59
|
+
subject.deliver('second')
|
60
|
+
end
|
61
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: logglier
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.8
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2012-08-12 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rake
|
16
|
-
requirement:
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
@@ -21,18 +21,28 @@ dependencies:
|
|
21
21
|
version: '0'
|
22
22
|
type: :development
|
23
23
|
prerelease: false
|
24
|
-
version_requirements:
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ! '>='
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '0'
|
25
30
|
- !ruby/object:Gem::Dependency
|
26
31
|
name: rspec
|
27
|
-
requirement:
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
28
33
|
none: false
|
29
34
|
requirements:
|
30
35
|
- - ~>
|
31
36
|
- !ruby/object:Gem::Version
|
32
|
-
version: 2.
|
37
|
+
version: 2.11.0
|
33
38
|
type: :development
|
34
39
|
prerelease: false
|
35
|
-
version_requirements:
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ~>
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: 2.11.0
|
36
46
|
description: Logger => Loggly
|
37
47
|
email: edwardam@interlix.com
|
38
48
|
executables: []
|
@@ -51,6 +61,7 @@ files:
|
|
51
61
|
- ./lib/logglier/client.rb
|
52
62
|
- ./lib/logglier/version.rb
|
53
63
|
- ./lib/logglier.rb
|
64
|
+
- ./spec/client/syslog_spec.rb
|
54
65
|
- ./spec/client_spec.rb
|
55
66
|
- ./spec/http_spec.rb
|
56
67
|
- ./spec/logglier_spec.rb
|
@@ -76,13 +87,15 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
76
87
|
version: 1.3.6
|
77
88
|
requirements: []
|
78
89
|
rubyforge_project: logglier
|
79
|
-
rubygems_version: 1.8.
|
90
|
+
rubygems_version: 1.8.23
|
80
91
|
signing_key:
|
81
92
|
specification_version: 3
|
82
93
|
summary: Loggly "plugin" for Logger
|
83
94
|
test_files:
|
95
|
+
- ./spec/client/syslog_spec.rb
|
84
96
|
- ./spec/client_spec.rb
|
85
97
|
- ./spec/http_spec.rb
|
86
98
|
- ./spec/logglier_spec.rb
|
87
99
|
- ./spec/spec_helper.rb
|
88
100
|
- ./spec/threaded_spec.rb
|
101
|
+
has_rdoc:
|