airship-ruby 1.1.9 → 1.1.10
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/airship-ruby.gemspec +5 -5
- data/lib/airship-ruby.rb +61 -60
- metadata +26 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3d59b238a7a3c148f227bf5cee84afdea2b05d503cc4c09cb32099cedb2f124a
|
4
|
+
data.tar.gz: 8995be1f77fa3c2b4bb28ab3e0b59c398e4b93aa42c2e06105c5c6e5c49b40ad
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1aa178627ab85311d5526a4fe04c73af313f12fb3c77792caa20d7b59d76898bf846426e2ac125e7abf132c2c879a2d1eba3ff6c9fd7cb60ff6bf4de7df9aace
|
7
|
+
data.tar.gz: 1c6f2fa64fb2833b3a6cea08ece255cc02bbe5e88c66fb62a6a07298c18c8074a32a3513e4436350481f3f10570f3e9e11827af736a48185a7c14a49bb20559e
|
data/airship-ruby.gemspec
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
Gem::Specification.new do |s|
|
2
2
|
s.name = "airship-ruby"
|
3
|
-
s.version = "1.1.
|
3
|
+
s.version = "1.1.10"
|
4
4
|
s.licenses = ["MIT"]
|
5
5
|
s.summary = "Airship Ruby SDK"
|
6
6
|
s.description = "Ruby SDK"
|
@@ -9,8 +9,8 @@ Gem::Specification.new do |s|
|
|
9
9
|
s.files = ["lib/airship-ruby.rb", "airship-ruby.gemspec"]
|
10
10
|
s.homepage = "https://airshiphq.com"
|
11
11
|
s.metadata = { "source_code_uri" => "https://github.com/airshiphq/airship-ruby" }
|
12
|
-
s.add_runtime_dependency "faraday", ">= 0.9.0"
|
13
|
-
s.add_runtime_dependency "json", ">= 1.8.2"
|
14
|
-
s.add_runtime_dependency "concurrent-ruby", ">= 1.0.3"
|
15
|
-
s.add_runtime_dependency "json-schema", ">= 2.5.0"
|
12
|
+
s.add_runtime_dependency "faraday", "~> 0.9", ">= 0.9.0"
|
13
|
+
s.add_runtime_dependency "json", "~> 1.8", ">= 1.8.2"
|
14
|
+
s.add_runtime_dependency "concurrent-ruby", "~> 1.0", ">= 1.0.3"
|
15
|
+
s.add_runtime_dependency "json-schema", "~> 2.5", ">= 2.5.0"
|
16
16
|
end
|
data/lib/airship-ruby.rb
CHANGED
@@ -160,56 +160,44 @@ class Airship
|
|
160
160
|
end
|
161
161
|
|
162
162
|
def initialize(options)
|
163
|
-
|
164
163
|
@api_key = options[:api_key]
|
165
164
|
@env_key = options[:env_key]
|
165
|
+
@timeout = 10
|
166
166
|
|
167
|
-
|
168
|
-
|
169
|
-
end
|
167
|
+
@polling_interval = 60
|
168
|
+
@ingestion_interval = 60
|
170
169
|
|
171
|
-
|
172
|
-
|
173
|
-
end
|
170
|
+
@polling_thread = nil
|
171
|
+
@ingestion_thread = nil
|
174
172
|
|
175
173
|
@gating_info = nil
|
176
|
-
@gating_info_downloader_task = nil
|
177
|
-
@gating_info_polling_interval = 60
|
178
|
-
|
179
174
|
@gating_info_map = nil
|
180
175
|
|
181
|
-
@
|
182
|
-
@
|
176
|
+
@last_ingestion_timestamp = 0
|
177
|
+
@ingestion_tasks = []
|
183
178
|
|
184
|
-
@
|
185
|
-
@
|
179
|
+
@ingestion_batch = []
|
180
|
+
@ingestion_max_batch_size = 500
|
186
181
|
|
187
|
-
@
|
182
|
+
@init_lock = Concurrent::Semaphore.new(1)
|
183
|
+
@ingestion_batch_lock = Concurrent::Semaphore.new(1)
|
188
184
|
|
189
|
-
@
|
190
|
-
|
191
|
-
@initialization_lock = Concurrent::Semaphore.new(1)
|
192
|
-
@gate_stats_batch_lock = Concurrent::Semaphore.new(1)
|
193
|
-
|
194
|
-
@first_gate = true
|
185
|
+
@first_ingestion = true
|
195
186
|
end
|
196
187
|
|
197
188
|
def init
|
198
|
-
@
|
199
|
-
if @
|
189
|
+
@init_lock.acquire
|
190
|
+
if @polling_thread.nil?
|
200
191
|
self._poll
|
201
|
-
|
202
|
-
|
203
|
-
end
|
204
|
-
@gating_info_downloader_task = self._create_poller
|
205
|
-
@gating_info_downloader_task.execute
|
192
|
+
@polling_thread = self._create_poller
|
193
|
+
@polling_thread.execute
|
206
194
|
end
|
207
195
|
|
208
|
-
if @
|
209
|
-
@
|
210
|
-
@
|
196
|
+
if @ingestion_thread.nil?
|
197
|
+
@ingestion_thread = self._create_ingestor
|
198
|
+
@ingestion_thread.execute
|
211
199
|
end
|
212
|
-
@
|
200
|
+
@init_lock.release
|
213
201
|
self
|
214
202
|
end
|
215
203
|
|
@@ -271,7 +259,7 @@ class Airship
|
|
271
259
|
|
272
260
|
object['stats'] = stats
|
273
261
|
|
274
|
-
self.
|
262
|
+
self._ingest_async(object)
|
275
263
|
end
|
276
264
|
|
277
265
|
return is_enabled
|
@@ -335,7 +323,7 @@ class Airship
|
|
335
323
|
|
336
324
|
object['stats'] = stats
|
337
325
|
|
338
|
-
self.
|
326
|
+
self._ingest_async(object)
|
339
327
|
end
|
340
328
|
|
341
329
|
return variation
|
@@ -399,7 +387,7 @@ class Airship
|
|
399
387
|
|
400
388
|
object['stats'] = stats
|
401
389
|
|
402
|
-
self.
|
390
|
+
self._ingest_async(object)
|
403
391
|
end
|
404
392
|
|
405
393
|
return is_eligible
|
@@ -460,53 +448,66 @@ class Airship
|
|
460
448
|
begin
|
461
449
|
conn = Faraday.new(url: "#{GATING_INFO_ENDPOINT}/#{@env_key}")
|
462
450
|
response = conn.get do |req|
|
463
|
-
req.options.timeout =
|
451
|
+
req.options.timeout = @timeout
|
464
452
|
req.headers['api-key'] = @api_key
|
465
453
|
end
|
466
454
|
if response.status == 200
|
467
455
|
gating_info = JSON.parse(response.body)
|
468
456
|
|
469
457
|
if gating_info['server_info'] == 'maintenance'
|
458
|
+
puts 'Airship is currently going through maintenance'
|
470
459
|
return
|
471
460
|
end
|
472
461
|
|
473
462
|
gating_info_map = self._get_gating_info_map(gating_info)
|
474
463
|
@gating_info = gating_info
|
475
464
|
@gating_info_map = gating_info_map
|
465
|
+
|
466
|
+
if !gating_info['polling_interval'].nil?
|
467
|
+
self.polling_interval = gating_info['polling_interval']
|
468
|
+
end
|
469
|
+
|
470
|
+
if !gating_info['ingestion_interval'].nil?
|
471
|
+
self.ingestion_interval = gating_info['ingestion_interval']
|
472
|
+
end
|
473
|
+
else
|
474
|
+
puts 'Failed to connect to Airship server'
|
476
475
|
end
|
477
476
|
rescue Exception => e
|
478
|
-
puts 'Failed to
|
477
|
+
puts 'Failed to connect to Airship server'
|
479
478
|
end
|
480
479
|
end
|
481
480
|
|
482
481
|
def _create_poller
|
483
|
-
Concurrent::TimerTask.new(execution_interval: @
|
482
|
+
Concurrent::TimerTask.new(execution_interval: @polling_interval, timeout_interval: @timeout) do |task|
|
484
483
|
self._poll
|
484
|
+
task.execution_interval = @polling_interval
|
485
485
|
end
|
486
486
|
end
|
487
487
|
|
488
|
-
def
|
489
|
-
Concurrent::TimerTask.new(execution_interval: @
|
488
|
+
def _create_ingestor
|
489
|
+
Concurrent::TimerTask.new(execution_interval: @ingestion_interval, timeout_interval: @timeout) do |task|
|
490
490
|
now = Time.now.utc.to_i
|
491
|
-
if now - @
|
491
|
+
if now - @last_ingestion_timestamp >= @ingestion_interval
|
492
492
|
processed = self._process_batch(0)
|
493
493
|
if processed
|
494
|
-
@
|
494
|
+
@last_ingestion_timestamp = now
|
495
495
|
end
|
496
496
|
end
|
497
|
+
task.execution_interval = @ingestion_interval
|
497
498
|
end
|
498
499
|
end
|
499
500
|
|
500
|
-
def _create_processor(
|
501
|
+
def _create_processor(payload)
|
501
502
|
return Concurrent::ScheduledTask.execute(0) do |task|
|
502
503
|
conn = Faraday.new(url: IDENTIFY_ENDPOINT)
|
503
504
|
response = conn.post do |req|
|
504
|
-
req.options.timeout =
|
505
|
+
req.options.timeout = @timeout
|
505
506
|
req.headers['Content-Type'] = 'application/json'
|
506
507
|
req.headers['api-key'] = @api_key
|
507
508
|
req.body = JSON.generate({
|
508
509
|
'env_key' => @env_key,
|
509
|
-
'objects' =>
|
510
|
+
'objects' => payload,
|
510
511
|
})
|
511
512
|
end
|
512
513
|
end
|
@@ -521,33 +522,33 @@ class Airship
|
|
521
522
|
# is performed.
|
522
523
|
|
523
524
|
processed = false
|
524
|
-
@
|
525
|
+
@ingestion_batch_lock.acquire
|
525
526
|
if !gate_stats.nil?
|
526
|
-
@
|
527
|
+
@ingestion_batch.push(gate_stats)
|
527
528
|
end
|
528
|
-
if @
|
529
|
-
@
|
530
|
-
|
531
|
-
@
|
529
|
+
if @ingestion_batch.size > limit || (@first_ingestion && @ingestion_batch.size > 0)
|
530
|
+
@first_ingestion = false
|
531
|
+
new_ingestion_tasks = []
|
532
|
+
@ingestion_tasks.each do |task|
|
532
533
|
if !task.fulfilled?
|
533
|
-
|
534
|
+
new_ingestion_tasks.push(task)
|
534
535
|
end
|
535
536
|
end
|
536
|
-
|
537
|
-
@
|
538
|
-
|
539
|
-
@
|
537
|
+
payload = @ingestion_batch
|
538
|
+
@ingestion_batch = []
|
539
|
+
new_ingestion_tasks.push(self._create_processor(payload))
|
540
|
+
@ingestion_tasks = new_ingestion_tasks
|
540
541
|
processed = true
|
541
542
|
end
|
542
|
-
@
|
543
|
+
@ingestion_batch_lock.release
|
543
544
|
processed
|
544
545
|
end
|
545
546
|
|
546
|
-
def
|
547
|
-
processed = self._process_batch(@
|
547
|
+
def _ingest_async(gate_stats)
|
548
|
+
processed = self._process_batch(@ingestion_max_batch_size - 1, gate_stats)
|
548
549
|
if processed
|
549
550
|
now = Time.now.utc.to_i
|
550
|
-
@
|
551
|
+
@last_ingestion_timestamp = now
|
551
552
|
end
|
552
553
|
end
|
553
554
|
|
metadata
CHANGED
@@ -1,19 +1,22 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: airship-ruby
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.1.
|
4
|
+
version: 1.1.10
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Airship Dev Team
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-
|
11
|
+
date: 2018-05-18 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: faraday
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0.9'
|
17
20
|
- - ">="
|
18
21
|
- !ruby/object:Gem::Version
|
19
22
|
version: 0.9.0
|
@@ -21,6 +24,9 @@ dependencies:
|
|
21
24
|
prerelease: false
|
22
25
|
version_requirements: !ruby/object:Gem::Requirement
|
23
26
|
requirements:
|
27
|
+
- - "~>"
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '0.9'
|
24
30
|
- - ">="
|
25
31
|
- !ruby/object:Gem::Version
|
26
32
|
version: 0.9.0
|
@@ -28,6 +34,9 @@ dependencies:
|
|
28
34
|
name: json
|
29
35
|
requirement: !ruby/object:Gem::Requirement
|
30
36
|
requirements:
|
37
|
+
- - "~>"
|
38
|
+
- !ruby/object:Gem::Version
|
39
|
+
version: '1.8'
|
31
40
|
- - ">="
|
32
41
|
- !ruby/object:Gem::Version
|
33
42
|
version: 1.8.2
|
@@ -35,6 +44,9 @@ dependencies:
|
|
35
44
|
prerelease: false
|
36
45
|
version_requirements: !ruby/object:Gem::Requirement
|
37
46
|
requirements:
|
47
|
+
- - "~>"
|
48
|
+
- !ruby/object:Gem::Version
|
49
|
+
version: '1.8'
|
38
50
|
- - ">="
|
39
51
|
- !ruby/object:Gem::Version
|
40
52
|
version: 1.8.2
|
@@ -42,6 +54,9 @@ dependencies:
|
|
42
54
|
name: concurrent-ruby
|
43
55
|
requirement: !ruby/object:Gem::Requirement
|
44
56
|
requirements:
|
57
|
+
- - "~>"
|
58
|
+
- !ruby/object:Gem::Version
|
59
|
+
version: '1.0'
|
45
60
|
- - ">="
|
46
61
|
- !ruby/object:Gem::Version
|
47
62
|
version: 1.0.3
|
@@ -49,6 +64,9 @@ dependencies:
|
|
49
64
|
prerelease: false
|
50
65
|
version_requirements: !ruby/object:Gem::Requirement
|
51
66
|
requirements:
|
67
|
+
- - "~>"
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: '1.0'
|
52
70
|
- - ">="
|
53
71
|
- !ruby/object:Gem::Version
|
54
72
|
version: 1.0.3
|
@@ -56,6 +74,9 @@ dependencies:
|
|
56
74
|
name: json-schema
|
57
75
|
requirement: !ruby/object:Gem::Requirement
|
58
76
|
requirements:
|
77
|
+
- - "~>"
|
78
|
+
- !ruby/object:Gem::Version
|
79
|
+
version: '2.5'
|
59
80
|
- - ">="
|
60
81
|
- !ruby/object:Gem::Version
|
61
82
|
version: 2.5.0
|
@@ -63,6 +84,9 @@ dependencies:
|
|
63
84
|
prerelease: false
|
64
85
|
version_requirements: !ruby/object:Gem::Requirement
|
65
86
|
requirements:
|
87
|
+
- - "~>"
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '2.5'
|
66
90
|
- - ">="
|
67
91
|
- !ruby/object:Gem::Version
|
68
92
|
version: 2.5.0
|