raindrops 0.17.0 → 0.19.1
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/.document +1 -1
- data/.olddoc.yml +6 -8
- data/GIT-VERSION-GEN +1 -1
- data/GNUmakefile +1 -1
- data/README +11 -5
- data/TODO +1 -0
- data/examples/linux-listener-stats.rb +1 -2
- data/examples/watcher_demo.ru +1 -1
- data/ext/raindrops/extconf.rb +106 -2
- data/ext/raindrops/linux_inet_diag.c +55 -85
- data/ext/raindrops/raindrops.c +28 -7
- data/ext/raindrops/tcp_info.c +245 -0
- data/lib/raindrops.rb +1 -1
- data/lib/raindrops/aggregate/pmq.rb +23 -17
- data/lib/raindrops/linux.rb +4 -5
- data/lib/raindrops/middleware.rb +2 -2
- data/lib/raindrops/middleware/proxy.rb +2 -2
- data/lib/raindrops/watcher.rb +7 -7
- data/pkg.mk +1 -1
- data/raindrops.gemspec +11 -15
- data/test/ipv6_enabled.rb +4 -4
- data/test/test_aggregate_pmq.rb +1 -1
- data/test/test_inet_diag_socket.rb +1 -1
- data/test/test_last_data_recv_unicorn.rb +1 -1
- data/test/test_linux.rb +3 -2
- data/test/test_linux_all_tcp_listen_stats_leak.rb +2 -2
- data/test/test_raindrops.rb +1 -1
- data/test/{test_linux_tcp_info.rb → test_tcp_info.rb} +34 -14
- data/test/test_watcher.rb +15 -10
- metadata +10 -55
- data/ext/raindrops/linux_tcp_info.c +0 -173
data/lib/raindrops/linux.rb
CHANGED
@@ -14,8 +14,7 @@ module Raindrops::Linux
|
|
14
14
|
# The standard proc path for active UNIX domain sockets, feel free to call
|
15
15
|
# String#replace on this if your /proc is mounted in a non-standard location
|
16
16
|
# for whatever reason
|
17
|
-
PROC_NET_UNIX_ARGS =
|
18
|
-
defined?(::Encoding) and PROC_NET_UNIX_ARGS.push({ :encoding => "binary" })
|
17
|
+
PROC_NET_UNIX_ARGS = [ '/proc/net/unix', { encoding: "binary" }]
|
19
18
|
|
20
19
|
# Get ListenStats from an array of +paths+
|
21
20
|
#
|
@@ -42,11 +41,11 @@ def unix_listener_stats(paths = nil)
|
|
42
41
|
else
|
43
42
|
paths = paths.map do |path|
|
44
43
|
path = path.dup
|
45
|
-
path.force_encoding(Encoding::BINARY)
|
44
|
+
path.force_encoding(Encoding::BINARY)
|
46
45
|
if File.symlink?(path)
|
47
46
|
link = path
|
48
47
|
path = File.readlink(link)
|
49
|
-
path.force_encoding(Encoding::BINARY)
|
48
|
+
path.force_encoding(Encoding::BINARY)
|
50
49
|
rv[link] = rv[path] # vivify ListenerStats
|
51
50
|
else
|
52
51
|
rv[path] # vivify ListenerStats
|
@@ -57,7 +56,7 @@ def unix_listener_stats(paths = nil)
|
|
57
56
|
paths = /^\w+: \d+ \d+ (\d+) \d+ (\d+)\s+\d+ (#{paths.join('|')})$/n
|
58
57
|
|
59
58
|
# no point in pread since we can't stat for size on this file
|
60
|
-
File.read(
|
59
|
+
File.read(PROC_NET_UNIX_ARGS[0], encoding: 'binary').scan(paths) do |s|
|
61
60
|
path = s[-1]
|
62
61
|
case s[0]
|
63
62
|
when "00000000" # client sockets
|
data/lib/raindrops/middleware.rb
CHANGED
@@ -62,9 +62,9 @@
|
|
62
62
|
# = Demo Server
|
63
63
|
#
|
64
64
|
# There is a server running this middleware (and Watcher) at
|
65
|
-
# https://raindrops-demo
|
65
|
+
# https://yhbt.net/raindrops-demo/_raindrops
|
66
66
|
#
|
67
|
-
# Also check out the Watcher demo at https://raindrops-demo
|
67
|
+
# Also check out the Watcher demo at https://yhbt.net/raindrops-demo/
|
68
68
|
#
|
69
69
|
# The demo server is only limited to 30 users, so be sure not to abuse it
|
70
70
|
# by using the /tail/ endpoint too much.
|
@@ -27,9 +27,9 @@ def to_path
|
|
27
27
|
|
28
28
|
# Rack servers use +respond_to?+ to check for the presence of +close+
|
29
29
|
# and +to_path+ methods.
|
30
|
-
def respond_to?(m)
|
30
|
+
def respond_to?(m, include_all = false)
|
31
31
|
m = m.to_sym
|
32
|
-
:close == m || @body.respond_to?(m)
|
32
|
+
:close == m || @body.respond_to?(m, include_all)
|
33
33
|
end
|
34
34
|
|
35
35
|
# Avoid breaking users of non-standard extensions (e.g. #body)
|
data/lib/raindrops/watcher.rb
CHANGED
@@ -35,28 +35,28 @@
|
|
35
35
|
# Returns a plain text summary + histogram with X-* HTTP headers for
|
36
36
|
# active connections.
|
37
37
|
#
|
38
|
-
# e.g.: curl https://raindrops-demo
|
38
|
+
# e.g.: curl https://yhbt.net/raindrops-demo/active/0.0.0.0%3A80.txt
|
39
39
|
#
|
40
40
|
# === GET /active/$LISTENER.html
|
41
41
|
#
|
42
42
|
# Returns an HTML summary + histogram with X-* HTTP headers for
|
43
43
|
# active connections.
|
44
44
|
#
|
45
|
-
# e.g.: curl https://raindrops-demo
|
45
|
+
# e.g.: curl https://yhbt.net/raindrops-demo/active/0.0.0.0%3A80.html
|
46
46
|
#
|
47
47
|
# === GET /queued/$LISTENER.txt
|
48
48
|
#
|
49
49
|
# Returns a plain text summary + histogram with X-* HTTP headers for
|
50
50
|
# queued connections.
|
51
51
|
#
|
52
|
-
# e.g.: curl https://raindrops-demo
|
52
|
+
# e.g.: curl https://yhbt.net/raindrops-demo/queued/0.0.0.0%3A80.txt
|
53
53
|
#
|
54
54
|
# === GET /queued/$LISTENER.html
|
55
55
|
#
|
56
56
|
# Returns an HTML summary + histogram with X-* HTTP headers for
|
57
57
|
# queued connections.
|
58
58
|
#
|
59
|
-
# e.g.: curl https://raindrops-demo
|
59
|
+
# e.g.: curl https://yhbt.net/raindrops-demo/queued/0.0.0.0%3A80.html
|
60
60
|
#
|
61
61
|
# === POST /reset/$LISTENER
|
62
62
|
#
|
@@ -95,9 +95,9 @@
|
|
95
95
|
#
|
96
96
|
# = Demo Server
|
97
97
|
#
|
98
|
-
# There is a server running this app at https://raindrops-demo
|
98
|
+
# There is a server running this app at https://yhbt.net/raindrops-demo/
|
99
99
|
# The Raindrops::Middleware demo is also accessible at
|
100
|
-
# https://raindrops-demo
|
100
|
+
# https://yhbt.net/raindrops-demo/_raindrops
|
101
101
|
#
|
102
102
|
# The demo server is only limited to 30 users, so be sure not to abuse it
|
103
103
|
# by using the /tail/ endpoint too much.
|
@@ -106,7 +106,7 @@ class Raindrops::Watcher
|
|
106
106
|
attr_reader :snapshot
|
107
107
|
include Rack::Utils
|
108
108
|
include Raindrops::Linux
|
109
|
-
DOC_URL = "https://
|
109
|
+
DOC_URL = "https://yhbt.net/raindrops/Raindrops/Watcher.html"
|
110
110
|
Peak = Struct.new(:first, :last)
|
111
111
|
|
112
112
|
def initialize(opts = {})
|
data/pkg.mk
CHANGED
@@ -60,7 +60,7 @@ doc:: .document .olddoc.yml $(pkg_extra) $(PLACEHOLDERS)
|
|
60
60
|
-find lib -type f -name '*.rbc' -exec rm -f '{}' ';'
|
61
61
|
-find ext -type f -name '*.rbc' -exec rm -f '{}' ';'
|
62
62
|
$(RM) -r doc
|
63
|
-
$(RDOC) -f
|
63
|
+
$(RDOC) -f dark216
|
64
64
|
$(OLDDOC) merge
|
65
65
|
install -m644 COPYING doc/COPYING
|
66
66
|
install -m644 NEWS doc/NEWS
|
data/raindrops.gemspec
CHANGED
@@ -1,30 +1,26 @@
|
|
1
1
|
# -*- encoding: binary -*-
|
2
|
-
|
3
|
-
|
2
|
+
manifest = File.exist?('.manifest') ?
|
3
|
+
IO.readlines('.manifest').map!(&:chomp!) : `git ls-files`.split("\n")
|
4
4
|
test_files = manifest.grep(%r{\Atest/test_.*\.rb\z})
|
5
|
-
require 'olddoc'
|
6
|
-
extend Olddoc::Gemspec
|
7
|
-
name, summary, title = readme_metadata
|
8
5
|
|
9
6
|
Gem::Specification.new do |s|
|
10
7
|
s.name = %q{raindrops}
|
11
|
-
s.version = ENV["VERSION"].dup
|
12
|
-
|
8
|
+
s.version = (ENV["VERSION"] ||= '0.18.0').dup
|
13
9
|
s.authors = ["raindrops hackers"]
|
14
|
-
s.description =
|
15
|
-
s.email = %q{raindrops@
|
10
|
+
s.description = File.read('README').split("\n\n")[1]
|
11
|
+
s.email = %q{raindrops-public@yhbt.net}
|
16
12
|
s.extensions = %w(ext/raindrops/extconf.rb)
|
17
|
-
s.extra_rdoc_files =
|
13
|
+
s.extra_rdoc_files = IO.readlines('.document').map!(&:chomp!).keep_if do |f|
|
14
|
+
File.exist?(f)
|
15
|
+
end
|
18
16
|
s.files = manifest
|
19
|
-
s.homepage =
|
20
|
-
s.summary =
|
17
|
+
s.homepage = 'https://yhbt.net/raindrops/'
|
18
|
+
s.summary = 'real-time stats for preforking Rack servers'
|
19
|
+
s.required_ruby_version = '>= 1.9.3'
|
21
20
|
s.test_files = test_files
|
22
21
|
s.add_development_dependency('aggregate', '~> 0.2')
|
23
22
|
s.add_development_dependency('test-unit', '~> 3.0')
|
24
|
-
s.add_development_dependency('io-extra', [ '~> 1.2', '>= 1.2.3'])
|
25
23
|
s.add_development_dependency('posix_mq', '~> 2.0')
|
26
24
|
s.add_development_dependency('rack', [ '>= 1.2', '< 3.0' ])
|
27
|
-
s.add_development_dependency('olddoc', '~> 1.0')
|
28
|
-
|
29
25
|
s.licenses = %w(LGPL-2.1+)
|
30
26
|
end
|
data/test/ipv6_enabled.rb
CHANGED
@@ -2,8 +2,8 @@ def ipv6_enabled?
|
|
2
2
|
tmp = TCPServer.new(ENV["TEST_HOST6"] || '::1', 0)
|
3
3
|
tmp.close
|
4
4
|
true
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
5
|
+
rescue => e
|
6
|
+
warn "skipping IPv6 tests, host does not seem to be IPv6 enabled:"
|
7
|
+
warn " #{e.class}: #{e}"
|
8
|
+
false
|
9
9
|
end
|
data/test/test_aggregate_pmq.rb
CHANGED
@@ -8,7 +8,7 @@ class TestInetDiagSocket < Test::Unit::TestCase
|
|
8
8
|
def test_new
|
9
9
|
sock = Raindrops::InetDiagSocket.new
|
10
10
|
assert_kind_of Socket, sock
|
11
|
-
assert_kind_of
|
11
|
+
assert_kind_of Integer, sock.fileno
|
12
12
|
flags = sock.fcntl(Fcntl::F_GETFD)
|
13
13
|
assert_equal Fcntl::FD_CLOEXEC, flags & Fcntl::FD_CLOEXEC
|
14
14
|
assert_nil sock.close
|
data/test/test_linux.rb
CHANGED
@@ -76,6 +76,7 @@ def test_unix_all_unused
|
|
76
76
|
|
77
77
|
assert_equal 0, stats[tmp.path].active
|
78
78
|
assert_equal 0, stats[tmp.path].queued
|
79
|
+
us.close
|
79
80
|
end
|
80
81
|
|
81
82
|
def test_unix_resolves_symlinks
|
@@ -151,8 +152,8 @@ def test_tcp_reuse_sock
|
|
151
152
|
assert_equal 1, stats.size
|
152
153
|
assert_equal 0, stats[addr].queued
|
153
154
|
assert_equal 1, stats[addr].active
|
154
|
-
|
155
|
-
|
155
|
+
ensure
|
156
|
+
nlsock.close
|
156
157
|
end
|
157
158
|
|
158
159
|
def test_tcp_multi
|
data/test/test_raindrops.rb
CHANGED
@@ -134,7 +134,7 @@ def test_resize_mremap
|
|
134
134
|
assert_equal 0, rd[rd.capa - 1]
|
135
135
|
assert_equal 1, rd.incr(rd.capa - 1)
|
136
136
|
assert_raises(ArgumentError) { rd[rd.capa] }
|
137
|
-
|
137
|
+
rescue RangeError
|
138
138
|
end # if RUBY_PLATFORM =~ /linux/
|
139
139
|
|
140
140
|
def test_evaporate
|
@@ -5,15 +5,15 @@
|
|
5
5
|
require 'socket'
|
6
6
|
require 'pp'
|
7
7
|
$stderr.sync = $stdout.sync = true
|
8
|
-
class
|
8
|
+
class TestTCP_Info < Test::Unit::TestCase
|
9
9
|
|
10
10
|
TEST_ADDR = ENV['UNICORN_TEST_ADDR'] || '127.0.0.1'
|
11
11
|
|
12
12
|
# Linux kernel commit 5ee3afba88f5a79d0bff07ddd87af45919259f91
|
13
13
|
TCP_INFO_useful_listenq = `uname -r`.strip >= '2.6.24'
|
14
14
|
|
15
|
-
|
16
|
-
|
15
|
+
def test_tcp_server_unacked
|
16
|
+
return if RUBY_PLATFORM !~ /linux/ # unacked not implemented on others...
|
17
17
|
s = TCPServer.new(TEST_ADDR, 0)
|
18
18
|
rv = Raindrops::TCP_Info.new s
|
19
19
|
c = TCPSocket.new TEST_ADDR, s.addr[1]
|
@@ -29,10 +29,8 @@ def test_tcp_server
|
|
29
29
|
tmp.get!(s)
|
30
30
|
assert_equal before, tmp.object_id
|
31
31
|
|
32
|
-
|
33
|
-
|
34
|
-
a.close if a
|
35
|
-
s.close
|
32
|
+
ensure
|
33
|
+
[ c, a, s ].compact.each(&:close)
|
36
34
|
end
|
37
35
|
|
38
36
|
def test_accessors
|
@@ -42,12 +40,14 @@ def test_accessors
|
|
42
40
|
assert tcp_info_methods.size >= 32
|
43
41
|
tcp_info_methods.each do |m|
|
44
42
|
next if m.to_sym == :get!
|
43
|
+
next if ! tmp.respond_to?(m)
|
45
44
|
val = tmp.__send__ m
|
46
45
|
assert_kind_of Integer, val
|
47
46
|
assert val >= 0
|
48
47
|
end
|
49
|
-
|
50
|
-
|
48
|
+
assert tmp.respond_to?(:state), 'every OS knows about TCP state, right?'
|
49
|
+
ensure
|
50
|
+
s.close
|
51
51
|
end
|
52
52
|
|
53
53
|
def test_tcp_server_delayed
|
@@ -60,9 +60,29 @@ def test_tcp_server_delayed
|
|
60
60
|
a = s.accept
|
61
61
|
i = Raindrops::TCP_Info.new(a)
|
62
62
|
assert i.last_data_recv >= delay_ms, "#{i.last_data_recv} < #{delay_ms}"
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
63
|
+
ensure
|
64
|
+
c.close if c
|
65
|
+
a.close if a
|
66
|
+
s.close
|
67
|
+
end
|
68
|
+
|
69
|
+
def test_tcp_server_state_closed
|
70
|
+
s = TCPServer.new(TEST_ADDR, 0)
|
71
|
+
c = TCPSocket.new(TEST_ADDR, s.addr[1])
|
72
|
+
i = Raindrops::TCP_Info.allocate
|
73
|
+
a = s.accept
|
74
|
+
i.get!(a)
|
75
|
+
state = i.state
|
76
|
+
if Raindrops.const_defined?(:TCP)
|
77
|
+
assert_equal state, Raindrops::TCP[:ESTABLISHED]
|
78
|
+
end
|
79
|
+
c = c.close
|
80
|
+
sleep(0.01) # wait for kernel to update state
|
81
|
+
i.get!(a)
|
82
|
+
assert_not_equal state, i.state
|
83
|
+
ensure
|
84
|
+
s.close if s
|
85
|
+
c.close if c
|
86
|
+
a.close if a
|
67
87
|
end
|
68
|
-
end if
|
88
|
+
end if defined? Raindrops::TCP_Info
|
data/test/test_watcher.rb
CHANGED
@@ -2,6 +2,11 @@
|
|
2
2
|
require "test/unit"
|
3
3
|
require "rack"
|
4
4
|
require "raindrops"
|
5
|
+
begin
|
6
|
+
require 'aggregate'
|
7
|
+
rescue LoadError => e
|
8
|
+
warn "W: #{e} skipping #{__FILE__}"
|
9
|
+
end
|
5
10
|
|
6
11
|
class TestWatcher < Test::Unit::TestCase
|
7
12
|
TEST_ADDR = ENV['UNICORN_TEST_ADDR'] || '127.0.0.1'
|
@@ -113,28 +118,28 @@ def test_tail_queued_min
|
|
113
118
|
|
114
119
|
def test_x_current_header
|
115
120
|
env = @req.class.env_for "/active/#@addr.txt"
|
116
|
-
|
121
|
+
_status, headers, _body = @app.call(env)
|
117
122
|
assert_equal "0", headers["X-Current"], headers.inspect
|
118
123
|
|
119
124
|
env = @req.class.env_for "/queued/#@addr.txt"
|
120
|
-
|
125
|
+
_status, headers, _body = @app.call(env)
|
121
126
|
assert_equal "1", headers["X-Current"], headers.inspect
|
122
127
|
|
123
128
|
@ios << @srv.accept
|
124
129
|
sleep 0.1
|
125
130
|
|
126
131
|
env = @req.class.env_for "/queued/#@addr.txt"
|
127
|
-
|
132
|
+
_status, headers, _body = @app.call(env)
|
128
133
|
assert_equal "0", headers["X-Current"], headers.inspect
|
129
134
|
|
130
135
|
env = @req.class.env_for "/active/#@addr.txt"
|
131
|
-
|
136
|
+
_status, headers, _body = @app.call(env)
|
132
137
|
assert_equal "1", headers["X-Current"], headers.inspect
|
133
138
|
end
|
134
139
|
|
135
140
|
def test_peaks
|
136
141
|
env = @req.class.env_for "/active/#@addr.txt"
|
137
|
-
|
142
|
+
_status, headers, _body = @app.call(env.dup)
|
138
143
|
start = headers["X-First-Peak-At"]
|
139
144
|
assert headers["X-First-Peak-At"], headers.inspect
|
140
145
|
assert headers["X-Last-Peak-At"], headers.inspect
|
@@ -143,14 +148,14 @@ def test_peaks
|
|
143
148
|
before = headers["X-Last-Peak-At"]
|
144
149
|
|
145
150
|
env = @req.class.env_for "/queued/#@addr.txt"
|
146
|
-
|
151
|
+
_status, headers, _body = @app.call(env)
|
147
152
|
assert_nothing_raised { Time.parse(headers["X-First-Peak-At"]) }
|
148
153
|
assert_nothing_raised { Time.parse(headers["X-Last-Peak-At"]) }
|
149
154
|
assert_equal before, headers["X-Last-Peak-At"], "should not change"
|
150
155
|
|
151
156
|
sleep 2
|
152
157
|
env = @req.class.env_for "/active/#@addr.txt"
|
153
|
-
|
158
|
+
_status, headers, _body = @app.call(env.dup)
|
154
159
|
assert_equal before, headers["X-Last-Peak-At"], headers.inspect
|
155
160
|
|
156
161
|
@ios << @srv.accept
|
@@ -162,7 +167,7 @@ def test_peaks
|
|
162
167
|
end
|
163
168
|
sleep 0.1
|
164
169
|
env = @req.class.env_for "/queued/#@addr.txt"
|
165
|
-
|
170
|
+
_status, headers, _body = @app.call(env.dup)
|
166
171
|
assert headers["X-Last-Peak-At"], headers.inspect
|
167
172
|
assert_nothing_raised { Time.parse(headers["X-Last-Peak-At"]) }
|
168
173
|
assert before != headers["X-Last-Peak-At"]
|
@@ -172,10 +177,10 @@ def test_peaks
|
|
172
177
|
sleep 2
|
173
178
|
|
174
179
|
env = @req.class.env_for "/queued/#@addr.txt"
|
175
|
-
|
180
|
+
_status, headers, _body = @app.call(env)
|
176
181
|
assert_equal "0", headers["X-Current"]
|
177
182
|
assert_nothing_raised { Time.parse(headers["X-Last-Peak-At"]) }
|
178
183
|
assert_equal queued_before, headers["X-Last-Peak-At"], "should not change"
|
179
184
|
assert_equal start, headers["X-First-Peak-At"]
|
180
185
|
end
|
181
|
-
end if RUBY_PLATFORM =~ /linux/
|
186
|
+
end if RUBY_PLATFORM =~ /linux/ && defined?(Aggregate)
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: raindrops
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.19.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- raindrops hackers
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2020-01-08 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: aggregate
|
@@ -38,26 +38,6 @@ dependencies:
|
|
38
38
|
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '3.0'
|
41
|
-
- !ruby/object:Gem::Dependency
|
42
|
-
name: io-extra
|
43
|
-
requirement: !ruby/object:Gem::Requirement
|
44
|
-
requirements:
|
45
|
-
- - "~>"
|
46
|
-
- !ruby/object:Gem::Version
|
47
|
-
version: '1.2'
|
48
|
-
- - ">="
|
49
|
-
- !ruby/object:Gem::Version
|
50
|
-
version: 1.2.3
|
51
|
-
type: :development
|
52
|
-
prerelease: false
|
53
|
-
version_requirements: !ruby/object:Gem::Requirement
|
54
|
-
requirements:
|
55
|
-
- - "~>"
|
56
|
-
- !ruby/object:Gem::Version
|
57
|
-
version: '1.2'
|
58
|
-
- - ">="
|
59
|
-
- !ruby/object:Gem::Version
|
60
|
-
version: 1.2.3
|
61
41
|
- !ruby/object:Gem::Dependency
|
62
42
|
name: posix_mq
|
63
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -92,27 +72,13 @@ dependencies:
|
|
92
72
|
- - "<"
|
93
73
|
- !ruby/object:Gem::Version
|
94
74
|
version: '3.0'
|
95
|
-
- !ruby/object:Gem::Dependency
|
96
|
-
name: olddoc
|
97
|
-
requirement: !ruby/object:Gem::Requirement
|
98
|
-
requirements:
|
99
|
-
- - "~>"
|
100
|
-
- !ruby/object:Gem::Version
|
101
|
-
version: '1.0'
|
102
|
-
type: :development
|
103
|
-
prerelease: false
|
104
|
-
version_requirements: !ruby/object:Gem::Requirement
|
105
|
-
requirements:
|
106
|
-
- - "~>"
|
107
|
-
- !ruby/object:Gem::Version
|
108
|
-
version: '1.0'
|
109
75
|
description: |-
|
110
76
|
raindrops is a real-time stats toolkit to show statistics for Rack HTTP
|
111
77
|
servers. It is designed for preforking servers such as unicorn, but
|
112
78
|
should support any Rack HTTP server on platforms supporting POSIX shared
|
113
79
|
memory. It may also be used as a generic scoreboard for sharing atomic
|
114
80
|
counters across multiple processes.
|
115
|
-
email: raindrops@
|
81
|
+
email: raindrops-public@yhbt.net
|
116
82
|
executables: []
|
117
83
|
extensions:
|
118
84
|
- ext/raindrops/extconf.rb
|
@@ -120,19 +86,9 @@ extra_rdoc_files:
|
|
120
86
|
- README
|
121
87
|
- LICENSE
|
122
88
|
- NEWS
|
123
|
-
- lib/raindrops.rb
|
124
|
-
- lib/raindrops/aggregate.rb
|
125
|
-
- lib/raindrops/aggregate/last_data_recv.rb
|
126
|
-
- lib/raindrops/aggregate/pmq.rb
|
127
|
-
- lib/raindrops/last_data_recv.rb
|
128
|
-
- lib/raindrops/linux.rb
|
129
|
-
- lib/raindrops/middleware.rb
|
130
|
-
- lib/raindrops/middleware/proxy.rb
|
131
|
-
- lib/raindrops/struct.rb
|
132
|
-
- lib/raindrops/watcher.rb
|
133
89
|
- ext/raindrops/raindrops.c
|
134
90
|
- ext/raindrops/linux_inet_diag.c
|
135
|
-
- ext/raindrops/
|
91
|
+
- ext/raindrops/tcp_info.c
|
136
92
|
files:
|
137
93
|
- ".document"
|
138
94
|
- ".gitattributes"
|
@@ -158,10 +114,10 @@ files:
|
|
158
114
|
- examples/zbatery.conf.rb
|
159
115
|
- ext/raindrops/extconf.rb
|
160
116
|
- ext/raindrops/linux_inet_diag.c
|
161
|
-
- ext/raindrops/linux_tcp_info.c
|
162
117
|
- ext/raindrops/my_fileno.h
|
163
118
|
- ext/raindrops/raindrops.c
|
164
119
|
- ext/raindrops/raindrops_atomic.h
|
120
|
+
- ext/raindrops/tcp_info.c
|
165
121
|
- lib/raindrops.rb
|
166
122
|
- lib/raindrops/aggregate.rb
|
167
123
|
- lib/raindrops/aggregate/last_data_recv.rb
|
@@ -185,15 +141,15 @@ files:
|
|
185
141
|
- test/test_linux_all_tcp_listen_stats_leak.rb
|
186
142
|
- test/test_linux_ipv6.rb
|
187
143
|
- test/test_linux_middleware.rb
|
188
|
-
- test/test_linux_tcp_info.rb
|
189
144
|
- test/test_middleware.rb
|
190
145
|
- test/test_middleware_unicorn.rb
|
191
146
|
- test/test_middleware_unicorn_ipv6.rb
|
192
147
|
- test/test_raindrops.rb
|
193
148
|
- test/test_raindrops_gc.rb
|
194
149
|
- test/test_struct.rb
|
150
|
+
- test/test_tcp_info.rb
|
195
151
|
- test/test_watcher.rb
|
196
|
-
homepage: https://
|
152
|
+
homepage: https://yhbt.net/raindrops/
|
197
153
|
licenses:
|
198
154
|
- LGPL-2.1+
|
199
155
|
metadata: {}
|
@@ -205,15 +161,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
205
161
|
requirements:
|
206
162
|
- - ">="
|
207
163
|
- !ruby/object:Gem::Version
|
208
|
-
version:
|
164
|
+
version: 1.9.3
|
209
165
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
210
166
|
requirements:
|
211
167
|
- - ">="
|
212
168
|
- !ruby/object:Gem::Version
|
213
169
|
version: '0'
|
214
170
|
requirements: []
|
215
|
-
|
216
|
-
rubygems_version: 2.6.6
|
171
|
+
rubygems_version: 3.0.2
|
217
172
|
signing_key:
|
218
173
|
specification_version: 4
|
219
174
|
summary: real-time stats for preforking Rack servers
|
@@ -226,11 +181,11 @@ test_files:
|
|
226
181
|
- test/test_linux_all_tcp_listen_stats_leak.rb
|
227
182
|
- test/test_linux_ipv6.rb
|
228
183
|
- test/test_linux_middleware.rb
|
229
|
-
- test/test_linux_tcp_info.rb
|
230
184
|
- test/test_middleware.rb
|
231
185
|
- test/test_middleware_unicorn.rb
|
232
186
|
- test/test_middleware_unicorn_ipv6.rb
|
233
187
|
- test/test_raindrops.rb
|
234
188
|
- test/test_raindrops_gc.rb
|
235
189
|
- test/test_struct.rb
|
190
|
+
- test/test_tcp_info.rb
|
236
191
|
- test/test_watcher.rb
|