thrift_rack 0.2.4 → 0.2.5

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: dbc7add06ec124797661d7ab6b729163133d05bd
4
- data.tar.gz: 6119c9955c08cc5af4d639247b66176ce3e50d43
2
+ SHA256:
3
+ metadata.gz: 91940d7237d325873fa1aa7b9a6db6d93549d76c60ce045695652664aa1ac375
4
+ data.tar.gz: 3853a703f5aa6b3aae575d18963c16c2b366c6da43faa186ea8dd2893037b2c0
5
5
  SHA512:
6
- metadata.gz: fd58668bd96316d3a14d68a8327ba2ed69a5e96add76412c8f3bae539655d3287fb1fa409250951b4d3801062b165d54465b8144e7d0424eb71649d35d081517
7
- data.tar.gz: 99bc7e9293e69f5531581b7f274f9c0a6538317837852f7bea34f255eae76d660253de2dc92023a334392e3216894b2410c6d8ead8747d123642b32f7e320880
6
+ metadata.gz: 7271e71e2410c02aa94ef4e81b0e5be8e0f310dda5338cde11f7d4458c8ee7cf84197a895b8e2fd7cf1905b1d849ee02d90951bfc17cd939908f617b07e77221
7
+ data.tar.gz: fa40c932b3bbb545eb7c93da1be7c43483e80f68450b4c07c1ff1520bfa3119aaf148348c398ab24ead02b2dade1f6b06e220c5c40e02036c7fe46c1e28fc2d5
data/Gemfile.lock CHANGED
@@ -1,24 +1,26 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- thrift_rack (0.2.3)
4
+ thrift_rack (0.2.5)
5
5
  net-http-persistent (>= 3.0)
6
- rack (>= 2.0)
6
+ rack (>= 2.0.6)
7
+ redis (>= 3.0)
7
8
  thrift (~> 0.10.0)
8
9
 
9
10
  GEM
10
11
  remote: https://rubygems.org/
11
12
  specs:
12
13
  coderay (1.1.2)
13
- connection_pool (2.2.1)
14
+ connection_pool (2.2.2)
14
15
  method_source (0.9.0)
15
- net-http-persistent (3.0.0)
16
+ net-http-persistent (3.0.1)
16
17
  connection_pool (~> 2.2)
17
18
  pry (0.11.3)
18
19
  coderay (~> 1.1.0)
19
20
  method_source (~> 0.9.0)
20
- rack (2.0.5)
21
+ rack (2.0.7)
21
22
  rake (10.5.0)
23
+ redis (4.1.2)
22
24
  thrift (0.10.0.0)
23
25
 
24
26
  PLATFORMS
@@ -31,4 +33,4 @@ DEPENDENCIES
31
33
  thrift_rack!
32
34
 
33
35
  BUNDLED WITH
34
- 1.16.1
36
+ 1.16.6
@@ -0,0 +1,30 @@
1
+ require 'redis'
2
+ class ThriftRack
3
+ class Atom
4
+ def initialize(app)
5
+ @app = app
6
+ end
7
+
8
+ def call(env)
9
+ req = Rack::Request.new(env)
10
+ rpc_id = req.env["HTTP_X_RPC_ID"]
11
+ if rpc_id
12
+ if ThriftRack::Atom.redis.set("thrift_request:#{rpc_id}", true, nx: true, ex: 600)
13
+ @app.call(env)
14
+ else
15
+ [409, {}, ["RPC Request Processed"]]
16
+ end
17
+ else
18
+ @app.call(env)
19
+ end
20
+ end
21
+
22
+ class << self
23
+ attr_accessor :redis
24
+
25
+ def redis
26
+ @redis ||= Redis.new
27
+ end
28
+ end
29
+ end
30
+ end
@@ -9,56 +9,58 @@ class ThriftRack
9
9
  @client = client_klass.new(protocol)
10
10
  end
11
11
 
12
- def logger
13
- @logger ||= (defined? Rails) ? rails_logger : std_logger
14
- end
15
-
16
12
  def protocol_factory
17
13
  Thrift::CompactProtocolFactory.new
18
14
  end
19
15
 
