promoted-ruby-client 0.1.7 → 0.1.11

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 38925e54b884c3e36db632faa2481cd99621846848c21c80def989e1539a87d7
4
- data.tar.gz: 6c0b3caedbef47b9ed6a5c5c1c9e58368031521c6f36181ae1a4938bd9f796fd
3
+ metadata.gz: 950806d84717ca91785f950a51a9612f2c35c8ddf6479c529091c07db454cc3d
4
+ data.tar.gz: 410043b55f5ff026c1909b52bad6d32949b106556de3b0b20a791b3b748c4dfb
5
5
  SHA512:
6
- metadata.gz: eae233ce5d572a6e581a57572292edf212205ab15764ff41db98116506c548b0746a94be236d44dda1bb43d758005a25bef8bbcfb8816295f4de9f30efb75481
7
- data.tar.gz: 5085fa33d2e4d040d134a69cc8af872b4c209bda2ddee1be1f51f3d7c3b948ac8300152a790fbcdadaa5dbb75902b94727d1b20575398d563b5aa6757cfc3ea4
6
+ metadata.gz: f07f0079ed29fed4d2a9ea812ccbc8c6cb19ee711a4f4b6eb7837ac93f41c255244301b6267d7b6637913d78df2fc718083d0289e9e8d8e2fbe58f463839d04a
7
+ data.tar.gz: 87210c80e972f8c4a8324f70debcbba15a35e447120e6c95e437b960a9794b0145f975ba3ea325439fe186d822d543aad72ba9e076b25c1937bd4669a6ce40eb
data/.gitignore CHANGED
@@ -57,4 +57,7 @@ build-iPhoneSimulator/
57
57
  # .rubocop-https?--*
58
58
 
59
59
  # IDE
60
- .vscode/
60
+ .vscode/
61
+
62
+ # Dev
63
+ dev/
data/Gemfile CHANGED
@@ -5,11 +5,6 @@ git_source(:github) {|repo_name| "https://github.com/#{repo_name}" }
5
5
  # Specify your gem's dependencies in promoted-ruby-client.gemspec
6
6
  gemspec
7
7
 
8
- gem 'faraday', '~> 1.4.1'
9
- gem 'faraday_middleware'
10
- gem 'faraday-net_http'
11
- gem 'concurrent-ruby', require: 'concurrent'
12
-
13
8
  group :development do
14
9
  gem 'ruby-debug-ide', group: :development
15
10
  gem 'debase', '>= 0.2.5.beta2', group: :development
data/Gemfile.lock CHANGED
@@ -1,7 +1,12 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- promoted-ruby-client (0.1.7)
4
+ promoted-ruby-client (0.1.11)
5
+ concurrent-ruby (~> 1.1, >= 1.1.9)
6
+ faraday (~> 1.4, >= 1.4.3)
7
+ faraday-net_http (~> 1.0)
8
+ faraday_middleware (~> 1.0, >= 1.0.0)
9
+ net-http-persistent
5
10
 
6
11
  GEM
7
12
  remote: https://rubygems.org/
@@ -10,6 +15,7 @@ GEM
10
15
  backport (1.2.0)
11
16
  benchmark (0.1.1)
12
17
  concurrent-ruby (1.1.9)
18
+ connection_pool (2.2.5)
13
19
  debase (0.2.5.beta2)
14
20
  debase-ruby_core_source (>= 0.10.12)
15
21
  debase-ruby_core_source (0.10.12)
@@ -28,7 +34,7 @@ GEM
28
34
  faraday-em_synchrony (1.0.0)
29
35
  faraday-excon (1.1.0)
30
36
  faraday-net_http (1.0.1)
31
- faraday-net_http_persistent (1.1.0)
37
+ faraday-net_http_persistent (1.2.0)
32
38
  faraday_middleware (1.0.0)
33
39
  faraday (~> 1.0)
34
40
  jaro_winkler (1.5.4)
@@ -38,11 +44,17 @@ GEM
38
44
  kramdown (~> 2.0)
39
45
  mini_portile2 (2.5.3)
40
46
  multipart-post (2.1.1)
47
+ net-http-persistent (4.0.1)
48
+ connection_pool (~> 2.2)
41
49
  nokogiri (1.11.7)
