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