scribe-rb 2.2.rc3 → 2.2.rc4

Sign up to get free protection for your applications and to get access to all the features.
data/.travis.yml CHANGED
@@ -5,3 +5,5 @@ rvm:
5
5
  - rbx-2.0
6
6
  - jruby
7
7
  - ree
8
+ notifications:
9
+ disabled: true
data/README.md CHANGED
@@ -9,14 +9,34 @@ from generic *.thrift files.
9
9
  This gem tries to alleviate that slight annoyance and package everything
10
10
  you need to communicate with Scribe.
11
11
 
12
+ It also contains a some "extras" that alleviate a few gotchas I found
13
+ while creating a Scribe consumer/server.
14
+
12
15
  ## Installation
13
16
 
14
- Add to Gemfile:
17
+ ### Bundler
18
+
19
+ Add to `Gemfile` and run `bundle install`:
15
20
 
16
21
  ```ruby
17
22
  gem 'scribe-rb'
18
23
  ```
19
24
 
25
+ ### Without Bundler
26
+
27
+ Install the gem:
28
+
29
+ ```bash
30
+ gem install scribe-rb
31
+ ```
32
+
33
+ Require it explicitly in your scripts:
34
+
35
+ ```ruby
36
+ require "rubygems"
37
+ require "scribe-rb"
38
+ ```
39
+
20
40
  ## Producer (Client)
21
41
 
22
42
  ```ruby
@@ -43,14 +63,23 @@ transport.close
43
63
  # Define a handler that inherits from FacebookService::BaseHandler
44
64
  class MyScribeHandler < FacebookService::BaseHandler
45
65
  def Log(messages)
46
- # messages will be an array of LogEntry instances from Scribe
47
-
48
- # must return either ResultCode::OK or ResultCode::TRY_LATER
66
+ # Process the array of LogEntry instances passed
67
+ messages.each do |message|
68
+ puts "#{message.category}: #{message.message}"
69
+ end
70
+
71
+ # If messages were processed correctly, return `ResultCode::OK`
72
+ #
73
+ # To tell the Scribe producer/broker to resend messages later (e.g.,
74
+ # because this process is under too much load), return
75
+ # `ResultCode::TRY_LATER`
76
+
77
+ # Must return `ResultCode::OK` or `ResultCode::TRY_LATER`
49
78
  ResultCode::OK
50
79
  end
51
80
  end
52
81
 
53
- # The rest is boilerplate
82
+ # Setup
54
83
  handler = MyScribeHandler.new("My Scribe Handler")
55
84
  processor = Scribe::Processor.new(handler)
56
85
 
@@ -59,10 +88,12 @@ transport = Thrift::ServerSocket.new(5678) # 5678 is port number
59
88
  transportFactory = Thrift::FramedTransportFactory.new
60
89
  protocolFactory = Thrift::NonStrictBinaryProtocolFactory.new
61
90
 
62
- # Other server options exist; check Thrift documentation for details
91
+ # There are multiple options for server type
92
+ # * [Thrift::SimpleServer](http://rubydoc.info/gems/thrift/0.7.0/Thrift/SimpleServer): single threaded server (simplest)
93
+ # * [Thrift::ThreadedServer](http://rubydoc.info/gems/thrift/0.7.0/Thrift/ThreadedServer): server that spawns a thread to handle messages
94
+ # * [Thrift::ThreadPoolServer](http://rubydoc.info/gems/thrift/0.7.0/Thrift/ThreadPoolServer): server that uses a constant number of threads as workers
95
+ # * [Thrift::NonblockingServer](http://rubydoc.info/gems/thrift/0.7.0/Thrift/NonblockingServer): server that uses non-blocking I/O
63
96
  server = Thrift::SimpleServer.new(processor, transport, transportFactory, protocolFactory)
64
-
65
- # Blocks thread and runs until process is stopped
66
97
  server.serve
67
98
  ```
68
99
 
@@ -1,11 +1,14 @@
1
1
  module FacebookService
2
- # TODO: Not thread safe
3
2
  class BaseHandler
4
3
  def initialize(name)
5
- @name = name
6
- @alive = Time.now.to_i
7
- @counters = Hash.new { |h, k| h[k] = 0 }
8
- @options = Hash.new
4
+ @name = name
5
+ @alive = Time.now.to_i
6
+
7
+ @counters = Hash.new { |h, k| h[k] = 0 }
8
+ @counters_mutex = Mutex.new
9
+
10
+ @options = Hash.new
11
+ @options_mutex = Mutex.new
9
12
  end
