analytics-ruby 2.0.13 → 2.4.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 71d4951f83fc43ae93e330b35c97062bd9c8df64
4
- data.tar.gz: 11e299db5daf757cba620a539fd827dd25a8436d
2
+ SHA256:
3
+ metadata.gz: 51f3f02afed05c9c8461b454e0a3067962a75b8efde0930db0098eebf4a62829
4
+ data.tar.gz: e7d486d6c6186535e9a005c4d950e6e29d2dd9937f9b6da625191d786f76846a
5
5
  SHA512:
6
- metadata.gz: 8439045c35184236fe21998035a6aa56b799b0d51246f7a52afc676511991eedb71001059ed81fc5f72f05debb1471ea4acc49cc9c4395f7844d010c35c9a95c
7
- data.tar.gz: 3e5e394d1a0c569d37b8eccb85edc086ff6d7a94fb0eb8894764bafb57eaa01700ab7b2b64834052a17421e23b86396f8d9beca3fbcc67b824d6f2b4d615ea05
6
+ metadata.gz: c2ce09d450de65620eb99f9fae86aa5ce57709d53aa4a93c73c2d3db0b173afad532383a50fe4dcb953df72171b731a263ff7308aed79b646a25bc202c555e4d
7
+ data.tar.gz: b3625484ebca6117ae79fc42f03a595dff861b8c5ca02a6ef12ea9e933229c1479dad40b4db1d85e61ddf585c7c5a072d68e9cd21ced6b2482db338f45073707
data/bin/analytics ADDED
@@ -0,0 +1,108 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'segment/analytics'
4
+ require 'rubygems'
5
+ require 'commander/import'
6
+ require 'time'
7
+ require 'json'
8
+
9
+ program :name, 'simulator.rb'
10
+ program :version, '0.0.1'
11
+ program :description, 'scripting simulator'
12
+
13
+ def json_hash(str)
14
+ if str
15
+ return JSON.parse(str)
16
+ end
17
+ end
18
+
19
+ # analytics -method=<method> -segment-write-key=<segmentWriteKey> [options]
20
+
21
+ default_command :send
22
+
23
+ command :send do |c|
24
+ c.description = 'send a segment message'
25
+
26
+ c.option '--writeKey=<writeKey>', String, 'the Segment writeKey'
27
+ c.option '--type=<type>', String, 'The Segment message type'
28
+
29
+ c.option '--userId=<userId>', String, 'the user id to send the event as'
30
+ c.option '--anonymousId=<anonymousId>', String, 'the anonymous user id to send the event as'
31
+ c.option '--context=<context>', 'additional context for the event (JSON-encoded)'
32
+ c.option '--integrations=<integrations>', 'additional integrations for the event (JSON-encoded)'
33
+
34
+ c.option '--event=<event>', String, 'the event name to send with the event'
35
+ c.option '--properties=<properties>', 'the event properties to send (JSON-encoded)'
36
+
37
+ c.option '--name=<name>', 'name of the screen or page to send with the message'
38
+
39
+ c.option '--traits=<traits>', 'the identify/group traits to send (JSON-encoded)'
40
+
41
+ c.option '--groupId=<groupId>', String, 'the group id'
42
+ c.option '--previousId=<previousId>', String, 'the previous id'
43
+
44
+ c.action do |args, options|
45
+ Analytics = Segment::Analytics.new({
46
+ write_key: options.writeKey,
47
+ on_error: Proc.new { |status, msg| print msg }
48
+ })
49
+
50
+ case options.type
51
+ when "track"
52
+ Analytics.track({
53
+ user_id: options.userId,
54
+ event: options.event,
55
+ anonymous_id: options.anonymousId,
56
+ properties: json_hash(options.properties),
57
+ context: json_hash(options.context),
58
+ integrations: json_hash(options.integrations)
59
+ })
60
+ when "page"
61
+ Analytics.page({
62
+ user_id: options.userId,
63
+ anonymous_id: options.anonymousId,
64
+ name: options.name,
65
+ properties: json_hash(options.properties),
66
+ context: json_hash(options.context),
67
+ integrations: json_hash(options.integrations)
68
+ })
69
+ when "screen"
70
+ Analytics.screen({
71
+ user_id: options.userId,
72
+ anonymous_id: options.anonymousId,
73
+ name: options.name,
74
+ properties: json_hash(options.properties),
75
+ context: json_hash(options.context),
76
+ integrations: json_hash(options.integrations)
77
+ })
78
+ when "identify"
79
+ Analytics.identify({
80
+ user_id: options.userId,
81
+ anonymous_id: options.anonymousId,
82
+ traits: json_hash(options.traits),
83
+ context: json_hash(options.context),
84
+ integrations: json_hash(options.integrations)
85
+ })
86
+ when "group"
87
+ Analytics.group({
88
+ user_id: options.userId,
89
+ anonymous_id: options.anonymousId,
90
+ group_id: options.groupId,
91
+ traits: json_hash(options.traits),
92
+ context: json_hash(options.context),
93
+ integrations: json_hash(options.integrations)
94
+ })
95
+ when "alias"
96
+ Analytics.alias({
97
+ previous_id: options.previousId,
98
+ user_id: options.userId,
99
+ anonymous_id: options.anonymousId,
100
+ context: json_hash(options.context),
101
+ integrations: json_hash(options.integrations)
102
+ })
103
+ else
104
+ raise "Invalid Message Type #{options.type}"
105
+ end
106
+ Analytics.flush
107
+ end
108
+ end
@@ -0,0 +1 @@
1
+ require 'segment'
@@ -0,0 +1,49 @@
1
+ require 'segment/analytics/defaults'
2
+
3
+ module Segment
4
+ class Analytics
5
+ class BackoffPolicy
6
+ include Segment::Analytics::Defaults::BackoffPolicy
7
+
8
+ # @param [Hash] opts
9
+ # @option opts [Numeric] :min_timeout_ms The minimum backoff timeout
10
+ # @option opts [Numeric] :max_timeout_ms The maximum backoff timeout
11
+ # @option opts [Numeric] :multiplier The value to multiply the current
12
+ # interval with for each retry attempt
13
+ # @option opts [Numeric] :randomization_factor The randomization factor
14
+ # to use to create a range around the retry interval
15
+ def initialize(opts = {})
16
+ @min_timeout_ms = opts[:min_timeout_ms] || MIN_TIMEOUT_MS
17
+ @max_timeout_ms = opts[:max_timeout_ms] || MAX_TIMEOUT_MS
18
+ @multiplier = opts[:multiplier] || MULTIPLIER
19
+ @randomization_factor = opts[:randomization_factor] || RANDOMIZATION_FACTOR
20
+
21
+ @attempts = 0
22
+ end
23
+
24
+ # @return [Numeric] the next backoff interval, in milliseconds.
25
+ def next_interval
26
+ interval = @min_timeout_ms * (@multiplier**@attempts)
27
+ interval = add_jitter(interval, @randomization_factor)
28
+
29
+ @attempts += 1
30
+
31
+ [interval, @max_timeout_ms].min
32
+ end
33
+
34
+ private
35
+
36
+ def add_jitter(base, randomization_factor)
37
+ random_number = rand
38
+ max_deviation = base * randomization_factor
39
+ deviation = random_number * max_deviation
40
+
41
+ if random_number < 0.5
42
+ base - deviation
43
+ else
44
+ base + deviation
45
+ end
46
+ end
47
+ end
48
+ end
49
+ end
@@ -1,39 +1,42 @@
1
1
  require 'thread'