16
+ def respond_to_missing?(method, _include_private = false)
17
+ @client.respond_to?(method)
18
+ end
19
+
20
20
  def method_missing(method, *params)
21
21
  return super unless @client.respond_to?(method)
22
+
22
23
  self.class_eval do
23
24
  define_method method.to_sym do |*args|
24
25
  begin
25
26
  rpc_id = SecureRandom.uuid
26
27
  request_at = Time.now
27
- @transport.add_headers({"X-Request-ID" => @request_id, "X-Rpc-ID" => rpc_id, "X-Rpc-Func" => method.to_s, "X-From" => ThriftRack::Client.app_name || "unknown"})
28
+ @transport.add_headers("X-Request-ID" => @request_id, "X-Rpc-ID" => rpc_id, "X-Rpc-Func" => method.to_s, "X-From" => ThriftRack::Client.app_name || "unknown")
28
29
  @client.send(method, *args)
29
30
  ensure
30
31
  end_time = Time.now
31
- self.logger.info(JSON.dump({
32
- request_at: request_at.iso8601(6),
33
- request_id: @request_id,
34
- rpc_id: rpc_id,
35
- duration: ((end_time - request_at) * 1000).round(4),
36
- path: URI(@url).path,
37
- func: method,
38
- }))
32
+ ThriftRack::Client.logger.info(
33
+ JSON.dump(
34
+ request_at: request_at.iso8601(6),
35
+ request_id: @request_id,
36
+ rpc_id: rpc_id,
37
+ duration: ((end_time - request_at) * 1000).round(4),
38
+ path: URI(@url).path,
39
+ func: method,
40
+ ),
41
+ )
39
42
  end
40
43
  end
41
44
  end
42
45
  self.public_send(method, *params)
43
46
  end
44
47
 
45
- private
46
-
47
- def rails_logger
48
- file = File.open("#{Rails.root}/log/rpc_client.log", File::WRONLY | File::APPEND | File::CREAT)
49
- file.sync = true
50
- ActiveSupport::Logger.new(file)
51
- end
52
-
53
- def std_logger
54
- ::Logger.new(STDOUT)
55
- end
56
-
57
48
  class << self
58
- attr_accessor :app_name, :pool_size
49
+ attr_accessor :app_name
50
+ attr_reader :pool_size
51
+
52
+ def logger
53
+ @logger ||= if defined? Rails
54
+ ActiveSupport::Logger.new(File.open("#{Rails.root}/log/rpc_client.log", File::WRONLY | File::APPEND | File::CREAT))
55
+ else
56
+ ::Logger.new(STDOUT)
57
+ end
58
+ end
59
59
 
60
60
  def pool_size=(p)
61
61
  http = Net::HTTP::Persistent.new(name: self.app_name, pool_size: p)
62
+ http.retry_change_requests = true
63
+ http.max_requests = 100
62
64
  http.verify_mode = 0
63
65
  HttpClientTransport.default = http
64
66
  @pool_size = p
@@ -4,6 +4,7 @@ require 'net/http/persistent'
4
4
  class ThriftRack
5
5
  class HttpClientTransport < Thrift::BaseTransport
6
6
  class RespCodeError < StandardError; end
7
+ class ProcessedRequest < StandardError; end
7
8
  def initialize(url, opts = {})
8
9
  @headers = {'Content-Type' => 'application/x-thrift'}
9
10
  @outbuf = Thrift::Bytes.empty_byte_buffer
@@ -26,7 +27,13 @@ class ThriftRack
26
27
  post.initialize_http_header(@headers)
27
28
  resp = retry_request_with_503{ThriftRack::HttpClientTransport.default.request(uri, post)}
28
29
  data = resp.body
29
- raise RespCodeError.new("#{resp.code} on #{@url} with body #{data}") unless resp.code.to_i == 200
30
+ if resp.code.to_i != 200
31
+ if resp.code.to_i == 409
32
+ raise ProcessedRequest.new(@url)
33
+ else
34
+ raise RespCodeError.new("#{resp.code} on #{@url} with body #{data}")
35
+ end
36
+ end
30
37
  data = Thrift::Bytes.force_binary_encoding(data)
