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 +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
|