gelf 0.9.2 → 1.0.0

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.
@@ -0,0 +1,5 @@
1
+ pkg/
2
+ coverage/
3
+ rdoc/
4
+
5
+ .DS_Store
@@ -0,0 +1,3 @@
1
+ 1.0.0, 2010-11-10:
2
+ - initial stable version;
3
+ - deprecated Gelf class is still there.
data/LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2010 Lennart Koopmann
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,20 @@
1
+ = GELF
2
+
3
+ This is the new GELF gem written by Aleksey Palazhchenko. It is based on the old gem by Lennart Koopmann and allows you to send GELF
4
+ messages to Graylog2 server instances. See http://www.graylog2.org/about/gelf for more information about GELF and
5
+ http://www.graylog2.org/documentation/libraries for usage examples.
6
+
7
+ Works with Ruby 1.8.7 and 1.9.2. 1.8.6 is not supported.
8
+
9
+ == Note on Patches/Pull Requests
10
+
11
+ * Fork the project.
12
+ * Make your feature addition or bug fix.
13
+ * Add tests for it. This is important so I don't break it in a future version unintentionally.
14
+ * Commit, do not mess with rakefile, version, or history.
15
+ (if you want to have your own version, that is fine but bump version in a commit by itself I can ignore when I pull)
16
+ * Send me a pull request. Bonus points for topic branches.
17
+
18
+ == Copyright
19
+
20
+ Copyright (c) 2010 Lennart Koopmann. See LICENSE for details.
data/Rakefile CHANGED
@@ -1,10 +1,56 @@
1
1
  require 'rubygems'
2
2
  require 'rake'
3
- require 'echoe'
4
3
 
5
- Echoe.new('gelf', '0.9.2') do |p|
6
- p.description = "Library to send Graylog2 Extended Log Format (GELF) messages"
7
- p.url = "http://www.graylog2.org/"
8
- p.author = "Lennart Koopmann"
9
- p.email = "lennart@socketfeed.com"
4
+ begin
5
+ require 'jeweler'
6
+ Jeweler::Tasks.new do |gem|
7
+ gem.name = "gelf"
8
+ gem.summary = 'Library to send GELF messages to Graylog2 logging server'
9
+ gem.description = 'Suports plain-text, GELF messages and exceptions.'
10
+ gem.email = "lennart@socketfeed.com"
11
+ gem.homepage = "http://github.com/Graylog2/gelf-rb"
12
+ gem.authors = ["Alexey Palazhchenko", "Lennart Koopmann"]
13
+ gem.add_dependency "json"
14
+ gem.add_development_dependency "shoulda"
15
+ gem.add_development_dependency "mocha"
16
+ # gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
17
+ end
18
+ Jeweler::GemcutterTasks.new
19
+ rescue LoadError
20
+ puts "Jeweler (or a dependency) not available. Install it with: gem install jeweler"
21
+ end
22
+
23
+ require 'rake/testtask'
24
+ Rake::TestTask.new(:test) do |test|
25
+ test.libs << 'lib' << 'test'
26
+ test.pattern = 'test/**/test_*.rb'
27
+ test.verbose = true
28
+ end
29
+
30
+ begin
31
+ require 'rcov/rcovtask'
32
+ Rcov::RcovTask.new do |test|
33
+ test.libs << 'test'
34
+ test.pattern = 'test/**/test_*.rb'
35
+ test.rcov_opts << '--exclude gem'
36
+ test.verbose = true
37
+ end
38
+ rescue LoadError
39
+ task :rcov do
40
+ abort "RCov is not available. In order to run rcov, you must: gem install rcov"
41
+ end
42
+ end
43
+
44
+ task :test => :check_dependencies
45
+
46
+ task :default => :test
47
+
48
+ require 'rake/rdoctask'
49
+ Rake::RDocTask.new do |rdoc|
50
+ version = File.exist?('VERSION') ? File.read('VERSION') : ""
51
+
52
+ rdoc.rdoc_dir = 'rdoc'
53
+ rdoc.title = "gelf #{version}"
54
+ rdoc.rdoc_files.include('README*')
55
+ rdoc.rdoc_files.include('lib/**/*.rb')
10
56
  end
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 1.0.0
@@ -1,30 +1,64 @@
1
+ # Generated by jeweler
2
+ # DO NOT EDIT THIS FILE DIRECTLY
3
+ # Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command
1
4
  # -*- encoding: utf-8 -*-
