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.
@@ -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
@@ -0,0 +1,11 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /Gemfile.lock
4
+ /_yardoc/
5
+ /coverage/
6
+ /doc/
7
+ /pkg/
8
+ /spec/reports/
9
+ /tmp/
10
+ .idea
11
+ /spec/config.yml
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --color
2
+ --require helpers/spec_helper
data/Gemfile ADDED
@@ -0,0 +1,8 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in atsd.gemspec
4
+ gemspec
5
+
6
+ group :development do
7
+ gem 'vcr', github: 'vcr/vcr', ref: '572f1974b269c2bcb53fdf9a464011ed97758a6f' # fixes for Faraday
8
+ end
@@ -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
+
@@ -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
+
@@ -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