thrift_rack 0.2.4 → 0.2.5

Sign up to get free protection for your applications and to get access to all the features.
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