42
50
  mini_portile2 (~> 2.5.0)
43
51
  racc (~> 1.4)
52
+ nokogiri (1.11.7-x86_64-darwin)
53
+ racc (~> 1.4)
54
+ nokogiri (1.11.7-x86_64-linux)
55
+ racc (~> 1.4)
44
56
  parallel (1.20.1)
45
- parser (3.0.1.1)
57
+ parser (3.0.2.0)
46
58
  ast (~> 2.4.1)
47
59
  racc (1.5.2)
48
60
  rainbow (3.0.0)
@@ -64,28 +76,28 @@ GEM
64
76
  diff-lcs (>= 1.2.0, < 2.0)
65
77
  rspec-support (~> 3.10.0)
66
78
  rspec-support (3.10.2)
67
- rubocop (1.17.0)
79
+ rubocop (1.18.4)
68
80
  parallel (~> 1.10)
69
81
  parser (>= 3.0.0.0)
70
82
  rainbow (>= 2.2.2, < 4.0)
71
83
  regexp_parser (>= 1.8, < 3.0)
72
84
  rexml
73
- rubocop-ast (>= 1.7.0, < 2.0)
85
+ rubocop-ast (>= 1.8.0, < 2.0)
74
86
  ruby-progressbar (~> 1.7)
75
87
  unicode-display_width (>= 1.4.0, < 3.0)
76
- rubocop-ast (1.7.0)
88
+ rubocop-ast (1.8.0)
77
89
  parser (>= 3.0.1.1)
78
90
  ruby-debug-ide (0.7.2)
79
91
  rake (>= 0.8.1)
80
92
  ruby-progressbar (1.11.0)
81
- ruby2_keywords (0.0.4)
93
+ ruby2_keywords (0.0.5)
82
94
  simplecov (0.21.2)
83
95
  docile (~> 1.1)
84
96
  simplecov-html (~> 0.11)
85
97
  simplecov_json_formatter (~> 0.1)
86
98
  simplecov-html (0.12.3)
87
99
  simplecov_json_formatter (0.1.3)
88
- solargraph (0.42.3)
100
+ solargraph (0.42.4)
89
101
  backport (~> 1.2)
90
102
  benchmark
91
103
  bundler (>= 1.17.2)
@@ -107,14 +119,12 @@ GEM
107
119
 
108
120
  PLATFORMS
109
121
  ruby
122
+ x86_64-darwin-20
123
+ x86_64-linux
110
124
 
111
125
  DEPENDENCIES
112
- bundler (~> 1.17)
113
- concurrent-ruby
126
+ bundler (~> 2.2, >= 2.2.24)
114
127
  debase (>= 0.2.5.beta2)
115
- faraday (~> 1.4.1)
116
- faraday-net_http
117
- faraday_middleware
118
128
  jaro_winkler
119
129
  promoted-ruby-client!
120
130
  rake (~> 10.0)
@@ -124,4 +134,4 @@ DEPENDENCIES
124
134
  solargraph
125
135
 
126
136
  BUNDLED WITH
127
- 1.17.3
137
+ 2.2.24
data/README.md CHANGED
@@ -88,7 +88,7 @@ Field Name | Type | Optional? | Description
88
88
  ---------- | ---- | --------- | -----------
89
89
  ```:user_info``` | UserInfo | Yes | The user info structure.
90
90
  ```:insertion_id``` | String | Yes | Generated by the SDK (*do not set*)
91
- ```:request_id``` | String | Yes | Generated by the SDK (*do not set*)
91
+ ```:request_id``` | String | Yes | Generated by the SDK when needed (*do not set*)
92
92
  ```:content_id``` | String | No | Identifier for the content to be shown, must be set.
93
93
  ```:properties``` | Properties | Yes | Any additional custom properties to associate. For v1 integrations, it is fine not to fill in all the properties.
94
94
 
@@ -101,7 +101,7 @@ A request for content insertions.
101
101
  Field Name | Type | Optional? | Description
102
102
  ---------- | ---- | --------- | -----------
103
103
  ```:user_info``` | UserInfo | Yes | The user info structure.