2
5
 
3
6
  Gem::Specification.new do |s|
4
7
  s.name = %q{gelf}
5
- s.version = "0.9.2"
8
+ s.version = "1.0.0"
6
9
 
7
- s.required_rubygems_version = Gem::Requirement.new(">= 1.2") if s.respond_to? :required_rubygems_version=
8
- s.authors = ["Lennart Koopmann"]
9
- s.date = %q{2010-10-18}
10
- s.description = %q{Library to send Graylog2 Extended Log Format (GELF) messages}
10
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
+ s.authors = ["Alexey Palazhchenko", "Lennart Koopmann"]
12
+ s.date = %q{2010-11-12}
13
+ s.description = %q{Suports plain-text, GELF messages and exceptions.}
11
14
  s.email = %q{lennart@socketfeed.com}
12
- s.extra_rdoc_files = ["lib/gelf.rb"]
13
- s.files = ["Manifest", "Rakefile", "lib/gelf.rb", "gelf.gemspec"]
14
- s.homepage = %q{http://www.graylog2.org/}
15
- s.rdoc_options = ["--line-numbers", "--inline-source", "--title", "Gelf"]
15
+ s.extra_rdoc_files = [
16
+ "LICENSE",
17
+ "README.rdoc"
18
+ ]
19
+ s.files = [
20
+ ".gitignore",
21
+ "CHANGELOG",
22
+ "LICENSE",
23
+ "README.rdoc",
24
+ "Rakefile",
25
+ "VERSION",
26
+ "gelf.gemspec",
27
+ "lib/gelf.rb",
28
+ "lib/gelf/deprecations.rb",
29
+ "lib/gelf/notifier.rb",
30
+ "test/helper.rb",
31
+ "test/test_deprecations.rb",
32
+ "test/test_notifier.rb"
33
+ ]
34
+ s.homepage = %q{http://github.com/Graylog2/gelf-rb}
35
+ s.rdoc_options = ["--charset=UTF-8"]
16
36
  s.require_paths = ["lib"]
17
- s.rubyforge_project = %q{gelf}
18
37
  s.rubygems_version = %q{1.3.7}
19
- s.summary = %q{Library to send Graylog2 Extended Log Format (GELF) messages}
38
+ s.summary = %q{Library to send GELF messages to Graylog2 logging server}
39
+ s.test_files = [
40
+ "test/helper.rb",
41
+ "test/test_notifier.rb",
42
+ "test/test_deprecations.rb"
43
+ ]
20
44
 
21
45
  if s.respond_to? :specification_version then
22
46
  current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
23
47
  s.specification_version = 3
24
48
 
25
49
  if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
50
+ s.add_runtime_dependency(%q<json>, [">= 0"])
51
+ s.add_development_dependency(%q<shoulda>, [">= 0"])
52
+ s.add_development_dependency(%q<mocha>, [">= 0"])
26
53
  else
54
+ s.add_dependency(%q<json>, [">= 0"])
55
+ s.add_dependency(%q<shoulda>, [">= 0"])
56
+ s.add_dependency(%q<mocha>, [">= 0"])
27
57
  end
28
58
  else
59
+ s.add_dependency(%q<json>, [">= 0"])
60
+ s.add_dependency(%q<shoulda>, [">= 0"])
61
+ s.add_dependency(%q<mocha>, [">= 0"])
29
62
  end
30
63
  end
64
+
@@ -1,95 +1,7 @@
1
- require 'rubygems'
2
1
  require 'json'
3
2
  require 'socket'
4
3
  require 'zlib'
5
4
  require 'digest/sha2'
6
5
 
7
- class Gelf
8
-
9
- MAX_CHUNK_SIZE = 8154
10
-
11
- attr_accessor :short_message, :full_message, :level, :host, :line, :file
12
-
13
- @@additional = []
14
-
15
- def initialize hostname, port
16
- @hostname = hostname
17
- @port = port
18
- end
19
-
20
- def add_additional key, value
21
- @@additional << { :key => key, :value => value }
22
- end
23
-
24
- def send
25
- # Check if all required parameters are set.
26
- if self.short_message == nil or self.host == nil
27
- raise "Missing required information. Attributes short_message and host must be set."
28
- end
29
-
30
- data = {
31
- "short_message" => self.short_message,
32
- "full_message" => self.full_message,
33
- "level" => self.level,
34
- "host" => self.host,
35
- "line" => self.line,
36
- "file" => self.file
37
- }
38
-
39
- # Add additional fields if there are some.
40
- if @@additional.count > 0
41
- @@additional.each do |additional|
42
- data[additional[:key].delete(' ')] = additional[:value]
43
- end
44
- end
45
-
46
- # Convert to JSON and deflate (ZLIB)
47
- data = Zlib::Deflate.deflate(data.to_json)
48
-
49
- # Create a socket to send the data.
50
- sock = UDPSocket.open
51
-
52
- # Maximum total size is 8192 byte for UDP datagram. Split to chunks if bigger. (GELFv2 supports chunking)
53
- if data.length > MAX_CHUNK_SIZE
54
- # Too big for one datagram. Send in chunks.
55
-
56
- # Build a message ID.
57
- msg_id = Time.now.to_f.to_s + rand(10000).to_s
58
-
59
- # Split data to chunks
60
- data_chunks = Array.new
61
- data.chars.each_slice(MAX_CHUNK_SIZE){|slice| data_chunks << slice.join}
62
-
63
- # Send every chunk
64
- i = 0
65
- data_chunks.each do |chunk|
66
- sock.send prepend_chunk_data(chunk, msg_id, i, data_chunks.size), 0, @hostname, @port
67
- i += 1
68
- end
69
- else
70
- # Data fits in datagram without chunking. Send!
71
- sock.send data, 0, @hostname, @port
72
- end
73
- end
74
-
75
- def prepend_chunk_data data, msg_id, sequence_number, sequence_count
76
- raise "Data must be a string and not be empty." if data == nil or data.length == 0
77
- raise "Message ID must be a string and not be empty." if msg_id == nil or msg_id.length == 0
78
- raise "Sequence count must be bigger than 0." if sequence_count <= 0
79
- raise "Sequence number must not be higher than sequence count." if sequence_number > sequence_count
80
-
81
- # Get raw binary (packed) GELF ID
82
- gelf_id_bin = [ 30, 15 ].pack('CC')
83
-
84
- # Get raw binary SHA256 hash of message ID
85
- digest = Digest::SHA256.new << msg_id
86
- msg_id_bin = digest.digest
87
-
88
- # Get raw binary (packed) sequence count and number
89
- sequence_nums_bin = [ sequence_number, sequence_count ].pack('nn');
90
-
91
- # Combine and prepend to message chunk
92
- return gelf_id_bin + msg_id_bin + sequence_nums_bin + data
93
- end
94
-
95
- end
6
+ require 'gelf/notifier'
7
+ require 'gelf/deprecations'
@@ -0,0 +1,37 @@
1
+ # Deprecated, do not use in new code, to be removed.
2
+ class Gelf
3
+ def deprecate(instead)
4
+ Kernel.caller.first =~ /:in `(.+)'$/
5
+ warn "Gelf##{$1} is deprecated. Use #{instead} instead."
6
+ end
7
+
8
+ attr_reader :notifier, :message
9
+
10
+ def initialize(hostname, port)
11
+ deprecate('GELF::Notifier.new(hostname, port) and GELF::Message.new')
12
+ @notifier = GELF::Notifier.new(hostname, port)
13
+ @message = {}
14
+ end
15
+
16
+ # bizarre, but Gelf did this...
17
+ def send
18
+ deprecate('GELF::Notifier#notify(message)')
19
+ @notifier.notify(@message)
20
+ end
21
+
22
+ [:short_message, :full_message, :level, :host, :line, :file].each do |a|
23
+ define_method a do
24
+ deprecate("GELF::Message##{a}")
25
+ @message[a]
26
+ end
27
+
28
+ define_method "#{a}=" do |value|
29
+ deprecate("GELF::Message##{a} = value")
30
+ @message[a] = value
31
+ end
32
+ end
33
+
34
+ def add_additional(key, value)
35
+ @message[key] = value
36
+ end
37
+ end
@@ -0,0 +1,118 @@
1
+ module GELF
2
+ class Notifier
3
+ @@id = 0
4
+
5
+ attr_accessor :host, :port
6
+ attr_reader :max_chunk_size
7
+
8
+ # +host+ and +port+ are host/ip and port of graylog2-server.
9
+ def initialize(host = 'localhost', port = 12201, max_size = 'WAN')
10
+ @host, @port, self.max_chunk_size = host, port, max_size
11
+ end
12
+
13
+ # +size+ may be a number of bytes, 'WAN' (1420 bytes) or 'LAN' (8154).
14
+ # Default (safe) value is 'WAN'.
15
+ def max_chunk_size=(size)
16
+ s = size.to_s.downcase
17
+ if s == 'wan'
18
+ @max_chunk_size = 1420
19
+ elsif s == 'lan'
20
+ @max_chunk_size = 8154
21
+ else
22
+ @max_chunk_size = size.to_int
23
+ end
24
+ end
25
+
26
+ # Same as notify!, but rescues all exceptions (including +ArgumentError+)
27
+ # and sends them instead.
28
+ def notify(*args)
29
+ notify!(*args)
30
+ rescue Exception => e
31
+ notify!(e)
32
+ end
33
+
34
+ # Sends message to Graylog2 server.
35
+ # +args+ can be:
36
+ # - hash-like object (any object which responds to +to_hash+, including +Hash+ instance)
37
+ # notify!(:short_message => 'All your rebase are belong to us', :user => 'AlekSi')
38
+ # - exception with optional hash-like object
39
+ # notify!(SecurityError.new('ALARM!'), :trespasser => 'AlekSi')
40
+ # - string-like object (anything which responds to +to_s+) with optional hash-like object
41
+ # notify!('Plain olde text message', :scribe => 'AlekSi')
42
+ # This method will raise +ArgumentError+ if arguments are wrong. Consider using notify instead.
43
+ def notify!(*args)
44
+ do_notify(extract_hash(*args))
45
+ end
46
+
47
+ private
48
+ def extract_hash(object_or_exception, args = {})
49
+ primary_data = if object_or_exception.respond_to?(:to_hash)
50
+ object_or_exception.to_hash
51
+ elsif object_or_exception.is_a?(Exception)
52
+ bt = object_or_exception.backtrace || ["Backtrace is not available."]
53
+ { 'short_message' => "#{object_or_exception.class}: #{object_or_exception.message}",
54
+ 'full_message' => "Backtrace:\n" + bt.join("\n") }
55
+ else
56
+ { 'short_message' => object_or_exception.to_s }
57
+ end
58
+
59
+ hash = args.merge(primary_data)
60
+
61
+ hash.keys.each do |key|
62
+ value, key_s = hash.delete(key), key.to_s
63
+ raise ArgumentError.new("Both #{key.inspect} and #{key_s} are present.") if hash.has_key?(key_s)
64
+ hash[key_s] = value
65
+ end
66
+
67
+ hash['host'] ||= @this_host || detect_this_host
68
+
69
+ # for compatibility with HoptoadNotifier
70
+ if hash['short_message'].to_s.empty?
71
+ if hash.has_key?('error_class') && hash.has_key?('error_message')
72
+ hash['short_message'] = "#{hash['error_class']}: #{hash['error_message']}"
73
+ hash.delete('error_class')
74
+ hash.delete('error_message')
75
+ end
76
+ end
77
+
78
+ %w(short_message host).each do |a|
79
+ if hash[a].to_s.empty?
80
+ raise ArgumentError.new("Attributes short_message and host must be set.")
81
+ end
82
+ end
83
+
84
+ hash
85
+ end
86
+
87
+ def do_notify(hash)
88
+ data = Zlib::Deflate.deflate(hash.to_json).bytes
89
+ sock = UDPSocket.open
90
+ datagrams = []
91
+
92
+ # Maximum total size is 8192 byte for UDP datagram. Split to chunks if bigger. (GELFv2 supports chunking)
93
+ if data.count > @max_chunk_size
94
+ @@id += 1
95
+ msg_id = Digest::SHA256.digest("#{Time.now.to_f}-#{@@id}")
96
+ i, count = 0, (data.count / 1.0 / @max_chunk_size).ceil
97
+ data.each_slice(@max_chunk_size) do |slice|
98
+ datagrams << chunk_data(slice, msg_id, i, count)
99
+ i += 1
100
+ end
101
+ else
102
+ datagrams = [data.map(&:chr).join]
103
+ end
104
+
105
+ datagrams.each { |d| sock.send(d, 0, @host, @port) }
106
+ datagrams
107
+ end
108
+
109
+ def chunk_data(data, msg_id, sequence_number, sequence_count)
110
+ # [30, 15].pack('CC') => "\036\017"
111
+ return "\036\017" + msg_id + [sequence_number, sequence_count].pack('nn') + data.map(&:chr).join
112
+ end
113
+
114
+ def detect_this_host
115
+ @this_host = Socket.gethostname
116
+ end
117
+ end
118
+ end
@@ -0,0 +1,11 @@
1
+ require 'rubygems'
2
+ require 'test/unit'
3
+ require 'shoulda'
4
+ require 'mocha'
5
+
6
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
7
+ $LOAD_PATH.unshift(File.dirname(__FILE__))
8
+ require 'gelf'
9
+
10
+ class Test::Unit::TestCase
11
+ end
@@ -0,0 +1,38 @@
1
+ require 'helper'
2
+
3
+ class TestDeprecations < Test::Unit::TestCase
4
+ context "with Gelf object" do
5
+ setup do
6
+ @verbose, $VERBOSE = $VERBOSE, nil
7
+ @g = Gelf.new('host', 12345)
8
+ end
9
+
10
+ teardown do
11
+ $VERBOSE = @verbose
12
+ end
13
+
14
+ should "deprecate Gelf.new" do
15
+ assert_equal Gelf, @g.class
16
+ assert_equal 'host', @g.notifier.host
17
+ assert_equal 12345, @g.notifier.port
18
+ assert_equal Hash, @g.message.class
19
+ end
20
+
21
+ should "deprecate Gelf#send" do
22
+ @g.notifier.expects(:notify).with(@g.message)
23
+ @g.send
24
+ end
25
+
26
+ [:short_message, :full_message, :level, :host, :line, :file].each do |a|
27
+ should "deprecate Gelf##{a} and Gelf##{a}=" do
28
+ @g.__send__("#{a}=", 'value')
29
+ assert_equal 'value', @g.__send__(a)
30
+ end
31
+ end
32
+
33
+ should "set add additional params" do
34
+ @g.add_additional(:key, 'value')
35
+ assert_equal 'value', @g.message[:key]
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,130 @@
1
+ require 'helper'
2
+
3
+ HASH = {'short_message' => 'message', 'host' => 'localhost'}
4
+
5
+ RANDOM_DATA = ('A'..'Z').to_a
6
+
7
+ class TestNotifier < Test::Unit::TestCase
8
+ should "allow access to host, port and max_chunk_size" do
9
+ notifier = GELF::Notifier.new
10
+ assert_equal ['localhost', 12201, 1420], [notifier.host, notifier.port, notifier.max_chunk_size]
11
+ notifier.host, notifier.port, notifier.max_chunk_size = 'graylog2.org', 7777, :lan
12
+ assert_equal ['graylog2.org', 7777, 8154], [notifier.host, notifier.port, notifier.max_chunk_size]
13
+ end
14
+
15
+ context "with notifier" do
16
+ setup do
17
+ @notifier = GELF::Notifier.new('host', 12345)
18
+ end
19
+
20
+ context "extract_hash" do
21
+ should "check number of arguments" do
22
+ assert_raise(ArgumentError) { @notifier.__send__(:extract_hash) }
23
+ assert_raise(ArgumentError) { @notifier.__send__(:extract_hash, 1, 2, 3) }
24
+ end
25
+
26
+ should "work with hash" do
27
+ assert_equal HASH, @notifier.__send__(:extract_hash, HASH)
28
+ end
29
+
30
+ should "work with any object which responds to #to_hash" do
31
+ o = Object.new
32
+ o.expects(:to_hash).returns(HASH)
33
+ assert_equal HASH, @notifier.__send__(:extract_hash, o)
34
+ end
35
+
36
+ should "work with exception with backtrace" do
37
+ e = RuntimeError.new('message')
38
+ e.set_backtrace(caller)
39
+ hash = @notifier.__send__(:extract_hash, e)
40
+ assert_equal 'RuntimeError: message', hash['short_message']
41
+ assert_match /Backtrace/, hash['full_message']
42
+ end
43
+
44
+ should "work with exception without backtrace" do
45
+ e = RuntimeError.new('message')
46
+ hash = @notifier.__send__(:extract_hash, e)
47
+ assert_match /Backtrace is not available/, hash['full_message']
48
+ end
49
+
50
+ should "work with exception and hash" do
51
+ e, h = RuntimeError.new('message'), {'param' => 1, 'short_message' => 'will be hidden by exception'}
52
+ hash = @notifier.__send__(:extract_hash, e, h)
53
+ assert_equal 'RuntimeError: message', hash['short_message']
54
+ assert_equal 1, hash['param']
55
+ end
56
+
57
+ should "work with plain text" do
58
+ assert_equal 'message', @notifier.__send__(:extract_hash, 'message')['short_message']
59
+ end
60
+
61
+ should "work with plain text and hash" do
62
+ assert_equal HASH, @notifier.__send__(:extract_hash, 'message', 'host' => 'localhost')
63
+ end
64
+
65
+ should "covert hash keys to strings" do
66
+ hash = @notifier.__send__(:extract_hash, :short_message => :message)
67
+ assert hash.has_key?('short_message')
68
+ assert !hash.has_key?(:short_message)
69
+ end
70
+
71
+ should "not overwrite keys on convert" do
72
+ assert_raise(ArgumentError) { @notifier.__send__(:extract_hash, :short_message => :message1, 'short_message' => 'message2') }
73
+ end
74
+
75
+ should "be compatible with HoptoadNotifier" do
76
+ # https://github.com/thoughtbot/hoptoad_notifier/blob/master/README.rdoc, section Going beyond exceptions
77
+ hash = @notifier.__send__(:extract_hash, :error_class => 'Class', :error_message => 'Message')
78
+ assert_equal 'Class: Message', hash['short_message']
79
+ end
80
+ end
81
+
82
+ should "detect and cache host" do
83
+ Socket.expects(:gethostname).once.returns("localhost")
84
+ @notifier.expects(:do_notify).twice
85
+ 2.times { @notifier.notify!('short_message' => 'message') }
86
+ end
87
+
88
+ context "datagrams" do
89
+ should "not split short datagram" do
90
+ UDPSocket.any_instance.expects(:send).once
91
+ @notifier.notify!(HASH)
92
+ end
93
+
94
+ should "split long datagram" do
95
+ srand(1) # for stable tests
96
+ UDPSocket.any_instance.expects(:send).twice
97
+ @notifier.notify!(HASH.merge('something' => (0..3000).map { RANDOM_DATA[rand(RANDOM_DATA.count)] }.join)) # or it will be compressed too good
98
+ end
99
+
100
+ should "send correct short datagram" do
101
+ UDPSocket.any_instance.expects(:send).with do |data, flags, host, port|
102
+ host == @notifier.host &&
103
+ port == @notifier.port &&
104
+ data[0..1] == "\170\234"
105
+ end
106
+ @notifier.notify!(HASH)
107
+ end
108
+
109
+ should "send correct long datagrams" do
110
+ UDPSocket.any_instance.expects(:send).twice.with do |data, flags, host, port|
111
+ host == @notifier.host &&
112
+ port == @notifier.port &&
113
+ data[0..1] == "\036\017"
114
+ end
115
+ srand(1) # for stable tests
116
+ @notifier.notify!(HASH.merge('something' => (0..3000).map { RANDOM_DATA[rand(RANDOM_DATA.count)] }.join)) # or it will be compressed too good
117
+ end
118
+ end
119
+
120
+ should "not rescue from invalid invocation of #notify!" do
121
+ assert_raise(ArgumentError) { @notifier.notify!(:no_short_message => 'too bad') }
122
+ end
123
+
124
+ should "rescue from invalid invocation of #notify" do
125
+ @notifier.expects(:notify!).with(instance_of(Hash)).raises(ArgumentError)
126
+ @notifier.expects(:notify!).with(instance_of(ArgumentError))
127
+ assert_nothing_raised { @notifier.notify(:no_short_message => 'too bad') }
128
+ end
129
+ end
130
+ end
metadata CHANGED
@@ -1,47 +1,92 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: gelf
3
3
  version: !ruby/object:Gem::Version
4
- hash: 63
5
4
  prerelease: false
6
5
  segments:
6
+ - 1
7
7
  - 0
8
- - 9
9
- - 2
10
- version: 0.9.2
8
+ - 0
9
+ version: 1.0.0
11
10
  platform: ruby
12
11
  authors:
12
+ - Alexey Palazhchenko
13
13
  - Lennart Koopmann
14
14
  autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2010-10-18 00:00:00 +02:00
18
+ date: 2010-11-12 00:00:00 +01:00
19
19
  default_executable:
20
- dependencies: []
21
-
22
- description: Library to send Graylog2 Extended Log Format (GELF) messages
20
+ dependencies:
21
+ - !ruby/object:Gem::Dependency
22
+ name: json
23
+ prerelease: false
24
+ requirement: &id001 !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ">="
28
+ - !ruby/object:Gem::Version
29
+ segments:
30
+ - 0
31
+ version: "0"
32
+ type: :runtime
33
+ version_requirements: *id001
34
+ - !ruby/object:Gem::Dependency
35
+ name: shoulda
36
+ prerelease: false
37
+ requirement: &id002 !ruby/object:Gem::Requirement
38
+ none: false
39
+ requirements:
40
+ - - ">="
41
+ - !ruby/object:Gem::Version
42
+ segments:
43
+ - 0
44
+ version: "0"
45
+ type: :development
46
+ version_requirements: *id002
47
+ - !ruby/object:Gem::Dependency
48
+ name: mocha
49
+ prerelease: false
50
+ requirement: &id003 !ruby/object:Gem::Requirement
51
+ none: false
52
+ requirements:
53
+ - - ">="
54
+ - !ruby/object:Gem::Version
55
+ segments:
56
+ - 0
57
+ version: "0"
58
+ type: :development
59
+ version_requirements: *id003
60
+ description: Suports plain-text, GELF messages and exceptions.
23
61
  email: lennart@socketfeed.com
24
62
  executables: []
25
63
 
26
64
  extensions: []
27
65
 
28
66
  extra_rdoc_files:
29
- - lib/gelf.rb
67
+ - LICENSE
68
+ - README.rdoc
30
69
  files:
31
- - Manifest
70
+ - .gitignore
71
+ - CHANGELOG
72
+ - LICENSE
73
+ - README.rdoc
32
74
  - Rakefile
33
- - lib/gelf.rb
75
+ - VERSION
34
76
  - gelf.gemspec
77
+ - lib/gelf.rb
78
+ - lib/gelf/deprecations.rb
79
+ - lib/gelf/notifier.rb
80
+ - test/helper.rb
81
+ - test/test_deprecations.rb
82
+ - test/test_notifier.rb
35
83
  has_rdoc: true
36
- homepage: http://www.graylog2.org/
84
+ homepage: http://github.com/Graylog2/gelf-rb
37
85
  licenses: []
38
86
 
39
87
  post_install_message:
40
88
  rdoc_options:
41
- - --line-numbers
42
- - --inline-source
43
- - --title
44
- - Gelf
89
+ - --charset=UTF-8
45
90
  require_paths:
46
91
  - lib
47
92
  required_ruby_version: !ruby/object:Gem::Requirement
@@ -49,7 +94,6 @@ required_ruby_version: !ruby/object:Gem::Requirement
49
94
  requirements:
50
95
  - - ">="
51
96
  - !ruby/object:Gem::Version
52
- hash: 3
53
97
  segments:
54
98
  - 0
55
99
  version: "0"
@@ -58,17 +102,17 @@ required_rubygems_version: !ruby/object:Gem::Requirement
58
102
  requirements:
59
103
  - - ">="
60
104
  - !ruby/object:Gem::Version
61
- hash: 11
62
105
  segments:
63
- - 1
64
- - 2
65
- version: "1.2"
106
+ - 0
107
+ version: "0"
66
108
  requirements: []
67
109
 
68
- rubyforge_project: gelf
110
+ rubyforge_project:
69
111
  rubygems_version: 1.3.7
70
112
  signing_key:
71
113
  specification_version: 3
72
- summary: Library to send Graylog2 Extended Log Format (GELF) messages
73
- test_files: []
74
-
114
+ summary: Library to send GELF messages to Graylog2 logging server
115
+ test_files:
116
+ - test/helper.rb
117
+ - test/test_notifier.rb
118
+ - test/test_deprecations.rb
data/Manifest DELETED
@@ -1,3 +0,0 @@
1
- Manifest
2
- Rakefile
3
- lib/gelf.rb