2
2
  require 'time'
3
+
4
+ require 'segment/analytics/defaults'
5
+ require 'segment/analytics/logging'
3
6
  require 'segment/analytics/utils'
4
7
  require 'segment/analytics/worker'
5
- require 'segment/analytics/defaults'
6
8
 
7
9
  module Segment
8
10
  class Analytics
9
11
  class Client
10
12
  include Segment::Analytics::Utils
13
+ include Segment::Analytics::Logging
11
14
 
12
- # public: Creates a new client
13
- #
14
- # attrs - Hash
15
- # :write_key - String of your project's write_key
16
- # :max_queue_size - Fixnum of the max calls to remain queued (optional)
17
- # :on_error - Proc which handles error calls from the API
18
- def initialize attrs = {}
19
- symbolize_keys! attrs
15
+ # @param [Hash] opts
16
+ # @option opts [String] :write_key Your project's write_key
17
+ # @option opts [FixNum] :max_queue_size Maximum number of calls to be
18
+ # remain queued.
19
+ # @option opts [Proc] :on_error Handles error calls from the API.
20
+ def initialize(opts = {})
21
+ symbolize_keys!(opts)
20
22
 
21
23
  @queue = Queue.new
22
- @write_key = attrs[:write_key]
23
- @max_queue_size = attrs[:max_queue_size] || Defaults::Queue::MAX_SIZE
24
- @options = attrs
24
+ @test = opts[:test]
25
+ @write_key = opts[:write_key]
26
+ @max_queue_size = opts[:max_queue_size] || Defaults::Queue::MAX_SIZE
25
27
  @worker_mutex = Mutex.new
