atsd 1.0.1

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