nugget 0.0.10 → 0.0.11

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.md CHANGED
@@ -18,10 +18,10 @@ Nugget also includes a very basic web service daemon that simply reads the curre
18
18
 
19
19
  $ nugget -w
20
20
 
21
- Additionally, nugget includes support for sending results of the tests to [backstop](https://github.com/obfuscurity/backstop).
21
+ Additionally, nugget includes support for sending results of the tests to [backstop](https://github.com/obfuscurity/backstop) and [statsd](https://github.com/reinh/statsd).
22
22
 
23
23
  ![](https://dl.dropboxusercontent.com/s/1xhl7fnuw0y0934/2014-01-13%20at%207.47%20PM.png)
24
24
 
25
25
  #### License
26
26
 
27
- nugget is open source software available under the MIT License
27
+ nugget is open source software available under the MIT License
@@ -23,9 +23,25 @@ end
23
23
 
24
24
  failed_tests = {}
25
25
 
26
- results.each do |test, info|
27
- if info[:result] == "FAIL"
28
- failed_tests.store(test.to_s, info[:response][:failed])
26
+ if ARGV[0] == "-s"
27
+ if ARGV[1]
28
+ if results[ARGV[1].to_sym]
29
+ if results[ARGV[1].to_sym][:result] == "FAIL"
30
+ failed_tests.store(ARGV[1], results[ARGV[1].to_sym][:response][:failed])
31
+ end
32
+ else
33
+ puts "no check by that name"
34
+ exit 1
35
+ end
36
+ else
37
+ puts "-s requires an argument in the form of a check name"
38
+ exit 1
39
+ end
40
+ else
41
+ results.each do |test, info|
42
+ if info[:result] == "FAIL"
43
+ failed_tests.store(test.to_s, info[:response][:failed])
44
+ end
29
45
  end
30
46
  end
31
47
 
@@ -6,8 +6,10 @@ require 'mixlib/config'
6
6
  require 'mixlib/log'
7
7
  require 'yajl/json_gem'
8
8
  require 'thin'
9
+ require 'statsd'
9
10
  require 'open-uri'
10
11
  require 'iconv' if RUBY_VERSION =~ /1.8/
12
+ require 'timeout'
11
13
 
12
14
  __DIR__ = File.dirname(__FILE__)
13
15
 
@@ -21,8 +23,11 @@ require 'nugget/cli'
21
23
  require 'nugget/service'
22
24
  require 'nugget/web'
23
25
  require 'nugget/backstop'
26
+ require 'nugget/statsd'
24
27
  require 'nugget/version'
25
28
 
29
+ TIMEOUT = 180
30
+
26
31
  module Nugget
27
32
  class << self
28
33
 
@@ -10,6 +10,8 @@ module Nugget
10
10
 
11
11
  if result == "FAIL"
12
12
  backstop_requst("#{name}.result", 1)
13
+ else
14
+ backstop_requst("#{name}.result", 0)
13
15
  end
14
16
 
15
17
  end
@@ -51,4 +53,4 @@ module Nugget
51
53
  end
52
54
 
53
55
  end
54
- end
56
+ end
@@ -55,10 +55,25 @@ module Nugget
55
55
  :long => "--backstop URL",
56
56
  :description => "URL for backstop metrics thing."
57
57
 
58
+ option :statsd_namespace,
59
+ :short => "-s NAMESPACE",
60
+ :long => "--statsdnamespace NAMESPACE",
61
+ :description => "statsd namespace."
62
+
63
+ option :statsd_host,
64
+ :short => "-h HOST",
65
+ :long => "--statsdhost HOST",
66
+ :description => "statsd host."
67
+
68
+ option :statsd_port,
69
+ :short => "-a PORT",
70
+ :long => "--statsdport PORT",
71
+ :description => "statsd port."
72
+
58
73
  option :resultsfile,
59
74
  :short => "-r FILE",
60
75
  :long => "--results FILE",
61
- :default => "/tmp/nugget_results.json",
76
+ :default => false,
62
77
  :description => "Path to where results file is written/read."
63
78
 
64
79
  option :help,
@@ -5,9 +5,11 @@ module Nugget
5
5
  Nugget::Log.info("Starting up Nugget in daemon mode ...")
6
6
 
7
7
  loop do
8
+ Nugget::Log.debug("Running tests ...")
8
9
  run(test_name)
9
10
 
10
11
  # chill
12
+ Nugget::Log.debug("Sleeping for #{Nugget::Config.interval.to_i} ...")
11
13
  sleep(Nugget::Config.interval.to_i)
12
14
  end
13
15
  end
@@ -23,6 +25,7 @@ module Nugget
23
25
  config = parser.parse(config_file)
24
26
 
25
27
  results = Hash.new
28
+ threadlist = Array.new
26
29
 
27
30
  if test_name
28
31
  if definition = config[test_name.to_s.to_sym]
@@ -32,13 +35,15 @@ module Nugget
32
35
  end
33
36
  else
34
37
  config.each do |test, definition|
35
- run_test(results, test, definition)
38
+ threadlist << Thread.new { run_test(results, test, definition) }
36
39
  end
37
40
  end
38
41
 
39
- if Nugget::Config.daemon
40
- Nugget::Service.write_results(results)
41
- end
42
+ threadlist.each { |x|
43
+ x.join
44
+ }
45
+
46
+ Nugget::Service.write_results(results)
42
47
  end
43
48
 
44
49
  def self.run_test(results, test, definition)
@@ -49,8 +54,17 @@ module Nugget
49
54
  request_definition = config_converter(definition)
50
55
  response_definition = definition[:response]
51
56
 
52
- response = Turd.run(request_definition, response_definition)
57
+ status = Timeout::timeout(TIMEOUT) {
58
+ Nugget::Log.debug("Asserting turd definitions ...")
59
+ response = Turd.run(request_definition, response_definition)
60
+ }
53
61
  result = "PASS"
62
+ rescue Timeout::Error => e
63
+ Nugget::Log.error("#{definition[:type]} test #{test} took too long to run (#{TIMEOUT}s)!")
64
+ Nugget::Log.error(e)
65
+
66
+ result = "FAIL"
67
+ response = "timeout"
54
68
  rescue Exception => e
55
69
  Nugget::Log.error("#{definition[:type]} test #{test} failed due to #{e.response[:failed]}!")
56
70
  Nugget::Log.error(e)
@@ -68,9 +82,7 @@ module Nugget
68
82
  :timestamp => Time.now.to_i
69
83
  })
70
84
 
71
- if Nugget::Config.backstop_url
72
- Nugget::Backstop.send_metrics(test, result, response)
73
- end
85
+ send_metrics(test, result, response)
74
86
  end
75
87
 
76
88
  def self.config_converter(definition)
@@ -95,14 +107,27 @@ module Nugget
95
107
 
96
108
  def self.write_results(results)
97
109
  begin
98
- file = File.open(Nugget::Config.resultsfile, "w")
99
- file.puts(results.to_json)
100
- file.close
110
+ if Nugget::Config.resultsfile
111
+ Nugget::Log.debug("Writing results to #{Nugget::Config.resultsfile} ...")
112
+ file = File.open(Nugget::Config.resultsfile, "w")
113
+ file.puts(results.to_json)
114
+ file.close
115
+ end
101
116
  rescue Exception => e
102
117
  Nugget::Log.error("Something went wrong with writing out the results file!")
103
118
  Nugget::Log.error(e)
104
119
  end
105
120
  end
106
121
 
122
+ def self.send_metrics(test, result, response)
123
+ if Nugget::Config.backstop_url
124
+ Nugget::Backstop.send_metrics(test, result, response)
125
+ end
126
+
127
+ if Nugget::Config.statsd_host
128
+ Nugget::NStatsd.send_metrics(test, result, response)
129
+ end
130
+ end
131
+
107
132
  end
108
133
  end
@@ -0,0 +1,40 @@
1
+ module Nugget
2
+ class NStatsd # NStatsd since Statsd collides
3
+
4
+ def self.stats
5
+ @stats ||= Statsd.new(Nugget::Config.statsd_host, Nugget::Config.statsd_port).tap do |statsd|
6
+ statsd.namespace = Nugget::Config.statsd_namespace
7
+ end
8
+ end
9
+
10
+ def self.send_metrics(name, result, response)
11
+ statsd = Nugget::NStatsd.stats
12
+ send_test_result(statsd, name, result)
13
+ send_test_timings(statsd, name, response)
14
+ end
15
+
16
+ def self.send_test_result(statsd, name, result)
17
+
18
+ if result == "FAIL"
19
+ statsd.gauge("#{name}.failures.count", 1)
20
+ Nugget::Log.debug("Sending the following to statsd: #{name}_failure_count: 1")
21
+ else
22
+ statsd.gauge("#{name}.failures.count", 0)
23
+ Nugget::Log.debug("Sending the following to statsd: #{name}_failure_count: 0")
24
+ end
25
+
26
+ end
27
+
28
+ def self.send_test_timings(statsd, name, response)
29
+
30
+ response.each do |key, value|
31
+ if key.to_s.include?("_time")
32
+ Nugget::Log.debug("Sending the following to statsd: #{key}: #{value}")
33
+ statsd.timing("#{name}.#{key}", value)
34
+ end
35
+ end
36
+
37
+ end
38
+
39
+ end
40
+ end
@@ -1,3 +1,3 @@
1
1
  module Nugget
2
- VERSION = "0.0.10"
2
+ VERSION = "0.0.11"
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: nugget
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.10
4
+ version: 0.0.11
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2014-05-06 00:00:00.000000000 Z
12
+ date: 2014-10-28 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: mixlib-config
@@ -107,6 +107,22 @@ dependencies:
107
107
  - - ! '>='
108
108
  - !ruby/object:Gem::Version
109
109
  version: '0'
110
+ - !ruby/object:Gem::Dependency
111
+ name: statsd-ruby
112
+ requirement: !ruby/object:Gem::Requirement
113
+ none: false
114
+ requirements:
115
+ - - ! '>='
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :runtime
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ none: false
122
+ requirements:
123
+ - - ! '>='
124
+ - !ruby/object:Gem::Version
125
+ version: '0'
110
126
  - !ruby/object:Gem::Dependency
111
127
  name: bundler
112
128
  requirement: !ruby/object:Gem::Requirement
@@ -155,6 +171,7 @@ files:
155
171
  - lib/nugget/config.rb
156
172
  - lib/nugget/log.rb
157
173
  - lib/nugget/service.rb
174
+ - lib/nugget/statsd.rb
158
175
  - lib/nugget/version.rb
159
176
  - lib/nugget/web.rb
160
177
  - lib/nugget.rb