26
- @worker = Worker.new @queue, @write_key, @options
28
+ @worker = Worker.new(@queue, @write_key, opts)
29
+ @worker_thread = nil
27
30
 
28
31
  check_write_key!
29
32
 
30
33
  at_exit { @worker_thread && @worker_thread[:should_exit] = true }
31
34
  end
32
35
 
33
- # public: Synchronously waits until the worker has flushed the queue.
34
- # Use only for scripts which are not long-running, and will
35
- # specifically exit
36
+ # Synchronously waits until the worker has flushed the queue.
36
37
  #
38
+ # Use only for scripts which are not long-running, and will specifically
39
+ # exit
37
40
  def flush
38
41
  while !@queue.empty? || @worker.is_requesting?
39
42
  ensure_worker_running
@@ -41,246 +44,114 @@ module Segment
41
44
  end
42
45
  end
43
46
 
44
- # public: Tracks an event
47
+ # @!macro common_attrs
48
+ # @option attrs [String] :anonymous_id ID for a user when you don't know
49
+ # who they are yet. (optional but you must provide either an
50
+ # `anonymous_id` or `user_id`)
51
+ # @option attrs [Hash] :context ({})
52
+ # @option attrs [Hash] :integrations What integrations this event
53
+ # goes to (optional)
54
+ # @option attrs [String] :message_id ID that uniquely
55
+ # identifies a message across the API. (optional)
56
+ # @option attrs [Time] :timestamp When the event occurred (optional)
57
+ # @option attrs [String] :user_id The ID for this user in your database
58
+ # (optional but you must provide either an `anonymous_id` or `user_id`)
59
+ # @option attrs [Hash] :options Options such as user traits (optional)
60
+
61
+ # Tracks an event
45
62
  #
46
- # attrs - Hash
47
- # :anonymous_id - String of the user's id when you don't know who they are yet. (optional but you must provide either an anonymous_id or user_id. See: https://segment.io/docs/tracking - api/track/#user - id)
48
- # :context - Hash of context. (optional)
49
- # :event - String of event name.
50
- # :integrations - Hash specifying what integrations this event goes to. (optional)
51
- # :options - Hash specifying options such as user traits. (optional)
52
- # :properties - Hash of event properties. (optional)
53
- # :timestamp - Time of when the event occurred. (optional)
54
- # :user_id - String of the user id.
55
- def track attrs
63
+ # @see https://segment.com/docs/sources/server/ruby/#track
64
+ #
65
+ # @param [Hash] attrs
66
+ #
67
+ # @option attrs [String] :event Event name
68
+ # @option attrs [Hash] :properties Event properties (optional)
69
+ # @macro common_attrs
70
+ def track(attrs)
56
71
  symbolize_keys! attrs
57
- check_user_id! attrs
58
-
59
- event = attrs[:event]
60
- properties = attrs[:properties] || {}
61
- timestamp = attrs[:timestamp] || Time.new
62
- context = attrs[:context] || {}
63
-
64
- check_timestamp! timestamp
65
-
66
- if event.nil? || event.empty?
67
- fail ArgumentError, 'Must supply event as a non-empty string'
68
- end
69
-
70
- fail ArgumentError, 'Properties must be a Hash' unless properties.is_a? Hash
71
- isoify_dates! properties
72
-
73
- add_context context
74
-
75
- enqueue({
76
- :event => event,
77
- :userId => attrs[:user_id],
78
- :anonymousId => attrs[:anonymous_id],
79
- :context => context,
80
- :options => attrs[:options],
81
- :integrations => attrs[:integrations],
82
- :properties => properties,
83
- :timestamp => datetime_in_iso8601(timestamp),
84
- :type => 'track'
85
- })
72
+ enqueue(FieldParser.parse_for_track(attrs))
86
73
  end
87
74
 
88
- # public: Identifies a user
75
+ # Identifies a user
76
+ #
77
+ # @see https://segment.com/docs/sources/server/ruby/#identify
89
78
  #
