x_runtime 0.3.2 → 0.4.0
Sign up to get free protection for your applications and to get access to all the features.
- data/Gemfile +2 -1
- data/Gemfile.lock +8 -0
- data/README.markdown +26 -7
- data/VERSION +1 -1
- data/lib/x_runtime/middleware.rb +7 -19
- data/lib/x_runtime/server.rb +15 -0
- data/lib/x_runtime.rb +4 -2
- data/test/client.rb +1 -1
- data/test/server.ru +23 -0
- data/x_runtime.gemspec +6 -3
- metadata +20 -4
- data/lib/x_runtime/portal.rb +0 -12
- data/test/server.rb +0 -21
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
@@ -9,10 +9,17 @@ GEM
|
|
9
9
|
rdoc
|
10
10
|
json (1.7.5)
|
11
11
|
rack (1.4.1)
|
12
|
+
rack-protection (1.2.0)
|
13
|
+
rack
|
12
14
|
rake (0.9.2.2)
|
13
15
|
rdoc (3.12)
|
14
16
|
json (~> 1.4)
|
15
17
|
redis (3.0.1)
|
18
|
+
sinatra (1.3.3)
|
19
|
+
rack (~> 1.3, >= 1.3.6)
|
20
|
+
rack-protection (~> 1.2)
|
21
|
+
tilt (~> 1.3, >= 1.3.3)
|
22
|
+
tilt (1.3.3)
|
16
23
|
|
17
24
|
PLATFORMS
|
18
25
|
ruby
|
@@ -22,3 +29,4 @@ DEPENDENCIES
|
|
22
29
|
rack
|
23
30
|
rake
|
24
31
|
redis (~> 3.0.1)
|
32
|
+
sinatra
|
data/README.markdown
CHANGED
@@ -30,26 +30,45 @@ XRuntime是一个Rack的middleware,配合Redis用来分析Http Server每个URI
|
|
30
30
|
可以指定XRuntime使用的Redis的key前缀或者叫命名空间:
|
31
31
|
`XRuntime::NameSpace = "RuntimeEx::Threshold"`
|
32
32
|
|
33
|
-
|
33
|
+
### Server
|
34
34
|
|
35
|
-
|
36
|
-
|
37
|
-
|
35
|
+
可以通过自带的Http页面查看请求数据,这些页面可以设置Http basic auth验证以保护起来
|
36
|
+
只要在加载XRuntime::Server的时候,传递一个proc作为认证条件即可
|
37
|
+
可以在配置url路由的时候指定XRuntime::Server的挂载路径,然后就可以通过该路径访问页面
|
38
38
|
|
39
39
|
### Sinatra
|
40
40
|
|
41
|
+
收集数据 `config.ru`:
|
42
|
+
|
41
43
|
use Rack::XRuntime, 100, Redis.connect(:url => "redis://localhost:6380/")
|
42
44
|
|
45
|
+
查看数据 `config.ru`:
|
46
|
+
|
47
|
+
``` ruby
|
48
|
+
run Rack::URLMap.new \
|
49
|
+
"/" => Server.new,
|
50
|
+
"/xruntime" => XRuntime::Server.new{|name, password|name == "cui" and password == "hello"}
|
51
|
+
```
|
52
|
+
|
43
53
|
### Rails3
|
44
54
|
|
45
|
-
|
46
|
-
|
55
|
+
收集数据 `config/environment.rb`:
|
56
|
+
|
57
|
+
``` ruby
|
58
|
+
config.middleware.insert_after Rack::Runtime, Rack::XRuntime, 100, Redis.connect(:url => "redis://localhost:6380/")
|
59
|
+
```
|
60
|
+
|
61
|
+
查看数据 `config/route.rb`:
|
62
|
+
|
63
|
+
``` ruby
|
64
|
+
mount Rack::XRuntime.new{|name, password|name == "cui" and password == "hello"}, :at => "/xruntime"
|
65
|
+
```
|
47
66
|
|
48
67
|
### Test
|
49
68
|
|
50
69
|
请先修改test/server.rb和test/client.rb中的Redis参数,我的地址是localhost:6380,这个请改为你的地址。
|
51
70
|
|
52
|
-
* 先启动服务 `
|
71
|
+
* 先启动服务 `rackup test/server.ru`
|
53
72
|
* 再产生测试数据 `ruby test/client.rb`
|
54
73
|
|
55
74
|
执行完毕后可以打开浏览器访问[/xruntime](http://localhost:4567/xruntime),看是否已经准确的记录了一些数据
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.4.0
|
data/lib/x_runtime/middleware.rb
CHANGED
@@ -1,12 +1,12 @@
|
|
1
1
|
module XRuntime
|
2
2
|
class Middleware
|
3
|
+
|
3
4
|
# threshold => ms
|
4
|
-
def initialize(app, threshold, redis
|
5
|
+
def initialize(app, threshold, redis)
|
5
6
|
@app = app
|
6
7
|
@threshold = threshold.to_f
|
7
8
|
@redis = redis
|
8
|
-
|
9
|
-
@portal = Rack::Auth::Basic.new(@portal, &auth) if block_given?
|
9
|
+
XRuntime.middleware = self
|
10
10
|
end
|
11
11
|
|
12
12
|
def ds
|
@@ -16,16 +16,12 @@ module XRuntime
|
|
16
16
|
def script
|
17
17
|
@script ||= Script.new(@redis)
|
18
18
|
end
|
19
|
-
|
20
|
-
def
|
21
|
-
|
22
|
-
call_portal(env)
|
23
|
-
else
|
24
|
-
call_app(env)
|
25
|
-
end
|
19
|
+
|
20
|
+
def redis_key
|
21
|
+
@key ||= "#{XRuntime::NameSpace}::#{@threshold}"
|
26
22
|
end
|
27
23
|
|
28
|
-
def
|
24
|
+
def call(env)
|
29
25
|
start_time = Time.now
|
30
26
|
status, headers, body = @app.call(env)
|
31
27
|
request_time = (Time.now - start_time).to_f*1000
|
@@ -36,18 +32,10 @@ module XRuntime
|
|
36
32
|
|
37
33
|
[status, headers, body]
|
38
34
|
end
|
39
|
-
|
40
|
-
def call_portal(env)
|
41
|
-
@portal.call(env)
|
42
|
-
end
|
43
35
|
|
44
36
|
def logredis(cost,uri)
|
45
37
|
ds.add(uri, cost)
|
46
38
|
end
|
47
39
|
|
48
|
-
def redis_key
|
49
|
-
@key ||= "#{XRuntime::NameSpace}::#{@threshold}"
|
50
|
-
end
|
51
|
-
|
52
40
|
end#end of Middleware
|
53
41
|
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
module XRuntime
|
2
|
+
class Server
|
3
|
+
def initialize(app=nil, &auth)
|
4
|
+
@server = lambda {|env|
|
5
|
+
@req = Rack::Request.new(env)
|
6
|
+
[200, {'Content-Type' => 'text/html'}, [Template.new(XRuntime.middleware.ds, :limit => (@req.params["limit"] ? @req.params["limit"].to_i : 20), :offset => @req.params["offset"].to_i).render]]
|
7
|
+
}
|
8
|
+
@server = Rack::Auth::Basic.new(@server, &auth) if auth
|
9
|
+
end
|
10
|
+
|
11
|
+
def call(env)
|
12
|
+
@server.call(env)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
data/lib/x_runtime.rb
CHANGED
@@ -7,12 +7,14 @@ require "fileutils"
|
|
7
7
|
$:.unshift(File.dirname(__FILE__))
|
8
8
|
|
9
9
|
module XRuntime
|
10
|
-
NameSpace
|
10
|
+
NameSpace = "RuntimeEx::Threshold"
|
11
|
+
extend self
|
12
|
+
attr_accessor :middleware
|
11
13
|
|
12
14
|
autoload :Middleware, "x_runtime/middleware"
|
13
15
|
autoload :DataSet, "x_runtime/data_set"
|
14
16
|
autoload :Script, "x_runtime/script"
|
15
|
-
autoload :
|
17
|
+
autoload :Server, "x_runtime/server"
|
16
18
|
autoload :Template, "x_runtime/template"
|
17
19
|
autoload :Utils, "x_runtime/utils"
|
18
20
|
end
|
data/test/client.rb
CHANGED
data/test/server.ru
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
# run with : rackup server.ru
|
2
|
+
|
3
|
+
require "sinatra/base"
|
4
|
+
require "#{File.dirname(__FILE__)}/../lib/x_runtime"
|
5
|
+
|
6
|
+
# redis-server version must > 2.6.0 for lua script.
|
7
|
+
|
8
|
+
class Server < Sinatra::Base
|
9
|
+
# use XRuntime::Middleware, 10, Redis.connect(:url => "redis://localhost:6380/")
|
10
|
+
# XRuntime::Middleware is same as Rack::XRuntime
|
11
|
+
use Rack::XRuntime, 10, Redis.connect(:url => "redis://localhost:6379/")
|
12
|
+
|
13
|
+
get /.*/ do
|
14
|
+
# sleep(1)
|
15
|
+
sleep(0.01*rand(10))
|
16
|
+
"Hello, I'am x_runtime"
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
# Use with basic auth
|
21
|
+
run Rack::URLMap.new \
|
22
|
+
"/" => Server.new,
|
23
|
+
"/xruntime" => XRuntime::Server.new{|name, password|name == "cui" and password == "hello"}
|
data/x_runtime.gemspec
CHANGED
@@ -5,7 +5,7 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = "x_runtime"
|
8
|
-
s.version = "0.
|
8
|
+
s.version = "0.4.0"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["\u{5d14}\u{5ce5}"]
|
@@ -26,15 +26,15 @@ Gem::Specification.new do |s|
|
|
26
26
|
"lib/x_runtime.rb",
|
27
27
|
"lib/x_runtime/data_set.rb",
|
28
28
|
"lib/x_runtime/middleware.rb",
|
29
|
-
"lib/x_runtime/portal.rb",
|
30
29
|
"lib/x_runtime/redis.lua",
|
31
30
|
"lib/x_runtime/script.rb",
|
31
|
+
"lib/x_runtime/server.rb",
|
32
32
|
"lib/x_runtime/template.erb",
|
33
33
|
"lib/x_runtime/template.rb",
|
34
34
|
"lib/x_runtime/utils.rb",
|
35
35
|
"test/client.rb",
|
36
36
|
"test/helper.rb",
|
37
|
-
"test/server.
|
37
|
+
"test/server.ru",
|
38
38
|
"test/test_x_runtime.rb",
|
39
39
|
"x_runtime.gemspec"
|
40
40
|
]
|
@@ -52,17 +52,20 @@ Gem::Specification.new do |s|
|
|
52
52
|
s.add_runtime_dependency(%q<rake>, [">= 0"])
|
53
53
|
s.add_runtime_dependency(%q<jeweler>, [">= 0"])
|
54
54
|
s.add_runtime_dependency(%q<redis>, ["~> 3.0.1"])
|
55
|
+
s.add_runtime_dependency(%q<sinatra>, [">= 0"])
|
55
56
|
else
|
56
57
|
s.add_dependency(%q<rack>, [">= 0"])
|
57
58
|
s.add_dependency(%q<rake>, [">= 0"])
|
58
59
|
s.add_dependency(%q<jeweler>, [">= 0"])
|
59
60
|
s.add_dependency(%q<redis>, ["~> 3.0.1"])
|
61
|
+
s.add_dependency(%q<sinatra>, [">= 0"])
|
60
62
|
end
|
61
63
|
else
|
62
64
|
s.add_dependency(%q<rack>, [">= 0"])
|
63
65
|
s.add_dependency(%q<rake>, [">= 0"])
|
64
66
|
s.add_dependency(%q<jeweler>, [">= 0"])
|
65
67
|
s.add_dependency(%q<redis>, ["~> 3.0.1"])
|
68
|
+
s.add_dependency(%q<sinatra>, [">= 0"])
|
66
69
|
end
|
67
70
|
end
|
68
71
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: x_runtime
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.4.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -75,6 +75,22 @@ dependencies:
|
|
75
75
|
- - ~>
|
76
76
|
- !ruby/object:Gem::Version
|
77
77
|
version: 3.0.1
|
78
|
+
- !ruby/object:Gem::Dependency
|
79
|
+
name: sinatra
|
80
|
+
requirement: !ruby/object:Gem::Requirement
|
81
|
+
none: false
|
82
|
+
requirements:
|
83
|
+
- - ! '>='
|
84
|
+
- !ruby/object:Gem::Version
|
85
|
+
version: '0'
|
86
|
+
type: :runtime
|
87
|
+
prerelease: false
|
88
|
+
version_requirements: !ruby/object:Gem::Requirement
|
89
|
+
none: false
|
90
|
+
requirements:
|
91
|
+
- - ! '>='
|
92
|
+
- !ruby/object:Gem::Version
|
93
|
+
version: '0'
|
78
94
|
description: 由于使用到Redis的lua script,所以需要你的Redis服务支持,redis-server版本>2.6.x,redis(ruby
|
79
95
|
gem)>3.0.1.
|
80
96
|
email: zheng.cuizh@gmail.com
|
@@ -93,15 +109,15 @@ files:
|
|
93
109
|
- lib/x_runtime.rb
|
94
110
|
- lib/x_runtime/data_set.rb
|
95
111
|
- lib/x_runtime/middleware.rb
|
96
|
-
- lib/x_runtime/portal.rb
|
97
112
|
- lib/x_runtime/redis.lua
|
98
113
|
- lib/x_runtime/script.rb
|
114
|
+
- lib/x_runtime/server.rb
|
99
115
|
- lib/x_runtime/template.erb
|
100
116
|
- lib/x_runtime/template.rb
|
101
117
|
- lib/x_runtime/utils.rb
|
102
118
|
- test/client.rb
|
103
119
|
- test/helper.rb
|
104
|
-
- test/server.
|
120
|
+
- test/server.ru
|
105
121
|
- test/test_x_runtime.rb
|
106
122
|
- x_runtime.gemspec
|
107
123
|
homepage: http://github.com/charlescui/x_runtime
|
@@ -119,7 +135,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
119
135
|
version: '0'
|
120
136
|
segments:
|
121
137
|
- 0
|
122
|
-
hash:
|
138
|
+
hash: 336817792487171531
|
123
139
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
124
140
|
none: false
|
125
141
|
requirements:
|
data/lib/x_runtime/portal.rb
DELETED
@@ -1,12 +0,0 @@
|
|
1
|
-
module XRuntime
|
2
|
-
class Portal
|
3
|
-
def initialize(ds)
|
4
|
-
@ds = ds
|
5
|
-
end
|
6
|
-
|
7
|
-
def call(env)
|
8
|
-
@req = Rack::Request.new(env)
|
9
|
-
[200, {}, [Template.new(@ds, :limit => (@req.params["limit"] ? @req.params["limit"].to_i : 20), :offset => @req.params["offset"].to_i).render]]
|
10
|
-
end
|
11
|
-
end
|
12
|
-
end
|
data/test/server.rb
DELETED
@@ -1,21 +0,0 @@
|
|
1
|
-
require "sinatra"
|
2
|
-
require_relative "../lib/x_runtime"
|
3
|
-
|
4
|
-
# redis-server version must > 2.6.0 for lua script.
|
5
|
-
|
6
|
-
# use XRuntime::Middleware, 10, Redis.connect(:url => "redis://localhost:6380/")
|
7
|
-
|
8
|
-
# XRuntime::Middleware is same as Rack::XRuntime
|
9
|
-
|
10
|
-
# use Rack::XRuntime, 10, Redis.connect(:url => "redis://localhost:6380/")
|
11
|
-
|
12
|
-
# Use with basic auth
|
13
|
-
use Rack::XRuntime, 10, Redis.connect(:url => "redis://localhost:6380/") do |name, password|
|
14
|
-
name == "cui" and password == "hello"
|
15
|
-
end
|
16
|
-
|
17
|
-
get /.*/ do
|
18
|
-
# sleep(1)
|
19
|
-
sleep(0.01*rand(10))
|
20
|
-
"Hello, I'am x_runtime"
|
21
|
-
end
|