dogapi 1.39.0 → 1.44.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.azure-pipelines/all.yml +36 -8
- data/.rubocop.yml +4 -0
- data/.rubocop_todo.yml +3 -0
- data/CHANGELOG.md +21 -0
- data/Gemfile +1 -1
- data/Gemfile_1.9 +0 -1
- data/README.rdoc +7 -0
- data/RELEASING.md +1 -1
- data/dogapi.gemspec +2 -0
- data/lib/dogapi/common.rb +37 -10
- data/lib/dogapi/facade.rb +72 -28
- data/lib/dogapi/v1.rb +1 -0
- data/lib/dogapi/v1/dashboard.rb +12 -0
- data/lib/dogapi/v1/service_level_objective.rb +113 -0
- data/lib/dogapi/version.rb +1 -1
- data/spec/integration/dashboard_spec.rb +11 -1
- data/spec/integration/service_level_objective_spec.rb +73 -0
- data/spec/spec_helper.rb +13 -1
- data/spec/unit/common_spec.rb +9 -0
- metadata +8 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c64317943c656727e705f3ba310961de9fa8b3fda8fbcb976095d634d7311ecd
|
4
|
+
data.tar.gz: bb3f1977f9bd6bcd6d22779e23e247803b7800a1a0770e266d461878b68d574c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f2814b96964abfc35ade6827652aed52c0b2795aa71f47a4a8a9152d7f97a013bb18680060657df015aeb0cb925cce58a16780c67df56397256d9e4c10aa8fcc
|
7
|
+
data.tar.gz: f9b7cb7ec7486d40af67d12ad68e44787e3e890efb0a98a9a5093875eba00eb0c19556a6b4fd35246611ffdc4cfe3b1aa2750750d001f6e145a8fe52085aac46
|
data/.azure-pipelines/all.yml
CHANGED
@@ -9,10 +9,36 @@ pr:
|
|
9
9
|
include:
|
10
10
|
- master
|
11
11
|
|
12
|
+
resources:
|
13
|
+
containers:
|
14
|
+
- container: datadog-agent
|
15
|
+
image: datadog/agent:7
|
16
|
+
options: --health-cmd="exit 0" --health-interval=1s
|
17
|
+
ports:
|
18
|
+
- 8125:8125
|
19
|
+
- 8126:8126/tcp
|
20
|
+
env:
|
21
|
+
DD_API_KEY: $(ddAPIKey)
|
22
|
+
DD_APM_ENABLED: "true"
|
23
|
+
DD_APM_NON_LOCAL_TRAFFIC: "true"
|
24
|
+
DD_LOGS_ENABLED: "true"
|
25
|
+
DD_LOGS_CONFIG_CONTAINER_COLLECT_ALL: "true"
|
26
|
+
DD_AC_EXCLUDE: "name:datadog-agent"
|
27
|
+
volumes:
|
28
|
+
- /var/run/docker.sock:/var/run/docker.sock:ro
|
29
|
+
- /proc/:/host/proc/:ro
|
30
|
+
- /sys/fs/cgroup/:/host/sys/fs/cgroup:ro
|
31
|
+
|
12
32
|
jobs:
|
13
33
|
- job: UnitTests
|
14
34
|
pool:
|
15
35
|
vmImage: "Ubuntu-16.04"
|
36
|
+
container:
|
37
|
+
image: ruby:$(RUBY_VERSION)
|
38
|
+
options: >-
|
39
|
+
-l com.datadoghq.ad.logs="[{\"source\": \"Azure Pipeline\", \"service\": \"dogapi-rb\"}]"
|
40
|
+
services:
|
41
|
+
datadog-agent: datadog-agent
|
16
42
|
strategy:
|
17
43
|
matrix:
|
18
44
|
Rb24:
|
@@ -31,17 +57,19 @@ jobs:
|
|
31
57
|
RUBY_VERSION: '2.6'
|
32
58
|
TASK: rubocop
|
33
59
|
steps:
|
34
|
-
-
|
35
|
-
displayName: Use Ruby $(RUBY_VERSION)
|
36
|
-
inputs:
|
37
|
-
versionSpec: $(RUBY_VERSION)
|
38
|
-
addToPath: true
|
39
|
-
- script: |
|
40
|
-
gem install bundler
|
41
|
-
bundle install --retry=3 --jobs=4
|
60
|
+
- script: bundle install --retry=3 --jobs=4
|
42
61
|
displayName: 'bundle install'
|
62
|
+
env:
|
63
|
+
GEM_HOME: '~/.gem'
|
43
64
|
- script: bundle exec rake $(TASK)
|
44
65
|
displayName: Run $(TASK) via bundle
|
66
|
+
env:
|
67
|
+
GEM_HOME: '~/.gem'
|
68
|
+
DD_AGENT_HOST: datadog-agent
|
69
|
+
DD_ENV: ci
|
70
|
+
DD_SERVICE: dogapi-rb
|
71
|
+
DD_TAGS: "team:integration-tools-and-libraries,runtime:ruby-$(RUBY_VERSION),ci.job.name:$(System.JobName),matrix:$(TASK)"
|
72
|
+
DD_TRACE_ANALYTICS_ENABLED: "true"
|
45
73
|
- job: TestRuby19
|
46
74
|
pool:
|
47
75
|
vmImage: "Ubuntu-16.04"
|
data/.rubocop.yml
CHANGED
data/.rubocop_todo.yml
CHANGED
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,26 @@
|
|
1
1
|
# Changes
|
2
2
|
|
3
|
+
## 1.44.0 / 2020-12-10
|
4
|
+
|
5
|
+
* [Added] Allow skipping SSL verification. See [#246](https://github.com/DataDog/dogapi-rb/pull/246).
|
6
|
+
|
7
|
+
## 1.43.0 / 2020-12-07
|
8
|
+
|
9
|
+
* [Fixed] find_localhost: Try both `hostname` and `hostname -f` before raising. See [#242](https://github.com/DataDog/dogapi-rb/pull/242).
|
10
|
+
|
11
|
+
## 1.42.0 / 2020-09-17
|
12
|
+
|
13
|
+
* [Added] Allow dashboard creation / updates using Template Variable Presets. See [#238](https://github.com/DataDog/dogapi-rb/pull/238).
|
14
|
+
|
15
|
+
## 1.41.0 / 2020-07-27
|
16
|
+
|
17
|
+
* [Added] Improve user-agent header to include telemetry information. See [#235](https://github.com/DataDog/dogapi-rb/pull/235).
|
18
|
+
* [Added] Move setting hostname to end of method body in order to actually return it. See [#233](https://github.com/DataDog/dogapi-rb/pull/233).
|
19
|
+
|
20
|
+
## 1.40.0 / 2020-04-06
|
21
|
+
|
22
|
+
* [Added] Re-add service level objectives support. See [#224](https://github.com/DataDog/dogapi-rb/pull/224).
|
23
|
+
|
3
24
|
## 1.39.0 / 2020-02-04
|
4
25
|
|
5
26
|
* [Added] Allow Setting Proxy without Using HTTP_PROXY, etc.. See [#180](https://github.com/DataDog/dogapi-rb/pull/180). Thanks [KingAlex42](https://github.com/KingAlex42).
|
data/Gemfile
CHANGED
data/Gemfile_1.9
CHANGED
data/README.rdoc
CHANGED
@@ -154,6 +154,13 @@ data point you will need to pass a list of +Time+, +float+ pairs, instead of a s
|
|
154
154
|
|
155
155
|
dog.emit_points('some.metric.name', [[t1, val1], [t2, val2], [t3, val3]], :host => "my_host", :device => "my_device")
|
156
156
|
|
157
|
+
If you want to specify the metric type, using the example above you can pass in a symbol key with :type and a value of a metric type such as counter, gauge or rate.
|
158
|
+
|
159
|
+
dog.emit_points('some.metric.name', [[t1, val1], [t2, val2], [t3, val3]], :host => "my_host", :device => "my_device", :type => 'counter' )
|
160
|
+
|
161
|
+
If you want to add metric tags, using the example above you can pass in a symbol key with :tags and an array of tags.
|
162
|
+
|
163
|
+
dog.emit_points('some.metric.name', [[t1, val1], [t2, val2], [t3, val3]], :host => "my_host", :device => "my_device", :tags => ['frontend', 'app:webserver'] )
|
157
164
|
|
158
165
|
== Get points from a Datadog metric
|
159
166
|
|
data/RELEASING.md
CHANGED
@@ -43,4 +43,4 @@ Install [bundler](https://bundler.io/) and setup your RubyGems credentials:
|
|
43
43
|
1. Build the gem: `bundle exec gem build dogapi.gemspec`.
|
44
44
|
1. Push the gem: `bundle exec gem push dogapi-x.x.x.gem`.
|
45
45
|
1. Check that the [Ruby Gem is published](https://rubygems.org/gems/dogapi).
|
46
|
-
1. Bump the version again in `lib/dogapi/version.rb` to a dev version (e.g. `1.
|
46
|
+
1. Bump the version again in `lib/dogapi/version.rb` to a dev version (e.g. `1.42.0` -> `1.42.1.dev`), open a PR and merge it to master.
|
data/dogapi.gemspec
CHANGED
@@ -33,6 +33,8 @@ Gem::Specification.new do |spec|
|
|
33
33
|
spec.add_dependency 'multi_json'
|
34
34
|
|
35
35
|
spec.add_development_dependency 'bundler', '>= 1.3'
|
36
|
+
# NOTE: rake < 12.3.3 is vulnerable to CVE-2020-8130, but we only use it as a test dependency
|
37
|
+
# and neither our users nor our CI is vulnerable in any way
|
36
38
|
spec.add_development_dependency 'rake', '~> 10'
|
37
39
|
spec.add_development_dependency 'rdoc'
|
38
40
|
end
|
data/lib/dogapi/common.rb
CHANGED
@@ -4,6 +4,7 @@
|
|
4
4
|
|
5
5
|
require 'cgi'
|
6
6
|
require 'net/https'
|
7
|
+
require 'rbconfig'
|
7
8
|
require 'socket'
|
8
9
|
require 'uri'
|
9
10
|
require 'English'
|
@@ -13,7 +14,16 @@ require 'multi_json'
|
|
13
14
|
require 'set'
|
14
15
|
require 'open3'
|
15
16
|
|
17
|
+
require 'dogapi/version'
|
18
|
+
|
16
19
|
module Dogapi
|
20
|
+
USER_AGENT = format(
|
21
|
+
'dogapi-rb/%<version>s (ruby %<ruver>s; os %<os>s; arch %<arch>s)',
|
22
|
+
version: VERSION,
|
23
|
+
ruver: RUBY_VERSION,
|
24
|
+
os: RbConfig::CONFIG['host_os'].downcase,
|
25
|
+
arch: RbConfig::CONFIG['host_cpu']
|
26
|
+
)
|
17
27
|
|
18
28
|
# Metadata class to hold the scope of an API call
|
19
29
|
class Scope
|
@@ -76,11 +86,12 @@ module Dogapi
|
|
76
86
|
# Superclass that deals with the details of communicating with the DataDog API
|
77
87
|
class APIService
|
78
88
|
attr_reader :api_key, :application_key
|
79
|
-
def initialize(api_key, application_key, silent=true, timeout=nil, endpoint=nil)
|
89
|
+
def initialize(api_key, application_key, silent=true, timeout=nil, endpoint=nil, skip_ssl_validation=false)
|
80
90
|
@api_key = api_key
|
81
91
|
@application_key = application_key
|
82
92
|
@api_host = endpoint || Dogapi.find_datadog_host()
|
83
93
|
@silent = silent
|
94
|
+
@skip_ssl_validation = skip_ssl_validation
|
84
95
|
@timeout = timeout || 5
|
85
96
|
end
|
86
97
|
|
@@ -100,6 +111,9 @@ module Dogapi
|
|
100
111
|
session = connection.new(uri.host, uri.port)
|
101
112
|
session.open_timeout = @timeout
|
102
113
|
session.use_ssl = uri.scheme == 'https'
|
114
|
+
if @skip_ssl_validation
|
115
|
+
session.verify_mode = OpenSSL::SSL::VERIFY_NONE
|
116
|
+
end
|
103
117
|
session.start do |conn|
|
104
118
|
conn.read_timeout = @timeout
|
105
119
|
yield conn
|
@@ -138,11 +152,11 @@ module Dogapi
|
|
138
152
|
def prepare_request(method, url, params, body, send_json, with_app_key)
|
139
153
|
url_with_params = url + params
|
140
154
|
req = method.new(url_with_params)
|
155
|
+
req['User-Agent'] = USER_AGENT
|
141
156
|
unless should_set_api_and_app_keys_in_params?(url)
|
142
157
|
req['DD-API-KEY'] = @api_key
|
143
158
|
req['DD-APPLICATION-KEY'] = @application_key if with_app_key
|
144
159
|
end
|
145
|
-
|
146
160
|
if send_json
|
147
161
|
req.content_type = 'application/json'
|
148
162
|
req.body = MultiJson.dump(body)
|
@@ -200,14 +214,17 @@ module Dogapi
|
|
200
214
|
@@hostname = nil
|
201
215
|
|
202
216
|
def Dogapi.find_localhost
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
|
217
|
+
return @@hostname if @@hostname
|
218
|
+
out, status = Open3.capture2('hostname', '-f', err: File::NULL)
|
219
|
+
unless status.exitstatus.zero?
|
220
|
+
begin
|
221
|
+
out = Addrinfo.getaddrinfo(Socket.gethostname, nil, nil, nil, nil, Socket::AI_CANONNAME).first.canonname
|
222
|
+
rescue SocketError
|
223
|
+
out, status = Open3.capture2('hostname', err: File::NULL)
|
224
|
+
raise SystemCallError, 'Both `hostname` and `hostname -f` failed.' unless status.exitstatus.zero?
|
225
|
+
end
|
226
|
+
end
|
227
|
+
@@hostname = out.strip
|
211
228
|
end
|
212
229
|
|
213
230
|
def Dogapi.find_proxy
|
@@ -224,4 +241,14 @@ module Dogapi
|
|
224
241
|
raise ArgumentError, "Each tag needs to be a string. Current value: #{tag}" unless tag.is_a? String
|
225
242
|
end
|
226
243
|
end
|
244
|
+
|
245
|
+
# Very simplified hash with indifferent access - access to string or symbol
|
246
|
+
# keys via symbols. E.g.:
|
247
|
+
# my_hash = { 'foo' => 1 }
|
248
|
+
# Dogapi.symbolized_access(my_hash)
|
249
|
+
# my_hash[:foo] # => 1
|
250
|
+
def Dogapi.symbolized_access(hash)
|
251
|
+
hash.default_proc = proc { |h, k| h.key?(k.to_s) ? h[k.to_s] : nil }
|
252
|
+
hash
|
253
|
+
end
|
227
254
|
end
|
data/lib/dogapi/facade.rb
CHANGED
@@ -13,7 +13,8 @@ module Dogapi
|
|
13
13
|
# See Dogapi::V2 for the thick underlying clients
|
14
14
|
class ClientV2
|
15
15
|
attr_accessor :datadog_host
|
16
|
-
def initialize(api_key, application_key=nil, host=nil, device=nil, silent=true,
|
16
|
+
def initialize(api_key, application_key=nil, host=nil, device=nil, silent=true,
|
17
|
+
timeout=nil, endpoint=nil, skip_ssl_validation=false)
|
17
18
|
|
18
19
|
if api_key
|
19
20
|
@api_key = api_key
|
@@ -27,7 +28,7 @@ module Dogapi
|
|
27
28
|
@device = device
|
28
29
|
|
29
30
|
@dashboard_list_service_v2 = Dogapi::V2::DashboardListService.new(
|
30
|
-
@api_key, @application_key, silent, timeout, @datadog_host
|
31
|
+
@api_key, @application_key, silent, timeout, @datadog_host, skip_ssl_validation
|
31
32
|
)
|
32
33
|
|
33
34
|
end
|
@@ -64,7 +65,7 @@ module Dogapi
|
|
64
65
|
# Support for API version 2.
|
65
66
|
|
66
67
|
# rubocop:disable Metrics/MethodLength, Metrics/LineLength
|
67
|
-
def initialize(api_key, application_key=nil, host=nil, device=nil, silent=true, timeout=nil, endpoint=nil)
|
68
|
+
def initialize(api_key, application_key=nil, host=nil, device=nil, silent=true, timeout=nil, endpoint=nil, skip_ssl_validation=false)
|
68
69
|
|
69
70
|
if api_key
|
70
71
|
@api_key = api_key
|
@@ -78,35 +79,38 @@ module Dogapi
|
|
78
79
|
@device = device
|
79
80
|
|
80
81
|
# FIXME: refactor to avoid all this code duplication
|
81
|
-
@metric_svc = Dogapi::V1::MetricService.new(@api_key, @application_key, silent, timeout, @datadog_host)
|
82
|
-
@event_svc = Dogapi::V1::EventService.new(@api_key, @application_key, silent, timeout, @datadog_host)
|
83
|
-
@tag_svc = Dogapi::V1::TagService.new(@api_key, @application_key, silent, timeout, @datadog_host)
|
84
|
-
@comment_svc = Dogapi::V1::CommentService.new(@api_key, @application_key, silent, timeout, @datadog_host)
|
85
|
-
@search_svc = Dogapi::V1::SearchService.new(@api_key, @application_key, silent, timeout, @datadog_host)
|
86
|
-
@dash_service = Dogapi::V1::DashService.new(@api_key, @application_key, silent, timeout, @datadog_host)
|
87
|
-
@dashboard_service = Dogapi::V1::DashboardService.new(@api_key, @application_key, silent, timeout, @datadog_host)
|
82
|
+
@metric_svc = Dogapi::V1::MetricService.new(@api_key, @application_key, silent, timeout, @datadog_host, skip_ssl_validation)
|
83
|
+
@event_svc = Dogapi::V1::EventService.new(@api_key, @application_key, silent, timeout, @datadog_host, skip_ssl_validation)
|
84
|
+
@tag_svc = Dogapi::V1::TagService.new(@api_key, @application_key, silent, timeout, @datadog_host, skip_ssl_validation)
|
85
|
+
@comment_svc = Dogapi::V1::CommentService.new(@api_key, @application_key, silent, timeout, @datadog_host, skip_ssl_validation)
|
86
|
+
@search_svc = Dogapi::V1::SearchService.new(@api_key, @application_key, silent, timeout, @datadog_host, skip_ssl_validation)
|
87
|
+
@dash_service = Dogapi::V1::DashService.new(@api_key, @application_key, silent, timeout, @datadog_host, skip_ssl_validation)
|
88
|
+
@dashboard_service = Dogapi::V1::DashboardService.new(@api_key, @application_key, silent, timeout, @datadog_host, skip_ssl_validation)
|
88
89
|
@dashboard_list_service = Dogapi::V1::DashboardListService.new(
|
89
|
-
@api_key, @application_key, silent, timeout, @datadog_host
|
90
|
+
@api_key, @application_key, silent, timeout, @datadog_host, skip_ssl_validation
|
90
91
|
)
|
91
|
-
@alert_svc = Dogapi::V1::AlertService.new(@api_key, @application_key, silent, timeout, @datadog_host)
|
92
|
-
@user_svc = Dogapi::V1::UserService.new(@api_key, @application_key, silent, timeout, @datadog_host)
|
93
|
-
@snapshot_svc = Dogapi::V1::SnapshotService.new(@api_key, @application_key, silent, timeout, @datadog_host)
|
94
|
-
@embed_svc = Dogapi::V1::EmbedService.new(@api_key, @application_key, silent, timeout, @datadog_host)
|
95
|
-
@screenboard_svc = Dogapi::V1::ScreenboardService.new(@api_key, @application_key, silent, timeout, @datadog_host)
|
96
|
-
@monitor_svc = Dogapi::V1::MonitorService.new(@api_key, @application_key, silent, timeout, @datadog_host)
|
97
|
-
@synthetics_svc = Dogapi::V1::SyntheticsService.new(@api_key, @application_key, silent, timeout, @datadog_host)
|
98
|
-
@service_check_svc = Dogapi::V1::ServiceCheckService.new(@api_key, @application_key, silent, timeout, @datadog_host)
|
99
|
-
@metadata_svc = Dogapi::V1::MetadataService.new(@api_key, @application_key, silent, timeout, @datadog_host)
|
92
|
+
@alert_svc = Dogapi::V1::AlertService.new(@api_key, @application_key, silent, timeout, @datadog_host, skip_ssl_validation)
|
93
|
+
@user_svc = Dogapi::V1::UserService.new(@api_key, @application_key, silent, timeout, @datadog_host, skip_ssl_validation)
|
94
|
+
@snapshot_svc = Dogapi::V1::SnapshotService.new(@api_key, @application_key, silent, timeout, @datadog_host, skip_ssl_validation)
|
95
|
+
@embed_svc = Dogapi::V1::EmbedService.new(@api_key, @application_key, silent, timeout, @datadog_host, skip_ssl_validation)
|
96
|
+
@screenboard_svc = Dogapi::V1::ScreenboardService.new(@api_key, @application_key, silent, timeout, @datadog_host, skip_ssl_validation)
|
97
|
+
@monitor_svc = Dogapi::V1::MonitorService.new(@api_key, @application_key, silent, timeout, @datadog_host, skip_ssl_validation)
|
98
|
+
@synthetics_svc = Dogapi::V1::SyntheticsService.new(@api_key, @application_key, silent, timeout, @datadog_host, skip_ssl_validation)
|
99
|
+
@service_check_svc = Dogapi::V1::ServiceCheckService.new(@api_key, @application_key, silent, timeout, @datadog_host, skip_ssl_validation)
|
100
|
+
@metadata_svc = Dogapi::V1::MetadataService.new(@api_key, @application_key, silent, timeout, @datadog_host, skip_ssl_validation)
|
100
101
|
@legacy_event_svc = Dogapi::EventService.new(@datadog_host)
|
101
|
-
@hosts_svc = Dogapi::V1::HostsService.new(@api_key, @application_key, silent, timeout, @datadog_host)
|
102
|
-
@integration_svc = Dogapi::V1::IntegrationService.new(@api_key, @application_key, silent, timeout, @datadog_host)
|
103
|
-
@aws_integration_svc = Dogapi::V1::AwsIntegrationService.new(@api_key, @application_key, silent, timeout, @datadog_host)
|
104
|
-
@aws_logs_svc = Dogapi::V1::AwsLogsService.new(@api_key, @application_key, silent, timeout, @datadog_host)
|
105
|
-
@usage_svc = Dogapi::V1::UsageService.new(@api_key, @application_key, silent, timeout, @datadog_host)
|
106
|
-
@azure_integration_svc = Dogapi::V1::AzureIntegrationService.new(@api_key, @application_key, silent, timeout, @datadog_host)
|
107
|
-
@gcp_integration_svc = Dogapi::V1::GcpIntegrationService.new(@api_key, @application_key, silent, timeout, @datadog_host)
|
102
|
+
@hosts_svc = Dogapi::V1::HostsService.new(@api_key, @application_key, silent, timeout, @datadog_host, skip_ssl_validation)
|
103
|
+
@integration_svc = Dogapi::V1::IntegrationService.new(@api_key, @application_key, silent, timeout, @datadog_host, skip_ssl_validation)
|
104
|
+
@aws_integration_svc = Dogapi::V1::AwsIntegrationService.new(@api_key, @application_key, silent, timeout, @datadog_host, skip_ssl_validation)
|
105
|
+
@aws_logs_svc = Dogapi::V1::AwsLogsService.new(@api_key, @application_key, silent, timeout, @datadog_host, skip_ssl_validation)
|
106
|
+
@usage_svc = Dogapi::V1::UsageService.new(@api_key, @application_key, silent, timeout, @datadog_host, skip_ssl_validation)
|
107
|
+
@azure_integration_svc = Dogapi::V1::AzureIntegrationService.new(@api_key, @application_key, silent, timeout, @datadog_host, skip_ssl_validation)
|
108
|
+
@gcp_integration_svc = Dogapi::V1::GcpIntegrationService.new(@api_key, @application_key, silent, timeout, @datadog_host, skip_ssl_validation)
|
109
|
+
@service_level_objective_svc = Dogapi::V1::ServiceLevelObjectiveService.new(@api_key, @application_key, silent,
|
110
|
+
timeout, @datadog_host, skip_ssl_validation)
|
111
|
+
|
108
112
|
# Support for Dashboard List API v2.
|
109
|
-
@v2 = Dogapi::ClientV2.new(@api_key, @application_key, true, true, @datadog_host)
|
113
|
+
@v2 = Dogapi::ClientV2.new(@api_key, @application_key, true, true, @datadog_host, skip_ssl_validation)
|
110
114
|
|
111
115
|
end
|
112
116
|
# rubocop:enable Metrics/MethodLength, Metrics/LineLength
|
@@ -673,6 +677,46 @@ module Dogapi
|
|
673
677
|
@monitor_svc.unmute_host(hostname)
|
674
678
|
end
|
675
679
|
|
680
|
+
#
|
681
|
+
# SERVICE LEVEL OBJECTIVES
|
682
|
+
#
|
683
|
+
|
684
|
+
def create_service_level_objective(type, slo_name, thresholds, options = {})
|
685
|
+
@service_level_objective_svc.create_service_level_objective(type, slo_name, thresholds, options)
|
686
|
+
end
|
687
|
+
|
688
|
+
def update_service_level_objective(slo_id, type, options = {})
|
689
|
+
@service_level_objective_svc.update_service_level_objective(slo_id, type, options)
|
690
|
+
end
|
691
|
+
|
692
|
+
def get_service_level_objective(slo_id)
|
693
|
+
@service_level_objective_svc.get_service_level_objective(slo_id)
|
694
|
+
end
|
695
|
+
|
696
|
+
def get_service_level_objective_history(slo_id, from_ts, to_ts)
|
697
|
+
@service_level_objective_svc.get_service_level_objective_history(slo_id, from_ts, to_ts)
|
698
|
+
end
|
699
|
+
|
700
|
+
def search_service_level_objective(slo_ids = nil, query = nil, offset = nil, limit = nil)
|
701
|
+
@service_level_objective_svc.search_service_level_objective(slo_ids, query, offset, limit)
|
702
|
+
end
|
703
|
+
|
704
|
+
def can_delete_service_level_objective(slo_ids)
|
705
|
+
@service_level_objective_svc.can_delete_service_level_objective(slo_ids)
|
706
|
+
end
|
707
|
+
|
708
|
+
def delete_service_level_objective(slo_id)
|
709
|
+
@service_level_objective_svc.delete_service_level_objective(slo_id)
|
710
|
+
end
|
711
|
+
|
712
|
+
def delete_many_service_level_objective(slo_ids)
|
713
|
+
@service_level_objective_svc.delete_many_service_level_objective(slo_ids)
|
714
|
+
end
|
715
|
+
|
716
|
+
def delete_timeframes_service_level_objective(ops)
|
717
|
+
@service_level_objective_svc.delete_timeframes_service_level_objective(ops)
|
718
|
+
end
|
719
|
+
|
676
720
|
#
|
677
721
|
# SERVICE CHECKS
|
678
722
|
#
|
data/lib/dogapi/v1.rb
CHANGED
@@ -15,6 +15,7 @@ require 'dogapi/v1/monitor'
|
|
15
15
|
require 'dogapi/v1/screenboard'
|
16
16
|
require 'dogapi/v1/search'
|
17
17
|
require 'dogapi/v1/service_check'
|
18
|
+
require 'dogapi/v1/service_level_objective'
|
18
19
|
require 'dogapi/v1/snapshot'
|
19
20
|
require 'dogapi/v1/synthetics'
|
20
21
|
require 'dogapi/v1/tag'
|
data/lib/dogapi/v1/dashboard.rb
CHANGED
@@ -28,6 +28,11 @@ module Dogapi
|
|
28
28
|
# e.g. '["user1@domain.com", "user2@domain.com"]'
|
29
29
|
# :template_variables => JSON: List of template variables for this dashboard.
|
30
30
|
# e.g. [{"name": "host", "prefix": "host", "default": "my-host"}]
|
31
|
+
# :template_variable_presets => JSON: List of template variables saved views
|
32
|
+
# e.g. {
|
33
|
+
# "name": "my_template_variable_preset",
|
34
|
+
# "template_variables": [{"name": "host", "prefix": "host", "default": "my-host"}]
|
35
|
+
# }
|
31
36
|
def create_board(title, widgets, layout_type, options)
|
32
37
|
# Required arguments
|
33
38
|
body = {
|
@@ -40,6 +45,7 @@ module Dogapi
|
|
40
45
|
body[:is_read_only] = options[:is_read_only] if options[:is_read_only]
|
41
46
|
body[:notify_list] = options[:notify_list] if options[:notify_list]
|
42
47
|
body[:template_variables] = options[:template_variables] if options[:template_variables]
|
48
|
+
body[:template_variable_presets] = options[:template_variable_presets] if options[:template_variable_presets]
|
43
49
|
|
44
50
|
request(Net::HTTP::Post, "/api/#{API_VERSION}/#{RESOURCE_NAME}", nil, body, true)
|
45
51
|
end
|
@@ -60,6 +66,11 @@ module Dogapi
|
|
60
66
|
# e.g. '["user1@domain.com", "user2@domain.com"]'
|
61
67
|
# :template_variables => JSON: List of template variables for this dashboard.
|
62
68
|
# e.g. [{"name": "host", "prefix": "host", "default": "my-host"}]
|
69
|
+
# :template_variable_presets => JSON: List of template variables saved views
|
70
|
+
# e.g. {
|
71
|
+
# "name": "my_template_variable_preset",
|
72
|
+
# "template_variables": [{"name": "host", "prefix": "host", "default": "my-host"}]
|
73
|
+
# }
|
63
74
|
def update_board(dashboard_id, title, widgets, layout_type, options)
|
64
75
|
# Required arguments
|
65
76
|
body = {
|
@@ -72,6 +83,7 @@ module Dogapi
|
|
72
83
|
body[:is_read_only] = options[:is_read_only] if options[:is_read_only]
|
73
84
|
body[:notify_list] = options[:notify_list] if options[:notify_list]
|
74
85
|
body[:template_variables] = options[:template_variables] if options[:template_variables]
|
86
|
+
body[:template_variable_presets] = options[:template_variable_presets] if options[:template_variable_presets]
|
75
87
|
|
76
88
|
request(Net::HTTP::Put, "/api/#{API_VERSION}/#{RESOURCE_NAME}/#{dashboard_id}", nil, body, true)
|
77
89
|
end
|
@@ -0,0 +1,113 @@
|
|
1
|
+
require 'dogapi'
|
2
|
+
|
3
|
+
module Dogapi
|
4
|
+
class V1 # for namespacing
|
5
|
+
|
6
|
+
# Implements Service Level Objectives endpoints
|
7
|
+
class ServiceLevelObjectiveService < Dogapi::APIService
|
8
|
+
|
9
|
+
API_VERSION = 'v1'
|
10
|
+
|
11
|
+
def create_service_level_objective(type, slo_name, thresholds, options = {})
|
12
|
+
body = {
|
13
|
+
type: type,
|
14
|
+
name: slo_name,
|
15
|
+
thresholds: thresholds
|
16
|
+
}
|
17
|
+
|
18
|
+
symbolized_options = Dogapi.symbolized_access(options)
|
19
|
+
if type.to_s == 'metric'
|
20
|
+
body[:query] = {
|
21
|
+
numerator: symbolized_options[:numerator],
|
22
|
+
denominator: symbolized_options[:denominator]
|
23
|
+
}
|
24
|
+
else
|
25
|
+
body[:monitor_search] = symbolized_options[:monitor_search] if symbolized_options[:monitor_search]
|
26
|
+
body[:monitor_ids] = symbolized_options[:monitor_ids] if symbolized_options[:monitor_ids]
|
27
|
+
body[:groups] = symbolized_options[:groups] if symbolized_options[:groups]
|
28
|
+
end
|
29
|
+
body[:tags] = symbolized_options[:tags] if symbolized_options[:tags]
|
30
|
+
body[:description] = symbolized_options[:description] if symbolized_options[:description]
|
31
|
+
|
32
|
+
request(Net::HTTP::Post, "/api/#{API_VERSION}/slo", nil, body, true)
|
33
|
+
end
|
34
|
+
|
35
|
+
def update_service_level_objective(slo_id, type, options = {})
|
36
|
+
body = {
|
37
|
+
type: type
|
38
|
+
}
|
39
|
+
|
40
|
+
symbolized_options = Dogapi.symbolized_access(options)
|
41
|
+
if type == 'metric'
|
42
|
+
if symbolized_options[:numerator] && symbolized_options[:denominator]
|
43
|
+
body[:query] = {
|
44
|
+
numerator: symbolized_options[:numerator],
|
45
|
+
denominator: symbolized_options[:denominator]
|
46
|
+
}
|
47
|
+
end
|
48
|
+
else
|
49
|
+
body[:monitor_search] = symbolized_options[:monitor_search] if symbolized_options[:monitor_search]
|
50
|
+
body[:monitor_ids] = symbolized_options[:monitor_ids] if symbolized_options[:monitor_ids]
|
51
|
+
body[:groups] = symbolized_options[:groups] if symbolized_options[:groups]
|
52
|
+
end
|
53
|
+
[:name, :thresholds, :tags, :description].each do |a|
|
54
|
+
body[a] = symbolized_options[a] if symbolized_options[a]
|
55
|
+
end
|
56
|
+
|
57
|
+
request(Net::HTTP::Put, "/api/#{API_VERSION}/slo/#{slo_id}", nil, body, true)
|
58
|
+
end
|
59
|
+
|
60
|
+
def get_service_level_objective(slo_id)
|
61
|
+
request(Net::HTTP::Get, "/api/#{API_VERSION}/slo/#{slo_id}", nil, nil, false)
|
62
|
+
end
|
63
|
+
|
64
|
+
def search_service_level_objective(slo_ids, query, offset, limit)
|
65
|
+
params = {}
|
66
|
+
params[:offset] = offset unless offset.nil?
|
67
|
+
params[:limit] = limit unless limit.nil?
|
68
|
+
if !slo_ids.nil?
|
69
|
+
params[:ids] = slo_ids.join(',')
|
70
|
+
else
|
71
|
+
params[:query] = query
|
72
|
+
end
|
73
|
+
|
74
|
+
request(Net::HTTP::Get, "/api/#{API_VERSION}/slo/", params, nil, false)
|
75
|
+
end
|
76
|
+
|
77
|
+
def delete_service_level_objective(slo_id)
|
78
|
+
request(Net::HTTP::Delete, "/api/#{API_VERSION}/slo/#{slo_id}", nil, nil, false)
|
79
|
+
end
|
80
|
+
|
81
|
+
def delete_many_service_level_objective(slo_ids)
|
82
|
+
body = {
|
83
|
+
ids: slo_ids
|
84
|
+
}
|
85
|
+
request(Net::HTTP::Delete, "/api/#{API_VERSION}/slo/", nil, body, true)
|
86
|
+
end
|
87
|
+
|
88
|
+
def delete_timeframes_service_level_objective(ops)
|
89
|
+
# ops is a hash of slo_id: [<timeframe>] to delete
|
90
|
+
request(Net::HTTP::Post, "/api/#{API_VERSION}/slo/bulk_delete", nil, ops, true)
|
91
|
+
end
|
92
|
+
|
93
|
+
def get_service_level_objective_history(slo_id, from_ts, to_ts)
|
94
|
+
params = {
|
95
|
+
from_ts: from_ts,
|
96
|
+
to_ts: to_ts
|
97
|
+
}
|
98
|
+
request(Net::HTTP::Get, "/api/#{API_VERSION}/slo/#{slo_id}/history", params, nil, false)
|
99
|
+
end
|
100
|
+
|
101
|
+
def can_delete_service_level_objective(slo_ids)
|
102
|
+
params = {}
|
103
|
+
params[:ids] = if slo_ids.is_a? Array
|
104
|
+
slo_ids.join(',')
|
105
|
+
else
|
106
|
+
slo_ids
|
107
|
+
end
|
108
|
+
request(Net::HTTP::Get, "/api/#{API_VERSION}/slo/can_delete", params, nil, false)
|
109
|
+
end
|
110
|
+
|
111
|
+
end
|
112
|
+
end
|
113
|
+
end
|
data/lib/dogapi/version.rb
CHANGED
@@ -26,6 +26,15 @@ describe Dogapi::Client do
|
|
26
26
|
'prefix' => 'host',
|
27
27
|
'default' => 'my-host'
|
28
28
|
}].freeze
|
29
|
+
TEMPLATE_VARIABLE_PRESETS = [{
|
30
|
+
'name' => 'preset1',
|
31
|
+
'template_variables' => [
|
32
|
+
{
|
33
|
+
'name' => 'host1',
|
34
|
+
'value' => 'my-host'
|
35
|
+
}
|
36
|
+
]
|
37
|
+
}].freeze
|
29
38
|
|
30
39
|
REQUIRED_ARGS = {
|
31
40
|
title: TITLE,
|
@@ -37,7 +46,8 @@ describe Dogapi::Client do
|
|
37
46
|
description: DESCRIPTION,
|
38
47
|
is_read_only: IS_READ_ONLY,
|
39
48
|
notify_list: NOTIFY_LIST,
|
40
|
-
template_variables: TEMPLATE_VARIABLES
|
49
|
+
template_variables: TEMPLATE_VARIABLES,
|
50
|
+
template_variable_presets: TEMPLATE_VARIABLE_PRESETS
|
41
51
|
}
|
42
52
|
DASHBOARD_ARGS = REQUIRED_ARGS.values + [OPTIONS]
|
43
53
|
DASHBOARD_PAYLOAD = REQUIRED_ARGS.merge(OPTIONS)
|
@@ -0,0 +1,73 @@
|
|
1
|
+
require_relative '../spec_helper'
|
2
|
+
|
3
|
+
describe Dogapi::Client do
|
4
|
+
SLO_ID = '42424242424242424242424242424242'.freeze
|
5
|
+
SLO_TYPE = 'metric'.freeze
|
6
|
+
SLO_NAME = 'test slo'.freeze
|
7
|
+
SLO_DESCRIPTION = 'test slo description'.freeze
|
8
|
+
SLO_QUERY_NUMERATOR = 'sum:test.metric.metric{type:good}.as_count()'.freeze
|
9
|
+
SLO_QUERY_DENOMINATOR = 'sum:test.metric.metric{*}.as_count()'.freeze
|
10
|
+
SLO_TAGS = ['type:test'].freeze
|
11
|
+
SLO_THRESHOLDS = [{ timeframe: '7d', target: 90 }, { timeframe: '30d', target: 95 }].freeze
|
12
|
+
|
13
|
+
describe '#create_service_level_objective' do
|
14
|
+
it_behaves_like 'an api method',
|
15
|
+
:create_service_level_objective, [SLO_TYPE, SLO_NAME, SLO_THRESHOLDS, {
|
16
|
+
description: SLO_DESCRIPTION,
|
17
|
+
tags: SLO_TAGS,
|
18
|
+
numerator: SLO_QUERY_NUMERATOR,
|
19
|
+
denominator: SLO_QUERY_DENOMINATOR
|
20
|
+
}],
|
21
|
+
:post, '/slo', 'type' => SLO_TYPE, 'name' => SLO_NAME, 'thresholds' => SLO_THRESHOLDS,
|
22
|
+
'query' => { numerator: SLO_QUERY_NUMERATOR, denominator: SLO_QUERY_DENOMINATOR },
|
23
|
+
'tags' => SLO_TAGS, 'description' => SLO_DESCRIPTION
|
24
|
+
end
|
25
|
+
|
26
|
+
describe '#update_service_level_objective' do
|
27
|
+
it_behaves_like 'an api method',
|
28
|
+
:update_service_level_objective, [SLO_ID, SLO_TYPE, { name: SLO_NAME }],
|
29
|
+
:put, "/slo/#{SLO_ID}", 'type' => SLO_TYPE, 'name' => SLO_NAME
|
30
|
+
end
|
31
|
+
|
32
|
+
describe '#get_service_level_objective' do
|
33
|
+
it_behaves_like 'an api method',
|
34
|
+
:get_service_level_objective, [SLO_ID],
|
35
|
+
:get, "/slo/#{SLO_ID}"
|
36
|
+
end
|
37
|
+
|
38
|
+
describe '#get_service_level_objective_history' do
|
39
|
+
it_behaves_like 'an api method with params',
|
40
|
+
:get_service_level_objective_history, [SLO_ID],
|
41
|
+
:get, "/slo/#{SLO_ID}/history", 'from_ts' => 0, 'to_ts' => 1_000_000
|
42
|
+
end
|
43
|
+
|
44
|
+
describe '#can_delete_service_level_objective' do
|
45
|
+
it_behaves_like 'an api method with params',
|
46
|
+
:can_delete_service_level_objective, [],
|
47
|
+
:get, '/slo/can_delete', 'ids' => [SLO_ID]
|
48
|
+
end
|
49
|
+
|
50
|
+
describe '#search_service_level_objective' do
|
51
|
+
it_behaves_like 'an api method with optional params',
|
52
|
+
:search_service_level_objective, [[SLO_ID]],
|
53
|
+
:get, '/slo/', 'ids' => SLO_ID
|
54
|
+
end
|
55
|
+
|
56
|
+
describe '#delete_service_level_objective' do
|
57
|
+
it_behaves_like 'an api method',
|
58
|
+
:delete_service_level_objective, [SLO_ID],
|
59
|
+
:delete, "/slo/#{SLO_ID}"
|
60
|
+
end
|
61
|
+
|
62
|
+
describe '#delete_many_service_level_objective' do
|
63
|
+
it_behaves_like 'an api method',
|
64
|
+
:delete_many_service_level_objective, [[SLO_ID]],
|
65
|
+
:delete, '/slo/', 'ids' => [SLO_ID]
|
66
|
+
end
|
67
|
+
|
68
|
+
describe '#delete_timeframes_service_level_objective' do
|
69
|
+
it_behaves_like 'an api method',
|
70
|
+
:delete_timeframes_service_level_objective, [{ SLO_ID => ['7d'] }],
|
71
|
+
:post, '/slo/bulk_delete', SLO_ID => ['7d']
|
72
|
+
end
|
73
|
+
end
|
data/spec/spec_helper.rb
CHANGED
@@ -10,7 +10,19 @@ SimpleCov.start do
|
|
10
10
|
add_filter 'spec'
|
11
11
|
end
|
12
12
|
|
13
|
-
|
13
|
+
webmock_allow = []
|
14
|
+
|
15
|
+
begin
|
16
|
+
require 'ddtrace'
|
17
|
+
Datadog.configure do |c|
|
18
|
+
c.use :rspec, service_name: 'dogapi-rb'
|
19
|
+
end
|
20
|
+
webmock_allow << "#{Datadog::Transport::HTTP.default_hostname}:#{Datadog::Transport::HTTP.default_port}"
|
21
|
+
rescue LoadError
|
22
|
+
puts 'ddtrace gem not found'
|
23
|
+
end
|
24
|
+
|
25
|
+
WebMock.disable_net_connect!(allow_localhost: false, allow: webmock_allow)
|
14
26
|
|
15
27
|
# include our code and methods
|
16
28
|
require 'dogapi'
|
data/spec/unit/common_spec.rb
CHANGED
@@ -134,6 +134,15 @@ describe 'Common' do
|
|
134
134
|
expect(req['DD-APPLICATION-KEY']).to eq service.application_key
|
135
135
|
end
|
136
136
|
end
|
137
|
+
|
138
|
+
it 'properly sets User-Agent header' do
|
139
|
+
service = Dogapi::APIService.new('api_key', 'app_key', true, nil, 'https://app.example.com')
|
140
|
+
params = service.prepare_params(nil, '/api/v1/validate', true)
|
141
|
+
req = service.prepare_request(Net::HTTP::Get, '/api/v1/validate', params, nil, false, true)
|
142
|
+
|
143
|
+
expect(req.key?('User-Agent')).to be true
|
144
|
+
expect(req['User-Agent']).to match(%r{dogapi-rb\/[^\s]+ \(ruby [^\s]+; os [^\s]+; arch [^\s]+\)})
|
145
|
+
end
|
137
146
|
end
|
138
147
|
end
|
139
148
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: dogapi
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.44.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Datadog, Inc.
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-
|
11
|
+
date: 2020-12-10 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: multi_json
|
@@ -131,6 +131,7 @@ files:
|
|
131
131
|
- lib/dogapi/v1/screenboard.rb
|
132
132
|
- lib/dogapi/v1/search.rb
|
133
133
|
- lib/dogapi/v1/service_check.rb
|
134
|
+
- lib/dogapi/v1/service_level_objective.rb
|
134
135
|
- lib/dogapi/v1/snapshot.rb
|
135
136
|
- lib/dogapi/v1/synthetics.rb
|
136
137
|
- lib/dogapi/v1/tag.rb
|
@@ -158,6 +159,7 @@ files:
|
|
158
159
|
- spec/integration/screenboard_spec.rb
|
159
160
|
- spec/integration/search_spec.rb
|
160
161
|
- spec/integration/service_check_spec.rb
|
162
|
+
- spec/integration/service_level_objective_spec.rb
|
161
163
|
- spec/integration/snapshot_spec.rb
|
162
164
|
- spec/integration/synthetics_spec.rb
|
163
165
|
- spec/integration/tag_spec.rb
|
@@ -175,7 +177,7 @@ metadata:
|
|
175
177
|
changelog_uri: https://github.com/DataDog/dogapi-rb/blob/master/CHANGELOG.md
|
176
178
|
documentation_uri: https://docs.datadoghq.com/api/
|
177
179
|
source_code_uri: https://github.com/DataDog/dogapi-rb
|
178
|
-
post_install_message:
|
180
|
+
post_install_message:
|
179
181
|
rdoc_options:
|
180
182
|
- "--title"
|
181
183
|
- DogAPI -- Datadog Client
|
@@ -197,7 +199,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
197
199
|
version: '0'
|
198
200
|
requirements: []
|
199
201
|
rubygems_version: 3.0.6
|
200
|
-
signing_key:
|
202
|
+
signing_key:
|
201
203
|
specification_version: 4
|
202
204
|
summary: Ruby bindings for Datadog's API
|
203
205
|
test_files:
|
@@ -220,6 +222,7 @@ test_files:
|
|
220
222
|
- spec/integration/screenboard_spec.rb
|
221
223
|
- spec/integration/search_spec.rb
|
222
224
|
- spec/integration/service_check_spec.rb
|
225
|
+
- spec/integration/service_level_objective_spec.rb
|
223
226
|
- spec/integration/snapshot_spec.rb
|
224
227
|
- spec/integration/synthetics_spec.rb
|
225
228
|
- spec/integration/tag_spec.rb
|