104
- ```:request_id``` | String | Yes | Generated by the SDK (*do not set*)
104
+ ```:request_id``` | String | Yes | Generated by the SDK when needed (*do not set*)
105
105
  ```:use_case``` | String | Yes | One of the use case values, i.e. 'FEED' (see [constants.rb](https://github.com/promotedai/promoted-ruby-client/blob/main/lib/promoted/ruby/client/constants.rb)).
106
106
  ```:properties``` | Properties | Yes | Any additional custom properties to associate.
107
107
  ```:paging``` | Paging | Yes | Paging parameters (see TODO)
data/dev.md CHANGED
@@ -4,5 +4,5 @@
4
4
  2. Get credentials for deployment from 1password.
5
5
  3. Modify `promoted-ruby-client.gemspec`'s push block.
6
6
  4. Run `gem build promoted-ruby-client.gemspec` to generate `gem`.
7
- 5. Run (using new output) `gem push promoted-ruby-client-0.1.7.gem`
7
+ 5. Run (using new output) `gem push promoted-ruby-client-0.1.11.gem`
8
8
  6. Update README with new version.
@@ -21,8 +21,14 @@ module Promoted
21
21
  attr_reader :perform_checks, :default_only_log, :delivery_timeout_millis, :metrics_timeout_millis, :should_apply_treatment_func,
22
22
  :default_request_headers, :http_client, :logger, :shadow_traffic_delivery_percent, :async_shadow_traffic
23
23
 
24
- attr_accessor :request_logging_on
24
+ attr_accessor :request_logging_on, :enabled
25
25
 
26
+ ##
27
+ # Whether or not the client is currently enabled for execution.
28
+ def enabled?
29
+ @enabled
30
+ end
31
+
26
32
  ##
27
33
  # A common compact method implementation.
28
34
  def self.copy_and_remove_properties
@@ -55,6 +61,7 @@ module Promoted
55
61
  raise ArgumentError.new("Invalid shadow_traffic_delivery_percent, must be between 0 and 1") if @shadow_traffic_delivery_percent < 0 || @shadow_traffic_delivery_percent > 1.0
56
62
 
57
63
  @sampler = Sampler.new
64
+ @pager = Pager.new
58
65
 
59
66
  # HTTP Client creation
60
67
  @delivery_endpoint = params[:delivery_endpoint] || DEFAULT_DELIVERY_ENDPOINT
@@ -85,6 +92,11 @@ module Promoted
85
92
  fallback_policy: :discard
86
93
  )
87
94
  end
95
+
96
+ @enabled = true
97
+ if params[:enabled] != nil
98
+ @enabled = params[:enabled] || false
99
+ end
88
100
  end
89
101
 
90
102
  ##
@@ -101,19 +113,34 @@ module Promoted
101
113
  def deliver args, headers={}
102
114
  args = Promoted::Ruby::Client::Util.translate_args(args)
103
115
 
116
+ # Respect the enabled state
117
+ if !@enabled
118
+ return {
119
+ insertion: @pager.apply_paging(args[:full_insertion], Promoted::Ruby::Client::INSERTION_PAGING_TYPE['UNPAGED'], args[:request][:paging])
120
+ # No log request returned when disabled
121
+ }
122
+ end
123
+
104
124
  delivery_request_builder = RequestBuilder.new
105
125
  delivery_request_builder.set_request_params(args)
106
126
 
107
127
  perform_common_checks!(args) if @perform_checks
108
128
 
109
- pre_delivery_fillin_fields delivery_request_builder
129
+ delivery_request_builder.ensure_client_timestamp
110
130
 
111
131
  response_insertions = []
112
132
  cohort_membership_to_log = nil
113
- insertions_from_promoted = false
133
+ insertions_from_delivery = false
114
134
 
115
135
  only_log = delivery_request_builder.only_log != nil ? delivery_request_builder.only_log : @default_only_log
116
136
  deliver_err = false
137
+
138
+ if !@pager.validate_paging(delivery_request_builder.full_insertion, delivery_request_builder.request[:paging])
139
+ # Invalid input, log and do SDK-side delivery.
140
+ @logger.warn("Invalid paging parameters") if @logger
141
+ only_log = true
142
+ end
143
+
117
144
  if !only_log
118
145
  cohort_membership_to_log = delivery_request_builder.new_cohort_membership_to_log
119
146
 
@@ -130,22 +157,16 @@ module Promoted
130
157
  @logger.error("Error calling delivery: " + err.message) if @logger
131
158
  end
132
159
 
133
- insertions_from_promoted = (response != nil && !deliver_err);
160
+ insertions_from_delivery = (response != nil && !deliver_err);
134
161
  response_insertions = delivery_request_builder.fill_details_from_response(
135
162
  response ? response[:insertion] : [])
136
163
  end
137
164
  end
138
165
 
139
166
  request_to_log = nil
140
- if !insertions_from_promoted then
167
+ if !insertions_from_delivery then
141
168
  request_to_log = delivery_request_builder.request
142
- size = delivery_request_builder.request.dig(:paging, :size)
143
- response_insertions = size != nil ? delivery_request_builder.full_insertion[0..size] : delivery_request_builder.full_insertion
144
- end
145
-
146
- if request_to_log
147
- request_to_log[:request_id] = SecureRandom.uuid if not request_to_log[:request_id]
148
- add_missing_ids_on_insertions! request_to_log, response_insertions
169
+ response_insertions = @pager.apply_paging(delivery_request_builder.full_insertion, Promoted::Ruby::Client::INSERTION_PAGING_TYPE['UNPAGED'], delivery_request_builder.request[:paging])
149
170
  end
150
171
 
151
172
  log_req = nil
@@ -163,14 +184,12 @@ module Promoted
163
184
  log_request_builder.platform_id = delivery_request_builder.platform_id
164
185
  log_request_builder.timing = delivery_request_builder.timing
165
186
  log_request_builder.user_info = delivery_request_builder.user_info
166
- pre_delivery_fillin_fields log_request_builder
167
-
168
187
 
169
188
  # On a successful delivery request, we don't log the insertions
170
189
  # or the request since they are logged on the server-side.
171
190
  log_req = log_request_builder.log_request_params(
172
- include_insertions: !insertions_from_promoted,
173
- include_request: !insertions_from_promoted)
191
+ include_insertions: !insertions_from_delivery,
192
+ include_request: !insertions_from_delivery)
174
193
  end