31
38
  @inbuf = StringIO.new data
32
39
  ensure
@@ -52,6 +59,8 @@ class ThriftRack
52
59
  def default
53
60
  return @default if @default
54
61
  @default = Net::HTTP::Persistent.new
62
+ @default.retry_change_requests = true
63
+ @default.max_requests = 100
55
64
  @default.verify_mode = 0
56
65
  @default
57
66
  end
@@ -0,0 +1,12 @@
1
+ class ThriftRack
2
+ class LaunchTimestamp
3
+ def initialize(app)
4
+ @app = app
5
+ end
6
+
7
+ def call(env)
8
+ env['LAUNCH_AT'] = Time.now
9
+ @app.call(env)
10
+ end
11
+ end
12
+ end
@@ -7,37 +7,40 @@ class ThriftRack
7
7
  end
8
8
 
9
9
  def call(env)
10
- request_at = Time.now
10
+ request_at = env['LAUNCH_AT'] || Time.now
11
11
  req = Rack::Request.new(env)
12
12
  resp = @app.call(env)
13
13
  resp
14
14
  ensure
15
15
  end_time = Time.now
16
- self.logger.info(JSON.dump({
17
- request_at: request_at.iso8601(6),
18
- request_id: req.env["HTTP_X_REQUEST_ID"],
19
- rpc_id: req.env["HTTP_X_RPC_ID"],
20
- duration: ((end_time - request_at) * 1000).round(4),
21
- path: req.path,
22
- func: req.env["HTTP_X_RPC_FUNC"],
23
- from: req.env["HTTP_X_FROM"],
24
- }))
16
+ ThriftRack::Logger.logger.info(
17
+ JSON.dump(
18
+ request_at: request_at.iso8601(6),
19
+ request_id: req.env["HTTP_X_REQUEST_ID"],
20
+ rpc_id: req.env["HTTP_X_RPC_ID"],
21
+ duration: ((end_time - request_at) * 1000).round(4),
22
+ path: req.path,
23
+ func: req.env["HTTP_X_RPC_FUNC"],
24
+ from: req.env["HTTP_X_FROM"],
25
+ tag: Logger.tag,
26
+ ),
27
+ )
25
28
  end
26
29
 
27
- def logger
28
- @logger ||= (defined? Rails) ? rails_logger : std_logger
29
- end
30
-
31
- private
30
+ class << self
31
+ attr_writer :tag
32
32
 
33
- def rails_logger
34
- file = File.open("#{Rails.root}/log/rpc.log", File::WRONLY | File::APPEND | File::CREAT)
35
- file.sync = true
36
- ActiveSupport::Logger.new(file)
37
- end
33
+ def logger
34
+ @logger ||= if defined? Rails
35
+ ActiveSupport::Logger.new(File.open("#{Rails.root}/log/rpc.log", File::WRONLY | File::APPEND | File::CREAT))
36
+ else
37
+ ::Logger.new(STDOUT)
38
+ end
39
+ end
38
40
 
39
- def std_logger
40
- ::Logger.new(STDOUT)
41
+ def tag
42
+ @tag ||= {}
43
+ end
41
44
  end
42
45
  end
43
46
  end
@@ -0,0 +1,13 @@
1
+ class ThriftRack
2
+ class Sentry
3
+ def initialize(app)
4
+ @app = app
5
+ end
6
+
7
+ def call(env)
8
+ req = Rack::Request.new(env)
9
+ Raven.extra_context(request_id: req.env["HTTP_X_REQUEST_ID"], rpc_id: req.env["HTTP_X_RPC_ID"], from: req.env["HTTP_X_FROM"])
10
+ @app.call(env)
11
+ end
12
+ end
13
+ end
@@ -1,3 +1,3 @@
1
1
  class ThriftRack
2
- VERSION = "0.2.4"
2
+ VERSION = "0.2.5"
3
3
  end
data/lib/thrift_rack.rb CHANGED
@@ -1,8 +1,11 @@
1
1
  require "thrift_rack/version"
2
2
  require "thrift_rack/server"
