chef-handler-splunkstorm 1.0.0 → 1.1.0

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.
@@ -0,0 +1,118 @@
1
+ #!/usr/bin/env ruby
2
+ # Chef Exception & Reporting Handler for Splunk Storm.
3
+ #
4
+ # Author:: Greg Albrecht <mailto:gba@splunk.com>
5
+ # Copyright:: Copyright 2012 Splunk, Inc.
6
+ # License:: Apache License 2.0.
7
+ #
8
+
9
+
10
+ require 'rubygems'
11
+ require 'chef/handler'
12
+ require 'json'
13
+ require 'rest-client'
14
+
15
+
16
+ class Chef
17
+ class Handler
18
+
19
+ # Chef Exception & Reporting Handler for Splunk Storm.
20
+ #
21
+ # Extracts several keys from the run_status Hash, converts them to JSON, and
22
+ # POSTs them to Splunk Storm as an event for later searching & reporting.
23
+ #
24
+ # = Usage
25
+ # 1. Create a Splunk Storm account: https://www.splunkstorm.com
26
+ # 2. Retrieve your Access Token & Project ID: http://docs.splunk.com/Documentation/Storm/latest/User/UseStormsRESTAPI
27
+ # 3. Add the chef_handler Cookbook to your Run List.
28
+ # 4. Add a chef_handler Resource to one of your existing Recipes.
29
+ #
30
+ # = Example
31
+ # Here's an example +chef_handler+ Resource given you've retrieved your
32
+ # Access Token as *ACCESS_TOKEN* and Project ID as *PROJECT_ID*:
33
+ #
34
+ # include_recipe 'chef_handler'
35
+ #
36
+ # gem_package('chef-handler-splunkstorm'){action :nothing}.run_action(:install)
37
+ #
38
+ # chef_handler 'Chef::Handler::SplunkStorm' do
39
+ # action :enable
40
+ # arguments ['ACCESS_TOKEN', 'PROJECT_ID']
41
+ # source File.join(Gem.all_load_paths.grep(/chef-handler-splunkstorm/).first,
42
+ # 'chef', 'handler', 'splunkstorm.rb')
43
+ # end
44
+ #
45
+ # = Requirements
46
+ # * +json+ Gem: http://flori.github.com/json/
47
+ # * +rest-client+ Gem: https://github.com/archiloque/rest-client
48
+ #
49
+ # = Links
50
+ # * Internal Splunk JIRA: http://jira.splunk.com/browse/STORM-3796
51
+ # * Opscode JIRA: http://tickets.opscode.com/browse/COOK-1208
52
+ #
53
+ class SplunkStorm < Chef::Handler
54
+ SPLUNKSTORM_URL = 'https://api.splunkstorm.com'
55
+ API_ENDPOINT = '/1/inputs/http'
56
+
57
+ # * *Args*:
58
+ # - +access_token+ -> A Splunk Storm Access Token.
59
+ # - +project_id+ -> A Splunk Storm Project ID.
60
+ #
61
+ def initialize(access_token, project_id)
62
+ @access_token = access_token
63
+ @project_id = project_id
64
+ end
65
+
66
+ # Reports Chef's +run_status+ metrics and results to Splunk Storm.
67
+ def report_metrics
68
+ event_metadata = {
69
+ :sourcetype => 'generic_single_line',
70
+ :host => node.hostname,
71
+ :project => @project_id}
72
+
73
+ # We're creating a new Hash b/c 'node' and 'all_resources' in run_status
74
+ # are just TOO large.
75
+ status_event = {
76
+ :failed => run_status.failed?,
77
+ :start_time => run_status.start_time,
78
+ :end_time => run_status.end_time,
79
+ :elapsed_time => run_status.elapsed_time,
80
+ :exception => run_status.formatted_exception}
81
+
82
+ api_params = event_metadata.collect{ |k,v| [k, v].join('=') }.join('&')
83
+ url_params = URI.escape(api_params)
84
+ endpoint_path = [API_ENDPOINT, url_params].join('?')
85
+
86
+ request = RestClient::Resource.new(
87
+ SPLUNKSTORM_URL, :user => @access_token, :password => 'x')
88
+
89
+ request[endpoint_path].post(status_event.to_json)
90
+ end
91
+
92
+ # Reports Chef's +run_status+ exception and backtrace to Splunk Storm.
93
+ def report_exception
94
+ event_metadata = {
95
+ :sourcetype => 'storm_multi_line',
96
+ :host => node.hostname,
97
+ :project => @project_id}
98
+
99
+ api_params = event_metadata.collect{ |k,v| [k, v].join('=') }.join('&')
100
+ url_params = URI.escape(api_params)
101
+ endpoint_path = [API_ENDPOINT, url_params].join('?')
102
+
103
+ request = RestClient::Resource.new(
104
+ SPLUNKSTORM_URL, :user => @access_token, :password => 'x')
105
+
106
+ request[endpoint_path].post(Array(run_status.backtrace).join("\n"))
107
+ end
108
+
109
+ # Proxies calls for +report_metrics+ and, on failure, +report_exception+.
110
+ def report
111
+ report_metrics
112
+ if run_status.failed?
113
+ report_exception
114
+ end
115
+ end
116
+ end
117
+ end
118
+ end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: chef-handler-splunkstorm
3
3
  version: !ruby/object:Gem::Version
4
- hash: 23
4
+ hash: 19
5
5
  prerelease:
6
6
  segments:
7
7
  - 1