175
194
 
176
195
  client_response = {
@@ -186,6 +205,12 @@ module Promoted
186
205
  def prepare_for_logging args, headers={}
187
206
  args = Promoted::Ruby::Client::Util.translate_args(args)
188
207
 
208
+ if !@enabled
209
+ return {
210
+ insertion: args[:full_insertion]
211
+ }
212
+ end
213
+
189
214
  log_request_builder = RequestBuilder.new
190
215
 
191
216
  # Note: This method expects as JSON (string keys) but internally, RequestBuilder
@@ -201,7 +226,7 @@ module Promoted
201
226
  end
202
227
  end
203
228
 
204
- pre_delivery_fillin_fields log_request_builder
229
+ log_request_builder.ensure_client_timestamp
205
230
 
206
231
  if !shadow_traffic_err && should_send_as_shadow_traffic?
207
232
  deliver_shadow_traffic args, headers
@@ -237,34 +262,31 @@ module Promoted
237
262
 
238
263
  if send_async && @pool
239
264
  @pool.post do
240
- start_time = Time.now.to_i
265
+ start_time = Time.now
241
266
  begin
242
267
  resp = @http_client.send(endpoint, timeout_millis, payload, use_headers)
243
268
  rescue Faraday::Error => err
244
- @logger.warn("Deliver call failed with #{err}") if @logger
269
+ @logger.warn("Async send_request failed with #{err}") if @logger
245
270
  return
246
271
  end
247
- ellapsed_time = Time.now.to_i - start_time
248
- @logger.info("Deliver call completed in #{ellapsed_time} ms") if @logger
272
+
273
+ ellapsed_time = Time.now - start_time
274
+ @logger.debug("Async send_request completed in #{ellapsed_time.to_f * 1000} ms") if @logger
249
275
  end
250
276
  else
277
+ start_time = Time.now
251
278
  begin
252
279
  resp = @http_client.send(endpoint, timeout_millis, payload, use_headers)
253
280
  rescue Faraday::Error => err
281
+ @logger.warn("Sync send_request failed with #{err}") if @logger
254
282
  raise EndpointError.new(err)
255
283
  end
256
- end
257
284
 
258
- return resp
285
+ ellapsed_time = Time.now - start_time
286
+ @logger.debug("Sync send_request completed in #{ellapsed_time.to_f * 1000} ms") if @logger
259
287
  end
260
288
 
261
-
262
- def add_missing_ids_on_insertions! request, insertions
263
- insertions.each do |insertion|
264
- insertion[:insertion_id] = SecureRandom.uuid if not insertion[:insertion_id]
265
- insertion[:session_id] = request[:session_id] if request[:session_id]
266
- insertion[:request_id] = request[:request_id] if request[:request_id]
267
- end
289
+ return resp
268
290
  end
269
291
 
270
292
  def should_send_as_shadow_traffic?
@@ -281,8 +303,19 @@ module Promoted
281
303
  delivery_request_params = delivery_request_builder.delivery_request_params(should_compact: false)
282
304
  delivery_request_params[:client_info][:traffic_type] = Promoted::Ruby::Client::TRAFFIC_TYPE['SHADOW']
283
305
 
284
- # Call Delivery API async (fire and forget)
285
- send_request(delivery_request_params, @delivery_endpoint, @delivery_timeout_millis, @delivery_api_key, headers, true)
306
+ # Call Delivery API and log/ignore errors.
307
+ start_time = Time.now
308
+ begin
309
+ send_request(delivery_request_params, @delivery_endpoint, @delivery_timeout_millis, @delivery_api_key, headers, @async_shadow_traffic)
310
+ rescue StandardError => err
311
+ @logger.warn("Shadow traffic call failed with #{err}") if @logger
312
+ return
313
+ end
314
+
315
+ if !@async_shadow_traffic
316
+ ellapsed_time = Time.now - start_time
317
+ @logger.info("Shadow traffic call completed in #{ellapsed_time.to_f * 1000} ms") if @logger
318
+ end
286
319
  end
287
320
 
288
321
  def perform_common_checks!(req)
@@ -303,14 +336,7 @@ module Promoted
303
336
  return true if !cohort_membership[:arm]
304
337
  return cohort_membership[:arm] != Promoted::Ruby::Client::COHORT_ARM['CONTROL']
305
338
  end
306
- end
307
-
308
- # TODO: This probably just goes better in the RequestBuilder class.
309
- def pre_delivery_fillin_fields(log_request_builder)
310
- if log_request_builder.timing[:client_log_timestamp].nil?
311
- log_request_builder.timing[:client_log_timestamp] = Time.now.to_i
312
- end
313
- end
339
+ end
314
340
  end
315
341
  end
316
342
  end
@@ -318,6 +344,7 @@ end
318
344
 
319
345
  # dependent /libs
320
346
  require "promoted/ruby/client/request_builder"
347
+ require "promoted/ruby/client/pager"
321
348
  require "promoted/ruby/client/sampler"
322
349
  require "promoted/ruby/client/util"
323
350
  require "promoted/ruby/client/validator"
@@ -11,7 +11,7 @@ module Promoted
11
11
  f.request :json
12
12
  f.request :retry, max: 3
13
13
  f.use Faraday::Response::RaiseError # raises on 4xx and 5xx responses
14
- f.adapter :net_http
14
+ f.adapter :net_http_persistent
15
15
  end
16
16
  end
17
17
 
@@ -0,0 +1,15 @@
1
+ module Promoted
2
+ module Ruby
3
+ module Client
4
+ class IdGenerator
5
+ def initialize;end
6
+
7
+ def newID
8
+ SecureRandom.uuid
9
+ end
10
+ end
11
+ end
12
+ end
13
+ end
14
+
15
+ require 'securerandom'
@@ -0,0 +1,57 @@
1
+ module Promoted
2
+ module Ruby
3
+ module Client
4
+ class Pager
5
+ def validate_paging (insertions, paging)
6
+ if paging && paging[:offset]
7
+ return paging[:offset] < insertions.length
8
+ end
9
+ return true
10
+ end
11
+
12
+ def apply_paging (insertions, insertion_page_type, paging = nil)
13
+ # This is invalid input, stop it before it goes to the server.
14
+ if !validate_paging(insertions, paging)
15
+ return []
16
+ end
17
+
18
+ if !paging
19
+ paging = {
20
+ :offset => 0,
21
+ :size => insertions.length
22
+ }
23
+ end
24
+
25
+ offset = [0, paging[:offset]].max
26
+
27
+ index = offset
28
+ if insertion_page_type == Promoted::Ruby::Client::INSERTION_PAGING_TYPE['PRE_PAGED']
29
+ # When insertions are pre-paged, we don't use offset to
30
+ # window into the provided insertions, although we do use it when
31
+ # assigning positions.
32
+ index = 0
33
+ end
34
+
35
+ size = paging[:size]
36
+ if size <= 0
37
+ size = insertions.length
38
+ end
39
+
40
+ final_insertion_size = [size, insertions.length].min
41
+ insertion_page = Array.new(final_insertion_size)
42
+ 0.upto(final_insertion_size - 1) {|i|
43
+ insertion = insertions[index]
44
+ if insertion[:position] == nil
45
+ insertion[:position] = offset
46
+ end
47
+ insertion_page[i] = insertion
48
+ index = index + 1
49
+ offset = offset + 1
50
+ }
51
+
52
+ return insertion_page
53
+ end
54
+ end
55
+ end
56
+ end
57
+ end
@@ -8,7 +8,13 @@ module Promoted
8
8
 
9
9
  attr_accessor :timing, :user_info, :platform_id
10
10
 
11
- def initialize;end
11
+ def initialize args = {}
12
+ if args[:id_generator]
13
+ @id_generator = args[:id_generator]
14
+ else
15
+ @id_generator = IdGenerator.new
16
+ end
17
+ end
12
18
 
13
19
  # Populates request parameters from the given arguments, presumed to be a hash of symbols.
14
20
  def set_request_params args = {}
@@ -21,11 +27,13 @@ module Promoted
21
27
  @view_id = request[:view_id]
22
28
  @use_case = Promoted::Ruby::Client::USE_CASES[request[:use_case]] || Promoted::Ruby::Client::USE_CASES['UNKNOWN_USE_CASE']
23
29
  @full_insertion = args[:full_insertion]
24
- @request_id = SecureRandom.uuid
25
30
  @user_info = request[:user_info] || { :user_id => nil, :log_user_id => nil}
26
31
  @timing = request[:timing] || { :client_log_timestamp => Time.now.to_i }
27
32
  @to_compact_metrics_insertion_func = args[:to_compact_metrics_insertion_func]
28
33
  @to_compact_delivery_insertion_func = args[:to_compact_delivery_insertion_func]
34
+
35
+ # If the user didn't create a client request id, we do it for them.
36
+ request[:client_request_id] = request[:client_request_id] || @id_generator.newID
29
37
  end
30
38
 
31
39
  # Only used in delivery
@@ -50,13 +58,13 @@ module Promoted
50
58
  timing: timing,
51
59
  client_info: @client_info.merge({ :client_type => Promoted::Ruby::Client::CLIENT_TYPE['PLATFORM_SERVER'] }),
52
60
  platform_id: @platform_id,
53
- request_id: @request_id,
54
61
  view_id: @view_id,
55
62
  session_id: @session_id,
56
63
  use_case: @use_case,
57
64
  search_query: request[:search_query],
58
65
  properties: request[:properties],
59
- paging: request[:paging]
66
+ paging: request[:paging],
67
+ client_request_id: request[:client_request_id]
60
68
  }
