beanstalkd-stats 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
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: []