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 +5 -5
- data/Gemfile.lock +8 -6
- data/lib/thrift_rack/atom.rb +30 -0
- data/lib/thrift_rack/client.rb +28 -26
- data/lib/thrift_rack/http_client_transport.rb +10 -1
- data/lib/thrift_rack/launch_timestamp.rb +12 -0
- data/lib/thrift_rack/logger.rb +25 -22
- data/lib/thrift_rack/sentry.rb +13 -0
- data/lib/thrift_rack/version.rb +1 -1
- data/lib/thrift_rack.rb +9 -0
- data/thrift_rack.gemspec +2 -1
- metadata +22 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 91940d7237d325873fa1aa7b9a6db6d93549d76c60ce045695652664aa1ac375
|
4
|
+
data.tar.gz: 3853a703f5aa6b3aae575d18963c16c2b366c6da43faa186ea8dd2893037b2c0
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
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.
|
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.
|
14
|
+
connection_pool (2.2.2)
|
14
15
|
method_source (0.9.0)
|
15
|
-
net-http-persistent (3.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.
|
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.
|
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
|
data/lib/thrift_rack/client.rb
CHANGED
@@ -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(
|
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
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
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
|
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
|
-
|
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
|
data/lib/thrift_rack/logger.rb
CHANGED
@@ -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
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
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
|
-
|
28
|
-
|
29
|
-
end
|
30
|
-
|
31
|
-
private
|
30
|
+
class << self
|
31
|
+
attr_writer :tag
|
32
32
|
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
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
|
-
|
40
|
-
|
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
|
data/lib/thrift_rack/version.rb
CHANGED
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
|
+
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:
|
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:
|
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:
|
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.
|
159
|
+
rubygems_version: 2.7.9
|
143
160
|
signing_key:
|
144
161
|
specification_version: 4
|
145
162
|
summary: thrift http rakc server
|