61
69
  params[:insertion] = should_compact ? compact_delivery_insertions : full_insertion
62
70
 
@@ -94,8 +102,17 @@ module Promoted
94
102
  cohort_membership: @experiment,
95
103
  client_info: @client_info
96
104
  }
97
- params[:request] = [request] if include_request
98
- params[:insertion] = compact_metrics_insertions if include_insertions
105
+
106
+ # Log request allows for multiple requests but here we only send one.
107
+ if include_request
108
+ request[:request_id] = request[:request_id] || @id_generator.newID
109
+ params[:request] = [request]
110
+ end
111
+
112
+ if include_insertions
113
+ params[:insertion] = compact_metrics_insertions if include_insertions
114
+ add_missing_ids_on_insertions! request, params[:insertion]
115
+ end
99
116
 
100
117
  params.clean!
101
118
  end
@@ -108,6 +125,12 @@ module Promoted
108
125
  end
109
126
  end
110
127
 
128
+ def ensure_client_timestamp
129
+ if timing[:client_log_timestamp].nil?
130
+ timing[:client_log_timestamp] = Time.now.to_i
131
+ end
132
+ end
133
+
111
134
  # TODO: This looks overly complicated.
112
135
  def compact_metrics_insertions
113
136
  @insertion = [] # insertion should be set according to the compact insertion
