dogapi 1.1.0 → 1.2.1
Sign up to get free protection for your applications and to get access to all the features.
- 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
|