8
+ - 1
8
9
  - 0
9
- - 0
10
- version: 1.0.0
10
+ version: 1.1.0
11
11
  platform: ruby
12
12
  authors:
13
13
  - Greg Albrecht
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2012-05-09 00:00:00 Z
18
+ date: 2012-05-11 00:00:00 Z
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
21
21
  name: json
@@ -56,8 +56,8 @@ extra_rdoc_files: []
56
56
  files:
57
57
  - LICENSE
58
58
  - README.md
59
- - lib/chef/handler/splunkstorm_handler.rb
60
- homepage: http://github.com/ampledata/chef-handler-splunkstorm
59
+ - lib/chef/handler/splunkstorm.rb
60
+ homepage: http://ampledata.org/splunk_storm_chef_handler.html
61
61
  licenses: []
62
62
 
63
63
  post_install_message:
@@ -1,111 +0,0 @@
1
- #!/usr/bin/env ruby
2
- # Chef Exception & Reporting Handler for Splunk Storm.
3
- #
4
- # Author:: Greg Albrecht <mailto:gba@splunk.com>
5
- # Copyright:: Copyright 2012 Splunk, Inc.
6
- # License:: Apache License 2.0.
7
- #
8
-
9
-
10
- require 'rubygems'
11
- require 'json'
12
- require 'rest-client'
13
-
14
-
15
- # Chef Exception & Reporting Handler for Splunk Storm.
16
- #
17
- # Extracts several keys from the run_status Hash, converts them to JSON, and
18
- # POSTs them to Splunk Storm as an event for later searching & reporting.
19
- #
20
- # = Usage
21
- # 1. Create a Splunk Storm account: https://www.splunkstorm.com
22
- # 2. Retrieve your Access Token & Project ID: http://docs.splunk.com/Documentation/Storm/latest/User/UseStormsRESTAPI
23
- # 3. Add the chef_handler Cookbook to your Run List.
24
- # 4. Add a chef_handler Resource to one of your existing Recipes.
25
- #
26
- # = Example
27
- # Here's an example +chef_handler+ Resource given you've retrieved your
28
- # Access Token as *ACCESS_TOKEN* and Project ID as *PROJECT_ID*:
29
- #
30
- # include_recipe 'chef_handler'
31
- #
32
- # gem_package 'chef-handler-splunkstorm'
33
- #
34
- # chef_handler 'SplunkStormHandler' do
35
- # action :enable
36
- # arguments ['ACCESS_TOKEN', 'PROJECT_ID']
37
- # source 'chef/handler/splunkstorm_handler'
38
- # end
39
- #
40
- # = Requirements
41
- # * +json+ Gem: http://flori.github.com/json/
42
- # * +rest-client+ Gem: https://github.com/archiloque/rest-client
43
- #
44
- # = Links
45
- # * Internal Splunk JIRA: http://jira.splunk.com/browse/STORM-3796
46
- # * Opscode JIRA: http://tickets.opscode.com/browse/COOK-1208
47
- #
48
- class SplunkStormHandler < Chef::Handler
49
- SPLUNKSTORM_URL = 'https://api.splunkstorm.com'
50
- API_ENDPOINT = '/1/inputs/http'
51
-
52
- # * *Args*:
53
- # - +access_token+ -> A Splunk Storm Access Token.
54
- # - +project_id+ -> A Splunk Storm Project ID.
55
- #
56
- def initialize(access_token, project_id)
57
- @access_token = access_token
58
- @project_id = project_id
59
- end
60
-
61
- # Reports Chef's +run_status+ metrics and results to Splunk Storm.
62
- def report_metrics
63
- event_metadata = {
64
- :sourcetype => 'generic_single_line',
65
- :host => node.hostname,
66
- :project => @project_id}
67
-
68
- # We're creating a new Hash b/c 'node' and 'all_resources' in run_status
69
- # are just TOO large.
70
- status_event = {
71
- :failed => run_status.failed?,
72
- :start_time => run_status.start_time,
73
- :end_time => run_status.end_time,
74
- :elapsed_time => run_status.elapsed_time,
75
- :exception => run_status.formatted_exception}
76
-
77
- api_params = event_metadata.collect{ |k,v| [k, v].join('=') }.join('&')
78
- url_params = URI.escape(api_params)
79
- endpoint_path = [API_ENDPOINT, url_params].join('?')
80
-
81
- request = RestClient::Resource.new(
82
- SPLUNKSTORM_URL, :user => @access_token, :password => 'x')
83
-
84
- request[endpoint_path].post(status_event.to_json)
85
- end
86
-
87
- # Reports Chef's +run_status+ exception and backtrace to Splunk Storm.
88
- def report_exception
89
- event_metadata = {
90
- :sourcetype => 'storm_multi_line',
91
- :host => node.hostname,
92
- :project => @project_id}
93
-
94
- api_params = event_metadata.collect{ |k,v| [k, v].join('=') }.join('&')
95
- url_params = URI.escape(api_params)
96
- endpoint_path = [API_ENDPOINT, url_params].join('?')
97
-
98
- request = RestClient::Resource.new(
99
- SPLUNKSTORM_URL, :user => @access_token, :password => 'x')
100
-
101
- request[endpoint_path].post(Array(run_status.backtrace).join("\n"))
102
- end
103
-
104
- # Proxies calls for +report_metrics+ and, on failure, +report_exception+.
105
- def report
106
- report_metrics
107
- if run_status.failed?
108
- report_exception
109
- end
110
- end
111
- end