10
13
 
11
14
  def getName
@@ -25,23 +28,33 @@ module FacebookService
25
28
  end
26
29
 
27
30
  def getCounters
28
- @counters
31
+ @counters_mutex.synchronize do
32
+ @counters
33
+ end
29
34
  end
30
35
 
31
36
  def getCounter(key)
32
- @counters[key]
37
+ @counters_mutex.synchronize do
38
+ @counters[key]
39
+ end
33
40
  end
34
41
 
35
42
  def setOption(key, value)
36
- @options[key] = value
43
+ @options_mutex.synchronize do
44
+ @options[key] = value
45
+ end
37
46
  end
38
47
 
39
48
  def getOption(key)
40
- @options[key]
49
+ @options_mutex.synchronize do
50
+ @options[key]
51
+ end
41
52
  end
42
53
 
43
54
  def getOptions
44
- @options
55
+ @options_mutex.synchronize do
56
+ @options
57
+ end
45
58
  end
46
59
 
47
60
  def getCpuProfile(*)
@@ -0,0 +1,23 @@
1
+ require "thread"
2
+
3
+ module FacebookService
4
+ class QueuedLogMessageHandler < BaseHandler
5
+ attr_reader :queue
6
+
7
+ def initialize(name)
8
+ super(name)
9
+
10
+ @queue = Queue.new
11
+ end
12
+
13
+ def Log(messages)
14
+ messages.each do |message|
15
+ @queue.push(message)
16
+ end
17
+
18
+ ::ResultCode::OK
19
+ rescue Exception => e
20
+ ::ResultCode::TRY_LATER
21
+ end
22
+ end
23
+ end
data/lib/scribe-rb.rb CHANGED
@@ -5,3 +5,4 @@ require File.expand_path("generated/scribe", File.dirname(__FILE__))
5
5
 
6
6
  require File.expand_path("extras/facebook_base_handler", File.dirname(__FILE__))
7
7
  require File.expand_path("extras/non_strict_binary_protocol_factory", File.dirname(__FILE__))
8
+ require File.expand_path("extras/queued_log_message_handler", File.dirname(__FILE__))
data/scribe-rb.gemspec CHANGED
@@ -3,12 +3,12 @@ $:.push File.expand_path("../lib", __FILE__)
3
3
 
4
4
  Gem::Specification.new do |s|
5
5
  s.name = "scribe-rb"
6
- s.version = "2.2.rc3"
6
+ s.version = "2.2.rc4"
7
7
  s.authors = ["Andy Lindeman"]
8
8
  s.email = ["andy@highgroove.com"]
9
9
  s.homepage = "http://github.com/highgroove/scribe-rb"
10
10
  s.summary = %q{Generated scribe and fb303 bindings for Ruby packed into a gem}
11
- s.description = %q{}
11
+ s.description = %q{Everything you need to build a Ruby producer/client or consumer/server of Scribe messages}
12
12
 
13
13
  s.files = `git ls-files`.split("\n")
14
14
  s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
@@ -0,0 +1,23 @@
1
+ require "spec_helper"
2
+
3
+ describe FacebookService::QueuedLogMessageHandler do
4
+ subject do
5
+ described_class.new("Test Handler")
6
+ end
7
+
8
+ describe "#queue" do
9
+ it "provides access to messages received" do
10
+ subject.Log(["foo", "bar", "baz"])
11
+
12
+ subject.queue.pop.should eq("foo")
13
+ subject.queue.pop.should eq("bar")
14
+ subject.queue.pop.should eq("baz")
15
+ end
16
+ end
17
+
18
+ describe "#log" do
19
+ it "returns ResultCode::OK" do
20
+ subject.Log(["foo"]).should eq(ResultCode::OK)
21
+ end
22
+ end
23
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: scribe-rb
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.2.rc3
4
+ version: 2.2.rc4
5
5
  prerelease: 4
6
6
  platform: ruby
7
7
  authors:
@@ -9,12 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2011-09-09 00:00:00.000000000 -04:00
13
- default_executable:
12
+ date: 2011-09-20 00:00:00.000000000Z
14
13
  dependencies:
15
14
  - !ruby/object:Gem::Dependency
16
15
  name: thrift
17
- requirement: &21378900 !ruby/object:Gem::Requirement
16
+ requirement: &2156662740 !ruby/object:Gem::Requirement
18
17
  none: false
19
18
  requirements:
20
19
  - - ~>
@@ -22,10 +21,10 @@ dependencies:
22
21
  version: 0.7.0
23
22
  type: :runtime
24
23
  prerelease: false
25
- version_requirements: *21378900
24
+ version_requirements: *2156662740
26
25
  - !ruby/object:Gem::Dependency
27
26
  name: rake
28
- requirement: &21378460 !ruby/object:Gem::Requirement
27
+ requirement: &2156662140 !ruby/object:Gem::Requirement
29
28
  none: false
30
29
  requirements:
31
30
  - - ! '>='
@@ -33,10 +32,10 @@ dependencies:
33
32
  version: '0'
34
33
  type: :development
35
34
  prerelease: false
36
- version_requirements: *21378460
35
+ version_requirements: *2156662140
37
36
  - !ruby/object:Gem::Dependency
38
37
  name: rspec
39
- requirement: &21377900 !ruby/object:Gem::Requirement
38
+ requirement: &2156661320 !ruby/object:Gem::Requirement
40
39
  none: false
41
40
  requirements:
42
41
  - - ~>
@@ -44,10 +43,10 @@ dependencies:
44
43
  version: 2.6.0
45
44
  type: :development
46
45
  prerelease: false
47
- version_requirements: *21377900
46
+ version_requirements: *2156661320
48
47
  - !ruby/object:Gem::Dependency
49
48
  name: timecop
50
- requirement: &21377480 !ruby/object:Gem::Requirement
49
+ requirement: &2156660580 !ruby/object:Gem::Requirement
51
50
  none: false
52
51
  requirements:
53
52
  - - ! '>='
@@ -55,8 +54,9 @@ dependencies:
55
54
  version: '0'
56
55
  type: :development
57
56
  prerelease: false
58
- version_requirements: *21377480
59
- description: ''
57
+ version_requirements: *2156660580
58
+ description: Everything you need to build a Ruby producer/client or consumer/server
59
+ of Scribe messages
60
60
  email:
61
61
  - andy@highgroove.com
62
62
  executables: []
@@ -71,6 +71,7 @@ files:
71
71
  - Rakefile
72
72
  - lib/extras/facebook_base_handler.rb
73
73
  - lib/extras/non_strict_binary_protocol_factory.rb
74
+ - lib/extras/queued_log_message_handler.rb
74
75
  - lib/generated/facebook_service.rb
75
76
  - lib/generated/fb303_constants.rb
76
77
  - lib/generated/fb303_types.rb
@@ -81,8 +82,8 @@ files:
81
82
  - scribe-rb.gemspec
82
83
  - spec/lib/extras/facebook_base_handler_spec.rb
83
84
  - spec/lib/extras/non_strict_binary_protocol_factory_spec.rb
85
+ - spec/lib/extras/queued_log_message_handler_spec.rb
84
86
  - spec/spec_helper.rb
85
- has_rdoc: true
86
87
  homepage: http://github.com/highgroove/scribe-rb
87
88
  licenses: []
88
89
  post_install_message:
@@ -97,7 +98,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
97
98
  version: '0'
98
99
  segments:
99
100
  - 0
100
- hash: -2559920720779231407
101
+ hash: -57725399886143313
101
102
  required_rubygems_version: !ruby/object:Gem::Requirement
102
103
  none: false
103
104
  requirements:
@@ -106,8 +107,12 @@ required_rubygems_version: !ruby/object:Gem::Requirement
106
107
  version: 1.3.1
107
108
  requirements: []
108
109
  rubyforge_project:
109
- rubygems_version: 1.6.2
110
+ rubygems_version: 1.8.10
110
111
  signing_key:
111
112
  specification_version: 3
112
113
  summary: Generated scribe and fb303 bindings for Ruby packed into a gem
113
- test_files: []
114
+ test_files:
115
+ - spec/lib/extras/facebook_base_handler_spec.rb
116
+ - spec/lib/extras/non_strict_binary_protocol_factory_spec.rb
117
+ - spec/lib/extras/queued_log_message_handler_spec.rb
118
+ - spec/spec_helper.rb