chef-handler-datadog 0.6.0 → 0.7.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.
- checksums.yaml +5 -13
- data/.rubocop.yml +19 -17
- data/.travis.yml +16 -11
- data/Appraisals +9 -20
- data/CHANGELOG.md +13 -0
- data/README.md +12 -0
- data/Rakefile +1 -2
- data/chef-handler-datadog.gemspec +6 -6
- data/gemfiles/{chef_10.26.0.gemfile → chef_10.14.4.gemfile} +2 -2
- data/gemfiles/{chef_11.14.2.gemfile → chef_10.gemfile} +1 -1
- data/gemfiles/{chef_11.16.0.gemfile → chef_11.gemfile} +1 -1
- data/gemfiles/{chef_11.10.4.gemfile → chef_12.gemfile} +1 -1
- data/lib/chef/handler/datadog.rb +72 -218
- data/lib/chef/handler/datadog_chef_events.rb +174 -0
- data/lib/chef/handler/datadog_chef_metrics.rb +53 -0
- data/lib/chef/handler/datadog_chef_tags.rb +111 -0
- data/lib/chef_handler_datadog.rb +1 -1
- data/spec/datadog_spec.rb +29 -13
- data/spec/support/cassettes/Chef_Handler_Datadog/{handles_tags_correctly → tags/when_specified}/sets_the_role_and_env_and_tags.yml +62 -38
- data/spec/support/cassettes/Chef_Handler_Datadog/tags/when_unspecified/sets_role_env_and_nothing_else.yml +204 -0
- metadata +54 -53
- data/gemfiles/chef_10.32.2.gemfile +0 -17
- data/gemfiles/chef_11.12.8.gemfile +0 -16
- data/gemfiles/chef_11.8.2.gemfile +0 -16
- data/gemfiles/chef_12.0.0.alpha.1.gemfile +0 -16
checksums.yaml
CHANGED
@@ -1,15 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
|
5
|
-
data.tar.gz: !binary |-
|
6
|
-
MjlhNGU4MjZjYTZiZTFlMDEyMmFmOThlMjcyZjcyZTNhODAzOWM5NQ==
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 345202254b0a6790a4ee591adfeceb1b6fe4987b
|
4
|
+
data.tar.gz: 95b4da8f05b6179952e61a984ad683e83c11eae0
|
7
5
|
SHA512:
|
8
|
-
metadata.gz:
|
9
|
-
|
10
|
-
MWY0NDg2YjZlYmVlYTVmZjEyODI1MWNhOGI0NDM3MzNmNGFiNzNmZDA4ZGRj
|
11
|
-
NDA1YThjMjliMzg3MGE2ZDQ2MmM1MDg0OWI0YWQ5MWFkY2YwNTk=
|
12
|
-
data.tar.gz: !binary |-
|
13
|
-
Y2I2MmZhNzY0MWQ0YmEwNGE4ODZlOGY5YzM1NDhhZjczYWFkYjIxOTUxYWY2
|
14
|
-
NmNjODE0NmVjNDkxOGU1NDk4NjBmMjY3NmM1OTdlOTdlZGY0ZWMxY2U4NGJm
|
15
|
-
NTFlYTllY2I3M2E3M2I4ZDI0MzA4YzhjYTJhNjc3ZmQ2Y2Q0ODE=
|
6
|
+
metadata.gz: 672bc2ade623d4afda862b27b66d7301ea05ce1efe0404811bd9c99a36ce69c900e9cdd233165317c946f9891c23d313328c7effd8bb95185236b3043368ea00
|
7
|
+
data.tar.gz: 1565a34fa7063abe4db33ee64b724c1a7189b2d8a5478bdb46e18d00ebf8ad07497f6862f772e3b97bb2859bae4f4ccd2847b36093565263c47f22456b69321f
|
data/.rubocop.yml
CHANGED
@@ -1,42 +1,44 @@
|
|
1
1
|
AllCops:
|
2
2
|
Include:
|
3
3
|
- chef-handler-datadog.gemspec
|
4
|
-
- Appraisals
|
5
|
-
- Gemfile
|
6
|
-
- Rakefile
|
4
|
+
- '**/Appraisals'
|
5
|
+
- '**/Gemfile'
|
6
|
+
- '**/Rakefile'
|
7
7
|
Exclude:
|
8
|
-
- spec/*.rb
|
9
|
-
|
10
|
-
# We want to continue to support Ruby 1.8.x for now
|
11
|
-
HashSyntax:
|
12
|
-
EnforcedStyle: hash_rockets
|
8
|
+
- 'spec/*.rb'
|
9
|
+
- '*/vendor/**/*'
|
13
10
|
|
14
11
|
# 80 characters is a nice goal, but not worth currently changing in existing
|
15
12
|
# code for the sake of changing it to conform to a length set in 1928 (IBM).
|
16
|
-
LineLength:
|
13
|
+
Metrics/LineLength:
|
17
14
|
Max: 150
|
18
15
|
|
19
16
|
#####
|
20
17
|
# These exceptions are good goals to attain, and probably will over time,
|
21
18
|
# so periodic disabling and re-running to inspect values is suggested.
|
22
19
|
|
20
|
+
# TODO: main method `report` does a lot of work, which drives this number up.
|
21
|
+
Metrics/AbcSize:
|
22
|
+
Max: 38
|
23
|
+
|
23
24
|
# TODO: Main class is currently over 100 lines of code, making comprehending
|
24
25
|
# it harder. With refactors and simplifications, we can bring this down,
|
25
26
|
# but for now, let's not make it too much worse.
|
26
|
-
ClassLength:
|
27
|
-
Max:
|
27
|
+
Metrics/ClassLength:
|
28
|
+
Max: 158
|
28
29
|
|
29
|
-
# TODO: this is currently down to
|
30
|
+
# TODO: this is currently down to 7 from 22, and should be a constant
|
30
31
|
# goal to reduce method complexity. The accepted goal is 6.
|
31
|
-
|
32
|
-
|
32
|
+
# Method `select_hostname`
|
33
|
+
Metrics/CyclomaticComplexity:
|
34
|
+
Max: 7
|
33
35
|
|
34
36
|
# TODO: The main method `report` is now down from 85 lines. As refactors
|
35
37
|
# continue, this should drop. However, the goal of 10 lines in a method may
|
36
38
|
# be a little lofty.
|
37
|
-
MethodLength:
|
38
|
-
Max:
|
39
|
+
Metrics/MethodLength:
|
40
|
+
Max: 36
|
39
41
|
|
40
42
|
# TODO: select_hostname, report are both higher than the default of 7
|
41
|
-
PerceivedComplexity:
|
43
|
+
Metrics/PerceivedComplexity:
|
42
44
|
Max: 9
|
data/.travis.yml
CHANGED
@@ -1,20 +1,25 @@
|
|
1
1
|
language: ruby
|
2
|
+
cache: bundler
|
3
|
+
sudo: false
|
4
|
+
|
2
5
|
rvm:
|
3
6
|
- 1.9.3
|
4
|
-
- 2.1.
|
7
|
+
- 2.1.5
|
8
|
+
|
5
9
|
bundler_args: --without=localdev
|
10
|
+
|
6
11
|
gemfile:
|
7
|
-
- gemfiles/chef_10.
|
8
|
-
- gemfiles/chef_10.
|
9
|
-
- gemfiles/chef_11.
|
10
|
-
- gemfiles/
|
11
|
-
|
12
|
-
- gemfiles/chef_11.14.2.gemfile
|
13
|
-
- gemfiles/chef_11.16.0.gemfile
|
14
|
-
- gemfiles/chef_12.0.0.alpha.1.gemfile
|
12
|
+
- gemfiles/chef_10.14.4.gemfile
|
13
|
+
- gemfiles/chef_10.gemfile
|
14
|
+
- gemfiles/chef_11.gemfile
|
15
|
+
- gemfiles/chef_12.gemfile
|
16
|
+
|
15
17
|
env:
|
16
18
|
- API_KEY=somefakeapikey APPLICATION_KEY=somefakeapplicationkey
|
19
|
+
|
17
20
|
matrix:
|
21
|
+
exclude:
|
22
|
+
# Chef 12.x with Ohai 8.2.x doesn't work on Chef 1.9.3
|
23
|
+
- rvm: 1.9.3
|
24
|
+
gemfile: gemfiles/chef_12.gemfile
|
18
25
|
allow_failures:
|
19
|
-
- rvm: 2.1.2
|
20
|
-
- gemfile: gemfiles/chef_12.0.0.alpha.1.gemfile
|
data/Appraisals
CHANGED
@@ -1,27 +1,16 @@
|
|
1
1
|
# encoding: utf-8
|
2
2
|
|
3
|
-
#
|
4
|
-
%w(
|
5
|
-
11.8.2
|
6
|
-
11.10.4
|
7
|
-
11.12.8
|
8
|
-
11.14.2
|
9
|
-
11.16.0
|
10
|
-
12.0.0.alpha.1
|
11
|
-
).each do |tv|
|
3
|
+
# Latest release of mainline Chef versions here.
|
4
|
+
%w(10 11 12).each do |tv|
|
12
5
|
appraise "chef-#{tv}" do
|
13
|
-
gem 'chef', tv
|
6
|
+
gem 'chef', "~> #{tv}.0"
|
14
7
|
end
|
15
8
|
end
|
16
9
|
|
17
|
-
#
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
appraise "chef-#{tv}" do
|
24
|
-
gem 'chef', tv
|
25
|
-
gem 'json', '1.7.7'
|
26
|
-
end
|
10
|
+
# Describe any specific Chef versions here.
|
11
|
+
appraise 'chef-10.14.4' do
|
12
|
+
gem 'chef', '10.14.4'
|
13
|
+
# Old versions of Chef didn't pin the max version of Ohai they supported.
|
14
|
+
# See: http://git.io/vecAn
|
15
|
+
gem 'ohai', '< 8.0'
|
27
16
|
end
|
data/CHANGELOG.md
CHANGED
@@ -1,6 +1,13 @@
|
|
1
1
|
Changes
|
2
2
|
=======
|
3
3
|
|
4
|
+
# 0.7.0 / 2015-10-22
|
5
|
+
|
6
|
+
* [FEATURE] Support passing `DATADOG_PROXY` env var to control `dogapi` behavior, [#65][] [@datwiz][]
|
7
|
+
* [OPTIMIZE] Only map `tags` if non-nil, [#66][] [@owen][]
|
8
|
+
* [MISC] Style updates, [#60][] [@miketheman][]
|
9
|
+
* [MISC] Update test matrix to handle latest released major versions, [#59][] [@miketheman][]
|
10
|
+
|
4
11
|
# 0.6.0 / 2014-09-17
|
5
12
|
|
6
13
|
* [FEATURE] Submit Chef-related tags to Datadog for Events, [#52][] [@miketheman][]
|
@@ -62,7 +69,13 @@ And all other versions were prior to this. See git history for more.
|
|
62
69
|
[#50]: https://github.com/DataDog/chef-handler-datadog/issues/50
|
63
70
|
[#51]: https://github.com/DataDog/chef-handler-datadog/issues/51
|
64
71
|
[#52]: https://github.com/DataDog/chef-handler-datadog/issues/52
|
72
|
+
[#59]: https://github.com/DataDog/chef-handler-datadog/issues/59
|
73
|
+
[#60]: https://github.com/DataDog/chef-handler-datadog/issues/60
|
74
|
+
[#65]: https://github.com/DataDog/chef-handler-datadog/issues/65
|
75
|
+
[#66]: https://github.com/DataDog/chef-handler-datadog/issues/66
|
65
76
|
[@alq]: https://github.com/alq
|
77
|
+
[@datwiz]: https://github.com/datwiz
|
66
78
|
[@dwradcliffe]: https://github.com/dwradcliffe
|
67
79
|
[@miketheman]: https://github.com/miketheman
|
80
|
+
[@owen]: https://github.com/owen
|
68
81
|
[@remh]: https://github.com/remh
|
data/README.md
CHANGED
@@ -15,6 +15,18 @@ This can be installed by using the `dd-handler` recipe from the [datadog cookboo
|
|
15
15
|
run_list 'foo::bar', 'datadog::dd-handler'
|
16
16
|
```
|
17
17
|
|
18
|
+
### Windows support
|
19
|
+
|
20
|
+
The chef handler does work on Microsoft Windows however limitations with SSL + Ruby on Windows require extra setup. One solution is to set the `SSL_CERT_FILE` environmental variable to the one that chef uses on the machine to fix this issue. Here is how [chef](https://github.com/chef/omnibus-chef/blob/master/files/openssl-customization/windows/ssl_env_hack.rb) fixes the issue.
|
21
|
+
|
22
|
+
```ruby
|
23
|
+
# Setup the certs for ruby in windows
|
24
|
+
env 'SSL_CERT_FILE' do
|
25
|
+
action :create
|
26
|
+
value "C:\\opscode\\chef\\embedded\\ssl\\certs\\cacert.pem"
|
27
|
+
end
|
28
|
+
```
|
29
|
+
|
18
30
|
The Datadog Docs on [Chef](http://docs.datadoghq.com/guides/chef/#deployhandler) has detailed instructions.
|
19
31
|
|
20
32
|
## Contributing to chef-handler-datadog
|
data/Rakefile
CHANGED
@@ -3,12 +3,11 @@
|
|
3
3
|
require 'rubygems'
|
4
4
|
require 'bundler/gem_tasks'
|
5
5
|
|
6
|
-
require 'appraisal'
|
7
6
|
require 'rake/clean'
|
8
7
|
require 'rspec/core/rake_task'
|
9
8
|
require 'rubocop/rake_task'
|
10
9
|
|
11
|
-
task :
|
10
|
+
task default: [:cops, :spec]
|
12
11
|
|
13
12
|
CLEAN.include(['coverage/', 'doc/', 'pkg/'])
|
14
13
|
|
@@ -9,20 +9,20 @@ Gem::Specification.new do |gem|
|
|
9
9
|
gem.version = ChefHandlerDatadog::VERSION
|
10
10
|
|
11
11
|
gem.files = `git ls-files`.split($\) # rubocop:disable SpecialGlobalVars
|
12
|
-
gem.executables = gem.files.grep(
|
13
|
-
gem.test_files = gem.files.grep(
|
12
|
+
gem.executables = gem.files.grep(%r{^bin\/}).map { |f| File.basename(f) }
|
13
|
+
gem.test_files = gem.files.grep(%r{^(test|spec|features)\/})
|
14
14
|
gem.require_paths = ['lib']
|
15
15
|
gem.extra_rdoc_files = ['README.md', 'LICENSE.txt']
|
16
16
|
|
17
17
|
gem.add_dependency 'dogapi', '>= 1.6'
|
18
18
|
|
19
|
-
gem.add_development_dependency 'appraisal', '~>
|
19
|
+
gem.add_development_dependency 'appraisal', '~> 2.0.1'
|
20
20
|
gem.add_development_dependency 'bundler'
|
21
|
-
gem.add_development_dependency 'chef', '>= 10', '<=
|
21
|
+
gem.add_development_dependency 'chef', '>= 10.14.4', '<= 13'
|
22
22
|
gem.add_development_dependency 'dotenv'
|
23
23
|
gem.add_development_dependency 'rake'
|
24
|
-
gem.add_development_dependency 'rspec', '~> 3.
|
25
|
-
gem.add_development_dependency 'rubocop', '~> 0.
|
24
|
+
gem.add_development_dependency 'rspec', '~> 3.2.0'
|
25
|
+
gem.add_development_dependency 'rubocop', '~> 0.34.2'
|
26
26
|
gem.add_development_dependency 'simplecov'
|
27
27
|
gem.add_development_dependency 'vcr'
|
28
28
|
gem.add_development_dependency 'webmock'
|
data/lib/chef/handler/datadog.rb
CHANGED
@@ -3,6 +3,9 @@ require 'rubygems'
|
|
3
3
|
require 'chef/handler'
|
4
4
|
require 'chef/mash'
|
5
5
|
require 'dogapi'
|
6
|
+
require_relative 'datadog_chef_metrics'
|
7
|
+
require_relative 'datadog_chef_tags'
|
8
|
+
require_relative 'datadog_chef_events'
|
6
9
|
|
7
10
|
class Chef
|
8
11
|
class Handler
|
@@ -20,241 +23,75 @@ class Chef
|
|
20
23
|
end
|
21
24
|
|
22
25
|
def report
|
23
|
-
#
|
24
|
-
|
25
|
-
|
26
|
-
#
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
begin
|
34
|
-
# Collect tags
|
35
|
-
new_host_tags = get_combined_tags(node)
|
36
|
-
|
37
|
-
# Send the Event data
|
38
|
-
emit_event_to_datadog(hostname, event_data, new_host_tags)
|
39
|
-
|
40
|
-
# Update tags
|
41
|
-
if config[:application_key].nil?
|
42
|
-
Chef::Log.warn('You need an application key to let Chef tag your nodes ' \
|
43
|
-
'in Datadog. Visit https://app.datadoghq.com/account/settings#api to ' \
|
44
|
-
'create one and update your datadog attributes in the datadog cookbook.'
|
45
|
-
)
|
46
|
-
fail ArgumentError, 'Missing Datadog Application Key'
|
47
|
-
else
|
48
|
-
|
49
|
-
# Replace all Chef tags with the found Chef tags
|
50
|
-
rc = @dog.update_tags(hostname, new_host_tags, 'chef')
|
51
|
-
begin
|
52
|
-
# See FIXME above about why I feel dirty repeating this code here
|
53
|
-
if rc.length < 2
|
54
|
-
Chef::Log.warn("Unexpected response from Datadog Event API: #{rc}")
|
55
|
-
else
|
56
|
-
if rc[0].to_i / 100 != 2
|
57
|
-
Chef::Log.warn("Could not submit #{new_host_tags} tags for #{hostname} to Datadog: #{rc}")
|
58
|
-
else
|
59
|
-
Chef::Log.debug("Successfully updated #{hostname}'s tags to #{new_host_tags.join(', ')}")
|
60
|
-
end
|
61
|
-
end
|
62
|
-
rescue
|
63
|
-
Chef::Log.warn("Could not determine whether #{hostname}'s tags were successfully submitted to Datadog: #{rc}")
|
64
|
-
end
|
65
|
-
end
|
66
|
-
rescue Errno::ECONNREFUSED, Errno::ETIMEDOUT => e
|
67
|
-
Chef::Log.error("Could not connect to Datadog. Connection error:\n" + e)
|
68
|
-
Chef::Log.error('Data to be submitted was:')
|
69
|
-
Chef::Log.error(event_title)
|
70
|
-
Chef::Log.error(event_body)
|
71
|
-
Chef::Log.error('Tags to be set for this run:')
|
72
|
-
Chef::Log.error(new_host_tags)
|
73
|
-
end
|
26
|
+
# use datadog agent proxy settings, if available
|
27
|
+
use_agent_proxy unless ENV['DATADOG_PROXY'].nil?
|
28
|
+
|
29
|
+
# prepare the metrics, event, and tags information to be reported
|
30
|
+
prepare_report_for_datadog
|
31
|
+
# post the report information to the datadog service
|
32
|
+
send_report_to_datadog
|
33
|
+
ensure
|
34
|
+
# restore the env proxy settings before leaving to avoid downstream side-effects
|
35
|
+
restore_env_proxies unless ENV['DATADOG_PROXY'].nil?
|
74
36
|
end
|
75
37
|
|
76
38
|
private
|
77
39
|
|
78
|
-
#
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
alert_type = 'success'
|
106
|
-
event_priority = 'low'
|
107
|
-
event_title = "Chef completed in #{run_time} on #{hostname} "
|
108
|
-
else
|
109
|
-
alert_type = 'error'
|
110
|
-
event_priority = 'normal'
|
111
|
-
event_title = "Chef failed in #{run_time} on #{hostname} "
|
112
|
-
|
113
|
-
if @config[:notify_on_failure]
|
114
|
-
handles = @config[:notify_on_failure]
|
115
|
-
# convert the notification handle array to a string
|
116
|
-
event_body << "\nAlerting: #{handles.join(' ')}\n"
|
117
|
-
end
|
118
|
-
|
119
|
-
event_body << "\n$$$\n#{run_status.formatted_exception}\n$$$\n"
|
120
|
-
event_body << "\n$$$\n#{run_status.backtrace.join("\n")}\n$$$\n"
|
121
|
-
end
|
122
|
-
|
123
|
-
# Return resolved data
|
124
|
-
[alert_type, event_priority, event_title, event_body]
|
125
|
-
end
|
126
|
-
|
127
|
-
# Compose a list of resources updated during a run.
|
128
|
-
# Shorten the list when there is a failure for stacktrace debugging
|
129
|
-
#
|
130
|
-
# @param run_status [Chef::RunStatus] current run status
|
131
|
-
# @return [String] formatted list of resources updated, truncated on failure
|
132
|
-
def updated_resource_list(run_status)
|
133
|
-
# No resources updated? Go away.
|
134
|
-
return '' unless run_status.updated_resources.length.to_i > 0
|
135
|
-
|
136
|
-
if run_status.failed?
|
137
|
-
report_resources = run_status.updated_resources.last(5)
|
138
|
-
else
|
139
|
-
report_resources = run_status.updated_resources
|
140
|
-
end
|
141
|
-
|
142
|
-
event_body = "\n$$$\n"
|
143
|
-
report_resources.each do |r|
|
144
|
-
event_body << "- #{r} (#{r.defined_at})\n"
|
145
|
-
end
|
146
|
-
event_body << "\n$$$\n"
|
147
|
-
end
|
148
|
-
|
149
|
-
# Emit Event to Datadog Event Stream
|
150
|
-
#
|
151
|
-
# @param hostname [String] resolved hostname to attach to Event
|
152
|
-
# @param event_params [Array] all the configurables to build a valid Event
|
153
|
-
# @param tags [Array] Chef env/roles/tags to be set as Datadog tags
|
154
|
-
def emit_event_to_datadog(hostname, event_data, tags)
|
155
|
-
alert_type, event_priority, event_title, event_body = event_data
|
156
|
-
|
157
|
-
evt = @dog.emit_event(Dogapi::Event.new(event_body,
|
158
|
-
:msg_title => event_title,
|
159
|
-
:event_type => 'config_management.run',
|
160
|
-
:event_object => hostname,
|
161
|
-
:alert_type => alert_type,
|
162
|
-
:priority => event_priority,
|
163
|
-
:source_type_name => 'chef',
|
164
|
-
:tags => tags
|
165
|
-
), :host => hostname)
|
166
|
-
|
167
|
-
begin
|
168
|
-
# FIXME: nice-to-have: abstract format of return value away a bit
|
169
|
-
# in dogapi directly. See https://github.com/DataDog/dogapi-rb/issues/18
|
170
|
-
if evt.length < 2
|
171
|
-
Chef::Log.warn("Unexpected response from Datadog Event API: #{evt}")
|
172
|
-
else
|
173
|
-
# [http_response_code, {"event" => {"url" => "...", ...}}]
|
174
|
-
# 2xx means ok
|
175
|
-
if evt[0].to_i / 100 != 2
|
176
|
-
Chef::Log.warn("Could not submit event to Datadog (HTTP call failed): #{evt[0]}")
|
177
|
-
else
|
178
|
-
Chef::Log.debug("Successfully submitted Chef event to Datadog for #{hostname} at #{evt[1]['event']['url']}")
|
179
|
-
end
|
180
|
-
end
|
181
|
-
rescue
|
182
|
-
Chef::Log.warn("Could not determine whether chef run was successfully submitted to Datadog: #{evt}")
|
183
|
-
end
|
40
|
+
# prepare metrics, event, and tags data for posting to datadog
|
41
|
+
def prepare_report_for_datadog
|
42
|
+
# uses class method accessors for run_status and config
|
43
|
+
hostname = resolve_correct_hostname
|
44
|
+
# prepare chef run metrics
|
45
|
+
@metrics =
|
46
|
+
DatadogChefMetrics.new
|
47
|
+
.with_dogapi_client(@dog)
|
48
|
+
.with_hostname(hostname)
|
49
|
+
.with_run_status(run_status)
|
50
|
+
|
51
|
+
# Collect and prepare tags
|
52
|
+
@tags =
|
53
|
+
DatadogChefTags.new
|
54
|
+
.with_dogapi_client(@dog)
|
55
|
+
.with_hostname(hostname)
|
56
|
+
.with_run_status(run_status)
|
57
|
+
.with_application_key(config[:application_key])
|
58
|
+
|
59
|
+
# Build the chef event information
|
60
|
+
@event =
|
61
|
+
DatadogChefEvents.new
|
62
|
+
.with_dogapi_client(@dog)
|
63
|
+
.with_hostname(hostname)
|
64
|
+
.with_run_status(run_status)
|
65
|
+
.with_failure_notifications(@config['notify_on_failure'])
|
66
|
+
.with_tags(@tags.combined_host_tags)
|
184
67
|
end
|
185
68
|
|
186
|
-
#
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
# If there is a failure during compile phase, a large portion of
|
192
|
-
# run_status may be unavailable. Bail out here
|
193
|
-
warn_msg = 'Error during compile phase, no Datadog metrics available.'
|
194
|
-
return Chef::Log.warn(warn_msg) if run_status.elapsed_time.nil?
|
195
|
-
|
196
|
-
@dog.emit_point('chef.resources.total', run_status.all_resources.length, :host => hostname)
|
197
|
-
@dog.emit_point('chef.resources.updated', run_status.updated_resources.length, :host => hostname)
|
198
|
-
@dog.emit_point('chef.resources.elapsed_time', run_status.elapsed_time, :host => hostname)
|
199
|
-
Chef::Log.debug('Submitted Chef metrics back to Datadog')
|
69
|
+
# Submit metrics, event, and tags information to datadog
|
70
|
+
def send_report_to_datadog
|
71
|
+
@metrics.emit_to_datadog
|
72
|
+
@event.emit_to_datadog
|
73
|
+
@tags.send_update_to_datadog
|
200
74
|
rescue Errno::ECONNREFUSED, Errno::ETIMEDOUT => e
|
201
|
-
Chef::Log.error("Could not
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
# them to `key:value` e.g. `role:database-master`.
|
208
|
-
#
|
209
|
-
# @param node [Chef::Node]
|
210
|
-
# @return [Array] current Chef env, roles, tags
|
211
|
-
def get_combined_tags(node)
|
212
|
-
chef_env = get_node_env(node).split # converts a string into an array
|
213
|
-
|
214
|
-
chef_roles = get_node_roles(node)
|
215
|
-
chef_tags = get_node_tags(node)
|
216
|
-
|
217
|
-
# Combine (union) all arrays. Removes duplicates if found.
|
218
|
-
chef_env | chef_roles | chef_tags
|
219
|
-
end
|
220
|
-
|
221
|
-
def get_node_roles(node)
|
222
|
-
node.run_list.roles.map! { |role| 'role:' + role }
|
223
|
-
end
|
224
|
-
|
225
|
-
def get_node_env(node)
|
226
|
-
'env:' + node.chef_environment if node.respond_to?('chef_environment')
|
227
|
-
end
|
228
|
-
|
229
|
-
def get_node_tags(node)
|
230
|
-
node.tags.map! { |tag| 'tag:' + tag }
|
231
|
-
end
|
232
|
-
|
233
|
-
def pluralize(number, noun)
|
234
|
-
case number
|
235
|
-
when 0..1
|
236
|
-
"less than 1 #{noun}"
|
237
|
-
else
|
238
|
-
"#{number.round} #{noun}s"
|
239
|
-
end
|
240
|
-
rescue
|
241
|
-
Chef::Log.warn("Cannot make #{number} more legible")
|
242
|
-
"#{number} #{noun}s"
|
75
|
+
Chef::Log.error("Could not connect to Datadog. Connection error:\n" + e)
|
76
|
+
Chef::Log.error('Data to be submitted was:')
|
77
|
+
Chef::Log.error(@event.event_title)
|
78
|
+
Chef::Log.error(@event.event_body)
|
79
|
+
Chef::Log.error('Tags to be set for this run:')
|
80
|
+
Chef::Log.error(@tags.combined_host_tags)
|
243
81
|
end
|
244
82
|
|
245
83
|
# Select which hostname to report back to Datadog.
|
246
84
|
# Makes decision based on inputs from `config` and when absent, use the
|
247
85
|
# node's `ec2` attribute existence to make the decision.
|
248
86
|
#
|
249
|
-
# @param node [Chef::Node] from `run_status`, can feasibly any `node`
|
250
|
-
# @param config [Hash] config object passed in to handler
|
251
87
|
# @return [String] the hostname decided upon
|
252
|
-
def
|
88
|
+
def resolve_correct_hostname
|
89
|
+
node = run_status.node
|
253
90
|
use_ec2_instance_id = !config.key?(:use_ec2_instance_id) ||
|
254
|
-
|
255
|
-
config[:use_ec2_instance_id])
|
91
|
+
(config.key?(:use_ec2_instance_id) && config[:use_ec2_instance_id])
|
256
92
|
|
257
93
|
if config[:hostname]
|
94
|
+
puts "found hostname #{config[:hostname]} in config object"
|
258
95
|
config[:hostname]
|
259
96
|
elsif use_ec2_instance_id && node.attribute?('ec2') && node.ec2.attribute?('instance_id')
|
260
97
|
node.ec2.instance_id
|
@@ -262,6 +99,23 @@ class Chef
|
|
262
99
|
node.name
|
263
100
|
end
|
264
101
|
end
|
102
|
+
|
103
|
+
# Using the agent proxy settings requires setting http(s)_proxy
|
104
|
+
# env vars. However, original env var settings need to be
|
105
|
+
# preserved for restoration at the end of the handler.
|
106
|
+
def use_agent_proxy
|
107
|
+
Chef::Log.info('Using agent proxy settings')
|
108
|
+
@env_http_proxy = ENV['http_proxy']
|
109
|
+
@env_https_proxy = ENV['https_proxy']
|
110
|
+
ENV['http_proxy'] = ENV['DATADOG_PROXY']
|
111
|
+
ENV['https_proxy'] = ENV['DATADOG_PROXY']
|
112
|
+
end
|
113
|
+
|
114
|
+
# Restore environment proxy settings to pre-report values
|
115
|
+
def restore_env_proxies
|
116
|
+
ENV['http_proxy'] = @env_http_proxy
|
117
|
+
ENV['https_proxy'] = @env_https_proxy
|
118
|
+
end
|
265
119
|
end # end class Datadog
|
266
120
|
end # end class Handler
|
267
121
|
end # end class Chef
|