dogapi 1.1.0 → 1.2.1
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.
- data/README.rdoc +34 -17
- data/lib/dogapi/common.rb +69 -7
- data/lib/dogapi/event.rb +20 -7
- data/lib/dogapi/facade.rb +87 -24
- data/lib/dogapi/metric.rb +5 -1
- data/lib/dogapi/v1.rb +3 -0
- data/lib/dogapi/v1/event.rb +71 -0
- data/lib/dogapi/v1/metric.rb +33 -0
- data/lib/dogapi/v1/tag.rb +72 -0
- data/tests/tc_client.rb +86 -20
- data/tests/ts_dogapi.rb +0 -3
- metadata +9 -8
- data/tests/tc_env.rb +0 -23
- data/tests/tc_event.rb +0 -35
- data/tests/tc_metric.rb +0 -29
data/README.rdoc
CHANGED
@@ -1,7 +1,20 @@
|
|
1
|
-
= Ruby client for Datadog API v1.1
|
1
|
+
= Ruby client for Datadog API v1.2.1
|
2
2
|
|
3
3
|
The Ruby client is a library suitable for inclusion in existing Ruby projects or for development of standalone scripts. It provides an abstraction on top of Datadog's raw HTTP interface for reporting events and metrics.
|
4
4
|
|
5
|
+
= What's new?
|
6
|
+
|
7
|
+
== v1.2.x
|
8
|
+
|
9
|
+
* You can now manage host tags
|
10
|
+
* You can now get event details and query the stream in addition to posting events
|
11
|
+
* Functionality relating to events with a duration has been deprecated
|
12
|
+
* The underlying clients have been updated to use Datadog's new public HTTP API[https://github.com/DataDog/dogapi/wiki]
|
13
|
+
|
14
|
+
== v1.1.x
|
15
|
+
|
16
|
+
* You do not need to use environment variables anymore to use the client.
|
17
|
+
|
5
18
|
= Installation
|
6
19
|
|
7
20
|
== From Source
|
@@ -20,7 +33,7 @@ Gem page: https://rubygems.org/gems/dogapi
|
|
20
33
|
|
21
34
|
= Usage
|
22
35
|
|
23
|
-
== How to find your API
|
36
|
+
== How to find your API and application keys
|
24
37
|
|
25
38
|
Go to your setup page[https://app.datadoghq.com/account/settings].
|
26
39
|
|
@@ -34,62 +47,66 @@ on a host, simply specify the device when calling emit functions.
|
|
34
47
|
|
35
48
|
== Submit an event to Datadog
|
36
49
|
|
37
|
-
=== If the event has no duration
|
38
50
|
|
39
51
|
require 'rubygems'
|
40
52
|
require 'dogapi'
|
41
53
|
|
42
54
|
api_key = "abcdef123456"
|
43
55
|
|
56
|
+
# submitting events doesn't require an application_key, so we don't bother setting it
|
44
57
|
dog = Dogapi::Client.new(api_key)
|
45
58
|
|
46
|
-
dog.emit_event(Dogapi::Event.new('Testing done, FTW'), host => "my_host")
|
59
|
+
dog.emit_event(Dogapi::Event.new('Testing done, FTW'), :host => "my_host")
|
60
|
+
|
61
|
+
|
62
|
+
== Tag a host in Datadog
|
47
63
|
|
48
|
-
=== If the event has a duration
|
49
64
|
|
50
65
|
require 'rubygems'
|
51
66
|
require 'dogapi'
|
52
67
|
|
53
68
|
api_key = "abcdef123456"
|
69
|
+
application_key = "fedcba654321"
|
54
70
|
|
55
|
-
dog = Dogapi::Client.new(api_key)
|
71
|
+
dog = Dogapi::Client.new(api_key, application_key)
|
72
|
+
|
73
|
+
dog.add_tags("my_host", ["tagA", "tagB"])
|
56
74
|
|
57
|
-
dog.start_event(Dogapi::Event.new('My event with a duration'), host => "my_host") do
|
58
|
-
# do your work here...
|
59
|
-
# e.g. sleep 1
|
60
|
-
end
|
61
|
-
# stop_event will be sent automatically
|
62
75
|
|
63
76
|
== Submit a metric to Datadog
|
64
77
|
|
65
|
-
You want to track a new metric called +some
|
78
|
+
You want to track a new metric called +some+.+metric+.+name+ and have just sampled it from +my_device+ on +my_host+.
|
66
79
|
Its value is 50. Here is how you submit the value to Datadog.
|
67
80
|
|
81
|
+
|
68
82
|
require 'rubygems'
|
69
83
|
require 'dogapi'
|
70
84
|
|
71
85
|
api_key = "abcdef123456"
|
72
86
|
|
87
|
+
# submitting metrics doesn't require an application_key, so we don't bother setting it
|
73
88
|
dog = Dogapi::Client.new(api_key)
|
74
89
|
|
75
|
-
dog.emit_point
|
90
|
+
dog.emit_point('some.metric.name', 50.0, :host => "my_host", :device => "my_device")
|
91
|
+
|
76
92
|
|
77
93
|
Let us now assume that you have sampled the metric multiple times and you would like to submit the results.
|
78
94
|
You can use the +emit_points+ method (instead of +emit_point+). Since you are submitting more than one
|
79
95
|
data point you will need to pass a list of +Time+, +float+ pairs, instead of a simple +float+ value.
|
80
96
|
|
97
|
+
|
81
98
|
require 'rubygems'
|
82
99
|
require 'dogapi'
|
83
100
|
|
84
|
-
|
101
|
+
# Actual sampling takes place
|
85
102
|
t1 = Time.now
|
86
103
|
val1 = 50.0
|
87
104
|
|
88
|
-
|
105
|
+
# some time elapses
|
89
106
|
t2 = Time.now
|
90
107
|
val2 = 51.0
|
91
108
|
|
92
|
-
|
109
|
+
# some more time elapses
|
93
110
|
t3 = Time.now
|
94
111
|
val3 = -60.0
|
95
112
|
|
@@ -97,4 +114,4 @@ data point you will need to pass a list of +Time+, +float+ pairs, instead of a s
|
|
97
114
|
|
98
115
|
dog = Dogapi::Client.new(api_key)
|
99
116
|
|
100
|
-
dog.emit_points
|
117
|
+
dog.emit_points('some.metric.name', [[t1, val1], [t2, val2], [t3, val3]], :host => "my_host", :device => "my_device")
|
data/lib/dogapi/common.rb
CHANGED
@@ -18,15 +18,17 @@ module Dogapi
|
|
18
18
|
end
|
19
19
|
end
|
20
20
|
|
21
|
-
#
|
21
|
+
# <b>DEPRECATED:</b> Going forward, use the newer APIService.
|
22
22
|
class Service
|
23
|
+
# <b>DEPRECATED:</b> Going forward, use the newer APIService.
|
23
24
|
def initialize(api_key, api_host=Dogapi.find_datadog_host)
|
24
25
|
@api_key = api_key
|
25
26
|
@host = api_host
|
26
27
|
end
|
27
28
|
|
28
|
-
#
|
29
|
+
# <b>DEPRECATED:</b> Going forward, use the newer APIService.
|
29
30
|
def connect
|
31
|
+
warn "[DEPRECATION] Dogapi::Service has been deprecated in favor of the newer V1 services"
|
30
32
|
uri = URI.parse(@host)
|
31
33
|
session = Net::HTTP.new(uri.host, uri.port)
|
32
34
|
if 'https' == uri.scheme
|
@@ -41,12 +43,9 @@ module Dogapi
|
|
41
43
|
end
|
42
44
|
end
|
43
45
|
|
44
|
-
#
|
45
|
-
#
|
46
|
-
# +method+ is an implementation of Net::HTTP::Request (e.g. Net::HTTP::Post)
|
47
|
-
#
|
48
|
-
# +params+ is a Hash that will be converted to request parameters
|
46
|
+
# <b>DEPRECATED:</b> Going forward, use the newer APIService.
|
49
47
|
def request(method, url, params)
|
48
|
+
warn "[DEPRECATION] Dogapi::Service has been deprecated in favor of the newer V1 services"
|
50
49
|
if !params.has_key? :api_key
|
51
50
|
params[:api_key] = @api_key
|
52
51
|
end
|
@@ -72,6 +71,69 @@ module Dogapi
|
|
72
71
|
end
|
73
72
|
end
|
74
73
|
|
74
|
+
# Superclass that deals with the details of communicating with the DataDog API
|
75
|
+
class APIService
|
76
|
+
def initialize(api_key, application_key)
|
77
|
+
@api_key = api_key
|
78
|
+
@application_key = application_key
|
79
|
+
@api_host = Dogapi.find_datadog_host()
|
80
|
+
end
|
81
|
+
|
82
|
+
# Manages the HTTP connection
|
83
|
+
def connect
|
84
|
+
uri = URI.parse(@api_host)
|
85
|
+
session = Net::HTTP.new(uri.host, uri.port)
|
86
|
+
if 'https' == uri.scheme
|
87
|
+
session.use_ssl = true
|
88
|
+
# FIXME - turn off SSL verification for now until we can spend
|
89
|
+
# some time figuring out how to find certs across platforms.
|
90
|
+
# - matt 10/06/2011
|
91
|
+
session.verify_mode = OpenSSL::SSL::VERIFY_NONE
|
92
|
+
end
|
93
|
+
session.start do |conn|
|
94
|
+
yield(conn)
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
# Prepares the request and handles the response
|
99
|
+
#
|
100
|
+
# +method+ is an implementation of Net::HTTP::Request (e.g. Net::HTTP::Post)
|
101
|
+
#
|
102
|
+
# +params+ is a Hash that will be converted to request parameters
|
103
|
+
def request(method, url, params, body, send_json)
|
104
|
+
resp_obj = nil
|
105
|
+
resp = nil
|
106
|
+
connect do |conn|
|
107
|
+
if params and params.size > 0
|
108
|
+
qs_params = params.map { |k,v| k.to_s + "=" + v.to_s }
|
109
|
+
qs = "?" + qs_params.join("&")
|
110
|
+
url = url + qs
|
111
|
+
end
|
112
|
+
|
113
|
+
req = method.new(url)
|
114
|
+
|
115
|
+
if send_json
|
116
|
+
req.content_type = 'application/json'
|
117
|
+
req.body = JSON.generate(body)
|
118
|
+
end
|
119
|
+
|
120
|
+
resp = conn.request(req)
|
121
|
+
resp_str = resp.body
|
122
|
+
|
123
|
+
if resp.code != 204 and resp.body != '' and resp.body != 'null' and resp.body != nil
|
124
|
+
begin
|
125
|
+
resp_obj = JSON.parse(resp.body)
|
126
|
+
rescue
|
127
|
+
raise 'Invalid JSON Response: ' + resp.body
|
128
|
+
end
|
129
|
+
else
|
130
|
+
resp_obj = {}
|
131
|
+
end
|
132
|
+
end
|
133
|
+
return resp.code, resp_obj
|
134
|
+
end
|
135
|
+
end
|
136
|
+
|
75
137
|
def Dogapi.find_datadog_host
|
76
138
|
# allow env-based overriding, useful for tests
|
77
139
|
ENV["DATADOG_HOST"] || "https://app.datadoghq.com"
|
data/lib/dogapi/event.rb
CHANGED
@@ -15,6 +15,9 @@ module Dogapi
|
|
15
15
|
:event_object,
|
16
16
|
:msg_title,
|
17
17
|
:msg_text,
|
18
|
+
:priority,
|
19
|
+
:parent,
|
20
|
+
:tags,
|
18
21
|
:json_payload
|
19
22
|
|
20
23
|
# Optional arguments:
|
@@ -25,6 +28,9 @@ module Dogapi
|
|
25
28
|
# :event_type => String
|
26
29
|
# :event_object => String
|
27
30
|
# :msg_title => String
|
31
|
+
# :priority => String
|
32
|
+
# :parent => event ID (integer)
|
33
|
+
# :tags => array of Strings
|
28
34
|
# :json_payload => String
|
29
35
|
def initialize(msg_text, options={})
|
30
36
|
defaults = {
|
@@ -35,6 +41,9 @@ module Dogapi
|
|
35
41
|
:event_type => '',
|
36
42
|
:event_object => '',
|
37
43
|
:msg_title => '',
|
44
|
+
:priority => "normal",
|
45
|
+
:parent => nil,
|
46
|
+
:tags => [],
|
38
47
|
:json_payload => ''
|
39
48
|
}
|
40
49
|
options = defaults.merge(options)
|
@@ -47,17 +56,23 @@ module Dogapi
|
|
47
56
|
@event_type = options[:event_type]
|
48
57
|
@event_object = options[:event_object]
|
49
58
|
@msg_title = options[:msg_title]
|
59
|
+
@priority = options[:priority]
|
60
|
+
@parent = options[:parent]
|
61
|
+
@tags = options[:tags]
|
50
62
|
@json_payload = options[:json_payload]
|
51
63
|
end
|
52
64
|
end
|
53
65
|
|
54
|
-
#
|
66
|
+
# <b>DEPRECATED:</b> Going forward, use the V1 services. This legacy service will be
|
67
|
+
# removed in an upcoming release.
|
55
68
|
class EventService < Dogapi::Service
|
56
69
|
|
57
70
|
API_VERSION = "1.0.0"
|
58
71
|
|
59
|
-
#
|
72
|
+
# <b>DEPRECATED:</b> Going forward, use the V1 services. This legacy service will be
|
73
|
+
# removed in an upcoming release.
|
60
74
|
def submit(api_key, event, scope=nil, source_type=nil)
|
75
|
+
warn "[DEPRECATION] Dogapi::EventService.submit() has been deprecated in favor of the newer V1 services"
|
61
76
|
scope = scope || Dogapi::Scope.new()
|
62
77
|
params = {
|
63
78
|
:api_key => api_key,
|
@@ -84,12 +99,10 @@ module Dogapi
|
|
84
99
|
request Net::HTTP::Post, '/event/submit', params
|
85
100
|
end
|
86
101
|
|
87
|
-
#
|
88
|
-
#
|
89
|
-
# 0. The start time is recorded immediately
|
90
|
-
# 0. The given block is executed with access to the response of the start request
|
91
|
-
# 0. The end time is recorded once the block completes execution
|
102
|
+
# <b>DEPRECATED:</b> Going forward, use the V1 services. This legacy service will be
|
103
|
+
# removed in an upcoming release.
|
92
104
|
def start(api_key, event, scope, source_type=nil)
|
105
|
+
warn "[DEPRECATION] Dogapi::EventService.start() has been deprecated in favor of the newer V1 services"
|
93
106
|
response = submit api_key, event, scope, source_type
|
94
107
|
success = nil
|
95
108
|
|
data/lib/dogapi/facade.rb
CHANGED
@@ -1,15 +1,17 @@
|
|
1
1
|
require 'time'
|
2
|
-
require 'dogapi/
|
2
|
+
require 'dogapi/v1'
|
3
3
|
|
4
4
|
module Dogapi
|
5
5
|
|
6
6
|
# A simple DogAPI client
|
7
7
|
#
|
8
|
-
# See Dogapi::
|
8
|
+
# See Dogapi::V1 for the thick underlying clients
|
9
|
+
#
|
10
|
+
# Class methods return a tuple of (+response_code+, +response_body+). Unless otherwise noted, the response body is deserialized JSON. Up-to-date information about the JSON object structure is available in the HTTP API documentation, here[https://github.com/DataDog/dogapi/wiki].
|
9
11
|
class Client
|
10
12
|
|
11
13
|
# Create a new Client optionally specifying a default host and device
|
12
|
-
def initialize(api_key, host=nil, device=nil)
|
14
|
+
def initialize(api_key, application_key=nil, host=nil, device=nil)
|
13
15
|
|
14
16
|
if api_key
|
15
17
|
@api_key = api_key
|
@@ -17,15 +19,23 @@ module Dogapi
|
|
17
19
|
raise 'Please provide an API key to submit your data'
|
18
20
|
end
|
19
21
|
|
22
|
+
@application_key = application_key
|
23
|
+
|
20
24
|
@datadog_host = Dogapi.find_datadog_host()
|
21
25
|
|
22
26
|
@host = host
|
23
27
|
@device = device
|
24
28
|
|
25
|
-
@metric_svc = Dogapi::MetricService.new(@
|
26
|
-
@event_svc = Dogapi::EventService.new(@
|
29
|
+
@metric_svc = Dogapi::V1::MetricService.new(@api_key, @application_key)
|
30
|
+
@event_svc = Dogapi::V1::EventService.new(@api_key, @application_key)
|
31
|
+
@tag_svc = Dogapi::V1::TagService.new(@api_key, @application_key)
|
32
|
+
|
33
|
+
@legacy_event_svc = Dogapi::EventService.new(@datadog_host)
|
27
34
|
end
|
28
35
|
|
36
|
+
#
|
37
|
+
# METRICS
|
38
|
+
|
29
39
|
# Record a single point of metric data
|
30
40
|
#
|
31
41
|
# Optional arguments:
|
@@ -36,10 +46,10 @@ module Dogapi
|
|
36
46
|
defaults = {:timestamp => Time.now, :host => nil, :device => nil}
|
37
47
|
options = defaults.merge(options)
|
38
48
|
|
39
|
-
self.emit_points
|
49
|
+
self.emit_points(metric,
|
40
50
|
[[options[:timestamp], value]],
|
41
51
|
:host => options[:host],
|
42
|
-
:device => options[:device]
|
52
|
+
:device => options[:device])
|
43
53
|
end
|
44
54
|
|
45
55
|
# Record a set of points of metric data
|
@@ -57,52 +67,105 @@ module Dogapi
|
|
57
67
|
|
58
68
|
points.each do |p|
|
59
69
|
p[0].kind_of? Time or raise "Not a Time"
|
60
|
-
p[
|
70
|
+
p[0] = p[0].to_i
|
71
|
+
p[1] = p[1].to_f # TODO: stupid to_f will never raise an exception
|
61
72
|
end
|
62
73
|
|
63
|
-
@metric_svc.submit
|
74
|
+
@metric_svc.submit(metric, points, scope)
|
64
75
|
end
|
65
76
|
|
66
|
-
# Record an event with no duration
|
67
77
|
#
|
68
|
-
#
|
78
|
+
# EVENTS
|
79
|
+
|
80
|
+
# Record an event
|
69
81
|
#
|
70
82
|
# Optional arguments:
|
71
83
|
# :host => String
|
72
84
|
# :device => String
|
73
|
-
# :source_type => String
|
74
85
|
def emit_event(event, options={})
|
75
|
-
defaults = {:host => nil, :device => nil
|
86
|
+
defaults = {:host => nil, :device => nil}
|
76
87
|
options = defaults.merge(options)
|
77
88
|
|
78
|
-
scope = override_scope
|
89
|
+
scope = override_scope(options[:host], options[:device])
|
90
|
+
|
91
|
+
@event_svc.post(event, scope)
|
92
|
+
end
|
79
93
|
|
80
|
-
|
94
|
+
# Get the details of an event
|
95
|
+
#
|
96
|
+
# +id+ of the event to get
|
97
|
+
def get_event(id)
|
98
|
+
@event_svc.get(id)
|
81
99
|
end
|
82
100
|
|
83
|
-
#
|
101
|
+
# Get an optionally filtered event stream
|
84
102
|
#
|
85
|
-
#
|
86
|
-
# 0. The given block is executed
|
87
|
-
# 0. The end time is recorded once the block completes execution
|
103
|
+
# +start+ is a Time object for when to start the stream
|
88
104
|
#
|
89
|
-
#
|
105
|
+
# +stop+ is a Time object for when to end the stream
|
90
106
|
#
|
91
107
|
# Optional arguments:
|
92
|
-
#
|
93
|
-
#
|
94
|
-
#
|
108
|
+
# :priority => "normal" or "low"
|
109
|
+
# :sources => String, see https://github.com/DataDog/dogapi/wiki/Event for a current list of sources
|
110
|
+
# :tags => Array of Strings
|
111
|
+
def stream(start, stop, options={})
|
112
|
+
@event_svc.stream(start, stop, options)
|
113
|
+
end
|
114
|
+
|
115
|
+
# <b>DEPRECATED:</b> Recording events with a duration has been deprecated.
|
116
|
+
# The functionality will be removed in a later release.
|
95
117
|
def start_event(event, options={})
|
118
|
+
warn "[DEPRECATION] Dogapi::Client.start_event() is deprecated. Use `emit_event` instead."
|
96
119
|
defaults = {:host => nil, :device => nil, :source_type => nil}
|
97
120
|
options = defaults.merge(options)
|
98
121
|
|
99
122
|
scope = override_scope options[:host], options[:device]
|
100
123
|
|
101
|
-
@
|
124
|
+
@legacy_event_svc.start(@api_key, event, scope, options[:source_type]) do
|
102
125
|
yield
|
103
126
|
end
|
104
127
|
end
|
105
128
|
|
129
|
+
#
|
130
|
+
# TAGS
|
131
|
+
|
132
|
+
# Get all tags and their associated hosts at your org
|
133
|
+
def all_tags()
|
134
|
+
@tag_svc.get_all()
|
135
|
+
end
|
136
|
+
|
137
|
+
# Get all tags for the given host
|
138
|
+
#
|
139
|
+
# +host_id+ can be the host's numeric id or string name
|
140
|
+
def host_tags(host_id)
|
141
|
+
@tag_svc.get(host_id)
|
142
|
+
end
|
143
|
+
|
144
|
+
# Add the tags to the given host
|
145
|
+
#
|
146
|
+
# +host_id+ can be the host's numeric id or string name
|
147
|
+
#
|
148
|
+
# +tags+ is and Array of Strings
|
149
|
+
def add_tags(host_id, tags)
|
150
|
+
@tag_svc.add(host_id, tags)
|
151
|
+
end
|
152
|
+
|
153
|
+
# Replace the tags on the given host
|
154
|
+
#
|
155
|
+
# +host_id+ can be the host's numeric id or string name
|
156
|
+
#
|
157
|
+
# +tags+ is and Array of Strings
|
158
|
+
def update_tags(host_id, tags)
|
159
|
+
@tag_svc.update(host_id, tags)
|
160
|
+
end
|
161
|
+
|
162
|
+
# Remove all tags from the given host
|
163
|
+
#
|
164
|
+
# +host_id+ can be the host's numeric id or string name
|
165
|
+
def detatch_tags(host_id)
|
166
|
+
@tag_svc.detatch(host_id)
|
167
|
+
end
|
168
|
+
|
106
169
|
private
|
107
170
|
|
108
171
|
def override_scope(host, device)
|
data/lib/dogapi/metric.rb
CHANGED
@@ -5,12 +5,16 @@ require 'json'
|
|
5
5
|
|
6
6
|
module Dogapi
|
7
7
|
|
8
|
+
# <b>DEPRECATED:</b> Going forward, use the V1 services. This legacy service will be
|
9
|
+
# removed in an upcoming release.
|
8
10
|
class MetricService < Dogapi::Service
|
9
11
|
|
10
12
|
API_VERSION = "1.0.0"
|
11
13
|
|
12
|
-
#
|
14
|
+
# <b>DEPRECATED:</b> Going forward, use the V1 services. This legacy service will be
|
15
|
+
# removed in an upcoming release.
|
13
16
|
def submit(api_key, scope, metric, points)
|
17
|
+
warn "[DEPRECATION] Dogapi::MetricService.submit() has been deprecated in favor of the newer V1 services"
|
14
18
|
series = [{
|
15
19
|
:host => scope.host,
|
16
20
|
:device => scope.device,
|
data/lib/dogapi/v1.rb
ADDED
@@ -0,0 +1,71 @@
|
|
1
|
+
require 'dogapi'
|
2
|
+
|
3
|
+
module Dogapi
|
4
|
+
class V1 # for namespacing
|
5
|
+
|
6
|
+
# Event-specific client affording more granular control than the simple Dogapi::Client
|
7
|
+
class EventService < Dogapi::APIService
|
8
|
+
|
9
|
+
API_VERSION = "v1"
|
10
|
+
|
11
|
+
# Records an Event with no duration
|
12
|
+
def post(event, scope=nil)
|
13
|
+
scope = scope || Dogapi::Scope.new()
|
14
|
+
params = {
|
15
|
+
:api_key => @api_key
|
16
|
+
}
|
17
|
+
|
18
|
+
body = {
|
19
|
+
:title => event.msg_title,
|
20
|
+
:text => event.msg_text,
|
21
|
+
:date_happened => event.date_happened.to_i,
|
22
|
+
:priority => event.priority,
|
23
|
+
:parent => event.parent,
|
24
|
+
:tags => event.tags,
|
25
|
+
}
|
26
|
+
|
27
|
+
request(Net::HTTP::Post, '/api/v1/events', params, body, true)
|
28
|
+
end
|
29
|
+
|
30
|
+
def get(id)
|
31
|
+
params = {
|
32
|
+
:api_key => @api_key,
|
33
|
+
:application_key => @application_key
|
34
|
+
}
|
35
|
+
|
36
|
+
request(Net::HTTP::Get, '/api/' + API_VERSION + '/events/' + id.to_s, params, nil, false)
|
37
|
+
end
|
38
|
+
|
39
|
+
def stream(start, stop, options={})
|
40
|
+
defaults = {
|
41
|
+
:priority => nil,
|
42
|
+
:sources => nil,
|
43
|
+
:tags => nil
|
44
|
+
}
|
45
|
+
options = defaults.merge(options)
|
46
|
+
|
47
|
+
params = {
|
48
|
+
:api_key => @api_key,
|
49
|
+
:application_key => @application_key,
|
50
|
+
|
51
|
+
:start => start.to_i,
|
52
|
+
:end => stop.to_i
|
53
|
+
}
|
54
|
+
|
55
|
+
if options[:priority]:
|
56
|
+
params[:priority] = options[:priority]
|
57
|
+
end
|
58
|
+
if options[:sources]:
|
59
|
+
params[:sources] = options[:sources]
|
60
|
+
end
|
61
|
+
if options[:tags]:
|
62
|
+
params[:tags] = options[:tags]
|
63
|
+
end
|
64
|
+
|
65
|
+
request(Net::HTTP::Get, '/api/' + API_VERSION + '/events', params, nil, false)
|
66
|
+
end
|
67
|
+
|
68
|
+
end
|
69
|
+
|
70
|
+
end
|
71
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
require 'dogapi'
|
2
|
+
|
3
|
+
module Dogapi
|
4
|
+
class V1 # for namespacing
|
5
|
+
|
6
|
+
# Event-specific client affording more granular control than the simple Dogapi::Client
|
7
|
+
class MetricService < Dogapi::APIService
|
8
|
+
|
9
|
+
API_VERSION = "v1"
|
10
|
+
|
11
|
+
# Records an Event with no duration
|
12
|
+
def submit(metric, points, scope)
|
13
|
+
params = {
|
14
|
+
:api_key => @api_key
|
15
|
+
}
|
16
|
+
|
17
|
+
body = { :series => [
|
18
|
+
{
|
19
|
+
:metric => metric,
|
20
|
+
:points => points,
|
21
|
+
:type => "gauge",
|
22
|
+
:host => scope.host,
|
23
|
+
:device => scope.device
|
24
|
+
}
|
25
|
+
]
|
26
|
+
}
|
27
|
+
|
28
|
+
request(Net::HTTP::Post, '/api/' + API_VERSION + '/series', params, body, true)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,72 @@
|
|
1
|
+
require 'dogapi'
|
2
|
+
|
3
|
+
module Dogapi
|
4
|
+
class V1 # for namespacing
|
5
|
+
|
6
|
+
#
|
7
|
+
class TagService < Dogapi::APIService
|
8
|
+
|
9
|
+
API_VERSION = "v1"
|
10
|
+
|
11
|
+
# Gets all tags in your org and the hosts tagged with them
|
12
|
+
def get_all()
|
13
|
+
params = {
|
14
|
+
:api_key => @api_key,
|
15
|
+
:application_key => @application_key
|
16
|
+
}
|
17
|
+
|
18
|
+
request(Net::HTTP::Get, '/api/' + API_VERSION + '/tags/hosts', params, nil, false)
|
19
|
+
end
|
20
|
+
|
21
|
+
# Gets all tags for a given host
|
22
|
+
def get(host_id)
|
23
|
+
params = {
|
24
|
+
:api_key => @api_key,
|
25
|
+
:application_key => @application_key
|
26
|
+
}
|
27
|
+
|
28
|
+
request(Net::HTTP::Get, '/api/' + API_VERSION + '/tags/hosts/' + host_id.to_s, params, nil, false)
|
29
|
+
end
|
30
|
+
|
31
|
+
# Adds a list of tags to a host
|
32
|
+
def add(host_id, tags)
|
33
|
+
params = {
|
34
|
+
:api_key => @api_key,
|
35
|
+
:application_key => @application_key
|
36
|
+
}
|
37
|
+
|
38
|
+
body = {
|
39
|
+
:tags => tags
|
40
|
+
}
|
41
|
+
|
42
|
+
request(Net::HTTP::Post, '/api/' + API_VERSION + '/tags/hosts/' + host_id.to_s, params, body, true)
|
43
|
+
end
|
44
|
+
|
45
|
+
# Remove all tags from a host and replace them with a new list
|
46
|
+
def update(host_id, tags)
|
47
|
+
params = {
|
48
|
+
:api_key => @api_key,
|
49
|
+
:application_key => @application_key
|
50
|
+
}
|
51
|
+
|
52
|
+
body = {
|
53
|
+
:tags => tags
|
54
|
+
}
|
55
|
+
|
56
|
+
request(Net::HTTP::Put, '/api/' + API_VERSION + '/tags/hosts/' + host_id.to_s, params, body, true)
|
57
|
+
end
|
58
|
+
|
59
|
+
# Remove all tags from a host
|
60
|
+
def detatch(host_id)
|
61
|
+
params = {
|
62
|
+
:api_key => @api_key,
|
63
|
+
:application_key => @application_key
|
64
|
+
}
|
65
|
+
|
66
|
+
request(Net::HTTP::Delete, '/api/' + API_VERSION + '/tags/hosts/' + host_id.to_s, params, nil, false)
|
67
|
+
end
|
68
|
+
|
69
|
+
end
|
70
|
+
|
71
|
+
end
|
72
|
+
end
|
data/tests/tc_client.rb
CHANGED
@@ -1,37 +1,103 @@
|
|
1
1
|
require 'test/unit'
|
2
2
|
require 'dogapi'
|
3
|
+
require 'time'
|
3
4
|
|
4
5
|
class TestClient < Test::Unit::TestCase
|
5
6
|
|
6
7
|
def config_client_test_env
|
7
|
-
@api_key = ENV['
|
8
|
+
@api_key = ENV['DATADOG_API_KEY']
|
9
|
+
@app_key = ENV['DATADOG_APP_KEY']
|
10
|
+
if not @api_key or not @app_key
|
11
|
+
puts "\n"
|
12
|
+
abort "To run tests in your environment, set 'DATADOG_API_KEY' and 'DATADOG_APP_KEY' to appropriate values for your account. Be aware that the tests will submit data, some of which won't be removed at the end.\n\n"
|
13
|
+
end
|
8
14
|
end
|
9
15
|
|
10
16
|
def setup
|
11
|
-
config_client_test_env
|
17
|
+
config_client_test_env()
|
12
18
|
end
|
13
19
|
|
14
|
-
def
|
15
|
-
|
20
|
+
def test_tags
|
21
|
+
hostname = 'test.tag.host'
|
22
|
+
dog = Dogapi::Client.new(@api_key, @app_key)
|
16
23
|
|
17
|
-
|
18
|
-
|
19
|
-
:host => 'test.dogclient.fake',
|
20
|
-
:device => 'eth0'
|
24
|
+
# post a metric to make sure the test host context exists
|
25
|
+
dog.emit_point('test.tag.metric', 1, :host => hostname)
|
21
26
|
|
22
|
-
dog.
|
23
|
-
[[Time.now - 60, 10], [Time.now - 30, 20], [Time.now, 30]],
|
24
|
-
:host => 'test.dogclient.fake',
|
25
|
-
:device => 'eth0'
|
27
|
+
dog.all_tags()
|
26
28
|
|
27
|
-
|
28
|
-
dog.
|
29
|
-
|
30
|
-
:device => 'eth0'
|
29
|
+
dog.detatch_tags(hostname)
|
30
|
+
code, resp = dog.host_tags(hostname)
|
31
|
+
assert resp["tags"].size == 0
|
31
32
|
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
33
|
+
dog.add_tags(hostname, ['test.tag.1', 'test.tag.2'])
|
34
|
+
code, resp = dog.host_tags(hostname)
|
35
|
+
new_tags = resp["tags"]
|
36
|
+
assert new_tags.size == 2
|
37
|
+
assert new_tags.include?('test.tag.1')
|
38
|
+
assert new_tags.include?('test.tag.2')
|
39
|
+
|
40
|
+
dog.add_tags(hostname, ['test.tag.3'])
|
41
|
+
code, resp = dog.host_tags(hostname)
|
42
|
+
new_tags = resp["tags"]
|
43
|
+
assert new_tags.size == 3
|
44
|
+
assert new_tags.include?('test.tag.1')
|
45
|
+
assert new_tags.include?('test.tag.2')
|
46
|
+
assert new_tags.include?('test.tag.3')
|
47
|
+
|
48
|
+
dog.update_tags(hostname, ['test.tag.4'])
|
49
|
+
code, resp = dog.host_tags(hostname)
|
50
|
+
new_tags = resp["tags"]
|
51
|
+
assert new_tags.size == 1
|
52
|
+
assert new_tags.include?('test.tag.4')
|
53
|
+
|
54
|
+
dog.detatch_tags(hostname)
|
55
|
+
code, resp = dog.host_tags(hostname)
|
56
|
+
assert resp["tags"].size == 0
|
36
57
|
end
|
58
|
+
|
59
|
+
def test_events
|
60
|
+
now = Time.now()
|
61
|
+
|
62
|
+
now_ts = now
|
63
|
+
now_title = 'end test title ' + now_ts.to_i.to_s
|
64
|
+
now_message = 'test message ' + now_ts.to_i.to_s
|
65
|
+
|
66
|
+
before_ts = (now - 5*60)
|
67
|
+
before_title = 'start test title ' + before_ts.to_i.to_s
|
68
|
+
before_message = 'test message ' + before_ts.to_i.to_s
|
69
|
+
|
70
|
+
dog = Dogapi::Client.new(@api_key, @app_key)
|
71
|
+
dog_r = Dogapi::Client.new(@api_key)
|
72
|
+
|
73
|
+
code, resp = dog_r.emit_event(Dogapi::Event.new(now_message, :msg_title =>now_title, :date_happened => now_ts))
|
74
|
+
now_event_id = resp["event"]["id"]
|
75
|
+
sleep 1
|
76
|
+
code, resp = dog_r.emit_event(Dogapi::Event.new(before_message, :msg_title =>before_title, :date_happened => before_ts))
|
77
|
+
before_event_id = resp["event"]["id"]
|
78
|
+
|
79
|
+
code, resp = dog.stream(before_ts, now_ts + 1)
|
80
|
+
stream = resp["events"]
|
81
|
+
|
82
|
+
assert stream.last['title'] == before_title
|
83
|
+
assert stream.first['title'] == now_title
|
84
|
+
|
85
|
+
code, resp = dog.get_event(now_event_id)
|
86
|
+
now_event = resp['event']
|
87
|
+
code, resp = dog.get_event(before_event_id)
|
88
|
+
before_event = resp['event']
|
89
|
+
|
90
|
+
assert now_event['text'] == now_message
|
91
|
+
assert before_event['text'] == before_message
|
92
|
+
end
|
93
|
+
|
94
|
+
def test_metrics
|
95
|
+
# FIXME: actually verify this once there's a way to look at metrics through the api
|
96
|
+
dog = Dogapi::Client.new(@api_key, @app_key)
|
97
|
+
dog_r = Dogapi::Client.new(@api_key)
|
98
|
+
|
99
|
+
dog_r.emit_point('test.metric.metric', 10, :host => 'test.metric.host')
|
100
|
+
dog_r.emit_points('test.metric.metric', [[Time.now-5*60, 0]], :host => 'test.metric.host')
|
101
|
+
end
|
102
|
+
|
37
103
|
end
|
data/tests/ts_dogapi.rb
CHANGED
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: dogapi
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 29
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 1
|
8
|
+
- 2
|
8
9
|
- 1
|
9
|
-
|
10
|
-
version: 1.1.0
|
10
|
+
version: 1.2.1
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Datadog, Inc.
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2011-10-
|
18
|
+
date: 2011-10-27 00:00:00 Z
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
21
21
|
name: json
|
@@ -46,11 +46,12 @@ files:
|
|
46
46
|
- lib/dogapi/event.rb
|
47
47
|
- lib/dogapi/facade.rb
|
48
48
|
- lib/dogapi/metric.rb
|
49
|
+
- lib/dogapi/v1/event.rb
|
50
|
+
- lib/dogapi/v1/metric.rb
|
51
|
+
- lib/dogapi/v1/tag.rb
|
52
|
+
- lib/dogapi/v1.rb
|
49
53
|
- lib/dogapi.rb
|
50
54
|
- tests/tc_client.rb
|
51
|
-
- tests/tc_env.rb
|
52
|
-
- tests/tc_event.rb
|
53
|
-
- tests/tc_metric.rb
|
54
55
|
- tests/ts_dogapi.rb
|
55
56
|
- README.rdoc
|
56
57
|
homepage: http://datadoghq.com/
|
@@ -87,7 +88,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
87
88
|
requirements: []
|
88
89
|
|
89
90
|
rubyforge_project:
|
90
|
-
rubygems_version: 1.8.
|
91
|
+
rubygems_version: 1.8.11
|
91
92
|
signing_key:
|
92
93
|
specification_version: 3
|
93
94
|
summary: Ruby bindings for Datadog's API
|
data/tests/tc_env.rb
DELETED
@@ -1,23 +0,0 @@
|
|
1
|
-
require 'test/unit'
|
2
|
-
require 'dogapi'
|
3
|
-
|
4
|
-
class TestEnvironment < Test::Unit::TestCase
|
5
|
-
|
6
|
-
def setup
|
7
|
-
@host = ENV['DATADOG_HOST']
|
8
|
-
end
|
9
|
-
|
10
|
-
def teardown
|
11
|
-
ENV['DATADOG_HOST'] = @host
|
12
|
-
end
|
13
|
-
|
14
|
-
def test_unset
|
15
|
-
ENV['DATADOG_HOST'] = nil
|
16
|
-
assert_equal "https://app.datadoghq.com", Dogapi.find_datadog_host
|
17
|
-
end
|
18
|
-
|
19
|
-
def test_set
|
20
|
-
ENV['DATADOG_HOST'] = 'test.host'
|
21
|
-
assert_equal 'test.host', Dogapi.find_datadog_host
|
22
|
-
end
|
23
|
-
end
|
data/tests/tc_event.rb
DELETED
@@ -1,35 +0,0 @@
|
|
1
|
-
require 'test/unit'
|
2
|
-
require 'dogapi'
|
3
|
-
|
4
|
-
class TestEventClient < Test::Unit::TestCase
|
5
|
-
|
6
|
-
def config_client_test_env
|
7
|
-
@api_key = ENV['DATADOG_KEY']
|
8
|
-
end
|
9
|
-
|
10
|
-
def setup
|
11
|
-
config_client_test_env
|
12
|
-
end
|
13
|
-
|
14
|
-
def submit_event(scope=nil, source_type=nil)
|
15
|
-
event_service = Dogapi::EventService.new(@host)
|
16
|
-
tok = '#' + (rand(10000)+1).to_s
|
17
|
-
test_message = 'event_test_' + tok
|
18
|
-
event = Dogapi::Event.new(test_message, :event_type => 'test-event-type')
|
19
|
-
res = event_service.submit(@api_key, event, scope, source_type)
|
20
|
-
assert_not_equal(res['id'], nil)
|
21
|
-
end
|
22
|
-
|
23
|
-
def test_submit_event
|
24
|
-
submit_event
|
25
|
-
end
|
26
|
-
|
27
|
-
def test_submit_scoped_event
|
28
|
-
submit_event(Dogapi::Scope.new('scoped-testhost', 'testdevice'))
|
29
|
-
end
|
30
|
-
|
31
|
-
def test_submit_typed_event
|
32
|
-
submit_event(Dogapi::Scope.new('typed-testhost', 'testdevice'), 'GitHub')
|
33
|
-
end
|
34
|
-
|
35
|
-
end
|
data/tests/tc_metric.rb
DELETED
@@ -1,29 +0,0 @@
|
|
1
|
-
require 'test/unit'
|
2
|
-
require 'time'
|
3
|
-
require 'dogapi'
|
4
|
-
|
5
|
-
class TestMetricClient < Test::Unit::TestCase
|
6
|
-
|
7
|
-
def config_client_test_env
|
8
|
-
@api_key = ENV['DATADOG_KEY']
|
9
|
-
end
|
10
|
-
|
11
|
-
def setup
|
12
|
-
config_client_test_env
|
13
|
-
end
|
14
|
-
|
15
|
-
def test_submit_metric
|
16
|
-
metric_service = Dogapi::MetricService.new(@host)
|
17
|
-
scope = Dogapi::Scope.new('test.dogclient.fake', 'eth0')
|
18
|
-
metric = 'test.dogclient.metric.submit_metric'
|
19
|
-
points = [
|
20
|
-
[Time.now-90, 1.0],
|
21
|
-
[Time.now-60, 2.0],
|
22
|
-
[Time.now-30, 4.0],
|
23
|
-
[Time.now, 8.0]
|
24
|
-
]
|
25
|
-
res = metric_service.submit(@api_key, scope, metric, points)
|
26
|
-
assert_equal(res['status'], 'ok')
|
27
|
-
end
|
28
|
-
|
29
|
-
end
|