3
+ require 'thrift_rack/sentry'
3
4
  require "thrift_rack/logger"
4
5
  require "thrift_rack/client"
6
+ require 'thrift_rack/launch_timestamp'
5
7
  require 'thrift_rack/ping'
8
+ require 'thrift_rack/atom'
6
9
  require 'thrift_rack/format_check'
7
10
  require 'thrift_rack/http_client_transport'
8
11
 
@@ -22,6 +25,7 @@ class ThriftRack
22
25
 
23
26
  def call(env)
24
27
  req = Rack::Request.new(env)
28
+ Thread.current["request"] = req
25
29
  server_class = @maps[req.path]
26
30
  return Rack::Response.new(["No Thrift Server For #{req.path}"], 404, {'Content-Type' => 'text/plain'}) unless server_class
27
31
 
@@ -32,13 +36,18 @@ class ThriftRack
32
36
  server_class.processor_class.new(server_class.new).process(protocol, protocol)
33
37
 
34
38
  resp
39
+ ensure
40
+ Thread.current["request"] = nil
35
41
  end
36
42
 
37
43
  def self.app(servers = nil)
38
44
  Rack::Builder.new(ThriftRack.new(servers)) do
45
+ use ThriftRack::LaunchTimestamp
39
46
  use ThriftRack::Ping
40
47
  use ThriftRack::FormatCheck
48
+ use ThriftRack::Atom
41
49
  use ThriftRack::Logger
50
+ use ThriftRack::Sentry if defined? Raven
42
51
  end
43
52
  end
44
53
  end
data/thrift_rack.gemspec CHANGED
@@ -21,9 +21,10 @@ Gem::Specification.new do |spec|
21
21
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
22
22
  spec.require_paths = ["lib"]
23
23
 
24
- spec.add_dependency "rack", ">= 2.0"
24
+ spec.add_dependency "rack", ">= 2.0.6"
25
25
  spec.add_dependency "thrift", '~> 0.10.0'
26
26
  spec.add_dependency 'net-http-persistent', ">= 3.0"
27
+ spec.add_dependency 'redis', '>=3.0'
27
28
 
28
29
  spec.add_development_dependency "bundler", "~> 1.16"
29
30
  spec.add_development_dependency "rake", "~> 10.0"
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: thrift_rack
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.4
4
+ version: 0.2.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - xuxiangyang
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2018-05-08 00:00:00.000000000 Z
11
+ date: 2019-07-11 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rack
@@ -16,14 +16,14 @@ dependencies:
16
16
  requirements:
17
17
  - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: '2.0'
19
+ version: 2.0.6
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - ">="
25
25
  - !ruby/object:Gem::Version
26
- version: '2.0'
26
+ version: 2.0.6
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: thrift
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -52,6 +52,20 @@ dependencies:
52
52
  - - ">="
53
53
  - !ruby/object:Gem::Version
54
54
  version: '3.0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: redis
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '3.0'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '3.0'
55
69
  - !ruby/object:Gem::Dependency
56
70
  name: bundler
57
71
  requirement: !ruby/object:Gem::Requirement
@@ -111,11 +125,14 @@ files:
111
125
  - config.ru
112
126
  - lib/config.ru
113
127
  - lib/thrift_rack.rb
128
+ - lib/thrift_rack/atom.rb
114
129
  - lib/thrift_rack/client.rb
115
130
  - lib/thrift_rack/format_check.rb
116
131
  - lib/thrift_rack/http_client_transport.rb
132
+ - lib/thrift_rack/launch_timestamp.rb
117
133
  - lib/thrift_rack/logger.rb
118
134
  - lib/thrift_rack/ping.rb
135
+ - lib/thrift_rack/sentry.rb
119
136
  - lib/thrift_rack/server.rb
120
137
  - lib/thrift_rack/version.rb
121
138
  - thrift_rack.gemspec
@@ -139,7 +156,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
139
156
  version: '0'
140
157
  requirements: []
141
158
  rubyforge_project:
142
- rubygems_version: 2.6.14
159
+ rubygems_version: 2.7.9
143
160
  signing_key:
144
161
  specification_version: 4
145
162
  summary: thrift http rakc server