amnesia 1.0.0 → 1.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/README.markdown +31 -3
- data/lib/amnesia.rb +27 -4
- data/lib/amnesia/host.rb +27 -22
- metadata +8 -14
data/README.markdown
CHANGED
@@ -8,7 +8,7 @@ Hopefully with Amnesia you'll know exactly whats happening with memory when it c
|
|
8
8
|
|
9
9
|
## Why?
|
10
10
|
|
11
|
-
Its always nice to have some statistics to see how everything is performing within your stack. Memcached seems to be a mystery box that people don't really pay
|
11
|
+
Its always nice to have some statistics to see how everything is performing within your stack. Memcached seems to be a mystery box that people don't really pay a lot of attention to.
|
12
12
|
|
13
13
|
Amnesia tells you how your application is performing, when it misses, when it is running sweet, when you're about to run out of memcached and (perhaps) fall down in a screaming heap.
|
14
14
|
|
@@ -16,7 +16,7 @@ Amnesia tells you how your application is performing, when it misses, when it is
|
|
16
16
|
|
17
17
|
All stats are since each memcached instance was restarted
|
18
18
|
|
19
|
-
Available as a
|
19
|
+
Available as a cumulative result of all your memcached instances, or single instances alone:
|
20
20
|
|
21
21
|
* Cache hits and misses
|
22
22
|
* Reads and writes
|
@@ -40,11 +40,39 @@ Available for single instances only:
|
|
40
40
|
"config.ru":
|
41
41
|
|
42
42
|
require 'amnesia'
|
43
|
-
use Amnesia::Application
|
43
|
+
use Amnesia::Application
|
44
44
|
run Sinatra::Application
|
45
45
|
|
46
46
|
### Then, cruise on over to `your-host.tld/amnesia`
|
47
47
|
|
48
|
+
|
49
|
+
## Configuration options
|
50
|
+
|
51
|
+
### Hosts
|
52
|
+
Amnesia will work automagically if you drop it on a Heroku powered app, likewise—for a "standard" memcache host (running on localhost:11211, the default.).
|
53
|
+
|
54
|
+
When you need to specify where your memcache hosts can be found, you can either set an environment variable:
|
55
|
+
|
56
|
+
ENV["MEMCACHE_SERVERS"] = ['localhost:11211']
|
57
|
+
|
58
|
+
or alternately, you can set it within your `config.ru`:
|
59
|
+
|
60
|
+
use Amnesia::Application, :hosts => ["mc1.yourapp.com:11211", "mc2.yourapp.com:11211"]
|
61
|
+
|
62
|
+
### Authentication
|
63
|
+
|
64
|
+
When you want to keep your Amnesia data private, you can set an environment variable that will enable http basic authentication:
|
65
|
+
|
66
|
+
ENV["AMNESIA_CREDS"] = ben:schwarz
|
67
|
+
|
68
|
+
in your shell, you might do it like this:
|
69
|
+
|
70
|
+
export AMNESIA_CREDS=ben:schwarz
|
71
|
+
|
72
|
+
on heroku, like this:
|
73
|
+
|
74
|
+
heroku config:add AMNESIA_CREDS=ben:schwarz
|
75
|
+
|
48
76
|
## Potential issues
|
49
77
|
|
50
78
|
* Hosts are listed as "Inactive" or "Not Responding"
|
data/lib/amnesia.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
require 'sinatra'
|
2
|
-
require '
|
2
|
+
require 'memcached'
|
3
3
|
require 'gchart'
|
4
4
|
require 'haml'
|
5
5
|
|
@@ -19,6 +19,10 @@ module Amnesia
|
|
19
19
|
|
20
20
|
def initialize(app, configuration = {})
|
21
21
|
Amnesia.config = configuration
|
22
|
+
# Heroku
|
23
|
+
Amnesia.config[:hosts] ||= [nil] if ENV['MEMCACHE_SERVERS']
|
24
|
+
# Default if nothing set
|
25
|
+
Amnesia.config[:hosts] ||= ['127.0.0.1:11211']
|
22
26
|
super(app)
|
23
27
|
end
|
24
28
|
|
@@ -40,16 +44,35 @@ module Amnesia
|
|
40
44
|
rescue
|
41
45
|
nil
|
42
46
|
end
|
47
|
+
|
48
|
+
def protected!
|
49
|
+
unless authorized?
|
50
|
+
response['WWW-Authenticate'] = %(Basic realm="Amnesia")
|
51
|
+
throw(:halt, [401, "Not authorized\n"])
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
def authorized?
|
56
|
+
if ENV['AMNESIA_CREDS']
|
57
|
+
@auth ||= Rack::Auth::Basic::Request.new(request.env)
|
58
|
+
@auth.provided? && @auth.basic? && @auth.credentials && @auth.credentials == ENV['AMNESIA_CREDS'].split(':')
|
59
|
+
else
|
60
|
+
# No auth needed.
|
61
|
+
true
|
62
|
+
end
|
63
|
+
end
|
43
64
|
end
|
44
65
|
|
45
66
|
get '/amnesia' do
|
46
|
-
|
67
|
+
protected!
|
68
|
+
@hosts = Amnesia.config[:hosts].map{|host| Amnesia::Host.new(host)}
|
47
69
|
haml :index
|
48
70
|
end
|
49
71
|
|
50
72
|
get '/amnesia/:host' do
|
51
|
-
|
73
|
+
protected!
|
74
|
+
@host = Amnesia::Host.new(params[:host])
|
52
75
|
haml :host
|
53
76
|
end
|
54
77
|
end
|
55
|
-
end
|
78
|
+
end
|
data/lib/amnesia/host.rb
CHANGED
@@ -1,29 +1,34 @@
|
|
1
|
-
|
2
|
-
|
1
|
+
module Amnesia
|
2
|
+
class Host
|
3
|
+
def initialize(address)
|
4
|
+
@address = address
|
5
|
+
end
|
3
6
|
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
+
def alive?
|
8
|
+
return true if connection.stats
|
9
|
+
rescue Memcached::Error
|
10
|
+
return false
|
11
|
+
end
|
7
12
|
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
return false
|
12
|
-
end
|
13
|
+
def method_missing(method, *args)
|
14
|
+
stats[method.to_s.to_sym].sum if stats.has_key? method.to_s.to_sym
|
15
|
+
end
|
13
16
|
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
17
|
+
def stats
|
18
|
+
connection.stats[connection.stats.keys.first]
|
19
|
+
connection.stats
|
20
|
+
rescue Memcached::Error
|
21
|
+
return {}
|
22
|
+
end
|
23
|
+
|
24
|
+
def address
|
25
|
+
@address || @connection.servers.join(', ')
|
26
|
+
end
|
23
27
|
|
24
|
-
|
28
|
+
private
|
25
29
|
|
26
|
-
|
27
|
-
|
30
|
+
def connection
|
31
|
+
@connection ||= @address ? Memcached.new(@address) : Memcached.new
|
32
|
+
end
|
28
33
|
end
|
29
34
|
end
|
metadata
CHANGED
@@ -1,13 +1,12 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: amnesia
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash: 23
|
5
4
|
prerelease: false
|
6
5
|
segments:
|
7
6
|
- 1
|
8
7
|
- 0
|
9
|
-
-
|
10
|
-
version: 1.0.
|
8
|
+
- 1
|
9
|
+
version: 1.0.1
|
11
10
|
platform: ruby
|
12
11
|
authors:
|
13
12
|
- Ben Schwarz
|
@@ -15,7 +14,7 @@ autorequire:
|
|
15
14
|
bindir: bin
|
16
15
|
cert_chain: []
|
17
16
|
|
18
|
-
date: 2010-
|
17
|
+
date: 2010-10-02 00:00:00 +10:00
|
19
18
|
default_executable:
|
20
19
|
dependencies:
|
21
20
|
- !ruby/object:Gem::Dependency
|
@@ -26,7 +25,6 @@ dependencies:
|
|
26
25
|
requirements:
|
27
26
|
- - ">="
|
28
27
|
- !ruby/object:Gem::Version
|
29
|
-
hash: 15
|
30
28
|
segments:
|
31
29
|
- 1
|
32
30
|
- 0
|
@@ -34,19 +32,19 @@ dependencies:
|
|
34
32
|
type: :runtime
|
35
33
|
version_requirements: *id001
|
36
34
|
- !ruby/object:Gem::Dependency
|
37
|
-
name:
|
35
|
+
name: memcached-northscale
|
38
36
|
prerelease: false
|
39
37
|
requirement: &id002 !ruby/object:Gem::Requirement
|
40
38
|
none: false
|
41
39
|
requirements:
|
42
40
|
- - ">="
|
43
41
|
- !ruby/object:Gem::Version
|
44
|
-
hash: 3
|
45
42
|
segments:
|
46
|
-
- 1
|
47
|
-
- 5
|
48
43
|
- 0
|
49
|
-
|
44
|
+
- 19
|
45
|
+
- 5
|
46
|
+
- 4
|
47
|
+
version: 0.19.5.4
|
50
48
|
type: :runtime
|
51
49
|
version_requirements: *id002
|
52
50
|
- !ruby/object:Gem::Dependency
|
@@ -57,7 +55,6 @@ dependencies:
|
|
57
55
|
requirements:
|
58
56
|
- - "="
|
59
57
|
- !ruby/object:Gem::Version
|
60
|
-
hash: 23
|
61
58
|
segments:
|
62
59
|
- 1
|
63
60
|
- 0
|
@@ -73,7 +70,6 @@ dependencies:
|
|
73
70
|
requirements:
|
74
71
|
- - ">="
|
75
72
|
- !ruby/object:Gem::Version
|
76
|
-
hash: 7
|
77
73
|
segments:
|
78
74
|
- 3
|
79
75
|
- 0
|
@@ -114,7 +110,6 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
114
110
|
requirements:
|
115
111
|
- - ">="
|
116
112
|
- !ruby/object:Gem::Version
|
117
|
-
hash: 3
|
118
113
|
segments:
|
119
114
|
- 0
|
120
115
|
version: "0"
|
@@ -123,7 +118,6 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
123
118
|
requirements:
|
124
119
|
- - ">="
|
125
120
|
- !ruby/object:Gem::Version
|
126
|
-
hash: 3
|
127
121
|
segments:
|
128
122
|
- 0
|
129
123
|
version: "0"
|