@@ -126,7 +149,7 @@ module Promoted
126
149
  insertion_obj = Hash[insertion_obj]
127
150
  insertion_obj[:user_info] = user_info
128
151
  insertion_obj[:timing] = timing
129
- insertion_obj[:insertion_id] = SecureRandom.uuid # generate random UUID
152
+ insertion_obj[:insertion_id] = @id_generator.newID
130
153
  insertion_obj[:request_id] = request_id
131
154
  insertion_obj[:position] = offset + index
132
155
  insertion_obj = @to_compact_metrics_insertion_func.call(insertion_obj) if @to_compact_metrics_insertion_func
@@ -137,6 +160,14 @@ module Promoted
137
160
 
138
161
  private
139
162
 
163
+ def add_missing_ids_on_insertions! request, insertions
164
+ insertions.each do |insertion|
165
+ insertion[:insertion_id] = @id_generator.newID if not insertion[:insertion_id]
166
+ insertion[:session_id] = request[:session_id] if request[:session_id]
167
+ insertion[:request_id] = request[:request_id] if request[:request_id]
168
+ end
169
+ end
170
+
140
171
  # A list of the response Insertions. This client expects lists to be truncated
141
172
  # already to request.paging.size. If not truncated, this client will truncate
142
173
  # the list.
@@ -148,6 +179,6 @@ module Promoted
148
179
  end
