beanstalkd-stats 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/bin/beanstalkd-stats +73 -0
- data/lib/stackdriver.rb +64 -0
- data/lib/stat.rb +24 -0
- metadata +103 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 4252c3779ac2cfe56f7ab1e2f7c136c567c4303c
|
4
|
+
data.tar.gz: 79e87d48972aa2aefd947855c5ff074a42f1d0dc
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 1cf63bfcbeb6479693af1e8be48cdc5af8a8079492ea02e7359b6b9c0b71fa3624f419e70d4652060ebdfb088cae93d5a7e71a3a6de2207c41dd735513d75a5c
|
7
|
+
data.tar.gz: 43387e5c169611f74254c5441bacce8730c4049df96fe509d59a43ba522fcbfffd0ad4a930b4d18d3a4950ea0c55625c0ab81c9321f2c85ad0e9d7bfba479078
|
@@ -0,0 +1,73 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'open-uri'
|
4
|
+
require 'net/http'
|
5
|
+
require 'fileutils'
|
6
|
+
require 'stackdriver'
|
7
|
+
require 'beanstalk-client'
|
8
|
+
require 'rufus-scheduler'
|
9
|
+
require 'json'
|
10
|
+
require 'optparse'
|
11
|
+
require 'stat'
|
12
|
+
|
13
|
+
options = {}
|
14
|
+
optparse = OptionParser.new do |opts|
|
15
|
+
# todo: syntax
|
16
|
+
opts.on("-i", "--interval INTERVAL", "interval to query beanstalkd") do |interval|
|
17
|
+
options['interval'] = interval
|
18
|
+
end
|
19
|
+
opts.on("-h", "--host HOST", "beanstalkd host") do |host|
|
20
|
+
options['host'] = host
|
21
|
+
end
|
22
|
+
opts.on("-p", "--port PORT", "beanstalkd port") do |port|
|
23
|
+
options['port'] = port
|
24
|
+
end
|
25
|
+
opts.on("-c", "--config FILE", "config file" ) do |config_file|
|
26
|
+
file_json = File.read(config_file)
|
27
|
+
options.merge!(JSON.parse(file_json))
|
28
|
+
end
|
29
|
+
opts.on("-d", "--debug", "debug") do |debug|
|
30
|
+
options['debug'] = true
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
# Parsing arguments
|
35
|
+
begin
|
36
|
+
optparse.parse!
|
37
|
+
|
38
|
+
mandatory = []
|
39
|
+
missing = mandatory.select{}
|
40
|
+
rescue OptionParser::InvalidOption, OptionParser::MissingArgument
|
41
|
+
puts $!.to_s
|
42
|
+
puts optparse
|
43
|
+
exit 1
|
44
|
+
end
|
45
|
+
|
46
|
+
# StackDriver wants an instance_id
|
47
|
+
def instance_id
|
48
|
+
output = IO.popen('/opt/aws/bin/ec2-metadata -i')
|
49
|
+
output.readlines.first.split[1]
|
50
|
+
rescue
|
51
|
+
"localhost"
|
52
|
+
end
|
53
|
+
|
54
|
+
# begin
|
55
|
+
server = "#{options['host']}:#{options['port']}"
|
56
|
+
StackDriver.init options['stackdriver_api_key']
|
57
|
+
scheduler = Rufus::Scheduler.new
|
58
|
+
scheduler.every options['interval'] do
|
59
|
+
stats = []
|
60
|
+
connection = Beanstalk::Connection.new(server)
|
61
|
+
beanstalkd_stats = connection.stats
|
62
|
+
|
63
|
+
options['stats'].each do |m|
|
64
|
+
stat = Stat.new instance_id, m
|
65
|
+
stat.value = beanstalkd_stats[m] || 0
|
66
|
+
stats << stat.to_hash
|
67
|
+
end
|
68
|
+
|
69
|
+
puts stats.to_json if options['debug']
|
70
|
+
StackDriver.send_multi_metrics stats
|
71
|
+
end
|
72
|
+
|
73
|
+
scheduler.join
|
data/lib/stackdriver.rb
ADDED
@@ -0,0 +1,64 @@
|
|
1
|
+
require 'multi_json'
|
2
|
+
|
3
|
+
module StackDriver
|
4
|
+
POST_URI = "https://custom-gateway.stackdriver.com/v1/custom"
|
5
|
+
DELETE_URI = "https://custom-gateway.stackdriver.com/v1/delete_custom"
|
6
|
+
|
7
|
+
def self.init *args
|
8
|
+
if args.count > 1
|
9
|
+
puts "Customer ID is no longer needed, and will be deprecated"
|
10
|
+
args.shift
|
11
|
+
end
|
12
|
+
@api_key = args[0]
|
13
|
+
end
|
14
|
+
|
15
|
+
def self.send_metric name, value, time, instance=''
|
16
|
+
msg = build_message name, value, time, instance
|
17
|
+
post MultiJson.dump(msg), StackDriver::POST_URI
|
18
|
+
end
|
19
|
+
|
20
|
+
def self.send_multi_metrics data
|
21
|
+
msg = build_multi_message data
|
22
|
+
post MultiJson.dump(msg), StackDriver::POST_URI
|
23
|
+
end
|
24
|
+
|
25
|
+
def self.delete_metric name, time
|
26
|
+
msg = build_message name, nil, time
|
27
|
+
post MultiJson.dump(msg), StackDriver::DELETE_URI
|
28
|
+
end
|
29
|
+
|
30
|
+
private
|
31
|
+
|
32
|
+
def self.post msg, uri
|
33
|
+
headers = {'content-type' => 'application/json',
|
34
|
+
'x-stackdriver-apikey' => @api_key}
|
35
|
+
|
36
|
+
uri = URI(uri)
|
37
|
+
http = Net::HTTP.new(uri.host, uri.port)
|
38
|
+
http.use_ssl = true
|
39
|
+
|
40
|
+
http.start do |http|
|
41
|
+
response = http.post(uri.path, msg, headers)
|
42
|
+
if response.code != "201"
|
43
|
+
raise RuntimeError, "#{response.code} - #{response.body}"
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
def self.build_message name, value, time, instance=''
|
49
|
+
data_point = {'name' => name, 'value' => value, 'collected_at' => time}
|
50
|
+
data_point.merge!('value' => value) unless value.nil?
|
51
|
+
data_point.merge!('instance' => instance) unless instance.empty?
|
52
|
+
{'timestamp' => Time.now.to_i, 'proto_version' => '1', 'data' => data_point}
|
53
|
+
end
|
54
|
+
|
55
|
+
def self.build_multi_message data
|
56
|
+
data_point = data
|
57
|
+
{
|
58
|
+
'timestamp' => Time.now.to_i,
|
59
|
+
'proto_version' => '1',
|
60
|
+
'data' => data_point
|
61
|
+
}
|
62
|
+
|
63
|
+
end
|
64
|
+
end
|
data/lib/stat.rb
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
|
2
|
+
|
3
|
+
class Stat
|
4
|
+
attr_reader :instance, :name, :value, :collected_at
|
5
|
+
|
6
|
+
|
7
|
+
def initialize(instance, name)
|
8
|
+
@instance=instance
|
9
|
+
@name=name
|
10
|
+
@value=0
|
11
|
+
end
|
12
|
+
|
13
|
+
def value=(newval)
|
14
|
+
@value=newval.to_i
|
15
|
+
@collected_at=Time.now
|
16
|
+
end
|
17
|
+
|
18
|
+
def to_hash
|
19
|
+
hash = {}
|
20
|
+
instance_variables.each {|var| hash[var.to_s.delete("@")] = instance_variable_get(var) }
|
21
|
+
hash
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
metadata
ADDED
@@ -0,0 +1,103 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: beanstalkd-stats
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.2
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Jorge Moratilla
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2014-10-28 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: multi_json
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ~>
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '1.10'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ~>
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '1.10'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: beanstalk-client
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ~>
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '1.1'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ~>
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '1.1'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: rufus-scheduler
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ~>
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '2.0'
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ~>
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '2.0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: json
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ~>
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '1.8'
|
62
|
+
type: :runtime
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ~>
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '1.8'
|
69
|
+
description: A simple beanstalkd gem
|
70
|
+
email: jorge@moratilla.com
|
71
|
+
executables:
|
72
|
+
- beanstalkd-stats
|
73
|
+
extensions: []
|
74
|
+
extra_rdoc_files: []
|
75
|
+
files:
|
76
|
+
- bin/beanstalkd-stats
|
77
|
+
- lib/stackdriver.rb
|
78
|
+
- lib/stat.rb
|
79
|
+
homepage: http://rubygems.org/gems/beanstalkd-stats
|
80
|
+
licenses:
|
81
|
+
- MIT
|
82
|
+
metadata: {}
|
83
|
+
post_install_message:
|
84
|
+
rdoc_options: []
|
85
|
+
require_paths:
|
86
|
+
- lib
|
87
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
88
|
+
requirements:
|
89
|
+
- - '>='
|
90
|
+
- !ruby/object:Gem::Version
|
91
|
+
version: '0'
|
92
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - '>='
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '0'
|
97
|
+
requirements: []
|
98
|
+
rubyforge_project:
|
99
|
+
rubygems_version: 2.3.0
|
100
|
+
signing_key:
|
101
|
+
specification_version: 4
|
102
|
+
summary: Stats for beanstalkd!
|
103
|
+
test_files: []
|