atsd 1.0.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.
- 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
|