chef-metrics 0.0.2 → 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
data/README.md CHANGED
@@ -1,14 +1,79 @@
1
- # ChefMetrics
1
+ # Chef Metrics
2
2
 
3
- TODO: Write a gem description
3
+ Chef Metrics is an OpsCode Chef report/exception handler for sending
4
+ Chef metrics to one or more endpoints. Metrics are gathered using
5
+ `run_status` and `node.run_state[:metrics]` (optional). The method of
6
+ metric delivery to the endpoint/s of choice is left up to the
7
+ user. You can't manage what you don't measure.
4
8
 
5
9
  ## Installation
6
10
 
7
- TODO: Write installation instructions here
11
+ gem install chef-metrics
8
12
 
9
13
  ## Usage
10
14
 
11
- TODO: Write usage instructions here
15
+ Append the following to your Chef client configs, usually at `/etc/chef/client.rb`
16
+
17
+ require "chef-metrics"
18
+
19
+ metric_handler = ChefMetrics.new do
20
+ # see examples below
21
+ end
22
+
23
+ report_handlers << metric_handler
24
+ exception_handlers << metric_handler
25
+
26
+ Alternatively, you can use the LWRP (available @
27
+ http://community.opscode.com/cookbooks/chef_handler)
28
+
29
+ ## Examples
30
+
31
+ The following examples are "action" blocks:
32
+
33
+ metric_handler = ChefMetrics.new do
34
+ # action block
35
+ end
36
+
37
+ Note: I recommend adding logging, timeouts, and error handling to the following.
38
+
39
+ ### Graphite
40
+
41
+ require 'socket'
42
+
43
+ socket = TCPSocket.new(GRAPHITE_HOST, GRAPHITE_PORT)
44
+ socket.write(graphite_formatted)
45
+ socket.close
46
+
47
+ ### Sensu
48
+
49
+ require 'socket'
50
+
51
+ sensu_result = {
52
+ :name => "chef_report",
53
+ :type => "metric",
54
+ :handler => "metrics",
55
+ :output => graphite_formatted
56
+ }
57
+
58
+ socket = TCPSocket.open('127.0.0.1', 3030)
59
+ socket.write(sensu_result.to_json)
60
+ socket.close
61
+
62
+ ### More
63
+
64
+ puts metrics
65
+ # {:updated_resources=>12, :all_resources=>236, :elapsed_time=>22, :success=>1, :fail=>0}
66
+
67
+ puts graphite_formatted
68
+ # chef.i-424242.updated_resources 12
69
+ # chef.i-424242.all_resources 236
70
+ # ...
71
+
72
+ self.metric_scheme = "#{node.environment}.chef.#{node.name.gsub(".", "_")}"
73
+ puts graphite_formatted
74
+ # production.chef.i-424242.updated_resources 12
75
+ # production.chef.i-424242.all_resources 236
76
+ # ...
12
77
 
13
78
  ## Contributing
14
79
 
@@ -10,5 +10,5 @@ Gem::Specification.new do |gem|
10
10
  gem.files = `git ls-files`.split($\)
11
11
  gem.name = "chef-metrics"
12
12
  gem.require_paths = ["lib"]
13
- gem.version = "0.0.2"
13
+ gem.version = "0.0.3"
14
14
  end
@@ -2,15 +2,22 @@ require "rubygems"
2
2
  require "chef/handler"
3
3
 
4
4
  class ChefMetrics < Chef::Handler
5
- attr_accessor :metric_scheme, :measure_time, :metrics, :action
5
+ attr_accessor :metric_scheme, :measure_time, :metrics, :use_run_state, :action
6
6
 
7
7
  def initialize(&action)
8
8
  @metric_scheme = "chef.#{Chef::Config.node_name}"
9
9
  @measure_time = Time.now.to_i
10
10
  @metrics = Hash.new
11
+ @use_run_state = true
11
12
  @action = action
12
13
  end
13
14
 
15
+ def run_state_metrics!
16
+ if node.has_key?(:run_state) && node.run_state[:metrics].is_a?(Hash)
17
+ @metrics.merge!(node.run_state[:metrics])
18
+ end
19
+ end
20
+
14
21
  def graphite_formatted
15
22
  @metrics.inject("") do |result, (metric, value)|
16
23
  result << "#{@metric_scheme}.#{metric} #{value} #{@measure_time}\n"
@@ -30,6 +37,9 @@ class ChefMetrics < Chef::Handler
30
37
  @metrics[:success] = 0
31
38
  @metrics[:fail] = 1
32
39
  end
40
+ if @use_run_state
41
+ run_state_metrics!
42
+ end
33
43
  if @action
34
44
  self.instance_eval(&@action)
35
45
  else
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: chef-metrics
3
3
  version: !ruby/object:Gem::Version
4
- hash: 27
4
+ hash: 25
5
5
  prerelease: false
6
6
  segments:
7
7
  - 0
8
8
  - 0
9
- - 2
10
- version: 0.0.2
9
+ - 3
10
+ version: 0.0.3
11
11
  platform: ruby
12
12
  authors:
13
13
  - Sean Porter