moesif_rack 1.4.2 → 1.4.3
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/LICENSE +1 -1
- data/lib/moesif_rack/app_config.rb +5 -0
- data/lib/moesif_rack/client_ip.rb +2 -2
- data/lib/moesif_rack/moesif_middleware.rb +70 -90
- data/moesif_capture_outgoing/httplog/http_log.rb +4 -0
- metadata +21 -8
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e8bde32f3f60b62bfe1dfd5aef52ba6c56f21db3e2f8ac78743972c227ff1d2b
|
4
|
+
data.tar.gz: d0fe24cc62aa794dab07b04fa6ce943f85d015db045eb654cd66e9827e9b97fe
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0db637f28ba8d87d7e5e8a81b9642eeeb64f2c701d862c941e90ac0bdc5a2d15584f597df82420b736020dcd8f426c87e1e727cb9dcf081214e9aeecc07fdcd9
|
7
|
+
data.tar.gz: 134f36829793337b6d78a7a51dedddeadd2d4e2fc1353e5b0ae5962f7ddb72f08562c5ff9f5f93248b7ee80db14a987f4935c58eb152b0229bfae9f7ea9e128c
|
data/LICENSE
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
|
2
2
|
def is_ip?(value)
|
3
|
+
ipv4 = /^(?:(?:\d|[1-9]\d|1\d{2}|2[0-4]\d|25[0-5])\.){3}(?:\d|[1-9]\d|1\d{2}|2[0-4]\d|25[0-5])$/
|
4
|
+
ipv6 = /^\s*((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){1}(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:)))(%.+)?\s*$/
|
3
5
|
if
|
4
|
-
ipv4 = /^(?:(?:\d|[1-9]\d|1\d{2}|2[0-4]\d|25[0-5])\.){3}(?:\d|[1-9]\d|1\d{2}|2[0-4]\d|25[0-5])$/
|
5
|
-
ipv6 = /^\s*((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){1}(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:)))(%.+)?\s*$/
|
6
6
|
# We use !! to convert the return value to a boolean
|
7
7
|
!!(value =~ ipv4 or value=~ ipv6)
|
8
8
|
end
|
@@ -32,65 +32,29 @@ module MoesifRack
|
|
32
32
|
@config = @app_config.get_config(@api_controller, @debug)
|
33
33
|
@config_etag = nil
|
34
34
|
@sampling_percentage = 100
|
35
|
-
@
|
35
|
+
@last_config_download_time = Time.now.utc
|
36
|
+
@last_worker_run = Time.now.utc
|
36
37
|
@config_dict = Hash.new
|
37
38
|
@disable_transaction_id = options['disable_transaction_id'] || false
|
38
39
|
@log_body = options.fetch('log_body', true)
|
39
40
|
@batch_size = options['batch_size'] || 25
|
41
|
+
@batch_max_time = options['batch_max_time'] || 2
|
40
42
|
@events_queue = Queue.new
|
41
43
|
@event_response_config_etag = nil
|
42
|
-
|
43
|
-
Thread::new do
|
44
|
-
loop do
|
45
|
-
begin
|
46
|
-
until @events_queue.empty? do
|
47
|
-
batch_events = []
|
48
|
-
until batch_events.size == @batch_size || @events_queue.empty? do
|
49
|
-
batch_events << @events_queue.pop
|
50
|
-
end
|
51
|
-
event_api_response = @api_controller.create_events_batch(batch_events)
|
52
|
-
@event_response_config_etag = event_api_response[:x_moesif_config_etag]
|
53
|
-
if @debug
|
54
|
-
puts("Events successfully sent to Moesif")
|
55
|
-
end
|
56
|
-
end
|
57
|
-
|
58
|
-
if @events_queue.empty?
|
59
|
-
if @debug
|
60
|
-
puts("No events to read from the queue")
|
61
|
-
end
|
62
|
-
end
|
63
|
-
|
64
|
-
# Sleep for 5 seconds
|
65
|
-
sleep 5
|
66
|
-
rescue MoesifApi::APIException => e
|
67
|
-
if e.response_code.between?(401, 403)
|
68
|
-
puts "Unathorized accesss sending event to Moesif. Please verify your Application Id."
|
69
|
-
end
|
70
|
-
if @debug
|
71
|
-
puts "Error sending event to Moesif, with status code: "
|
72
|
-
puts e.response_code
|
73
|
-
end
|
74
|
-
end
|
75
|
-
end
|
76
|
-
end
|
44
|
+
start_worker()
|
77
45
|
|
78
46
|
begin
|
79
47
|
if !@config.nil?
|
80
|
-
@config_etag, @sampling_percentage, @
|
48
|
+
@config_etag, @sampling_percentage, @last_config_download_time = @app_config.parse_configuration(@config, @debug)
|
81
49
|
end
|
82
50
|
rescue => exception
|
83
|
-
|
84
|
-
|
85
|
-
puts exception.to_s
|
86
|
-
end
|
51
|
+
log_debug 'Error while parsing application configuration on initialization'
|
52
|
+
log_debug exception.to_s
|
87
53
|
end
|
88
54
|
@capture_outoing_requests = options['capture_outoing_requests']
|
89
55
|
@capture_outgoing_requests = options['capture_outgoing_requests']
|
90
56
|
if @capture_outoing_requests || @capture_outgoing_requests
|
91
|
-
|
92
|
-
puts 'Start Capturing outgoing requests'
|
93
|
-
end
|
57
|
+
log_debug 'Start Capturing outgoing requests'
|
94
58
|
require_relative '../../moesif_capture_outgoing/httplog.rb'
|
95
59
|
MoesifCaptureOutgoing.start_capture_outgoing(options)
|
96
60
|
end
|
@@ -128,6 +92,12 @@ module MoesifRack
|
|
128
92
|
return Base64.encode64(body), 'base64'
|
129
93
|
end
|
130
94
|
|
95
|
+
def log_debug(message)
|
96
|
+
if @debug
|
97
|
+
puts("#{Time.now.to_s} [Moesif Middleware] PID #{Process.pid} TID #{Thread.current.object_id} #{message}")
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
131
101
|
def parse_body(body, headers)
|
132
102
|
begin
|
133
103
|
if start_with_json(body)
|
@@ -145,12 +115,45 @@ module MoesifRack
|
|
145
115
|
return parsed_body, transfer_encoding
|
146
116
|
end
|
147
117
|
|
118
|
+
def start_worker
|
119
|
+
Thread::new do
|
120
|
+
@last_worker_run = Time.now.utc
|
121
|
+
loop do
|
122
|
+
begin
|
123
|
+
until @events_queue.empty? do
|
124
|
+
batch_events = []
|
125
|
+
until batch_events.size == @batch_size || @events_queue.empty? do
|
126
|
+
batch_events << @events_queue.pop
|
127
|
+
end
|
128
|
+
log_debug("Sending #{batch_events.size.to_s} events to Moesif")
|
129
|
+
event_api_response = @api_controller.create_events_batch(batch_events)
|
130
|
+
@event_response_config_etag = event_api_response[:x_moesif_config_etag]
|
131
|
+
log_debug(event_api_response.to_s)
|
132
|
+
log_debug("Events successfully sent to Moesif")
|
133
|
+
end
|
134
|
+
|
135
|
+
if @events_queue.empty?
|
136
|
+
log_debug("No events to read from the queue")
|
137
|
+
end
|
138
|
+
|
139
|
+
sleep @batch_max_time
|
140
|
+
rescue MoesifApi::APIException => e
|
141
|
+
if e.response_code.between?(401, 403)
|
142
|
+
puts "Unathorized accesss sending event to Moesif. Please verify your Application Id."
|
143
|
+
log_debug(e.to_s)
|
144
|
+
end
|
145
|
+
log_debug("Error sending event to Moesif, with status code #{e.response_code.to_s}")
|
146
|
+
rescue => e
|
147
|
+
log_debug(e.to_s)
|
148
|
+
end
|
149
|
+
end
|
150
|
+
end
|
151
|
+
end
|
152
|
+
|
148
153
|
def call env
|
149
154
|
start_time = Time.now.utc.iso8601
|
150
155
|
|
151
|
-
|
152
|
-
puts 'inside moesif middleware'
|
153
|
-
end
|
156
|
+
log_debug('Calling Moesif middleware')
|
154
157
|
|
155
158
|
status, headers, body = @app.call env
|
156
159
|
end_time = Time.now.utc.iso8601
|
@@ -245,43 +248,31 @@ module MoesifRack
|
|
245
248
|
event_model.direction = "Incoming"
|
246
249
|
|
247
250
|
if @identify_user
|
248
|
-
|
249
|
-
puts "calling identify user proc"
|
250
|
-
end
|
251
|
+
log_debug "calling identify user proc"
|
251
252
|
event_model.user_id = @identify_user.call(env, headers, body)
|
252
253
|
end
|
253
254
|
|
254
255
|
if @identify_company
|
255
|
-
|
256
|
-
puts "calling identify company proc"
|
257
|
-
end
|
256
|
+
log_debug "calling identify company proc"
|
258
257
|
event_model.company_id = @identify_company.call(env, headers, body)
|
259
258
|
end
|
260
259
|
|
261
260
|
if @get_metadata
|
262
|
-
|
263
|
-
puts "calling get_metadata proc"
|
264
|
-
end
|
261
|
+
log_debug "calling get_metadata proc"
|
265
262
|
event_model.metadata = @get_metadata.call(env, headers, body)
|
266
263
|
end
|
267
264
|
|
268
265
|
if @identify_session
|
269
|
-
|
270
|
-
puts "calling identify session proc"
|
271
|
-
end
|
266
|
+
log_debug "calling identify session proc"
|
272
267
|
event_model.session_token = @identify_session.call(env, headers, body)
|
273
268
|
end
|
274
269
|
if @mask_data
|
275
|
-
|
276
|
-
puts "calling mask_data proc"
|
277
|
-
end
|
270
|
+
log_debug "calling mask_data proc"
|
278
271
|
event_model = @mask_data.call(event_model)
|
279
272
|
end
|
280
273
|
|
281
|
-
|
282
|
-
|
283
|
-
puts event_model.to_json
|
284
|
-
end
|
274
|
+
log_debug "sending data to moesif"
|
275
|
+
log_debug event_model.to_json
|
285
276
|
# Perform the API call through the SDK function
|
286
277
|
begin
|
287
278
|
@random_percentage = Random.rand(0.00..100.00)
|
@@ -289,10 +280,8 @@ module MoesifRack
|
|
289
280
|
begin
|
290
281
|
@sampling_percentage = @app_config.get_sampling_percentage(@config, event_model.user_id, event_model.company_id, @debug)
|
291
282
|
rescue => exception
|
292
|
-
|
293
|
-
|
294
|
-
puts exception.to_s
|
295
|
-
end
|
283
|
+
log_debug 'Error while getting sampling percentage, assuming default behavior'
|
284
|
+
log_debug exception.to_s
|
296
285
|
@sampling_percentage = 100
|
297
286
|
end
|
298
287
|
|
@@ -300,31 +289,26 @@ module MoesifRack
|
|
300
289
|
event_model.weight = @app_config.calculate_weight(@sampling_percentage)
|
301
290
|
# Add Event to the queue
|
302
291
|
@events_queue << event_model
|
303
|
-
|
304
|
-
|
292
|
+
log_debug("Event added to the queue ")
|
293
|
+
if Time.now.utc > (@last_config_download_time + 60)
|
294
|
+
start_worker()
|
305
295
|
end
|
306
296
|
|
307
|
-
if !@event_response_config_etag.nil? && !@config_etag.nil? && @config_etag != @event_response_config_etag && Time.now.utc > @
|
297
|
+
if !@event_response_config_etag.nil? && !@config_etag.nil? && @config_etag != @event_response_config_etag && Time.now.utc > (@last_config_download_time + 300)
|
308
298
|
begin
|
309
299
|
@config = @app_config.get_config(@api_controller, @debug)
|
310
|
-
@config_etag, @sampling_percentage, @
|
300
|
+
@config_etag, @sampling_percentage, @last_config_download_time = @app_config.parse_configuration(@config, @debug)
|
311
301
|
rescue => exception
|
312
|
-
|
313
|
-
|
314
|
-
puts exception.to_s
|
315
|
-
end
|
302
|
+
log_debug 'Error while updating the application configuration'
|
303
|
+
log_debug exception.to_s
|
316
304
|
end
|
317
305
|
end
|
318
306
|
else
|
319
|
-
|
320
|
-
puts("Skipped Event due to sampling percentage: " + @sampling_percentage.to_s + " and random percentage: " + @random_percentage.to_s)
|
321
|
-
end
|
307
|
+
log_debug("Skipped Event due to sampling percentage: " + @sampling_percentage.to_s + " and random percentage: " + @random_percentage.to_s)
|
322
308
|
end
|
323
309
|
rescue => exception
|
324
|
-
|
325
|
-
|
326
|
-
puts exception.to_s
|
327
|
-
end
|
310
|
+
log_debug "Error adding event to the queue "
|
311
|
+
log_debug exception.to_s
|
328
312
|
end
|
329
313
|
|
330
314
|
end
|
@@ -338,11 +322,7 @@ module MoesifRack
|
|
338
322
|
end
|
339
323
|
|
340
324
|
if !should_skip
|
341
|
-
|
342
|
-
process_send.call
|
343
|
-
else
|
344
|
-
Thread.start(&process_send)
|
345
|
-
end
|
325
|
+
process_send.call
|
346
326
|
end
|
347
327
|
|
348
328
|
[status, headers, body]
|
metadata
CHANGED
@@ -1,28 +1,34 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: moesif_rack
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.4.
|
4
|
+
version: 1.4.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Moesif, Inc
|
8
8
|
- Xing Wang
|
9
|
-
autorequire:
|
9
|
+
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2020-
|
12
|
+
date: 2020-06-19 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: test-unit
|
16
16
|
requirement: !ruby/object:Gem::Requirement
|
17
17
|
requirements:
|
18
18
|
- - "~>"
|
19
|
+
- !ruby/object:Gem::Version
|
20
|
+
version: '3.1'
|
21
|
+
- - ">="
|
19
22
|
- !ruby/object:Gem::Version
|
20
23
|
version: 3.1.5
|
21
|
-
type: :
|
24
|
+
type: :development
|
22
25
|
prerelease: false
|
23
26
|
version_requirements: !ruby/object:Gem::Requirement
|
24
27
|
requirements:
|
25
28
|
- - "~>"
|
29
|
+
- !ruby/object:Gem::Version
|
30
|
+
version: '3.1'
|
31
|
+
- - ">="
|
26
32
|
- !ruby/object:Gem::Version
|
27
33
|
version: 3.1.5
|
28
34
|
- !ruby/object:Gem::Dependency
|
@@ -30,6 +36,9 @@ dependencies:
|
|
30
36
|
requirement: !ruby/object:Gem::Requirement
|
31
37
|
requirements:
|
32
38
|
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '1.2'
|
41
|
+
- - ">="
|
33
42
|
- !ruby/object:Gem::Version
|
34
43
|
version: 1.2.12
|
35
44
|
type: :runtime
|
@@ -37,9 +46,12 @@ dependencies:
|
|
37
46
|
version_requirements: !ruby/object:Gem::Requirement
|
38
47
|
requirements:
|
39
48
|
- - "~>"
|
49
|
+
- !ruby/object:Gem::Version
|
50
|
+
version: '1.2'
|
51
|
+
- - ">="
|
40
52
|
- !ruby/object:Gem::Version
|
41
53
|
version: 1.2.12
|
42
|
-
description:
|
54
|
+
description: Rack/Rails middleware to log API calls to Moesif API analytics and monitoring
|
43
55
|
email: xing@moesif.com
|
44
56
|
executables: []
|
45
57
|
extensions: []
|
@@ -61,7 +73,7 @@ homepage: https://moesif.com
|
|
61
73
|
licenses:
|
62
74
|
- Apache-2.0
|
63
75
|
metadata: {}
|
64
|
-
post_install_message:
|
76
|
+
post_install_message:
|
65
77
|
rdoc_options: []
|
66
78
|
require_paths:
|
67
79
|
- lib
|
@@ -76,8 +88,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
76
88
|
- !ruby/object:Gem::Version
|
77
89
|
version: '0'
|
78
90
|
requirements: []
|
79
|
-
|
80
|
-
|
91
|
+
rubyforge_project:
|
92
|
+
rubygems_version: 2.7.7
|
93
|
+
signing_key:
|
81
94
|
specification_version: 4
|
82
95
|
summary: moesif_rack
|
83
96
|
test_files: []
|