90
- # attrs - Hash
91
- # :anonymous_id - String of the user's id when you don't know who they are yet. (optional but you must provide either an anonymous_id or user_id. See: https://segment.io/docs/tracking - api/track/#user - id)
92
- # :context - Hash of context. (optional)
93
- # :integrations - Hash specifying what integrations this event goes to. (optional)
94
- # :options - Hash specifying options such as user traits. (optional)
95
- # :timestamp - Time of when the event occurred. (optional)
96
- # :traits - Hash of user traits. (optional)
97
- # :user_id - String of the user id
98
- def identify attrs
79
+ # @param [Hash] attrs
80
+ #
81
+ # @option attrs [Hash] :traits User traits (optional)
82
+ # @macro common_attrs
83
+ def identify(attrs)
99
84
  symbolize_keys! attrs
100
- check_user_id! attrs
101
-
102
- traits = attrs[:traits] || {}
103
- timestamp = attrs[:timestamp] || Time.new
104
- context = attrs[:context] || {}
105
-
106
- check_timestamp! timestamp
107
-
108
- fail ArgumentError, 'Must supply traits as a hash' unless traits.is_a? Hash
109
- isoify_dates! traits
110
-
111
- add_context context
112
-
113
- enqueue({
114
- :userId => attrs[:user_id],
115
- :anonymousId => attrs[:anonymous_id],
116
- :integrations => attrs[:integrations],
117
- :context => context,
118
- :traits => traits,
119
- :options => attrs[:options],
120
- :timestamp => datetime_in_iso8601(timestamp),
121
- :type => 'identify'
122
- })
85
+ enqueue(FieldParser.parse_for_identify(attrs))
123
86
  end
124
87
 
125
- # public: Aliases a user from one id to another
88
+ # Aliases a user from one id to another
89
+ #
90
+ # @see https://segment.com/docs/sources/server/ruby/#alias
126
91
  #
127
- # attrs - Hash
128
- # :context - Hash of context (optional)
129
- # :integrations - Hash specifying what integrations this event goes to. (optional)
130
- # :options - Hash specifying options such as user traits. (optional)
131
- # :previous_id - String of the id to alias from
132
- # :timestamp - Time of when the alias occured (optional)
133
- # :user_id - String of the id to alias to
92
+ # @param [Hash] attrs
93
+ #
94
+ # @option attrs [String] :previous_id The ID to alias from
95
+ # @macro common_attrs
134
96
  def alias(attrs)
135
97
  symbolize_keys! attrs
136
-
137
- from = attrs[:previous_id]
138
- to = attrs[:user_id]
139
- timestamp = attrs[:timestamp] || Time.new
140
- context = attrs[:context] || {}
141
-
142
- check_presence! from, 'previous_id'
143
- check_presence! to, 'user_id'
144
- check_timestamp! timestamp
145
- add_context context
146
-
147
- enqueue({
148
- :previousId => from,
149
- :userId => to,
150
- :integrations => attrs[:integrations],
151
- :context => context,
152
- :options => attrs[:options],
153
- :timestamp => datetime_in_iso8601(timestamp),
154
- :type => 'alias'
155
- })
98
+ enqueue(FieldParser.parse_for_alias(attrs))
156
99
  end
157
100
 
158
- # public: Associates a user identity with a group.
101
+ # Associates a user identity with a group.
159
102
  #
160
- # attrs - Hash
161
- # :context - Hash of context (optional)
162
- # :integrations - Hash specifying what integrations this event goes to. (optional)
163
- # :options - Hash specifying options such as user traits. (optional)
164
- # :previous_id - String of the id to alias from
165
- # :timestamp - Time of when the alias occured (optional)
166
- # :user_id - String of the id to alias to
103
+ # @see https://segment.com/docs/sources/server/ruby/#group
104
+ #
105
+ # @param [Hash] attrs
106
+ #
107
+ # @option attrs [String] :group_id The ID of the group
108
+ # @option attrs [Hash] :traits User traits (optional)
109
+ # @macro common_attrs
167
110
  def group(attrs)
168
111
  symbolize_keys! attrs
169
- check_user_id! attrs
170
-
171
- group_id = attrs[:group_id]
172
- user_id = attrs[:user_id]
173
- traits = attrs[:traits] || {}
174
- timestamp = attrs[:timestamp] || Time.new
175
- context = attrs[:context] || {}
176
-
177
- fail ArgumentError, '.traits must be a hash' unless traits.is_a? Hash
178
- isoify_dates! traits
179
-
180
- check_presence! group_id, 'group_id'
181
- check_timestamp! timestamp
182
- add_context context
183
-
184
- enqueue({
185
- :groupId => group_id,
186
- :userId => user_id,
187
- :traits => traits,
188
- :integrations => attrs[:integrations],
189
- :options => attrs[:options],
190
- :context => context,
191
- :timestamp => datetime_in_iso8601(timestamp),
192
- :type => 'group'
193
- })
112
+ enqueue(FieldParser.parse_for_group(attrs))
194
113
  end
