moesif_rack 1.3.5 → 1.3.6
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/moesif_rack/app_config.rb +121 -0
- data/lib/moesif_rack/moesif_middleware.rb +34 -36
- data/test/moesif_rack_test.rb +7 -1
- metadata +4 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f40e229ac134210c6703c176f6ce81a6de3c1fd483f5430c88ebb93dd60ad67e
|
4
|
+
data.tar.gz: c7afe14c3db3328dfe93fa824a245d2bea5ac88e89e48bb29735e6a0696f14e0
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ba2af16c43d3f9887b013edd3cfedac7cc032d713b51cc32c6250dfad367df96d7c1b848563aaf1889ce01ec2eb8d6b952ff08f12f40ebb210205570a7a59ace
|
7
|
+
data.tar.gz: 36acfefacd5edc2810185aa3b6096397e0ea2e0ee2b3003f7c3c9b99897d245be36dad84e45b35c3feded80fff6032d9704cc7edd2499a609354ded37e323ff5
|
@@ -0,0 +1,121 @@
|
|
1
|
+
require 'moesif_api'
|
2
|
+
require 'json'
|
3
|
+
require 'time'
|
4
|
+
require 'zlib'
|
5
|
+
require 'stringio'
|
6
|
+
|
7
|
+
class AppConfig
|
8
|
+
|
9
|
+
def get_config(api_controller, debug)
|
10
|
+
# Get Application Config
|
11
|
+
begin
|
12
|
+
config_api_response = api_controller.get_app_config()
|
13
|
+
return config_api_response
|
14
|
+
rescue MoesifApi::APIException => e
|
15
|
+
if e.response_code.between?(401, 403)
|
16
|
+
puts 'Unauthorized access getting application configuration. Please check your Appplication Id.'
|
17
|
+
end
|
18
|
+
if debug
|
19
|
+
puts 'Error getting application configuration, with status code:'
|
20
|
+
puts e.response_code
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def parse_configuration(config_api_response, debug)
|
26
|
+
# Parse configuration object and return Etag, sample rate and last updated time
|
27
|
+
begin
|
28
|
+
# Rails return gzipped compressed response body, so decompressing it and getting JSON response body
|
29
|
+
response_body = decompress_gzip_body(config_api_response, debug)
|
30
|
+
|
31
|
+
# Check if response body is not nil
|
32
|
+
if !response_body.nil? then
|
33
|
+
# Return Etag, sample rate and last updated time
|
34
|
+
return config_api_response.headers[:x_moesif_config_etag], response_body.fetch("sample_rate", 100), Time.now.utc
|
35
|
+
else
|
36
|
+
if debug
|
37
|
+
puts 'Response body is nil, assuming default behavior'
|
38
|
+
end
|
39
|
+
# Response body is nil, so assuming default behavior
|
40
|
+
return nil, 100, Time.now.utc
|
41
|
+
end
|
42
|
+
rescue => exception
|
43
|
+
if debug
|
44
|
+
puts 'Error while parsing the configuration object, assuming default behavior'
|
45
|
+
puts exception.to_s
|
46
|
+
end
|
47
|
+
# Assuming default behavior
|
48
|
+
return nil, 100, Time.now.utc
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
def get_sampling_percentage(config_api_response, user_id, company_id, debug)
|
53
|
+
# Get sampling percentage
|
54
|
+
begin
|
55
|
+
# Rails return gzipped compressed response body, so decompressing it and getting JSON response body
|
56
|
+
response_body = decompress_gzip_body(config_api_response, debug)
|
57
|
+
|
58
|
+
# Check if response body is not nil
|
59
|
+
if !response_body.nil? then
|
60
|
+
|
61
|
+
# Get user sample rate object
|
62
|
+
user_sample_rate = response_body.fetch('user_sample_rate', nil)
|
63
|
+
|
64
|
+
# Get company sample rate object
|
65
|
+
company_sample_rate = response_body.fetch('company_sample_rate', nil)
|
66
|
+
|
67
|
+
# Get sample rate for the user if exist
|
68
|
+
if !user_id.nil? && !user_sample_rate.nil? && user_sample_rate.key?(user_id)
|
69
|
+
return user_sample_rate.fetch(user_id)
|
70
|
+
end
|
71
|
+
|
72
|
+
# Get sample rate for the company if exist
|
73
|
+
if !company_id.nil? && !company_sample_rate.nil? && company_sample_rate.key?(company_id)
|
74
|
+
return company_sample_rate.fetch(company_id)
|
75
|
+
end
|
76
|
+
|
77
|
+
# Return sample rate
|
78
|
+
return response_body.fetch('sample_rate', 100)
|
79
|
+
else
|
80
|
+
if debug
|
81
|
+
puts 'Assuming default behavior as response body is nil - '
|
82
|
+
end
|
83
|
+
return 100
|
84
|
+
end
|
85
|
+
rescue => exception
|
86
|
+
if debug
|
87
|
+
puts 'Error while geting sampling percentage, assuming default behavior'
|
88
|
+
end
|
89
|
+
return 100
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
def decompress_gzip_body(config_api_response, debug)
|
94
|
+
# Decompress gzip response body
|
95
|
+
begin
|
96
|
+
# Check if the content-encoding header exist and is of type zip
|
97
|
+
if config_api_response.headers.key?(:content_encoding) && config_api_response.headers[:content_encoding].eql?( 'gzip' ) then
|
98
|
+
|
99
|
+
# Create a GZipReader object to read data
|
100
|
+
gzip_reader = Zlib::GzipReader.new(StringIO.new(config_api_response.raw_body.to_s))
|
101
|
+
|
102
|
+
# Read the body
|
103
|
+
uncompressed_string = gzip_reader.read
|
104
|
+
|
105
|
+
# Return the parsed body
|
106
|
+
return JSON.parse( uncompressed_string )
|
107
|
+
else
|
108
|
+
if debug
|
109
|
+
puts 'Content Encoding is of type other than gzip, returning nil'
|
110
|
+
end
|
111
|
+
return nil
|
112
|
+
end
|
113
|
+
rescue => exception
|
114
|
+
if debug
|
115
|
+
puts 'Error while decompressing the response body'
|
116
|
+
puts exception.to_s
|
117
|
+
end
|
118
|
+
return nil
|
119
|
+
end
|
120
|
+
end
|
121
|
+
end
|
@@ -3,6 +3,7 @@ require 'json'
|
|
3
3
|
require 'time'
|
4
4
|
require 'base64'
|
5
5
|
require_relative './client_ip.rb'
|
6
|
+
require_relative './app_config.rb'
|
6
7
|
require_relative './update_user.rb'
|
7
8
|
require_relative './update_company.rb'
|
8
9
|
|
@@ -12,7 +13,7 @@ module MoesifRack
|
|
12
13
|
def initialize app, options = {}
|
13
14
|
@app = app
|
14
15
|
if not options['application_id']
|
15
|
-
raise 'application_id
|
16
|
+
raise 'application_id required for Moesif Middleware'
|
16
17
|
end
|
17
18
|
@api_client = MoesifApi::MoesifAPIClient.new(options['application_id'])
|
18
19
|
@api_controller = @api_client.api
|
@@ -25,12 +26,23 @@ module MoesifRack
|
|
25
26
|
@mask_data = options['mask_data']
|
26
27
|
@skip = options['skip']
|
27
28
|
@debug = options['debug']
|
29
|
+
@app_config = AppConfig.new
|
30
|
+
@config = @app_config.get_config(@api_controller, @debug)
|
31
|
+
@config_etag = nil
|
32
|
+
@sampling_percentage = 100
|
33
|
+
@last_updated_time = Time.now.utc
|
28
34
|
@config_dict = Hash.new
|
29
35
|
@disable_transaction_id = options['disable_transaction_id'] || false
|
30
36
|
@log_body = options.fetch('log_body', true)
|
31
|
-
|
32
|
-
|
33
|
-
|
37
|
+
begin
|
38
|
+
if !@config.nil?
|
39
|
+
@config_etag, @sampling_percentage, @last_updated_time = @app_config.parse_configuration(@config, @debug)
|
40
|
+
end
|
41
|
+
rescue => exception
|
42
|
+
if @debug
|
43
|
+
puts 'Error while parsing application configuration on initialization'
|
44
|
+
puts exception.to_s
|
45
|
+
end
|
34
46
|
end
|
35
47
|
@capture_outoing_requests = options['capture_outoing_requests']
|
36
48
|
if @capture_outoing_requests
|
@@ -42,35 +54,6 @@ module MoesifRack
|
|
42
54
|
end
|
43
55
|
end
|
44
56
|
|
45
|
-
def get_config(cached_config_etag)
|
46
|
-
sample_rate = 100
|
47
|
-
begin
|
48
|
-
# Calling the api
|
49
|
-
config_api_response = @api_controller.get_app_config()
|
50
|
-
# Fetch the response ETag
|
51
|
-
response_config_etag = JSON.parse( config_api_response.to_json )["headers"]["x_moesif_config_etag"]
|
52
|
-
# Remove ETag from the global dict if exist
|
53
|
-
if !cached_config_etag.nil? && @config_dict.key?(cached_config_etag)
|
54
|
-
@config_dict.delete(cached_config_etag)
|
55
|
-
end
|
56
|
-
# Fetch the response body
|
57
|
-
@config_dict[response_config_etag] = JSON.parse(JSON.parse( config_api_response.to_json )["raw_body"])
|
58
|
-
#
|
59
|
-
app_config = @config_dict[response_config_etag]
|
60
|
-
# Fetch the sample rate
|
61
|
-
if !app_config.nil?
|
62
|
-
sample_rate = app_config.fetch("sample_rate", 100)
|
63
|
-
end
|
64
|
-
# Set the last updated time
|
65
|
-
@last_updated_time = Time.now.utc
|
66
|
-
rescue
|
67
|
-
# Set the last updated time
|
68
|
-
@last_updated_time = Time.now.utc
|
69
|
-
end
|
70
|
-
# Return the sample rate
|
71
|
-
return sample_rate
|
72
|
-
end
|
73
|
-
|
74
57
|
def update_user(user_profile)
|
75
58
|
UserHelper.new.update_user(@api_controller, @debug, user_profile)
|
76
59
|
end
|
@@ -236,13 +219,28 @@ module MoesifRack
|
|
236
219
|
# Perform the API call through the SDK function
|
237
220
|
begin
|
238
221
|
@random_percentage = Random.rand(0.00..100.00)
|
222
|
+
|
223
|
+
# Event UserId
|
224
|
+
user_id = !event_model.user_id.nil? ? event_model.user_id : nil
|
225
|
+
# Event CompanyId
|
226
|
+
company_id = !event_model.company_id.nil? ? event_model.company_id : nil
|
227
|
+
# Get sampling percentage
|
228
|
+
@sampling_percentage = @app_config.get_sampling_percentage(@config, user_id, company_id, @debug)
|
229
|
+
|
239
230
|
if @sampling_percentage > @random_percentage
|
240
231
|
event_api_response = @api_controller.create_event(event_model)
|
241
|
-
cached_config_etag = @config_dict.keys[0]
|
242
232
|
event_response_config_etag = event_api_response[:x_moesif_config_etag]
|
243
233
|
|
244
|
-
if !event_response_config_etag.nil? &&
|
245
|
-
|
234
|
+
if !event_response_config_etag.nil? && !@config_etag.nil? && @config_etag != event_response_config_etag && Time.now.utc > @last_updated_time + 300
|
235
|
+
begin
|
236
|
+
@config = @app_config.get_config(@api_controller, @debug)
|
237
|
+
@config_etag, @sampling_percentage, @last_updated_time = @app_config.parse_configuration(@config, @debug)
|
238
|
+
rescue => exception
|
239
|
+
if @debug
|
240
|
+
puts 'Error while updating the application configuration'
|
241
|
+
puts exception.to_s
|
242
|
+
end
|
243
|
+
end
|
246
244
|
end
|
247
245
|
if @debug
|
248
246
|
puts("Event successfully sent to Moesif")
|
data/test/moesif_rack_test.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
require 'test/unit'
|
2
2
|
require 'rack'
|
3
3
|
require 'net/http'
|
4
|
+
require_relative '../lib/moesif_rack/app_config.rb'
|
4
5
|
require_relative '../lib/moesif_rack'
|
5
6
|
|
6
7
|
class MoesifRackTest < Test::Unit::TestCase
|
@@ -45,6 +46,7 @@ class MoesifRackTest < Test::Unit::TestCase
|
|
45
46
|
}
|
46
47
|
}
|
47
48
|
@moesif_rack_app = MoesifRack::MoesifMiddleware.new(@app, @options)
|
49
|
+
@app_config = AppConfig.new
|
48
50
|
end
|
49
51
|
|
50
52
|
def test_capture_outgoing
|
@@ -106,7 +108,11 @@ class MoesifRackTest < Test::Unit::TestCase
|
|
106
108
|
end
|
107
109
|
|
108
110
|
def test_get_config
|
109
|
-
|
111
|
+
@api_client = MoesifApi::MoesifAPIClient.new(@options['application_id'])
|
112
|
+
@api_controller = @api_client.api
|
113
|
+
@config = @app_config.get_config(@api_controller, @debug)
|
114
|
+
@config_etag, @sampling_percentage, @last_updated_time = @app_config.parse_configuration(@config, @debug)
|
115
|
+
assert_operator 100, :>=, @sampling_percentage
|
110
116
|
end
|
111
117
|
|
112
118
|
def test_update_company
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: moesif_rack
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.3.
|
4
|
+
version: 1.3.6
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Moesif, Inc
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2019-10-
|
12
|
+
date: 2019-10-16 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: test-unit
|
@@ -48,6 +48,7 @@ files:
|
|
48
48
|
- LICENSE
|
49
49
|
- README.md
|
50
50
|
- lib/moesif_rack.rb
|
51
|
+
- lib/moesif_rack/app_config.rb
|
51
52
|
- lib/moesif_rack/client_ip.rb
|
52
53
|
- lib/moesif_rack/moesif_middleware.rb
|
53
54
|
- lib/moesif_rack/update_company.rb
|
@@ -75,8 +76,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
75
76
|
- !ruby/object:Gem::Version
|
76
77
|
version: '0'
|
77
78
|
requirements: []
|
78
|
-
|
79
|
-
rubygems_version: 2.7.7
|
79
|
+
rubygems_version: 3.0.1
|
80
80
|
signing_key:
|
81
81
|
specification_version: 4
|
82
82
|
summary: moesif_rack
|