atsd 1.0.1 → 1.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +62 -32
- data/lib/atsd/atsd.rb +6 -6
- data/lib/atsd/models/base_model.rb +15 -0
- data/lib/atsd/models/entity.rb +39 -0
- data/lib/atsd/models/entity_group.rb +23 -0
- data/lib/atsd/models/metric.rb +208 -0
- data/lib/atsd/models/series.rb +54 -0
- data/lib/atsd/queries/base_query.rb +17 -0
- data/lib/atsd/queries/series_query.rb +92 -91
- data/lib/atsd/services/series_service.rb +7 -3
- data/lib/atsd/version.rb +1 -1
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 743f931e95108681d4b1a2406db3501c14b78a66
|
4
|
+
data.tar.gz: 19f72e28217eecfa35c64c5dc6abb067467d6f4c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6ba9b9e316ee783810bab3ac05f38b46e42aa98d76d73ee923e7d4637762ca988cc0c98c2516dbebc66d67c0c0064819a5f8f5df77b0826029687c59baade927
|
7
|
+
data.tar.gz: 8f9ea0a7a2f5ffd1dfa5c806f335b3ddbd2a80e376c5538189320d83ba1596f6e4f253da80e1f09eaf16462f01d1506896899a1c2f093ed0f0ba29b11e8985ee
|
data/README.md
CHANGED
@@ -68,8 +68,10 @@ Or install manually:
|
|
68
68
|
To start using the gem you need to create an ATSD instance:
|
69
69
|
|
70
70
|
```ruby
|
71
|
-
|
72
|
-
|
71
|
+
require 'atsd'
|
72
|
+
include ATSD
|
73
|
+
atsd = ATSD.new :url => "#{API_ENDPOINT}/api/v1",
|
74
|
+
:basic_auth => "#{LOGIN}:#{PASSWORD}",
|
73
75
|
:logger => true
|
74
76
|
```
|
75
77
|
|
@@ -119,10 +121,10 @@ to CamelCase used in the API. For example, `end_time` property in ruby code beco
|
|
119
121
|
Simple query:
|
120
122
|
|
121
123
|
```ruby
|
122
|
-
|
124
|
+
series_service = atsd.series_service
|
123
125
|
# => #<ATSD::SeriesService:0x007f82a4446c08
|
124
126
|
|
125
|
-
query =
|
127
|
+
query = series_service.query('ubuntu', 'meminfo.memfree')
|
126
128
|
# => {:entity=>"ubuntu", :metric=>"meminfo.memfree"}
|
127
129
|
|
128
130
|
query.class
|
@@ -154,7 +156,7 @@ s.entity
|
|
154
156
|
Complex query:
|
155
157
|
|
156
158
|
```ruby
|
157
|
-
query.aggregate(types:[
|
159
|
+
query.aggregate(types:[SeriesQuery::AggregateType::AVG], interval:{count:1, unit:SeriesQuery::Interval::HOUR})
|
158
160
|
# => {:entity=>"ubuntu",
|
159
161
|
# :metric=>"meminfo.memfree",
|
160
162
|
# :end_time=>1428303004000,
|
@@ -169,14 +171,30 @@ query.execute
|
|
169
171
|
# :data=>[{"t"=>1428300000000, "v"=>82615.05263157895}]}]
|
170
172
|
```
|
171
173
|
|
174
|
+
Query with Versions:
|
175
|
+
|
176
|
+
```ruby
|
177
|
+
query = atsd.series_service.query("sensor-1", "temperature", Time.new(2015, 11, 17, 12, 0, 0), Time.new(2015, 11, 17, 19, 0, 0), {:versioned => true})
|
178
|
+
query.execute
|
179
|
+
```
|
180
|
+
|
172
181
|
Data Insertion:
|
173
182
|
|
174
183
|
```ruby
|
175
|
-
s =
|
184
|
+
s = Series.new
|
176
185
|
s.entity = 'ubuntu'
|
177
186
|
s.metric = 'meminfo.memfree'
|
178
187
|
s.data = [ {t: 100000000, v: 512} ]
|
179
|
-
|
188
|
+
series_service.insert(s)
|
189
|
+
```
|
190
|
+
|
191
|
+
Inserting Series with Versions:
|
192
|
+
|
193
|
+
```ruby
|
194
|
+
sample_1 = Sample.new :t => Time.new(2015, 11, 17, 17, 0, 0), :v => 7, :version => {:status => "normal", :source => "gateway-1"}
|
195
|
+
sample_2 = Sample.new :t => Time.new(2015, 11, 17, 18, 0, 0), :v => 17, :version => {:status => "error", :source => "gateway-1"}
|
196
|
+
series = Series.new :entity => "sensor-1", :metric => "temperature", :data => [sample_1, sample_2]
|
197
|
+
atsd.series_service.insert(series)
|
180
198
|
```
|
181
199
|
|
182
200
|
**CSV Insert**
|
@@ -198,41 +216,41 @@ time, mem.info.memfree, meminfo.memused
|
|
198
216
|
|
199
217
|
Inserting csv data example:
|
200
218
|
```ruby
|
201
|
-
|
219
|
+
series_service.csv_insert('ubuntu', File.read('/path/to/data.csv'), { :user => 'beta' })
|
202
220
|
```
|
203
221
|
|
204
222
|
#### Properties Service
|
205
223
|
|
206
224
|
```ruby
|
207
|
-
|
225
|
+
properties_service = atsd.properties_service
|
208
226
|
# => #<ATSD::PropertiesService:0x007f82a456e6f8
|
209
227
|
|
210
|
-
property =
|
228
|
+
property = Property.new
|
211
229
|
property.entity = 'ubuntu'
|
212
230
|
property.type = 'system'
|
213
231
|
property.key = {"server_name":"server","user_name":"system"}
|
214
232
|
property.tags = {"name.1": "value.1"}
|
215
|
-
|
233
|
+
properties_service.insert(property)
|
216
234
|
|
217
|
-
|
235
|
+
properties_service.query('ubuntu', 'system').execute
|
218
236
|
# => [{:type=>"system",
|
219
237
|
# :entity=>"ubuntu",
|
220
238
|
# :key=>{"server_name"=>"server", "user_name"=>"system"},
|
221
239
|
# :timestamp=>1428304255068,
|
222
240
|
# :tags=>{"name.1"=>"value.1"}}]
|
223
241
|
|
224
|
-
|
225
|
-
|
242
|
+
properties_service.delete(property)
|
243
|
+
properties_service.query('ubuntu', 'system').execute
|
226
244
|
# => []
|
227
245
|
```
|
228
246
|
|
229
247
|
#### Alerts Service
|
230
248
|
|
231
249
|
```ruby
|
232
|
-
|
250
|
+
alerts_service = atsd.alerts_service
|
233
251
|
# => #<ATSD::AlertsService:0x007faf7c0efdc0
|
234
252
|
|
235
|
-
|
253
|
+
alerts_service.query.execute
|
236
254
|
# => [{:value=>447660.0,
|
237
255
|
# :id=>4,
|
238
256
|
# :text_value=>"447660",
|
@@ -258,10 +276,10 @@ a.query.execute
|
|
258
276
|
#### Metrics Service
|
259
277
|
|
260
278
|
```ruby
|
261
|
-
|
279
|
+
metrics_service = atsd.metrics_service
|
262
280
|
# => #<ATSD::MetricsService:0x007fbb548d9548
|
263
281
|
|
264
|
-
|
282
|
+
metrics_service.list
|
265
283
|
# => [{:name=>"activemq_metrics_count",
|
266
284
|
# :enabled=>true,
|
267
285
|
# :data_type=>"FLOAT",
|
@@ -271,6 +289,7 @@ ms.list
|
|
271
289
|
# :retention_interval=>0,
|
272
290
|
# :invalid_action=>"NONE",
|
273
291
|
# :last_insert_time=>1428328861848},
|
292
|
+
# :versioned=>true
|
274
293
|
# {:name=>"activemq_properties_count",
|
275
294
|
# :enabled=>true,
|
276
295
|
# :data_type=>"FLOAT",
|
@@ -278,7 +297,7 @@ ms.list
|
|
278
297
|
# :persistent=>true,
|
279
298
|
# ...
|
280
299
|
|
281
|
-
|
300
|
+
metrics_service.entity_and_tags('df.disk_size')
|
282
301
|
# => [{:entity=>"ubuntu", :tags=>{"file_system"=>"/dev/sda1", "mount_point"=>"/"}, :last_insert_time=>1428328928000},
|
283
302
|
# {:entity=>"ubuntu",
|
284
303
|
# :tags=>{"file_system"=>"none", "mount_point"=>"/sys/fs/cgroup"},
|
@@ -288,24 +307,35 @@ ms.entity_and_tags('df.disk_size')
|
|
288
307
|
# {:entity=>"ubuntu", :tags=>{"file_system"=>"none", "mount_point"=>"/run/user"}, :last_insert_time=>1428328928000},
|
289
308
|
# {:entity=>"ubuntu", :tags=>{"file_system"=>"udev", "mount_point"=>"/dev"}, :last_insert_time=>1428328928000},
|
290
309
|
# {:entity=>"ubuntu", :tags=>{"file_system"=>"tmpfs", "mount_point"=>"/run"}, :last_insert_time=>1428328928000}]
|
310
|
+
|
311
|
+
metric = Metric.new
|
312
|
+
# => {}
|
313
|
+
metric.name = "cpu_count"
|
314
|
+
# => "cpu_count"
|
315
|
+
metric.versioned = true
|
316
|
+
# => true
|
317
|
+
metrics_service.create_or_replace(metric)
|
318
|
+
metrics_service.get("cpu_count")
|
319
|
+
# => {:name=>"cpu_count", :enabled=>true, :data_type=>"FLOAT", :counter=>false, :persistent=>true, :tags=>{}, :time_precision=>"MILLISECONDS", :retention_interval=>0, :invalid_action=>"NONE", :versioned=>true}
|
320
|
+
|
291
321
|
```
|
292
322
|
|
293
323
|
#### Entities Service
|
294
324
|
|
295
325
|
```ruby
|
296
|
-
|
326
|
+
entities_service = atsd.entities_service
|
297
327
|
# => #<ATSD::EntitiesService:0x007f82a45b40b8
|
298
328
|
|
299
|
-
|
329
|
+
entities_service.list
|
300
330
|
# => [{:name=>"atsd", :enabled=>true, :last_insert_time=>1428304482631},
|
301
331
|
# {:name=>"mine", :enabled=>true},
|
302
332
|
# {:name=>"test_entity", :enabled=>true, :last_insert_time=>1000000000},
|
303
333
|
# {:name=>"ubuntu", :enabled=>true, :last_insert_time=>1428304489000}]
|
304
334
|
|
305
|
-
|
335
|
+
entities_service.get('ubuntu')
|
306
336
|
# => {:name=>"ubuntu", :enabled=>true, :last_insert_time=>1428304499000, :tags=>{}}
|
307
337
|
|
308
|
-
|
338
|
+
entities_service.metrics('ubuntu')
|
309
339
|
# => [{:name=>"df.disk_size",
|
310
340
|
# :enabled=>true,
|
311
341
|
# :data_type=>"FLOAT",
|
@@ -319,8 +349,8 @@ ent.metrics('ubuntu')
|
|
319
349
|
# :enabled=>true,
|
320
350
|
# ...
|
321
351
|
|
322
|
-
|
323
|
-
|
352
|
+
entities_service.delete(entities_service.get('mine')) # or entities_service.delete('mine')
|
353
|
+
entities_service.list
|
324
354
|
# => [{:name=>"atsd", :enabled=>true, :last_insert_time=>1428304482631},
|
325
355
|
# {:name=>"test_entity", :enabled=>true, :last_insert_time=>1000000000},
|
326
356
|
# {:name=>"ubuntu", :enabled=>true, :last_insert_time=>1428304489000}]
|
@@ -328,19 +358,19 @@ ent.list
|
|
328
358
|
#### Entity Groups Service
|
329
359
|
|
330
360
|
```ruby
|
331
|
-
|
361
|
+
entity_groups_service = atsd.entity_groups_service
|
332
362
|
# => #<ATSD::EntityGroupsService:0x007fb1b2a0d7f8
|
333
363
|
|
334
|
-
|
335
|
-
|
364
|
+
entity_groups_service.create_or_replace('group1')
|
365
|
+
entity_groups_service.list
|
336
366
|
# => [{:name=>"group1"}]
|
337
367
|
|
338
|
-
|
339
|
-
|
368
|
+
entity_groups_service.add_entities('group1', [{name:'entity1'},{name:'entity2'}])
|
369
|
+
entity_groups_service.entities(entity_groups_service.get('group1'))
|
340
370
|
# => [{:name=>"entity1", :enabled=>true}, {:name=>"entity2", :enabled=>true}]
|
341
371
|
|
342
|
-
|
343
|
-
|
372
|
+
entity_groups_service.delete_all_entities('group1')
|
373
|
+
entity_groups_service.entities('group1')
|
344
374
|
# => []
|
345
375
|
```
|
346
376
|
|
data/lib/atsd/atsd.rb
CHANGED
@@ -44,11 +44,11 @@ module ATSD
|
|
44
44
|
end
|
45
45
|
end
|
46
46
|
|
47
|
-
service :
|
48
|
-
service :
|
49
|
-
service :
|
50
|
-
service :
|
51
|
-
service :
|
52
|
-
service :
|
47
|
+
service :series_service, SeriesService
|
48
|
+
service :properties_service, PropertiesService
|
49
|
+
service :alerts_service, AlertsService
|
50
|
+
service :metrics_service, MetricsService
|
51
|
+
service :entities_service, EntitiesService
|
52
|
+
service :entity_groups_service, EntityGroupsService
|
53
53
|
end
|
54
54
|
end
|
@@ -5,6 +5,8 @@ module ATSD
|
|
5
5
|
include ::Hashie::Extensions::MethodAccess
|
6
6
|
include ::Hashie::Extensions::MergeInitializer
|
7
7
|
include Utils::UnderscoreKeys
|
8
|
+
include ::Hashie::Extensions::Coercion
|
9
|
+
|
8
10
|
|
9
11
|
# Converts model to hash usable for API
|
10
12
|
#
|
@@ -18,6 +20,19 @@ module ATSD
|
|
18
20
|
end
|
19
21
|
hash
|
20
22
|
end
|
23
|
+
|
24
|
+
# def method_missing(meth, *args, &block)
|
25
|
+
# action = meth[0, 3]
|
26
|
+
# field = meth[4..-1]
|
27
|
+
# case action
|
28
|
+
# when "get"
|
29
|
+
# return self.send(field)
|
30
|
+
# when "set"
|
31
|
+
# return self[field]=args[0]
|
32
|
+
# else
|
33
|
+
# super
|
34
|
+
# end
|
35
|
+
# end
|
21
36
|
end
|
22
37
|
end
|
23
38
|
|
data/lib/atsd/models/entity.rb
CHANGED
@@ -2,6 +2,45 @@ require 'atsd/models/base_model'
|
|
2
2
|
|
3
3
|
module ATSD
|
4
4
|
class Entity < BaseModel
|
5
|
+
def set_name(name)
|
6
|
+
self["name"] = name
|
7
|
+
end
|
8
|
+
|
9
|
+
def get_name()
|
10
|
+
self.send("name")
|
11
|
+
end
|
12
|
+
|
13
|
+
def set_enabled(enabled)
|
14
|
+
self["enabled"] = enabled
|
15
|
+
end
|
16
|
+
|
17
|
+
def get_enabled()
|
18
|
+
self.send("enabled")
|
19
|
+
end
|
20
|
+
|
21
|
+
def set_last_insert_time(last_insert_time)
|
22
|
+
self["last_insert_time"] = last_insert_time
|
23
|
+
end
|
24
|
+
|
25
|
+
def get_last_insert_time()
|
26
|
+
self.send("last_insert_time")
|
27
|
+
end
|
28
|
+
|
29
|
+
def set_last_insert_date(last_insert_date)
|
30
|
+
self["last_insert_date"] = last_insert_date
|
31
|
+
end
|
32
|
+
|
33
|
+
def get_last_insert_date()
|
34
|
+
self.send("last_insert_date")
|
35
|
+
end
|
36
|
+
|
37
|
+
def set_tags(tags)
|
38
|
+
self["tags"] = tags
|
39
|
+
end
|
40
|
+
|
41
|
+
def get_tags()
|
42
|
+
self.send("tags")
|
43
|
+
end
|
5
44
|
end
|
6
45
|
end
|
7
46
|
|
@@ -3,6 +3,29 @@ require 'atsd/models/entity'
|
|
3
3
|
|
4
4
|
module ATSD
|
5
5
|
class EntityGroup < BaseModel
|
6
|
+
def set_name(name)
|
7
|
+
self["name"] = name
|
8
|
+
end
|
9
|
+
|
10
|
+
def get_name()
|
11
|
+
self.send("name")
|
12
|
+
end
|
13
|
+
|
14
|
+
def set_expression(expression)
|
15
|
+
self["expression"] = expression
|
16
|
+
end
|
17
|
+
|
18
|
+
def get_expression()
|
19
|
+
self.send("expression")
|
20
|
+
end
|
21
|
+
|
22
|
+
def set_tags(tags)
|
23
|
+
self["tags"] = tags
|
24
|
+
end
|
25
|
+
|
26
|
+
def get_tags()
|
27
|
+
self.send("tags")
|
28
|
+
end
|
6
29
|
end
|
7
30
|
end
|
8
31
|
|
data/lib/atsd/models/metric.rb
CHANGED
@@ -2,6 +2,214 @@ require 'atsd/models/base_model'
|
|
2
2
|
|
3
3
|
module ATSD
|
4
4
|
class Metric < BaseModel
|
5
|
+
|
6
|
+
def set_name(name)
|
7
|
+
self["name"] = name
|
8
|
+
end
|
9
|
+
|
10
|
+
def get_name()
|
11
|
+
self.send("name")
|
12
|
+
end
|
13
|
+
|
14
|
+
def set_label(label)
|
15
|
+
self["label"] = label
|
16
|
+
end
|
17
|
+
|
18
|
+
def get_label()
|
19
|
+
self.send("label")
|
20
|
+
end
|
21
|
+
|
22
|
+
def set_enabled(enabled)
|
23
|
+
self["enabled"] = enabled
|
24
|
+
end
|
25
|
+
|
26
|
+
def get_enabled()
|
27
|
+
self.send("enabled")
|
28
|
+
end
|
29
|
+
|
30
|
+
def set_data_type(data_type)
|
31
|
+
self["data_type"] = data_type
|
32
|
+
end
|
33
|
+
|
34
|
+
def get_data_type()
|
35
|
+
self.send("data_type")
|
36
|
+
end
|
37
|
+
|
38
|
+
def set_time_precision(time_precision)
|
39
|
+
self["time_precision"] = time_precision
|
40
|
+
end
|
41
|
+
|
42
|
+
def get_time_precision()
|
43
|
+
self.send("time_precision")
|
44
|
+
end
|
45
|
+
|
46
|
+
def set_persistent(persistent)
|
47
|
+
self["persistent"] = persistent
|
48
|
+
end
|
49
|
+
|
50
|
+
def get_persistent()
|
51
|
+
self.send("persistent")
|
52
|
+
end
|
53
|
+
|
54
|
+
def set_counter(counter)
|
55
|
+
self["counter"] = counter
|
56
|
+
end
|
57
|
+
|
58
|
+
def get_counter()
|
59
|
+
self.send("counter")
|
60
|
+
end
|
61
|
+
|
62
|
+
def set_filter(filter)
|
63
|
+
self["filter"] = filter
|
64
|
+
end
|
65
|
+
|
66
|
+
def get_filter()
|
67
|
+
self.send("filter")
|
68
|
+
end
|
69
|
+
|
70
|
+
def set_min_value(min_value)
|
71
|
+
self["min_value"] = min_value
|
72
|
+
end
|
73
|
+
|
74
|
+
def get_min_value()
|
75
|
+
self.send("min_value")
|
76
|
+
end
|
77
|
+
|
78
|
+
def set_max_value(max_value)
|
79
|
+
self["max_value"] = max_value
|
80
|
+
end
|
81
|
+
|
82
|
+
def get_max_value()
|
83
|
+
self.send("max_value")
|
84
|
+
end
|
85
|
+
|
86
|
+
def set_invalid_action(invalid_action)
|
87
|
+
self["invalid_action"] = invalid_action
|
88
|
+
end
|
89
|
+
|
90
|
+
def get_invalid_action()
|
91
|
+
self.send("invalid_action")
|
92
|
+
end
|
93
|
+
|
94
|
+
def set_description(description)
|
95
|
+
self["description"] = description
|
96
|
+
end
|
97
|
+
|
98
|
+
def get_description()
|
99
|
+
self.send("description")
|
100
|
+
end
|
101
|
+
|
102
|
+
def set_retention_interval(retention_interval)
|
103
|
+
self["retention_interval"] = retention_interval
|
104
|
+
end
|
105
|
+
|
106
|
+
def get_retention_interval()
|
107
|
+
self.send("retention_interval")
|
108
|
+
end
|
109
|
+
|
110
|
+
def set_last_insert_time(last_insert_time)
|
111
|
+
self["last_insert_time"] = last_insert_time
|
112
|
+
end
|
113
|
+
|
114
|
+
def get_last_insert_time()
|
115
|
+
self.send("last_insert_time")
|
116
|
+
end
|
117
|
+
|
118
|
+
def get_last_insert_date()
|
119
|
+
Time.at(self.send("last_insert_time")/1000)
|
120
|
+
end
|
121
|
+
|
122
|
+
# def set_last_insert_date(last_insert_date)
|
123
|
+
# self["last_insert_date"] = last_insert_date
|
124
|
+
# end
|
125
|
+
|
126
|
+
def set_versioned(versioned)
|
127
|
+
self["versioned"] = versioned
|
128
|
+
end
|
129
|
+
|
130
|
+
def get_versioned()
|
131
|
+
self.send("versioned")
|
132
|
+
end
|
133
|
+
|
134
|
+
def set_tags(tags)
|
135
|
+
self["tags"] = tags
|
136
|
+
end
|
137
|
+
|
138
|
+
def get_tags()
|
139
|
+
self.send("tags")
|
140
|
+
end
|
141
|
+
|
142
|
+
end
|
143
|
+
|
144
|
+
module DataType
|
145
|
+
SHORT = 'SHORT'
|
146
|
+
INTEGER = 'INTEGER'
|
147
|
+
FLOAT = 'FLOAT'
|
148
|
+
LONG = 'LONG'
|
149
|
+
DOUBLE = 'DOUBLE'
|
150
|
+
end
|
151
|
+
|
152
|
+
module TimePrecision
|
153
|
+
SECONDS = 'SECONDS'
|
154
|
+
MILLISECONDS = 'MILLISECONDS'
|
155
|
+
end
|
156
|
+
|
157
|
+
module InvalidAction
|
158
|
+
NONE = 'NONE'
|
159
|
+
DISCARD = 'DISCARD'
|
160
|
+
TRANSFORM = 'TRANSFORM'
|
161
|
+
RAISE_ERROR = 'RAISE_ERROR'
|
5
162
|
end
|
163
|
+
|
164
|
+
# class Enum
|
165
|
+
# def self.keys
|
166
|
+
# constants
|
167
|
+
# end
|
168
|
+
#
|
169
|
+
# def self.values
|
170
|
+
# @values ||= constants.map { |const| const_get(const) }
|
171
|
+
# end
|
172
|
+
# end
|
173
|
+
# class Enum
|
174
|
+
# def self.keys
|
175
|
+
# constants
|
176
|
+
# end
|
177
|
+
#
|
178
|
+
# def self.values
|
179
|
+
# @values ||= constants.map { |const| const_get(const) }
|
180
|
+
# end
|
181
|
+
# end
|
182
|
+
#
|
183
|
+
# class Data_Type < Enum
|
184
|
+
# SHORT='SHORT'
|
185
|
+
# INTEGER='INTEGER'
|
186
|
+
# FLOAT='FLOAT'
|
187
|
+
# LONG='LONG'
|
188
|
+
# DOUBLE='DOUBLE'
|
189
|
+
# end
|
190
|
+
#
|
191
|
+
# class Time_Precision < Enum
|
192
|
+
# SECONDS='SECONDS'
|
193
|
+
# MILLISECONDS='MILLISECONDS'
|
194
|
+
# end
|
195
|
+
#
|
196
|
+
# class Invalid_Action < Enum
|
197
|
+
# NONE='NONE'
|
198
|
+
# DISCARD='DISCARD'
|
199
|
+
# TRANSFORM='TRANSFORM'
|
200
|
+
# RAISE_ERROR='RAISE_ERROR'
|
201
|
+
# end
|
202
|
+
|
6
203
|
end
|
7
204
|
|
205
|
+
|
206
|
+
|
207
|
+
|
208
|
+
|
209
|
+
|
210
|
+
|
211
|
+
|
212
|
+
|
213
|
+
|
214
|
+
|
215
|
+
|
data/lib/atsd/models/series.rb
CHANGED
@@ -4,5 +4,59 @@ module ATSD
|
|
4
4
|
# Time Series model
|
5
5
|
class Series < BaseModel
|
6
6
|
end
|
7
|
+
|
8
|
+
class Sample < BaseModel
|
9
|
+
|
10
|
+
TO_MILLISECONDS_LAMBDA = ->(v) do
|
11
|
+
case v
|
12
|
+
when Time
|
13
|
+
v.to_i * 1_000
|
14
|
+
else
|
15
|
+
v.to_i
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
coerce_key :t, TO_MILLISECONDS_LAMBDA
|
20
|
+
|
21
|
+
def set_time(time)
|
22
|
+
self["t"] = time
|
23
|
+
end
|
24
|
+
|
25
|
+
def get_time()
|
26
|
+
self.send("t")
|
27
|
+
end
|
28
|
+
|
29
|
+
def get_date()
|
30
|
+
Time.at(self.send("t")/1000)
|
31
|
+
end
|
32
|
+
|
33
|
+
def set_value(value)
|
34
|
+
self["v"] = value
|
35
|
+
end
|
36
|
+
|
37
|
+
def get_value()
|
38
|
+
self.send("v")
|
39
|
+
end
|
40
|
+
|
41
|
+
end
|
42
|
+
|
43
|
+
class Version < BaseModel
|
44
|
+
|
45
|
+
def set_source(source)
|
46
|
+
self["source"] = source
|
47
|
+
end
|
48
|
+
|
49
|
+
def get_source()
|
50
|
+
self.send("source")
|
51
|
+
end
|
52
|
+
|
53
|
+
def set_status(status)
|
54
|
+
self["status"] = status
|
55
|
+
end
|
56
|
+
|
57
|
+
def get_status()
|
58
|
+
self.send("status")
|
59
|
+
end
|
60
|
+
end
|
7
61
|
end
|
8
62
|
|
@@ -12,6 +12,22 @@ module ATSD
|
|
12
12
|
@client = client
|
13
13
|
end
|
14
14
|
|
15
|
+
|
16
|
+
# @!method type(type)
|
17
|
+
# specifies source for underlying data
|
18
|
+
# @param [String] type see {Type} for possible values
|
19
|
+
# @return [self]
|
20
|
+
|
21
|
+
TO_MILLISECONDS_LAMBDA = ->(v) do
|
22
|
+
case v
|
23
|
+
when Time
|
24
|
+
v.to_i * 1_000
|
25
|
+
else
|
26
|
+
v.to_i
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
|
15
31
|
# Build request parameters hash
|
16
32
|
# @return [Hash]
|
17
33
|
def to_request_hash
|
@@ -31,6 +47,7 @@ module ATSD
|
|
31
47
|
# @raise [APIError]
|
32
48
|
def result
|
33
49
|
@result ||= execute
|
50
|
+
@result
|
34
51
|
end
|
35
52
|
|
36
53
|
protected
|
@@ -4,97 +4,20 @@ module ATSD
|
|
4
4
|
# Class for building and executing Series Query
|
5
5
|
# @see https://axibase.com/atsd/api/#series:-query
|
6
6
|
class SeriesQuery < BaseQuery
|
7
|
-
|
8
|
-
# @!method type(type)
|
9
|
-
# specifies source for underlying data
|
10
|
-
# @param [String] type see {Type} for possible values
|
11
|
-
# @return [self]
|
12
|
-
|
13
|
-
#
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
#
|
21
|
-
module JoinType
|
22
|
-
COUNT = 'COUNT'
|
23
|
-
MIN = 'MIN'
|
24
|
-
MAX = 'MAX'
|
25
|
-
AVG = 'AVG'
|
26
|
-
SUM = 'SUM'
|
27
|
-
PERCENTILE_999 = 'PERCENTILE_999'
|
28
|
-
PERCENTILE_995 = 'PERCENTILE_995'
|
29
|
-
PERCENTILE_99 = 'PERCENTILE_99'
|
30
|
-
PERCENTILE_95 = 'PERCENTILE_95'
|
31
|
-
PERCENTILE_90 = 'PERCENTILE_90'
|
32
|
-
PERCENTILE_75 = 'PERCENTILE_75'
|
33
|
-
PERCENTILE_50 = 'PERCENTILE_50'
|
34
|
-
STANDARD_DEVIATION = 'STANDARD_DEVIATION'
|
35
|
-
end
|
36
|
-
|
37
|
-
# `join.interpolate` parameter possible values
|
38
|
-
module JoinInterpolate
|
39
|
-
STEP = 'STEP' # default
|
40
|
-
NONE = 'NONE'
|
41
|
-
LINEAR = 'LINEAR'
|
42
|
-
end
|
43
|
-
|
44
|
-
# `aggregate.type` parameter possible values
|
45
|
-
module AggregateType
|
46
|
-
DETAIL = 'DETAIL'
|
47
|
-
COUNT = 'COUNT'
|
48
|
-
MIN = 'MIN'
|
49
|
-
MAX = 'MAX'
|
50
|
-
AVG = 'AVG'
|
51
|
-
SUM = 'SUM'
|
52
|
-
PERCENTILE_999 = 'PERCENTILE_999'
|
53
|
-
PERCENTILE_995 = 'PERCENTILE_995'
|
54
|
-
PERCENTILE_99 = 'PERCENTILE_99'
|
55
|
-
PERCENTILE_95 = 'PERCENTILE_95'
|
56
|
-
PERCENTILE_90 = 'PERCENTILE_90'
|
57
|
-
PERCENTILE_75 = 'PERCENTILE_75'
|
58
|
-
PERCENTILE_50 = 'PERCENTILE_50'
|
59
|
-
STANDARD_DEVIATION = 'STANDARD_DEVIATION'
|
60
|
-
FIRST = 'FIRST'
|
61
|
-
LAST = 'LAST'
|
62
|
-
DELTA = 'DELTA'
|
63
|
-
WAVG = 'WAVG'
|
64
|
-
WTAVG = 'WTAVG'
|
65
|
-
THRESHOLD_COUNT = 'THRESHOLD_COUNT'
|
66
|
-
THRESHOLD_DURATION = 'THRESHOLD_DURATION'
|
67
|
-
THRESHOLD_PERCENT = 'THRESHOLD_PERCENT'
|
68
|
-
end
|
69
|
-
|
70
|
-
# `aggregate.interpolate` parameter possible values
|
71
|
-
module AggregateInterpolate
|
72
|
-
STEP = 'STEP'
|
73
|
-
NONE = 'NONE'
|
74
|
-
LINEAR = 'LINEAR'
|
75
|
-
end
|
76
|
-
|
77
|
-
# interval's unit possible values
|
78
|
-
module Interval
|
79
|
-
MILLISECOND = 'MILLISECOND'
|
80
|
-
SECOND = 'SECOND'
|
81
|
-
MINUTE = 'MINUTE'
|
82
|
-
HOUR = 'HOUR'
|
83
|
-
DAY = 'DAY'
|
84
|
-
WEEK = 'WEEK'
|
85
|
-
MONTH = 'MONTH'
|
86
|
-
QUARTER = 'QUARTER'
|
87
|
-
YEAR = 'YEAR'
|
88
|
-
end
|
89
|
-
|
90
|
-
TO_MILLISECONDS_LAMBDA = ->(v) do
|
91
|
-
case v
|
92
|
-
when Time
|
93
|
-
v.to_i * 1_000
|
94
|
-
else
|
95
|
-
v.to_i
|
96
|
-
end
|
97
|
-
end
|
7
|
+
#
|
8
|
+
# # @!method type(type)
|
9
|
+
# # specifies source for underlying data
|
10
|
+
# # @param [String] type see {Type} for possible values
|
11
|
+
# # @return [self]
|
12
|
+
#
|
13
|
+
# TO_MILLISECONDS_LAMBDA = ->(v) do
|
14
|
+
# case v
|
15
|
+
# when Time
|
16
|
+
# v.to_i * 1_000
|
17
|
+
# else
|
18
|
+
# v.to_i
|
19
|
+
# end
|
20
|
+
# end
|
98
21
|
|
99
22
|
coerce_key :end_time, TO_MILLISECONDS_LAMBDA
|
100
23
|
coerce_key :start_time, TO_MILLISECONDS_LAMBDA
|
@@ -146,5 +69,83 @@ module ATSD
|
|
146
69
|
results.each { |r| queries_by_id[r.request_id].result << r }
|
147
70
|
end
|
148
71
|
end
|
72
|
+
|
73
|
+
# `type` parameter possible values
|
74
|
+
module Type
|
75
|
+
HISTORY = 'HISTORY' # default
|
76
|
+
FORECAST = 'FORECAST'
|
77
|
+
FORECAST_DEVIATION = 'FORECAST_DEVIATION'
|
78
|
+
end
|
79
|
+
|
80
|
+
# `join.type` parameter possible values
|
81
|
+
module JoinType
|
82
|
+
COUNT = 'COUNT'
|
83
|
+
MIN = 'MIN'
|
84
|
+
MAX = 'MAX'
|
85
|
+
AVG = 'AVG'
|
86
|
+
SUM = 'SUM'
|
87
|
+
PERCENTILE_999 = 'PERCENTILE_999'
|
88
|
+
PERCENTILE_995 = 'PERCENTILE_995'
|
89
|
+
PERCENTILE_99 = 'PERCENTILE_99'
|
90
|
+
PERCENTILE_95 = 'PERCENTILE_95'
|
91
|
+
PERCENTILE_90 = 'PERCENTILE_90'
|
92
|
+
PERCENTILE_75 = 'PERCENTILE_75'
|
93
|
+
PERCENTILE_50 = 'PERCENTILE_50'
|
94
|
+
STANDARD_DEVIATION = 'STANDARD_DEVIATION'
|
95
|
+
end
|
96
|
+
|
97
|
+
# `join.interpolate` parameter possible values
|
98
|
+
module JoinInterpolate
|
99
|
+
STEP = 'STEP' # default
|
100
|
+
NONE = 'NONE'
|
101
|
+
LINEAR = 'LINEAR'
|
102
|
+
end
|
103
|
+
|
104
|
+
# `aggregate.type` parameter possible values
|
105
|
+
module AggregateType
|
106
|
+
DETAIL = 'DETAIL'
|
107
|
+
COUNT = 'COUNT'
|
108
|
+
MIN = 'MIN'
|
109
|
+
MAX = 'MAX'
|
110
|
+
AVG = 'AVG'
|
111
|
+
SUM = 'SUM'
|
112
|
+
PERCENTILE_999 = 'PERCENTILE_999'
|
113
|
+
PERCENTILE_995 = 'PERCENTILE_995'
|
114
|
+
PERCENTILE_99 = 'PERCENTILE_99'
|
115
|
+
PERCENTILE_95 = 'PERCENTILE_95'
|
116
|
+
PERCENTILE_90 = 'PERCENTILE_90'
|
117
|
+
PERCENTILE_75 = 'PERCENTILE_75'
|
118
|
+
PERCENTILE_50 = 'PERCENTILE_50'
|
119
|
+
STANDARD_DEVIATION = 'STANDARD_DEVIATION'
|
120
|
+
FIRST = 'FIRST'
|
121
|
+
LAST = 'LAST'
|
122
|
+
DELTA = 'DELTA'
|
123
|
+
WAVG = 'WAVG'
|
124
|
+
WTAVG = 'WTAVG'
|
125
|
+
THRESHOLD_COUNT = 'THRESHOLD_COUNT'
|
126
|
+
THRESHOLD_DURATION = 'THRESHOLD_DURATION'
|
127
|
+
THRESHOLD_PERCENT = 'THRESHOLD_PERCENT'
|
128
|
+
end
|
129
|
+
|
130
|
+
# `aggregate.interpolate` parameter possible values
|
131
|
+
module AggregateInterpolate
|
132
|
+
STEP = 'STEP'
|
133
|
+
NONE = 'NONE'
|
134
|
+
LINEAR = 'LINEAR'
|
135
|
+
end
|
136
|
+
|
137
|
+
# interval's unit possible values
|
138
|
+
module Interval
|
139
|
+
MILLISECOND = 'MILLISECOND'
|
140
|
+
SECOND = 'SECOND'
|
141
|
+
MINUTE = 'MINUTE'
|
142
|
+
HOUR = 'HOUR'
|
143
|
+
DAY = 'DAY'
|
144
|
+
WEEK = 'WEEK'
|
145
|
+
MONTH = 'MONTH'
|
146
|
+
QUARTER = 'QUARTER'
|
147
|
+
YEAR = 'YEAR'
|
148
|
+
end
|
149
|
+
|
149
150
|
end
|
150
151
|
|
@@ -10,13 +10,15 @@ module ATSD
|
|
10
10
|
#
|
11
11
|
# @param [String, Entity] entity
|
12
12
|
# @param [String, Metric] metric
|
13
|
+
# @param [Fixnum] start_time
|
14
|
+
# @param [Fixnum] end_time
|
13
15
|
# @param [Hash] options other query parameters
|
14
16
|
# @return [SeriesQuery]
|
15
|
-
def query(entity, metric, options = {})
|
17
|
+
def query(entity, metric, start_time, end_time, options = {})
|
16
18
|
query = SeriesQuery.new @client
|
17
19
|
entity = entity.name if entity.is_a? Entity
|
18
20
|
metric = metric.name if metric.is_a? Metric
|
19
|
-
options.merge! entity: entity, metric: metric
|
21
|
+
options.merge! entity: entity, metric: metric, start_time: start_time, end_time: end_time
|
20
22
|
options.each { |option, value| query[option] = value }
|
21
23
|
query
|
22
24
|
end
|
@@ -28,7 +30,9 @@ module ATSD
|
|
28
30
|
# @raise [APIError]
|
29
31
|
def insert(series)
|
30
32
|
series = Utils.ensure_array(series).map do |s|
|
31
|
-
|
33
|
+
if s.is_a? Hash
|
34
|
+
s = Series.new(s)
|
35
|
+
end
|
32
36
|
s.to_request_hash
|
33
37
|
end
|
34
38
|
@client.series_insert series
|
data/lib/atsd/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: atsd
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Axibase Corporation
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-11-18 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -256,7 +256,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
256
256
|
version: '0'
|
257
257
|
requirements: []
|
258
258
|
rubyforge_project:
|
259
|
-
rubygems_version: 2.4.
|
259
|
+
rubygems_version: 2.4.5.1
|
260
260
|
signing_key:
|
261
261
|
specification_version: 4
|
262
262
|
summary: Axibase Time-Series Database Client for Ruby.
|