195
114
 
196
- # public: Records a page view
115
+ # Records a page view
116
+ #
117
+ # @see https://segment.com/docs/sources/server/ruby/#page
118
+ #
119
+ # @param [Hash] attrs
197
120
  #
198
- # attrs - Hash
199
- # :anonymous_id - String of the user's id when you don't know who they are yet. (optional but you must provide either an anonymous_id or user_id. See: https://segment.io/docs/tracking - api/track/#user - id)
200
- # :category - String of the page category (optional)
201
- # :context - Hash of context (optional)
202
- # :integrations - Hash specifying what integrations this event goes to. (optional)
203
- # :name - String name of the page
204
- # :options - Hash specifying options such as user traits. (optional)
205
- # :properties - Hash of page properties (optional)
206
- # :timestamp - Time of when the pageview occured (optional)
207
- # :user_id - String of the id to alias from
121
+ # @option attrs [String] :name Name of the page
122
+ # @option attrs [Hash] :properties Page properties (optional)
123
+ # @macro common_attrs
208
124
  def page(attrs)
209
125
  symbolize_keys! attrs
210
- check_user_id! attrs
211
-
212
- name = attrs[:name].to_s
213
- properties = attrs[:properties] || {}
214
- timestamp = attrs[:timestamp] || Time.new
215
- context = attrs[:context] || {}
216
-
217
- fail ArgumentError, '.properties must be a hash' unless properties.is_a? Hash
218
- isoify_dates! properties
219
-
220
- check_timestamp! timestamp
221
- add_context context
222
-
223
- enqueue({
224
- :userId => attrs[:user_id],
225
- :anonymousId => attrs[:anonymous_id],
226
- :name => name,
227
- :category => attrs[:category],
228
- :properties => properties,
229
- :integrations => attrs[:integrations],
230
- :options => attrs[:options],
231
- :context => context,
232
- :timestamp => datetime_in_iso8601(timestamp),
233
- :type => 'page'
234
- })
126
+ enqueue(FieldParser.parse_for_page(attrs))
235
127
  end
236
- # public: Records a screen view (for a mobile app)
128
+
129
+ # Records a screen view (for a mobile app)
237
130
  #
238
- # attrs - Hash
239
- # :anonymous_id - String of the user's id when you don't know who they are yet. (optional but you must provide either an anonymous_id or user_id. See: https://segment.io/docs/tracking - api/track/#user - id)
240
- # :category - String screen category (optional)
241
- # :context - Hash of context (optional)
242
- # :integrations - Hash specifying what integrations this event goes to. (optional)
243
- # :name - String name of the screen
244
- # :options - Hash specifying options such as user traits. (optional)
245
- # :properties - Hash of screen properties (optional)
246
- # :timestamp - Time of when the screen occured (optional)
247
- # :user_id - String of the id to alias from
131
+ # @param [Hash] attrs
132
+ #
133
+ # @option attrs [String] :name Name of the screen
134
+ # @option attrs [Hash] :properties Screen properties (optional)
135
+ # @option attrs [String] :category The screen category (optional)
136
+ # @macro common_attrs
248
137
  def screen(attrs)
249
138
  symbolize_keys! attrs
250
- check_user_id! attrs
251
-
252
- name = attrs[:name].to_s
253
- properties = attrs[:properties] || {}
254
- timestamp = attrs[:timestamp] || Time.new
255
- context = attrs[:context] || {}
256
-
257
- fail ArgumentError, '.properties must be a hash' unless properties.is_a? Hash
258
- isoify_dates! properties
259
-
260
- check_timestamp! timestamp
261
- add_context context
262
-
263
- enqueue({
264
- :userId => attrs[:user_id],
265
- :anonymousId => attrs[:anonymous_id],
266
- :name => name,
267
- :properties => properties,
268
- :category => attrs[:category],
269
- :options => attrs[:options],
270
- :integrations => attrs[:integrations],
271
- :context => context,
272
- :timestamp => timestamp.iso8601,
273
- :type => 'screen'
274
- })
139
+ enqueue(FieldParser.parse_for_screen(attrs))
275
140
  end
