kingkong 0.0.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.
- data/.gitignore +6 -0
- data/.rvmrc +1 -0
- data/Gemfile +7 -0
- data/README.md +33 -0
- data/Rakefile +1 -0
- data/bin/kingkong-munin +15 -0
- data/bin/kingkong-server +10 -0
- data/kingkong.gemspec +24 -0
- data/lib/README.md +33 -0
- data/lib/kingkong.rb +8 -0
- data/lib/kingkong/aggregator.rb +56 -0
- data/lib/kingkong/cli.rb +4 -0
- data/lib/kingkong/logging.rb +15 -0
- data/lib/kingkong/ping.rb +102 -0
- data/lib/kingkong/server.rb +24 -0
- data/lib/kingkong/version.rb +3 -0
- metadata +77 -0
data/.gitignore
ADDED
data/.rvmrc
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
rvm use --create --install 1.9.2@kingkong
|
data/Gemfile
ADDED
data/README.md
ADDED
@@ -0,0 +1,33 @@
|
|
1
|
+
# KingKong
|
2
|
+
|
3
|
+
,.-" "-.,
|
4
|
+
/ === \
|
5
|
+
/ ======= \
|
6
|
+
__| (o) (0) |__
|
7
|
+
/ _| .---. |_ \
|
8
|
+
| /.----/ O O \----.\ |
|
9
|
+
\/ | | \/
|
10
|
+
| |
|
11
|
+
| |
|
12
|
+
| |
|
13
|
+
_\ -.,_____,.- /_
|
14
|
+
,.-" "-.,_________,.-" "-.,
|
15
|
+
/ | | \
|
16
|
+
| l. .l |
|
17
|
+
| | | |
|
18
|
+
l. | | .l
|
19
|
+
| l. .l | \,
|
20
|
+
l. | | .l \,
|
21
|
+
| | | | \,
|
22
|
+
l. | | .l |
|
23
|
+
| | | | |
|
24
|
+
| |---| | |
|
25
|
+
| | | | |
|
26
|
+
/"-.,__,.-"\ /"-.,__,.-"\"-.,_,.-"\
|
27
|
+
| \ / | |
|
28
|
+
| | | |
|
29
|
+
\__|__|__|__/ \__|__|__|__/ \_|__|__/ KingKong gets what KingKong wants!
|
30
|
+
|
31
|
+
KingKong makes it easy to build full-stack ping-pong checks. You might need this to check and graph out the response time on your website, Twitter application, SMS gateway, or whatever else you'd connect to a network.
|
32
|
+
|
33
|
+
Stay tuned, I'm still working out the ping DSL and reporting infrastructure!
|
data/Rakefile
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require "bundler/gem_tasks"
|
data/bin/kingkong-munin
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'socket'
|
4
|
+
require 'yaml'
|
5
|
+
|
6
|
+
puts case ARGV.first
|
7
|
+
when /config/
|
8
|
+
%(graph_title Result latency
|
9
|
+
graph_category App
|
10
|
+
graph_vlabel load
|
11
|
+
load.label load)
|
12
|
+
else
|
13
|
+
stats = YAML.load UNIXSocket.new("/tmp/kingkong.socket").gets("\r\n")
|
14
|
+
%(load.value #{stats[:avg]})
|
15
|
+
end
|
data/bin/kingkong-server
ADDED
data/kingkong.gemspec
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
$:.push File.expand_path("../lib", __FILE__)
|
3
|
+
require "kingkong/version"
|
4
|
+
|
5
|
+
Gem::Specification.new do |s|
|
6
|
+
s.name = "kingkong"
|
7
|
+
s.version = KingKong::VERSION
|
8
|
+
s.authors = ["Brad Gessler"]
|
9
|
+
s.email = ["brad@bradgessler.com"]
|
10
|
+
s.homepage = ""
|
11
|
+
s.summary = %q{Build complex network application health checks with Ruby and EventMachine}
|
12
|
+
s.description = %q{Have you ever wanted to shoot a message throught Twitter, have your app pick it up, do some work on it, and report how long it takes? KingKong makes it slightly easier to do this with a DSL for writing custom pings and by providing basic reporting facilities that plug into graphing applications like Munin.}
|
13
|
+
|
14
|
+
s.rubyforge_project = "kingkong"
|
15
|
+
|
16
|
+
s.files = `git ls-files`.split("\n")
|
17
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
18
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
19
|
+
s.require_paths = ["lib"]
|
20
|
+
|
21
|
+
# specify any dependencies here; for example:
|
22
|
+
# s.add_development_dependency "rspec"
|
23
|
+
s.add_runtime_dependency "eventmachine"
|
24
|
+
end
|
data/lib/README.md
ADDED
@@ -0,0 +1,33 @@
|
|
1
|
+
# KingKong
|
2
|
+
|
3
|
+
,.-" "-.,
|
4
|
+
/ === \
|
5
|
+
/ ======= \
|
6
|
+
__| (o) (0) |__
|
7
|
+
/ _| .---. |_ \
|
8
|
+
| /.----/ O O \----.\ |
|
9
|
+
\/ | | \/
|
10
|
+
| |
|
11
|
+
| | KingKong gets what KingKong wants!
|
12
|
+
| |
|
13
|
+
_\ -.,_____,.- /_
|
14
|
+
,.-" "-.,_________,.-" "-.,
|
15
|
+
/ | | \
|
16
|
+
| l. .l |
|
17
|
+
| | | |
|
18
|
+
l. | | .l
|
19
|
+
| l. .l | \,
|
20
|
+
l. | | .l \,
|
21
|
+
| | | | \,
|
22
|
+
l. | | .l |
|
23
|
+
| | | | |
|
24
|
+
| |---| | |
|
25
|
+
| | | | |
|
26
|
+
/"-.,__,.-"\ /"-.,__,.-"\"-.,_,.-"\
|
27
|
+
| \ / | |
|
28
|
+
| | | |
|
29
|
+
\__|__|__|__/ \__|__|__|__/ \_|__|__/
|
30
|
+
|
31
|
+
KingKong makes it easy to build full-stack ping-pong checks. You might need this to check and graph out the response time on your website, Twitter application, SMS gateway, or whatever else you'd connect to a network.
|
32
|
+
|
33
|
+
Stay tuned, I'm still working out the ping DSL and reporting infrastructure!
|
data/lib/kingkong.rb
ADDED
@@ -0,0 +1,56 @@
|
|
1
|
+
module KingKong
|
2
|
+
# Processes and aggregates pings for reporting. These stats will probably
|
3
|
+
# be accessed throug the KingKong::Server UNIX socket.
|
4
|
+
class Aggregator
|
5
|
+
attr_reader :sum, :max_count, :pings, :started_at
|
6
|
+
|
7
|
+
def initialize(max_count=10)
|
8
|
+
@max_count = max_count
|
9
|
+
reset
|
10
|
+
end
|
11
|
+
|
12
|
+
# Accept a ping message, keep a running total, and make sure we stay within the
|
13
|
+
# size of the number of samples that we want to keep around.
|
14
|
+
def process(ping)
|
15
|
+
@sum+=ping.latency
|
16
|
+
pings.push ping
|
17
|
+
|
18
|
+
# Take out the old ping if we're approaching our max sample size and substruct it
|
19
|
+
# from the running latency sum
|
20
|
+
if count > max_count and ping = pings.shift
|
21
|
+
@sum-=ping.latency
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
# Average latency of pings
|
26
|
+
def avg
|
27
|
+
count.zero? ? 0 : sum / count
|
28
|
+
end
|
29
|
+
|
30
|
+
# Number of pings
|
31
|
+
def count
|
32
|
+
pings.size
|
33
|
+
end
|
34
|
+
|
35
|
+
# Basic statistical summary of ping latency
|
36
|
+
def to_hash
|
37
|
+
{
|
38
|
+
:avg => avg,
|
39
|
+
:count => count,
|
40
|
+
:sum => sum,
|
41
|
+
:started_at => started_at
|
42
|
+
}
|
43
|
+
end
|
44
|
+
|
45
|
+
def to_s
|
46
|
+
to_hash.to_yaml
|
47
|
+
end
|
48
|
+
|
49
|
+
# Reset all of the counts to 0 and empty all of the pings
|
50
|
+
def reset
|
51
|
+
@sum = 0
|
52
|
+
@pings = Array.new
|
53
|
+
@started_at = Time.now
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
data/lib/kingkong/cli.rb
ADDED
@@ -0,0 +1,102 @@
|
|
1
|
+
require 'eventmachine'
|
2
|
+
|
3
|
+
module KingKong
|
4
|
+
# Encaspulates and calculates latency.
|
5
|
+
class Ping
|
6
|
+
attr_accessor :end_time, :ttl
|
7
|
+
|
8
|
+
def initialize(ttl=30,sequencer=self.class.sequencer)
|
9
|
+
# Time out is when the ping should give up!
|
10
|
+
@ttl, @sequencer = ttl, sequencer
|
11
|
+
end
|
12
|
+
|
13
|
+
# Lazily grab a id
|
14
|
+
def id
|
15
|
+
@id ||= @sequencer.next
|
16
|
+
end
|
17
|
+
|
18
|
+
# When did the ping start? This is also what starts the time for this thing
|
19
|
+
def start_time
|
20
|
+
unless @start_time
|
21
|
+
@start_time = current_time
|
22
|
+
end
|
23
|
+
@start_time
|
24
|
+
end
|
25
|
+
|
26
|
+
# Set the end time
|
27
|
+
def pong
|
28
|
+
@end_time ||= current_time
|
29
|
+
end
|
30
|
+
|
31
|
+
# How long did it take to clear the message?
|
32
|
+
def latency
|
33
|
+
end_time - start_time if end_time
|
34
|
+
end
|
35
|
+
|
36
|
+
# Did this get ponged yet?
|
37
|
+
def completed?
|
38
|
+
!!end_time
|
39
|
+
end
|
40
|
+
|
41
|
+
# Is this ping still on its journy? Will it make it back! It hasn't yet...
|
42
|
+
def active?
|
43
|
+
!timed_out? or !completed?
|
44
|
+
end
|
45
|
+
|
46
|
+
# Did we not receive a pong?
|
47
|
+
def timed_out?
|
48
|
+
start_time + ttl < current_time and not end_time
|
49
|
+
end
|
50
|
+
|
51
|
+
# Give us the current time in seconds
|
52
|
+
def current_time
|
53
|
+
Time.now.to_f
|
54
|
+
end
|
55
|
+
|
56
|
+
# Generates ids for pings
|
57
|
+
def self.sequencer
|
58
|
+
@sequencer ||= Sequencer.new
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
# Keeps track of the results heading in/out. We could just use
|
63
|
+
# some totally random GUID instead of bothering with this, but
|
64
|
+
# having a 1,2,3... sequence makes it much easier to spot check
|
65
|
+
# tests to verify whether or not messages are being sent correctly.
|
66
|
+
class Ping::Sequencer
|
67
|
+
attr_reader :count, :run
|
68
|
+
|
69
|
+
def initialize(run=Time.now.to_i)
|
70
|
+
@run, @count = run, 0
|
71
|
+
end
|
72
|
+
|
73
|
+
# Tick up the restul count and give us the key
|
74
|
+
def next
|
75
|
+
key @count += 1
|
76
|
+
end
|
77
|
+
|
78
|
+
private
|
79
|
+
# Spits out a key and run for a result
|
80
|
+
def key(count=count)
|
81
|
+
"#{count}:#{run}"
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
# Add evented functionality to a ping so that it times out, etc.
|
86
|
+
class Ping::Deferrable < Ping
|
87
|
+
include EventMachine::Deferrable
|
88
|
+
|
89
|
+
# Setup a ttl for the ping so that it will timeout after ttl seconds
|
90
|
+
def start_time
|
91
|
+
timeout(ttl) # Setup an em TTL on this thing so it fails if the thing isn't called
|
92
|
+
super
|
93
|
+
end
|
94
|
+
|
95
|
+
# Succeed a block passed into the ping and mark the ping as suceeded
|
96
|
+
def pong(&block)
|
97
|
+
callback(&block) if block_given?
|
98
|
+
super
|
99
|
+
succeed self
|
100
|
+
end
|
101
|
+
end
|
102
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
module KingKong
|
2
|
+
# Opens a UNIX socket to report pinger statistics
|
3
|
+
class Server < EventMachine::Connection
|
4
|
+
Frame = "\r\n"
|
5
|
+
|
6
|
+
def initialize(pinger)
|
7
|
+
@pinger = pinger
|
8
|
+
end
|
9
|
+
|
10
|
+
def post_init
|
11
|
+
send_data frame @pinger.aggregator.to_hash.to_yaml
|
12
|
+
end
|
13
|
+
|
14
|
+
# Start an instance of the aggregator server on a unix port
|
15
|
+
def self.start(pinger, host='/tmp/kingkong.socket', port=nil)
|
16
|
+
EM.start_server host, port, self, pinger
|
17
|
+
end
|
18
|
+
|
19
|
+
private
|
20
|
+
def frame(message)
|
21
|
+
"#{message}#{Frame}"
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
metadata
ADDED
@@ -0,0 +1,77 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: kingkong
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Brad Gessler
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2011-09-02 00:00:00.000000000Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: eventmachine
|
16
|
+
requirement: &70132736057580 !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '0'
|
22
|
+
type: :runtime
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: *70132736057580
|
25
|
+
description: Have you ever wanted to shoot a message throught Twitter, have your app
|
26
|
+
pick it up, do some work on it, and report how long it takes? KingKong makes it
|
27
|
+
slightly easier to do this with a DSL for writing custom pings and by providing
|
28
|
+
basic reporting facilities that plug into graphing applications like Munin.
|
29
|
+
email:
|
30
|
+
- brad@bradgessler.com
|
31
|
+
executables:
|
32
|
+
- kingkong-munin
|
33
|
+
- kingkong-server
|
34
|
+
extensions: []
|
35
|
+
extra_rdoc_files: []
|
36
|
+
files:
|
37
|
+
- .gitignore
|
38
|
+
- .rvmrc
|
39
|
+
- Gemfile
|
40
|
+
- README.md
|
41
|
+
- Rakefile
|
42
|
+
- bin/kingkong-munin
|
43
|
+
- bin/kingkong-server
|
44
|
+
- kingkong.gemspec
|
45
|
+
- lib/README.md
|
46
|
+
- lib/kingkong.rb
|
47
|
+
- lib/kingkong/aggregator.rb
|
48
|
+
- lib/kingkong/cli.rb
|
49
|
+
- lib/kingkong/logging.rb
|
50
|
+
- lib/kingkong/ping.rb
|
51
|
+
- lib/kingkong/server.rb
|
52
|
+
- lib/kingkong/version.rb
|
53
|
+
homepage: ''
|
54
|
+
licenses: []
|
55
|
+
post_install_message:
|
56
|
+
rdoc_options: []
|
57
|
+
require_paths:
|
58
|
+
- lib
|
59
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
60
|
+
none: false
|
61
|
+
requirements:
|
62
|
+
- - ! '>='
|
63
|
+
- !ruby/object:Gem::Version
|
64
|
+
version: '0'
|
65
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
66
|
+
none: false
|
67
|
+
requirements:
|
68
|
+
- - ! '>='
|
69
|
+
- !ruby/object:Gem::Version
|
70
|
+
version: '0'
|
71
|
+
requirements: []
|
72
|
+
rubyforge_project: kingkong
|
73
|
+
rubygems_version: 1.8.6
|
74
|
+
signing_key:
|
75
|
+
specification_version: 3
|
76
|
+
summary: Build complex network application health checks with Ruby and EventMachine
|
77
|
+
test_files: []
|