dogapi 1.39.0 → 1.40.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 220b05feea1448dc86ed0be4b9efdc730ff56d561965d9e004de6c6c2daf8091
4
- data.tar.gz: 2d161a3452ad1e7fe0e4d0039bf10866f10fd868ac008fe6d0b17485395289fb
3
+ metadata.gz: 03dcbb8f50795fb901c13effb712107ac78beb545d55bebccb9f2cfc83c92908
4
+ data.tar.gz: d6cbb3c3dd0807d8d684879fa3efb44e8a54acd7c07298261ebc11b5b9a099e4
5
5
  SHA512:
6
- metadata.gz: 5c835303762440f2e6293d308dfd7cc19585194572960fd4244e8ac84035733d5fa47622b28b74b61ca5356a0f87aeba97385ee6dd3108b4a24f0c307fc5761b
7
- data.tar.gz: b4ae214e6f20ae634e32492c87dd9c50010d0c9ef8e4635a1cd9e76ebef75992bc215e096673ad01052ea00a770b25e95e85ce8a4bd0ddfdb94f690738f1c6ce
6
+ metadata.gz: 4b969abe11bd88812b9eb70066fb1d1fb2ff5df49a5a95de7c92893357dde80af0e5636500b1a7ed9703ce525a96d10662ff4900d09fd2676db263be17dfcaaf
7
+ data.tar.gz: 3b63c822096ba541151e837c16d47c0aa298baff22257be5b098e13041bba0dd00bba328d479240d17b2c58c9a1c9cacfdbf33a9416752b5a61a4dd65a999457
@@ -520,3 +520,6 @@ Style/YodaCondition:
520
520
  Style/ZeroLengthPredicate:
521
521
  Exclude:
522
522
  - 'lib/capistrano/datadog.rb'
523
+
524
+ Style/SymbolArray:
525
+ EnforcedStyle: brackets # Since ruby1.9 is supported
@@ -1,5 +1,9 @@
1
1
  # Changes
2
2
 
3
+ ## 1.40.0 / 2020-04-06
4
+
5
+ * [Added] Re-add service level objectives support. See [#224](https://github.com/DataDog/dogapi-rb/pull/224).
6
+
3
7
  ## 1.39.0 / 2020-02-04
4
8
 
5
9
  * [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
@@ -4,6 +4,8 @@ gemspec
4
4
 
5
5
  group :test do
6
6
  gem 'rubocop', "~> 0.49.0"
7
+ # NOTE: rake < 12.3.3 is vulnerable to CVE-2020-8130, but we only use it as a test dependency
8
+ # and neither our users nor our CI is vulnerable in any way
7
9
  gem 'rake', '>= 2.4.2'
8
10
  gem 'rspec'
9
11
  gem 'simplecov'
@@ -4,6 +4,8 @@ gemspec
4
4
 
5
5
  group :test do
6
6
  gem 'rubocop', "~> 0.41.0"
7
+ # NOTE: rake < 12.3.3 is vulnerable to CVE-2020-8130, but we only use it as a test dependency
8
+ # and neither our users nor our CI is vulnerable in any way
7
9
  gem 'rake', '>= 2.4.2'
8
10
  gem 'rspec'
9
11
  gem 'simplecov', "~> 0.11.2"
@@ -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
 
@@ -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
@@ -224,4 +224,14 @@ module Dogapi
224
224
  raise ArgumentError, "Each tag needs to be a string. Current value: #{tag}" unless tag.is_a? String
225
225
  end
226
226
  end
227
+
228
+ # Very simplified hash with indifferent access - access to string or symbol
229
+ # keys via symbols. E.g.:
230
+ # my_hash = { 'foo' => 1 }
231
+ # Dogapi.symbolized_access(my_hash)
232
+ # my_hash[:foo] # => 1
233
+ def Dogapi.symbolized_access(hash)
234
+ hash.default_proc = proc { |h, k| h.key?(k.to_s) ? h[k.to_s] : nil }
235
+ hash
236
+ end
227
237
  end
@@ -105,6 +105,9 @@ module Dogapi
105
105
  @usage_svc = Dogapi::V1::UsageService.new(@api_key, @application_key, silent, timeout, @datadog_host)
106
106
  @azure_integration_svc = Dogapi::V1::AzureIntegrationService.new(@api_key, @application_key, silent, timeout, @datadog_host)
107
107
  @gcp_integration_svc = Dogapi::V1::GcpIntegrationService.new(@api_key, @application_key, silent, timeout, @datadog_host)
108
+ @service_level_objective_svc = Dogapi::V1::ServiceLevelObjectiveService.new(@api_key, @application_key, silent,
109
+ timeout, @datadog_host)
110
+
108
111
  # Support for Dashboard List API v2.
109
112
  @v2 = Dogapi::ClientV2.new(@api_key, @application_key, true, true, @datadog_host)
110
113
 
@@ -673,6 +676,46 @@ module Dogapi
673
676
  @monitor_svc.unmute_host(hostname)
674
677
  end
675
678
 
679
+ #
680
+ # SERVICE LEVEL OBJECTIVES
681
+ #
682
+
683
+ def create_service_level_objective(type, slo_name, thresholds, options = {})
684
+ @service_level_objective_svc.create_service_level_objective(type, slo_name, thresholds, options)
685
+ end
686
+
687
+ def update_service_level_objective(slo_id, type, options = {})
688
+ @service_level_objective_svc.update_service_level_objective(slo_id, type, options)
689
+ end
690
+
691
+ def get_service_level_objective(slo_id)
692
+ @service_level_objective_svc.get_service_level_objective(slo_id)
693
+ end
694
+
695
+ def get_service_level_objective_history(slo_id, from_ts, to_ts)
696
+ @service_level_objective_svc.get_service_level_objective_history(slo_id, from_ts, to_ts)
697
+ end
698
+
699
+ def search_service_level_objective(slo_ids = nil, query = nil, offset = nil, limit = nil)
700
+ @service_level_objective_svc.search_service_level_objective(slo_ids, query, offset, limit)
701
+ end
702
+
703
+ def can_delete_service_level_objective(slo_ids)
704
+ @service_level_objective_svc.can_delete_service_level_objective(slo_ids)
705
+ end
706
+
707
+ def delete_service_level_objective(slo_id)
708
+ @service_level_objective_svc.delete_service_level_objective(slo_id)
709
+ end
710
+
711
+ def delete_many_service_level_objective(slo_ids)
712
+ @service_level_objective_svc.delete_many_service_level_objective(slo_ids)
713
+ end
714
+
715
+ def delete_timeframes_service_level_objective(ops)
716
+ @service_level_objective_svc.delete_timeframes_service_level_objective(ops)
717
+ end
718
+
676
719
  #
677
720
  # SERVICE CHECKS
678
721
  #
@@ -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'
@@ -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
@@ -3,5 +3,5 @@
3
3
  # Copyright 2011-Present Datadog, Inc.
4
4
 
5
5
  module Dogapi
6
- VERSION = '1.39.0'
6
+ VERSION = '1.40.0'
7
7
  end
@@ -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
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.39.0
4
+ version: 1.40.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Datadog, Inc.
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-02-04 00:00:00.000000000 Z
11
+ date: 2020-04-06 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
@@ -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