276
141
 
277
- # public: Returns the number of queued messages
278
- #
279
- # returns Fixnum of messages in the queue
142
+ # @return [Fixnum] number of messages in the queue
280
143
  def queued_messages
281
144
  @queue.length
282
145
  end
283
146
 
147
+ def test_queue
148
+ unless @test
149
+ raise 'Test queue only available when setting :test to true.'
150
+ end
151
+
152
+ @test_queue ||= TestQueue.new
153
+ end
154
+
284
155
  private
285
156
 
286
157
  # private: Enqueues the action.
@@ -288,57 +159,28 @@ module Segment
288
159
  # returns Boolean of whether the item was added to the queue.
289
160
  def enqueue(action)
290
161
  # add our request id for tracing purposes
291
- action[:messageId] = uid
292
- unless queue_full = @queue.length >= @max_queue_size
293
- ensure_worker_running
162
+ action[:messageId] ||= uid
163
+
164
+ test_queue << action if @test
165
+
166
+ if @queue.length < @max_queue_size
294
167
  @queue << action
295
- end
296
- !queue_full
297
- end
168
+ ensure_worker_running
298
169
 
299
- # private: Ensures that a string is non-empty
300
- #
301
- # obj - String|Number that must be non-blank
302
- # name - Name of the validated value
303
- #
304
- def check_presence!(obj, name)
305
- if obj.nil? || (obj.is_a?(String) && obj.empty?)
306
- fail ArgumentError, "#{name} must be given"
170
+ true
171
+ else
172
+ logger.warn(
173
+ 'Queue is full, dropping events. The :max_queue_size ' \
174
+ 'configuration parameter can be increased to prevent this from ' \
175
+ 'happening.'
176
+ )
177
+ false
307
178
  end
308
179
  end
309
180
 
310
- # private: Adds contextual information to the call
311
- #
312
- # context - Hash of call context
313
- def add_context(context)
314
- context[:library] = { :name => "analytics-ruby", :version => Segment::Analytics::VERSION.to_s }
315
- end
316
-
317
181
  # private: Checks that the write_key is properly initialized
318
182
  def check_write_key!
319
- fail ArgumentError, 'Write key must be initialized' if @write_key.nil?
320
- end
321
-
322
- # private: Checks the timstamp option to make sure it is a Time.
323
- def check_timestamp!(timestamp)
324
- fail ArgumentError, 'Timestamp must be a Time' unless timestamp.is_a? Time
325
- end
326
-
327
- def event attrs
328
- symbolize_keys! attrs
329
-
330
- {
331
- :userId => user_id,
332
- :name => name,
333
- :properties => properties,
334
- :context => context,
335
- :timestamp => datetime_in_iso8601(timestamp),
336
- :type => 'screen'
337
- }
338
- end
339
-
340
- def check_user_id! attrs
341
- fail ArgumentError, 'Must supply either user_id or anonymous_id' unless attrs[:user_id] || attrs[:anonymous_id]
183
+ raise ArgumentError, 'Write key must be initialized' if @write_key.nil?
342
184
  end
343
185
 
344
186
  def ensure_worker_running
@@ -6,15 +6,31 @@ module Segment
6
6
  PORT = 443
7
7
  PATH = '/v1/import'
8
8
  SSL = true
9
- HEADERS = { :accept => 'application/json' }
10
- RETRIES = 4
11
- BACKOFF = 30.0
9
+ HEADERS = { 'Accept' => 'application/json',
10
+ 'Content-Type' => 'application/json',
11
+ 'User-Agent' => "analytics-ruby/#{Analytics::VERSION}" }
12
+ RETRIES = 10
12
13
  end
13
14
 
14
15
  module Queue
15
- BATCH_SIZE = 100
16
16
  MAX_SIZE = 10000
17
17
  end
18
+
19
+ module Message
20
+ MAX_BYTES = 32768 # 32Kb
21
+ end
22
+
23
+ module MessageBatch
24
+ MAX_BYTES = 512_000 # 500Kb
25
+ MAX_SIZE = 100
26
+ end
27
+
28
+ module BackoffPolicy
29
+ MIN_TIMEOUT_MS = 100
30
+ MAX_TIMEOUT_MS = 10000
31
+ MULTIPLIER = 1.5
32
+ RANDOMIZATION_FACTOR = 0.5
33
+ end
18
34
  end
19
35
  end
20
36
  end