beanstalkd-stats 0.0.2
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 +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: []
|