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 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
@@ -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: []