thrift_rack 0.1.1 → 0.1.2
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 +4 -4
- data/.gitignore +1 -1
- data/Gemfile.lock +1 -1
- data/lib/thrift_rack.rb +8 -8
- data/lib/thrift_rack/client.rb +60 -0
- data/lib/thrift_rack/format_check.rb +13 -0
- data/lib/thrift_rack/logger.rb +42 -0
- data/lib/thrift_rack/ping.rb +13 -0
- data/lib/thrift_rack/version.rb +1 -1
- metadata +6 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c273d19fb145e13d95492d12e9d2d132ad3034cc
|
4
|
+
data.tar.gz: 2ad194479ccb84197c6976e776779d398ac2bede
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: dc091bdbeb0a9463ddb0a4c7cf32020d8eab74f495097207d230f22ad49b3277b717c311485f2340859ba0aa65d1ec854eb88f12e65a40cb05204f15cc559e8a
|
7
|
+
data.tar.gz: 0581140e263a3eb43ae57cc59dc2e3f8baecb0d2fc398ceebeb7bbfae96bbd396f9087101941da522ce32234d415809f4cdda4734fca36fb02afc7903d34a0f2
|
data/.gitignore
CHANGED
data/Gemfile.lock
CHANGED
data/lib/thrift_rack.rb
CHANGED
@@ -1,9 +1,13 @@
|
|
1
1
|
require "thrift_rack/version"
|
2
2
|
require "thrift_rack/server"
|
3
|
+
require "thrift_rack/logger"
|
4
|
+
require "thrift_rack/client"
|
5
|
+
require 'thrift_rack/ping'
|
6
|
+
require 'thrift_rack/format_check'
|
7
|
+
|
3
8
|
require 'rack'
|
4
9
|
require 'thrift'
|
5
10
|
|
6
|
-
|
7
11
|
class ThriftRack
|
8
12
|
THRIFT_HEADER = "application/x-thrift"
|
9
13
|
|
@@ -17,10 +21,6 @@ class ThriftRack
|
|
17
21
|
|
18
22
|
def call(env)
|
19
23
|
req = Rack::Request.new(env)
|
20
|
-
return Rack::Response.new(["PONG"], 200, {'Content-Type' => 'text/plain'}) if req.path == "/ping"
|
21
|
-
|
22
|
-
return Rack::Response.new(["Not Valid Thrift Request"], 400, {'Content-Type' => 'text/plain'}) unless req.post? && req.env["CONTENT_TYPE"] == THRIFT_HEADER
|
23
|
-
|
24
24
|
server_class = @maps[req.path]
|
25
25
|
return Rack::Response.new(["No Thrift Server For #{req.path}"], 404, {'Content-Type' => 'text/plain'}) unless server_class
|
26
26
|
|
@@ -35,9 +35,9 @@ class ThriftRack
|
|
35
35
|
|
36
36
|
def self.app(servers = nil)
|
37
37
|
Rack::Builder.new(ThriftRack.new(servers)) do
|
38
|
-
use
|
39
|
-
use
|
40
|
-
use
|
38
|
+
use ThriftRack::Ping
|
39
|
+
use ThriftRack::FormatCheck
|
40
|
+
use ThriftRack::Logger
|
41
41
|
end
|
42
42
|
end
|
43
43
|
end
|
@@ -0,0 +1,60 @@
|
|
1
|
+
require 'thrift'
|
2
|
+
require 'securerandom'
|
3
|
+
class ThriftRack
|
4
|
+
class Client
|
5
|
+
def initialize(url, client_klass, request_id)
|
6
|
+
@rpc_id = SecureRandom.uuid
|
7
|
+
@request_id = request_id
|
8
|
+
@url = url
|
9
|
+
@transport = Thrift::HTTPClientTransport.new(url, ssl_verify_mode: OpenSSL::SSL::VERIFY_NONE)
|
10
|
+
@transport.add_headers({"X-Request-ID" => @request_id, "X-Rpc-ID" => @rpc_id})
|
11
|
+
protocol = protocol_factory.get_protocol(@transport)
|
12
|
+
@client = client_klass.new(protocol)
|
13
|
+
|
14
|
+
end
|
15
|
+
|
16
|
+
def logger
|
17
|
+
@logger ||= (defined? Rails) ? rails_logger : std_logger
|
18
|
+
end
|
19
|
+
|
20
|
+
def protocol_factory
|
21
|
+
Thrift::CompactProtocolFactory.new
|
22
|
+
end
|
23
|
+
|
24
|
+
def method_missing(method, *params)
|
25
|
+
return super unless @client.respond_to?(method)
|
26
|
+
self.class_eval do
|
27
|
+
define_method method.to_sym do |*args|
|
28
|
+
begin
|
29
|
+
request_at = Time.now
|
30
|
+
@transport.add_headers({"X-Rpc-Func" => method.to_s})
|
31
|
+
@client.send(method, *args)
|
32
|
+
ensure
|
33
|
+
end_time = Time.now
|
34
|
+
self.logger.info(JSON.dump({
|
35
|
+
request_at: request_at.iso8601,
|
36
|
+
request_id: @request_id,
|
37
|
+
rpc_id: @rpc_id,
|
38
|
+
duration: ((end_time - request_at) * 1000).round(4),
|
39
|
+
path: URI(@url).path,
|
40
|
+
func: method,
|
41
|
+
}))
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
self.public_send(method, *params)
|
46
|
+
end
|
47
|
+
|
48
|
+
private
|
49
|
+
|
50
|
+
def rails_logger
|
51
|
+
file = File.open("#{Rails.root}/log/rpc_client.log", File::WRONLY | File::APPEND | File::CREAT)
|
52
|
+
file.sync = true
|
53
|
+
ActiveSupport::Logger.new(file)
|
54
|
+
end
|
55
|
+
|
56
|
+
def std_logger
|
57
|
+
::Logger.new(STDOUT)
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
class ThriftRack
|
2
|
+
class FormatCheck
|
3
|
+
def initialize(app)
|
4
|
+
@app = app
|
5
|
+
end
|
6
|
+
|
7
|
+
def call(env)
|
8
|
+
req = Rack::Request.new(env)
|
9
|
+
return Rack::Response.new(["Not Valid Thrift Request"], 400, {'Content-Type' => 'text/plain'}) unless req.post? && req.env["CONTENT_TYPE"] == THRIFT_HEADER
|
10
|
+
@app.call(env)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
require 'logger'
|
2
|
+
require 'json'
|
3
|
+
class ThriftRack
|
4
|
+
class Logger
|
5
|
+
def initialize(app)
|
6
|
+
@app = app
|
7
|
+
end
|
8
|
+
|
9
|
+
def call(env)
|
10
|
+
request_at = Time.now
|
11
|
+
req = Rack::Request.new(env)
|
12
|
+
resp = @app.call(env)
|
13
|
+
resp
|
14
|
+
ensure
|
15
|
+
end_time = Time.now
|
16
|
+
self.logger.info(JSON.dump({
|
17
|
+
request_at: request_at.iso8601,
|
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
|
+
}))
|
24
|
+
end
|
25
|
+
|
26
|
+
def logger
|
27
|
+
@logger ||= (defined? Rails) ? rails_logger : std_logger
|
28
|
+
end
|
29
|
+
|
30
|
+
private
|
31
|
+
|
32
|
+
def rails_logger
|
33
|
+
file = File.open("#{Rails.root}/log/rpc.log", File::WRONLY | File::APPEND | File::CREAT)
|
34
|
+
file.sync = true
|
35
|
+
ActiveSupport::Logger.new(file)
|
36
|
+
end
|
37
|
+
|
38
|
+
def std_logger
|
39
|
+
::Logger.new(STDOUT)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
class ThriftRack
|
2
|
+
class Ping
|
3
|
+
def initialize(app)
|
4
|
+
@app = app
|
5
|
+
end
|
6
|
+
|
7
|
+
def call(env)
|
8
|
+
req = Rack::Request.new(env)
|
9
|
+
return Rack::Response.new(["PONG"], 200, {'Content-Type' => 'text/plain'}) if req.path == "/ping"
|
10
|
+
@app.call(env)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
data/lib/thrift_rack/version.rb
CHANGED
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.1.
|
4
|
+
version: 0.1.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- xuxiangyang
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-04-
|
11
|
+
date: 2018-04-25 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rack
|
@@ -96,6 +96,10 @@ files:
|
|
96
96
|
- Rakefile
|
97
97
|
- config.ru
|
98
98
|
- lib/thrift_rack.rb
|
99
|
+
- lib/thrift_rack/client.rb
|
100
|
+
- lib/thrift_rack/format_check.rb
|
101
|
+
- lib/thrift_rack/logger.rb
|
102
|
+
- lib/thrift_rack/ping.rb
|
99
103
|
- lib/thrift_rack/server.rb
|
100
104
|
- lib/thrift_rack/version.rb
|
101
105
|
- thrift_rack.gemspec
|