nugget 0.0.10 → 0.0.11

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