149
180
  end
150
181
 
151
- require 'securerandom'
152
182
  require "promoted/ruby/client/constants"
153
183
  require "promoted/ruby/client/extensions"
184
+ require "promoted/ruby/client/id_generator"
@@ -1,7 +1,7 @@
1
1
  module Promoted
2
2
  module Ruby
3
3
  module Client
4
- VERSION = "0.1.7"
4
+ VERSION = "0.1.11"
5
5
  end
6
6
  end
7
7
  end
@@ -28,7 +28,13 @@ Gem::Specification.new do |spec|
28
28
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
29
29
  spec.require_paths = ["lib"]
30
30
 
31
- spec.add_development_dependency "bundler", "~> 1.17"
31
+ spec.add_runtime_dependency 'faraday', '~> 1.4', '>= 1.4.3'
32
+ spec.add_runtime_dependency 'faraday_middleware', '~> 1.0', '>= 1.0.0'
33
+ spec.add_runtime_dependency 'faraday-net_http', '~> 1.0'
34
+ spec.add_runtime_dependency 'net-http-persistent'
35
+ spec.add_runtime_dependency 'concurrent-ruby', '~> 1.1', '>= 1.1.9'
36
+
37
+ spec.add_development_dependency "bundler", '~> 2.2', '>= 2.2.24'
32
38
  spec.add_development_dependency "rake", "~> 10.0"
33
39
  spec.add_development_dependency "rspec", "~> 3.0"
34
40
  end
metadata CHANGED
@@ -1,29 +1,123 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: promoted-ruby-client
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.7
4
+ version: 0.1.11
5
5
  platform: ruby
6
6
  authors:
7
7
  - scottmcmaster
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2021-07-14 00:00:00.000000000 Z
11
+ date: 2021-07-24 00:00:00.000000000 Z
12
12
  dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: faraday
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.4'
20
+ - - ">="
21
+ - !ruby/object:Gem::Version
22
+ version: 1.4.3
23
+ type: :runtime
24
+ prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ requirements:
27
+ - - "~>"
28
+ - !ruby/object:Gem::Version
29
+ version: '1.4'
30
+ - - ">="
31
+ - !ruby/object:Gem::Version
32
+ version: 1.4.3
33
+ - !ruby/object:Gem::Dependency
34
+ name: faraday_middleware
35
+ requirement: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - ">="
38
+ - !ruby/object:Gem::Version
39
+ version: 1.0.0
40
+ - - "~>"
41
+ - !ruby/object:Gem::Version
42
+ version: '1.0'
43
+ type: :runtime
44
+ prerelease: false
45
+ version_requirements: !ruby/object:Gem::Requirement
46
+ requirements:
47
+ - - ">="
48
+ - !ruby/object:Gem::Version
49
+ version: 1.0.0
50
+ - - "~>"
51
+ - !ruby/object:Gem::Version
52
+ version: '1.0'
53
+ - !ruby/object:Gem::Dependency
54
+ name: faraday-net_http
55
+ requirement: !ruby/object:Gem::Requirement
56
+ requirements:
57
+ - - "~>"
58
+ - !ruby/object:Gem::Version
59
+ version: '1.0'
60
+ type: :runtime
61
+ prerelease: false
62
+ version_requirements: !ruby/object:Gem::Requirement
63
+ requirements:
64
+ - - "~>"
65
+ - !ruby/object:Gem::Version
66
+ version: '1.0'
67
+ - !ruby/object:Gem::Dependency
68
+ name: net-http-persistent
69
+ requirement: !ruby/object:Gem::Requirement
70
+ requirements:
71
+ - - ">="
72
+ - !ruby/object:Gem::Version
73
+ version: '0'
74
+ type: :runtime
75
+ prerelease: false
76
+ version_requirements: !ruby/object:Gem::Requirement
77
+ requirements:
78
+ - - ">="
79
+ - !ruby/object:Gem::Version
80
+ version: '0'
81
+ - !ruby/object:Gem::Dependency
82
+ name: concurrent-ruby
83
+ requirement: !ruby/object:Gem::Requirement
84
+ requirements:
85
+ - - "~>"
86
+ - !ruby/object:Gem::Version
87
+ version: '1.1'
88
+ - - ">="
89
+ - !ruby/object:Gem::Version
90
+ version: 1.1.9
91
+ type: :runtime
92
+ prerelease: false
93
+ version_requirements: !ruby/object:Gem::Requirement
94
+ requirements:
95
+ - - "~>"
96
+ - !ruby/object:Gem::Version
97
+ version: '1.1'
98
+ - - ">="
99
+ - !ruby/object:Gem::Version
100
+ version: 1.1.9
13
101
  - !ruby/object:Gem::Dependency
14
102
  name: bundler
15
103
  requirement: !ruby/object:Gem::Requirement
16
104
  requirements:
17
105
  - - "~>"
18
106
  - !ruby/object:Gem::Version
19
- version: '1.17'
107
+ version: '2.2'
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: 2.2.24
20
111
  type: :development
21
112
  prerelease: false
22
113
  version_requirements: !ruby/object:Gem::Requirement
23
114
  requirements:
24
115
  - - "~>"
25
116
  - !ruby/object:Gem::Version
26
- version: '1.17'
117
+ version: '2.2'
118
+ - - ">="
119
+ - !ruby/object:Gem::Version
120
+ version: 2.2.24
27
121
  - !ruby/object:Gem::Dependency
28
122
  name: rake
29
123
  requirement: !ruby/object:Gem::Requirement
@@ -75,6 +169,8 @@ files:
75
169
  - lib/promoted/ruby/client/errors.rb
76
170
  - lib/promoted/ruby/client/extensions.rb
77
171
  - lib/promoted/ruby/client/faraday_http_client.rb
172
+ - lib/promoted/ruby/client/id_generator.rb
173
+ - lib/promoted/ruby/client/pager.rb
78
174
  - lib/promoted/ruby/client/request_builder.rb
79
175
  - lib/promoted/ruby/client/sampler.rb
80
176
  - lib/promoted/ruby/client/util.rb