atsd 1.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +11 -0
- data/.rspec +2 -0
- data/Gemfile +8 -0
- data/README.md +365 -0
- data/Rakefile +16 -0
- data/atsd.gemspec +36 -0
- data/lib/atsd.rb +19 -0
- data/lib/atsd/atsd.rb +54 -0
- data/lib/atsd/client.rb +469 -0
- data/lib/atsd/errors/api_error.rb +11 -0
- data/lib/atsd/errors/error.rb +3 -0
- data/lib/atsd/middleware/errors_handler.rb +88 -0
- data/lib/atsd/models/alert.rb +7 -0
- data/lib/atsd/models/alert_history.rb +7 -0
- data/lib/atsd/models/base_model.rb +23 -0
- data/lib/atsd/models/entity.rb +7 -0
- data/lib/atsd/models/entity_group.rb +8 -0
- data/lib/atsd/models/metric.rb +7 -0
- data/lib/atsd/models/property.rb +11 -0
- data/lib/atsd/models/series.rb +8 -0
- data/lib/atsd/queries/alerts_history_query.rb +31 -0
- data/lib/atsd/queries/alerts_query.rb +31 -0
- data/lib/atsd/queries/base_query.rb +40 -0
- data/lib/atsd/queries/properties_query.rb +31 -0
- data/lib/atsd/queries/series_query.rb +150 -0
- data/lib/atsd/services/alerts_service.rb +88 -0
- data/lib/atsd/services/base_service.rb +15 -0
- data/lib/atsd/services/entities_service.rb +130 -0
- data/lib/atsd/services/entity_groups_service.rb +186 -0
- data/lib/atsd/services/metrics_service.rb +122 -0
- data/lib/atsd/services/properties_service.rb +63 -0
- data/lib/atsd/services/series_service.rb +53 -0
- data/lib/atsd/utils.rb +20 -0
- data/lib/atsd/utils/camelize_keys.rb +41 -0
- data/lib/atsd/utils/underscore_keys.rb +21 -0
- data/lib/atsd/version.rb +3 -0
- metadata +264 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 9025f64163ec30e20c4a242935de58d36956fdee
|
4
|
+
data.tar.gz: f9d451cb22a9b1c1cd8ee7cbb09d916538019543
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: efd37ea4a310e612b2df8b8417b8ae09fc5990703f8b569f33c1efbdd014d293f324cb9db6181c05eb6d1a092186cb0c3ac73b3e1e11613e0f5fe280dec643ab
|
7
|
+
data.tar.gz: e73b69f0c386d4f073f3df4ce77418bc00f75df5d93d3599e73078ffbb39b05ddd13d5f5f2d050765f96a0de54331b5d7e1ec6e9ad24eb0386c817227f94536f
|
data/.gitignore
ADDED
data/.rspec
ADDED
data/Gemfile
ADDED
data/README.md
ADDED
@@ -0,0 +1,365 @@
|
|
1
|
+
# Axibase Time-Series Database Client for Ruby
|
2
|
+
|
3
|
+
The ATSD Client for Ruby enables Ruby developers
|
4
|
+
to easily read and write statistics and metadata
|
5
|
+
from Axibase Time-Series Database.
|
6
|
+
|
7
|
+
API documentation: https://axibase.com/atsd/api
|
8
|
+
|
9
|
+
## Installation
|
10
|
+
|
11
|
+
Add this line to your application's Gemfile:
|
12
|
+
|
13
|
+
```ruby
|
14
|
+
gem 'atsd'
|
15
|
+
```
|
16
|
+
|
17
|
+
Then execute:
|
18
|
+
|
19
|
+
$ bundle
|
20
|
+
|
21
|
+
Or install manually:
|
22
|
+
|
23
|
+
$ gem install atsd
|
24
|
+
|
25
|
+
## Implemented Methods
|
26
|
+
|
27
|
+
### Data API
|
28
|
+
- Series
|
29
|
+
- Query
|
30
|
+
- Insert
|
31
|
+
- CSV Insert
|
32
|
+
- Properties
|
33
|
+
- Query
|
34
|
+
- Insert
|
35
|
+
- Batch
|
36
|
+
- Alerts
|
37
|
+
- Query
|
38
|
+
- Update
|
39
|
+
- History Query
|
40
|
+
|
41
|
+
### Meta API
|
42
|
+
- Metrics
|
43
|
+
- List
|
44
|
+
- Get
|
45
|
+
- Create or replace
|
46
|
+
- Update
|
47
|
+
- Delete
|
48
|
+
- Entities and tags
|
49
|
+
- Entities
|
50
|
+
- List
|
51
|
+
- Get
|
52
|
+
- Create or replace
|
53
|
+
- Update
|
54
|
+
- Delete
|
55
|
+
- Entity Group
|
56
|
+
- List
|
57
|
+
- Get
|
58
|
+
- Create or replace
|
59
|
+
- Update
|
60
|
+
- Delete
|
61
|
+
- Get entities
|
62
|
+
- Add entities
|
63
|
+
- Set entities
|
64
|
+
- Delete entities
|
65
|
+
|
66
|
+
## Usage
|
67
|
+
|
68
|
+
To start using the gem you need to create an ATSD instance:
|
69
|
+
|
70
|
+
```ruby
|
71
|
+
atsd = ATSD.new :url => '#{API_ENDPOINT}/api/v1',
|
72
|
+
:basic_auth => '#{LOGIN}:#{PASSWORD}',
|
73
|
+
:logger => true
|
74
|
+
```
|
75
|
+
|
76
|
+
### Configuration
|
77
|
+
|
78
|
+
#### Authorization
|
79
|
+
In order to use the API you need to specify `:basic_auth` option in one
|
80
|
+
of the following forms:
|
81
|
+
|
82
|
+
- `"login:password"`
|
83
|
+
- `{ :login => 'login', :password => 'password' }`
|
84
|
+
|
85
|
+
#### SSL
|
86
|
+
ATSD requires a little extra configuration for users who want to use SSL/HTTPS.
|
87
|
+
See [Faraday Wiki](https://github.com/lostisland/faraday/wiki/Setting-up-SSL-certificates) on how
|
88
|
+
to setup SSL. As a quickfix you can specify `ssl: { verify: false }` option in the client.
|
89
|
+
|
90
|
+
#### Logging
|
91
|
+
|
92
|
+
- To use a custom logger specify it in the `:logger` option.
|
93
|
+
- To use default STDOUT logger set `:logger` option to `true`.
|
94
|
+
|
95
|
+
#### Faraday Middleware
|
96
|
+
|
97
|
+
```ruby
|
98
|
+
ATSD.new url: end_point, basic_auth: basic_auth do |builder|
|
99
|
+
builder.insert_after(FaradayMiddleware::ParseJson, VCR::Middleware::Faraday)
|
100
|
+
# ...
|
101
|
+
end
|
102
|
+
```
|
103
|
+
|
104
|
+
### Services
|
105
|
+
Once you instantiated the ATSD class, you can use different services.
|
106
|
+
Each service represents a particular entity in Axibase Time Series Database.
|
107
|
+
There are 6 services: series, properties, alerts, metrics, entities and
|
108
|
+
entity groups.
|
109
|
+
|
110
|
+
See documentation for all available methods.
|
111
|
+
|
112
|
+
#### Query builders
|
113
|
+
Query objects created by some services (e.g. Series) provide convenient methods to build complex queries.
|
114
|
+
They support method chaining and automatically translate snake_styled properties
|
115
|
+
to CamelCase used in the API. For example, `end_time` property in ruby code becomes `endTime` in json request.
|
116
|
+
|
117
|
+
#### Series Service
|
118
|
+
|
119
|
+
Simple query:
|
120
|
+
|
121
|
+
```ruby
|
122
|
+
series = atsd.series
|
123
|
+
# => #<ATSD::SeriesService:0x007f82a4446c08
|
124
|
+
|
125
|
+
query = series.query('ubuntu', 'meminfo.memfree')
|
126
|
+
# => {:entity=>"ubuntu", :metric=>"meminfo.memfree"}
|
127
|
+
|
128
|
+
query.class
|
129
|
+
# => ATSD::SeriesQuery
|
130
|
+
|
131
|
+
query.end_time(Time.now)
|
132
|
+
# => {:entity=>"ubuntu", :metric=>"meminfo.memfree", :end_time=>1428303004000}
|
133
|
+
|
134
|
+
query.execute
|
135
|
+
# => [{:entity=>"ubuntu",
|
136
|
+
# :metric=>"meminfo.memfree",
|
137
|
+
# :tags=>{},
|
138
|
+
# :type=>"HISTORY",
|
139
|
+
# :aggregate=>{"type"=>"DETAIL"},
|
140
|
+
# :data=>
|
141
|
+
# [{"t"=>1428301869000, "v"=>78728.0},
|
142
|
+
# {"t"=>1428301884000, "v"=>68676.0},
|
143
|
+
# {"t"=>1428301899000, "v"=>66716.0},
|
144
|
+
# ...
|
145
|
+
|
146
|
+
query.result
|
147
|
+
# same result
|
148
|
+
|
149
|
+
s = query.result.first
|
150
|
+
s.entity
|
151
|
+
# => "ubuntu"
|
152
|
+
```
|
153
|
+
|
154
|
+
Complex query:
|
155
|
+
|
156
|
+
```ruby
|
157
|
+
query.aggregate(types:[ATSD::SeriesQuery::AggregateType::AVG], interval:{count:1, unit:ATSD::SeriesQuery::Interval::HOUR})
|
158
|
+
# => {:entity=>"ubuntu",
|
159
|
+
# :metric=>"meminfo.memfree",
|
160
|
+
# :end_time=>1428303004000,
|
161
|
+
# :aggregate=>{:types=>["AVG"], :interval=>{:count=>1, :unit=>"HOUR"}}}
|
162
|
+
|
163
|
+
query.execute
|
164
|
+
# => [{:entity=>"ubuntu",
|
165
|
+
# :metric=>"meminfo.memfree",
|
166
|
+
# :tags=>{},
|
167
|
+
# :type=>"HISTORY",
|
168
|
+
# :aggregate=>{"type"=>"AVG", "interval"=>{"count"=>1, "unit"=>"HOUR"}},
|
169
|
+
# :data=>[{"t"=>1428300000000, "v"=>82615.05263157895}]}]
|
170
|
+
```
|
171
|
+
|
172
|
+
Data Insertion:
|
173
|
+
|
174
|
+
```ruby
|
175
|
+
s = ATSD::Series.new
|
176
|
+
s.entity = 'ubuntu'
|
177
|
+
s.metric = 'meminfo.memfree'
|
178
|
+
s.data = [ {t: 100000000, v: 512} ]
|
179
|
+
series.insert(s)
|
180
|
+
```
|
181
|
+
|
182
|
+
**CSV Insert**
|
183
|
+
|
184
|
+
data.csv contents:
|
185
|
+
```plain
|
186
|
+
time, mem.info.memfree, meminfo.memused
|
187
|
+
1414789200000, 0.8, 0.0
|
188
|
+
1414789230000, 1.6, 1.0
|
189
|
+
1414789800000, 2.4, -3.0
|
190
|
+
1414800000000, 3.2, 23.0
|
191
|
+
1414861200000, 4.0, 7.0
|
192
|
+
1415134800000, 0.0, 0.8
|
193
|
+
1415800800000, 1.0, 1.6
|
194
|
+
1417244400000, -3.0, 2.4
|
195
|
+
1433106000000, 23.0, 3.2
|
196
|
+
1446238800000, 7.0, 4.0
|
197
|
+
```
|
198
|
+
|
199
|
+
Inserting csv data example:
|
200
|
+
```ruby
|
201
|
+
series.csv_insert('ubuntu', File.read('/path/to/data.csv'), { :user => 'beta' })
|
202
|
+
```
|
203
|
+
|
204
|
+
#### Properties Service
|
205
|
+
|
206
|
+
```ruby
|
207
|
+
props = atsd.properties
|
208
|
+
# => #<ATSD::PropertiesService:0x007f82a456e6f8
|
209
|
+
|
210
|
+
property = ATSD::Property.new
|
211
|
+
property.entity = 'ubuntu'
|
212
|
+
property.type = 'system'
|
213
|
+
property.key = {"server_name":"server","user_name":"system"}
|
214
|
+
property.tags = {"name.1": "value.1"}
|
215
|
+
props.insert(property)
|
216
|
+
|
217
|
+
props.query('ubuntu', 'system').execute
|
218
|
+
# => [{:type=>"system",
|
219
|
+
# :entity=>"ubuntu",
|
220
|
+
# :key=>{"server_name"=>"server", "user_name"=>"system"},
|
221
|
+
# :timestamp=>1428304255068,
|
222
|
+
# :tags=>{"name.1"=>"value.1"}}]
|
223
|
+
|
224
|
+
props.delete(property)
|
225
|
+
props.query('ubuntu', 'system').execute
|
226
|
+
# => []
|
227
|
+
```
|
228
|
+
|
229
|
+
#### Alerts Service
|
230
|
+
|
231
|
+
```ruby
|
232
|
+
a = atsd.alerts
|
233
|
+
# => #<ATSD::AlertsService:0x007faf7c0efdc0
|
234
|
+
|
235
|
+
a.query.execute
|
236
|
+
# => [{:value=>447660.0,
|
237
|
+
# :id=>4,
|
238
|
+
# :text_value=>"447660",
|
239
|
+
# :tags=>{},
|
240
|
+
# :metric=>"meminfo.active",
|
241
|
+
# :entity=>"ubuntu",
|
242
|
+
# :severity=>3,
|
243
|
+
# :rule=>"My rule!",
|
244
|
+
# :repeat_count=>5,
|
245
|
+
# :open_time=>1428330612667,
|
246
|
+
# :open_value=>445144.0,
|
247
|
+
# :acknowledged=>false,
|
248
|
+
# :last_event_time=>1428330687440},
|
249
|
+
# {:value=>447660.0,
|
250
|
+
# :id=>6,
|
251
|
+
# :text_value=>"447660",
|
252
|
+
# :tags=>{},
|
253
|
+
# :metric=>"meminfo.active",
|
254
|
+
# :entity=>"ubuntu",
|
255
|
+
# :severity=>3,
|
256
|
+
# ...
|
257
|
+
```
|
258
|
+
#### Metrics Service
|
259
|
+
|
260
|
+
```ruby
|
261
|
+
ms = atsd.metrics
|
262
|
+
# => #<ATSD::MetricsService:0x007fbb548d9548
|
263
|
+
|
264
|
+
ms.list
|
265
|
+
# => [{:name=>"activemq_metrics_count",
|
266
|
+
# :enabled=>true,
|
267
|
+
# :data_type=>"FLOAT",
|
268
|
+
# :counter=>false,
|
269
|
+
# :persistent=>true,
|
270
|
+
# :time_precision=>"MILLISECONDS",
|
271
|
+
# :retention_interval=>0,
|
272
|
+
# :invalid_action=>"NONE",
|
273
|
+
# :last_insert_time=>1428328861848},
|
274
|
+
# {:name=>"activemq_properties_count",
|
275
|
+
# :enabled=>true,
|
276
|
+
# :data_type=>"FLOAT",
|
277
|
+
# :counter=>false,
|
278
|
+
# :persistent=>true,
|
279
|
+
# ...
|
280
|
+
|
281
|
+
ms.entity_and_tags('df.disk_size')
|
282
|
+
# => [{:entity=>"ubuntu", :tags=>{"file_system"=>"/dev/sda1", "mount_point"=>"/"}, :last_insert_time=>1428328928000},
|
283
|
+
# {:entity=>"ubuntu",
|
284
|
+
# :tags=>{"file_system"=>"none", "mount_point"=>"/sys/fs/cgroup"},
|
285
|
+
# :last_insert_time=>1428328928000},
|
286
|
+
# {:entity=>"ubuntu", :tags=>{"file_system"=>"none", "mount_point"=>"/run/lock"}, :last_insert_time=>1428328928000},
|
287
|
+
# {:entity=>"ubuntu", :tags=>{"file_system"=>"none", "mount_point"=>"/run/shm"}, :last_insert_time=>1428328928000},
|
288
|
+
# {:entity=>"ubuntu", :tags=>{"file_system"=>"none", "mount_point"=>"/run/user"}, :last_insert_time=>1428328928000},
|
289
|
+
# {:entity=>"ubuntu", :tags=>{"file_system"=>"udev", "mount_point"=>"/dev"}, :last_insert_time=>1428328928000},
|
290
|
+
# {:entity=>"ubuntu", :tags=>{"file_system"=>"tmpfs", "mount_point"=>"/run"}, :last_insert_time=>1428328928000}]
|
291
|
+
```
|
292
|
+
|
293
|
+
#### Entities Service
|
294
|
+
|
295
|
+
```ruby
|
296
|
+
ent = atsd.entities
|
297
|
+
# => #<ATSD::EntitiesService:0x007f82a45b40b8
|
298
|
+
|
299
|
+
ent.list
|
300
|
+
# => [{:name=>"atsd", :enabled=>true, :last_insert_time=>1428304482631},
|
301
|
+
# {:name=>"mine", :enabled=>true},
|
302
|
+
# {:name=>"test_entity", :enabled=>true, :last_insert_time=>1000000000},
|
303
|
+
# {:name=>"ubuntu", :enabled=>true, :last_insert_time=>1428304489000}]
|
304
|
+
|
305
|
+
ent.get('ubuntu')
|
306
|
+
# => {:name=>"ubuntu", :enabled=>true, :last_insert_time=>1428304499000, :tags=>{}}
|
307
|
+
|
308
|
+
ent.metrics('ubuntu')
|
309
|
+
# => [{:name=>"df.disk_size",
|
310
|
+
# :enabled=>true,
|
311
|
+
# :data_type=>"FLOAT",
|
312
|
+
# :counter=>false,
|
313
|
+
# :persistent=>true,
|
314
|
+
# :time_precision=>"MILLISECONDS",
|
315
|
+
# :retention_interval=>0,
|
316
|
+
# :invalid_action=>"NONE",
|
317
|
+
# :last_insert_time=>1428304499000},
|
318
|
+
# {:name=>"df.disk_used",
|
319
|
+
# :enabled=>true,
|
320
|
+
# ...
|
321
|
+
|
322
|
+
ent.delete(ent.get('mine')) # or ent.delete('mine')
|
323
|
+
ent.list
|
324
|
+
# => [{:name=>"atsd", :enabled=>true, :last_insert_time=>1428304482631},
|
325
|
+
# {:name=>"test_entity", :enabled=>true, :last_insert_time=>1000000000},
|
326
|
+
# {:name=>"ubuntu", :enabled=>true, :last_insert_time=>1428304489000}]
|
327
|
+
```
|
328
|
+
#### Entity Groups Service
|
329
|
+
|
330
|
+
```ruby
|
331
|
+
eg = atsd.entity_groups
|
332
|
+
# => #<ATSD::EntityGroupsService:0x007fb1b2a0d7f8
|
333
|
+
|
334
|
+
eg.create_or_replace('group1')
|
335
|
+
eg.list
|
336
|
+
# => [{:name=>"group1"}]
|
337
|
+
|
338
|
+
eg.add_entities('group1', [{name:'entity1'},{name:'entity2'}])
|
339
|
+
eg.entities(eg.get('group1'))
|
340
|
+
# => [{:name=>"entity1", :enabled=>true}, {:name=>"entity2", :enabled=>true}]
|
341
|
+
|
342
|
+
eg.delete_all_entities('group1')
|
343
|
+
eg.entities('group1')
|
344
|
+
# => []
|
345
|
+
```
|
346
|
+
|
347
|
+
### Errors
|
348
|
+
If the request wasn't completed successfully then an `ATSD::APIError` exception is raised. You can get a message and HTTP status code using the `message` and `status`
|
349
|
+
fields.
|
350
|
+
|
351
|
+
### Low-level API Client
|
352
|
+
Gem also provides an `ATSD::Client` class. It is a simple API wrapper
|
353
|
+
which uses [Faraday](https://github.com/lostisland/faraday) to handle HTTP-related routines.
|
354
|
+
All services are built on top of it.
|
355
|
+
Client has 1-to-1 mapping for all REST methods specified on https://axibase.com/atsd/api.
|
356
|
+
|
357
|
+
You can access `Faraday::Connection` object using the `connection` field of the client if necessary.
|
358
|
+
|
359
|
+
## Development
|
360
|
+
|
361
|
+
After checking out the repository, run `bin/setup` to install dependencies.
|
362
|
+
Then run `bin/console` for an interactive prompt that will allow you to experiment.
|
363
|
+
|
364
|
+
To install this gem onto your local machine, run `bundle exec rake install`.
|
365
|
+
|
data/Rakefile
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
require 'bundler/gem_tasks'
|
2
|
+
require 'rspec/core/rake_task'
|
3
|
+
require 'yard'
|
4
|
+
require 'atsd/version'
|
5
|
+
|
6
|
+
RSpec::Core::RakeTask.new
|
7
|
+
|
8
|
+
task :default => :spec
|
9
|
+
task :test => :spec
|
10
|
+
|
11
|
+
YARD::Rake::YardocTask.new do |t|
|
12
|
+
t.files = ['lib/**/*.rb']
|
13
|
+
t.options = %w[ -m markdown -M redcarpet -r README.md ]
|
14
|
+
t.stats_options = []
|
15
|
+
end
|
16
|
+
|
data/atsd.gemspec
ADDED
@@ -0,0 +1,36 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'atsd/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = 'atsd'
|
8
|
+
spec.version = ATSD::VERSION
|
9
|
+
spec.license = 'Apache-2.0'
|
10
|
+
spec.authors = ['Axibase Corporation']
|
11
|
+
spec.email = ['atsd-api@axibase.com']
|
12
|
+
|
13
|
+
spec.summary = %q{Axibase Time-Series Database Client for Ruby.}
|
14
|
+
spec.description = %q{Axibase Time-Series Database Client for Ruby is an easy-to-use client for interfacing with ATSD metadata and data REST API services.}
|
15
|
+
spec.homepage = 'https://github.com/axibase/atsd-api-ruby/'
|
16
|
+
|
17
|
+
spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
|
18
|
+
spec.bindir = 'exe'
|
19
|
+
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
20
|
+
spec.require_paths = ['lib']
|
21
|
+
|
22
|
+
spec.add_development_dependency 'bundler', '~> 1.7'
|
23
|
+
spec.add_development_dependency 'rake', '~> 10.4'
|
24
|
+
spec.add_development_dependency 'pry', '~> 0.10'
|
25
|
+
spec.add_development_dependency 'rspec', '~> 3.2'
|
26
|
+
spec.add_development_dependency 'vcr', '~> 2.9'
|
27
|
+
spec.add_development_dependency 'yard', '~> 0.8'
|
28
|
+
spec.add_development_dependency 'redcarpet'
|
29
|
+
spec.add_development_dependency 'geminabox'
|
30
|
+
spec.add_development_dependency 'multi_json'
|
31
|
+
|
32
|
+
spec.add_dependency 'faraday', '~> 0.9'
|
33
|
+
spec.add_dependency 'faraday_middleware', '~> 0.9'
|
34
|
+
spec.add_dependency 'hashie', '~> 3.4'
|
35
|
+
spec.add_dependency 'activesupport', '~> 4.0'
|
36
|
+
end
|