trueandco_analytics 0.3.0 → 0.4.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +3 -6
- data/app/assets/javascripts/analitics_in_point.js +28 -0
- data/app/assets/javascripts/analitics_script.js +165 -0
- data/app/assets/javascripts/trueandco_analytics.js +2 -169
- data/app/views/trueandco_analytics/{receiver → site/receiver}/pull_user_statistic.erb +0 -0
- data/config/routes.rb +1 -1
- data/db/migrate/20170802133950_create_metric_users.rb +1 -1
- data/exe/trueandco_analytics +1 -10
- data/lib/generators/trueandco_analytics/templates/trueandco_analytics.rb +3 -3
- data/lib/trueandco_analytics.rb +44 -26
- data/lib/trueandco_analytics/{locales → common/locales}/en.yml +0 -0
- data/{app/models/trueandco_analytics → lib/trueandco_analytics/common/models}/application_record.rb +0 -0
- data/{app/models/trueandco_analytics → lib/trueandco_analytics/common/models}/metric_user.rb +0 -0
- data/{app/models/trueandco_analytics → lib/trueandco_analytics/common/models}/metric_user_session.rb +0 -0
- data/lib/trueandco_analytics/common/models/metric_user_visit.rb +8 -0
- data/lib/trueandco_analytics/{modules → common/modules}/info.rb +0 -0
- data/lib/trueandco_analytics/{reports → common/reports}/application_report.rb +0 -0
- data/lib/trueandco_analytics/{reports → common/reports}/details_report.rb +0 -0
- data/lib/trueandco_analytics/{reports → common/reports}/page_buy_in_date_range_report.rb +0 -0
- data/lib/trueandco_analytics/{services → common/services}/logger.rb +0 -0
- data/lib/trueandco_analytics/{services → common/services}/redis_connect.rb +0 -0
- data/lib/trueandco_analytics/{services → common/services}/reports.rb +1 -6
- data/lib/trueandco_analytics/{services → common/services}/workers.rb +0 -0
- data/lib/trueandco_analytics/config/params.rb +7 -7
- data/lib/trueandco_analytics/{cli → console/cli}/common.rb +0 -0
- data/lib/trueandco_analytics/{cli → console/cli}/report.rb +0 -0
- data/lib/trueandco_analytics/console/commands/report_c/generate.rb +29 -0
- data/lib/{extension_string.rb → trueandco_analytics/console/extension_string.rb} +0 -0
- data/lib/trueandco_analytics/engine.rb +2 -6
- data/{app/commands/trueandco_analytics → lib/trueandco_analytics/site/commands}/arr_jsons_to_arr_hash.rb +1 -1
- data/lib/trueandco_analytics/site/commands/metric_c/add_list.rb +63 -0
- data/lib/trueandco_analytics/site/commands/session_c/create.rb +63 -0
- data/lib/trueandco_analytics/site/commands/session_c/put_data.rb +49 -0
- data/lib/trueandco_analytics/site/commands/user_c/create_or_update_user_if_exist.rb +39 -0
- data/{app/controllers/trueandco_analytics → lib/trueandco_analytics/site/controllers}/application_controller.rb +2 -2
- data/{app/controllers/trueandco_analytics → lib/trueandco_analytics/site/controllers}/reciver_controller.rb +5 -7
- data/lib/trueandco_analytics/site/helpers/trueandco_analytics_helper.rb +18 -0
- data/lib/trueandco_analytics/site/workers/user_session_metric_worker.rb +20 -0
- data/lib/trueandco_analytics/version.rb +1 -1
- metadata +31 -29
- data/app/commands/trueandco_analytics/metric_c/add_list.rb +0 -65
- data/app/commands/trueandco_analytics/report_c/generate.rb +0 -31
- data/app/commands/trueandco_analytics/session_c/create.rb +0 -65
- data/app/commands/trueandco_analytics/session_c/put_data.rb +0 -46
- data/app/commands/trueandco_analytics/user_c/create_or_update_user_if_exist.rb +0 -41
- data/app/models/trueandco_analytics/metric_user_visit.rb +0 -8
- data/app/workers/trueandco_analytics/user_session_metric_worker.rb +0 -21
- data/lib/trueandco_analytics/helpers/trueandco_analytics_helper.rb +0 -35
data/lib/trueandco_analytics.rb
CHANGED
@@ -1,31 +1,49 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
if defined?(Rails) == 'constant'
|
7
|
-
require 'sidekiq/api'
|
8
|
-
require 'sidekiq'
|
9
|
-
require 'ipaddress'
|
10
|
-
require 'browser'
|
11
|
-
require 'browser/aliases'
|
12
|
-
require 'trueandco_analytics/engine'
|
13
|
-
else
|
14
|
-
require 'extension_string'
|
15
|
-
end
|
16
|
-
require 'trueandco_analytics/config/params'
|
17
|
-
require 'trueandco_analytics/modules/info'
|
1
|
+
module TrueandcoAnalytics
|
2
|
+
ROOT = File.expand_path('../..', __FILE__)
|
3
|
+
COMMON_PATH = "#{TrueandcoAnalytics::ROOT}/lib/trueandco_analytics/common"
|
4
|
+
SITE_PATH = "#{TrueandcoAnalytics::ROOT}/lib/trueandco_analytics/site"
|
5
|
+
CONSOLE_PATH = "#{TrueandcoAnalytics::ROOT}/lib/trueandco_analytics/console"
|
18
6
|
|
19
|
-
|
20
|
-
|
21
|
-
|
7
|
+
require 'colorize'
|
8
|
+
require 'csv'
|
9
|
+
require 'fnv'
|
10
|
+
require 'byebug'
|
11
|
+
require 'trueandco_analytics/config/params'
|
12
|
+
require 'trueandco_analytics/common/modules/info'
|
22
13
|
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
14
|
+
# Add the translations
|
15
|
+
I18n.available_locales = [:en]
|
16
|
+
I18n.config.enforce_available_locales = true
|
17
|
+
I18n.load_path += Dir[File.join(File.dirname(__FILE__), 'trueandco_analytics/common/locales', '*.yml').to_s]
|
18
|
+
|
19
|
+
# Add models
|
20
|
+
require "#{COMMON_PATH}/models/application_record"
|
21
|
+
Dir["#{COMMON_PATH}/models/*.rb"].each { |f| require f }
|
22
|
+
|
23
|
+
if defined?(Rails) == 'constant'
|
24
|
+
require 'sidekiq/api'
|
25
|
+
require 'sidekiq'
|
26
|
+
require 'ipaddress'
|
27
|
+
require 'browser'
|
28
|
+
require 'browser/aliases'
|
29
|
+
|
30
|
+
require "#{SITE_PATH}/controllers/application_controller"
|
31
|
+
Dir["#{SITE_PATH}/**/*.rb"].each { |f| require f }
|
32
|
+
|
33
|
+
require 'trueandco_analytics/engine'
|
34
|
+
else
|
35
|
+
Dir["#{CONSOLE_PATH}/**/*.rb"].each { |f| require f }
|
36
|
+
end
|
37
|
+
# Add service for reports
|
38
|
+
autoload :Reports, 'trueandco_analytics/common/services/reports'
|
39
|
+
# Add list of reports
|
40
|
+
autoload :ApplicationReport, 'trueandco_analytics/common/reports/application_report'
|
41
|
+
autoload :DetailsReport, 'trueandco_analytics/common/reports/details_report'
|
42
|
+
autoload :PageBuyInDateRangeReport, 'trueandco_analytics/common/reports/page_buy_in_date_range_report'
|
43
|
+
|
44
|
+
autoload :Logger, 'trueandco_analytics/common/services/logger'
|
45
|
+
autoload :Workers, 'trueandco_analytics/common/services/workers'
|
46
|
+
autoload :RedisConnect, 'trueandco_analytics/common/services/redis_connect'
|
29
47
|
|
30
48
|
def self.table_name_prefix
|
31
49
|
'metric_'
|
File without changes
|
data/{app/models/trueandco_analytics → lib/trueandco_analytics/common/models}/application_record.rb
RENAMED
File without changes
|
data/{app/models/trueandco_analytics → lib/trueandco_analytics/common/models}/metric_user.rb
RENAMED
File without changes
|
data/{app/models/trueandco_analytics → lib/trueandco_analytics/common/models}/metric_user_session.rb
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
@@ -1,14 +1,9 @@
|
|
1
|
-
report_dir = "#{TrueandcoAnalytics::ROOT}/lib/trueandco_analytics/reports"
|
2
|
-
require "#{report_dir}/application_report"
|
3
|
-
Dir["#{report_dir}/*.rb"].each do |f|
|
4
|
-
require f
|
5
|
-
end
|
6
|
-
|
7
1
|
module TrueandcoAnalytics
|
8
2
|
class Reports
|
9
3
|
include TrueandcoAnalytics::Modules::Info
|
10
4
|
|
11
5
|
def self.available_reports
|
6
|
+
Dir["#{COMMON_PATH}/reports/*.rb"].each { |f| require f }
|
12
7
|
TrueandcoAnalytics::ApplicationReport.reports
|
13
8
|
end
|
14
9
|
|
File without changes
|
@@ -8,8 +8,8 @@ module TrueandcoAnalytics
|
|
8
8
|
@time_dead_session = Rails.env.development? ? 30 : 600
|
9
9
|
end
|
10
10
|
@user_method_check = false
|
11
|
-
@
|
12
|
-
@
|
11
|
+
@buy_selector = ''
|
12
|
+
@buy_selector_check = false
|
13
13
|
@connect_redis = { redis_db: 1, }
|
14
14
|
@connect_redis_check = false
|
15
15
|
@sidekiq_configure_client_url = 'redis://localhost:6379/1'
|
@@ -41,18 +41,18 @@ module TrueandcoAnalytics
|
|
41
41
|
end
|
42
42
|
end
|
43
43
|
|
44
|
-
attr_reader :time_survey, :time_dead_session, :
|
44
|
+
attr_reader :time_survey, :time_dead_session, :buy_selector,
|
45
45
|
:sidekiq_configure_client_url, :sidekiq_configure_server_url, :sidekiq_configure_namespace,
|
46
46
|
:connect_db, :connect_redis
|
47
47
|
|
48
48
|
attr_writer_only_once :time_survey, :user_method,
|
49
49
|
:sidekiq_configure_client_url, :sidekiq_configure_server_url, :sidekiq_configure_namespace,
|
50
|
-
:connect_db
|
50
|
+
:connect_db, :connect_redis
|
51
51
|
|
52
|
-
def
|
52
|
+
def buy_selector=(value)
|
53
53
|
return if value.nil?
|
54
|
-
@
|
55
|
-
@
|
54
|
+
@buy_selector = value.delete('.') unless @buy_selector_check
|
55
|
+
@buy_selector_check = true
|
56
56
|
end
|
57
57
|
|
58
58
|
def user_method
|
File without changes
|
File without changes
|
@@ -0,0 +1,29 @@
|
|
1
|
+
module TrueandcoAnalytics::ReportC
|
2
|
+
class Generate
|
3
|
+
include TrueandcoAnalytics::Modules::Info
|
4
|
+
|
5
|
+
def initialize(name: nil, format: nil, datetime_start: nil, datetime_end: nil, path: nil)
|
6
|
+
@name = name
|
7
|
+
@format = format
|
8
|
+
@datetime_start = datetime_start
|
9
|
+
@datetime_end = datetime_end
|
10
|
+
@path = path || CURRENT_PATH
|
11
|
+
end
|
12
|
+
|
13
|
+
def execute
|
14
|
+
report = ::TrueandcoAnalytics::Reports.get_report_obj(name, format, datetime_start, datetime_end)
|
15
|
+
return if report.nil? || report.data.empty?
|
16
|
+
@path += report.report_name if File.directory?(path)
|
17
|
+
dirname = File.dirname(path)
|
18
|
+
unless File.directory?(dirname)
|
19
|
+
FileUtils.mkdir_p(dirname)
|
20
|
+
end
|
21
|
+
File.open(path, 'w+') {|f| f.write(report.data)}
|
22
|
+
result(I18n.t('trueandco_analytics.result.done', path: path))
|
23
|
+
end
|
24
|
+
|
25
|
+
private
|
26
|
+
|
27
|
+
attr_reader :name, :format, :datetime_start, :datetime_end, :path
|
28
|
+
end
|
29
|
+
end
|
File without changes
|
@@ -1,5 +1,3 @@
|
|
1
|
-
require "trueandco_analytics/helpers/trueandco_analytics_helper"
|
2
|
-
|
3
1
|
module TrueandcoAnalytics
|
4
2
|
|
5
3
|
class Engine < ::Rails::Engine
|
@@ -16,14 +14,12 @@ module TrueandcoAnalytics
|
|
16
14
|
initializer :action_controller do
|
17
15
|
::TrueandcoAnalytics::Workers.init
|
18
16
|
ActiveSupport.on_load(:action_controller) do
|
19
|
-
self.try(:helper, ::TrueandcoAnalytics::TrueandcoAnalyticsHelper) ||
|
20
|
-
self.try(:include, ::TrueandcoAnalytics::TrueandcoAnalyticsHelper)
|
17
|
+
self.try(:helper, ::TrueandcoAnalytics::Site::TrueandcoAnalyticsHelper) ||
|
18
|
+
self.try(:include, ::TrueandcoAnalytics::Site::TrueandcoAnalyticsHelper)
|
21
19
|
end
|
22
20
|
end
|
23
21
|
|
24
22
|
config.generators do |g|
|
25
|
-
g.test_framework :rspec, :fixture => false
|
26
|
-
g.fixture_replacement :factory_girl, :dir => 'spec/factories'
|
27
23
|
g.assets false
|
28
24
|
g.helper false
|
29
25
|
end
|
@@ -0,0 +1,63 @@
|
|
1
|
+
module TrueandcoAnalytics::Site::MetricC
|
2
|
+
class AddList
|
3
|
+
|
4
|
+
def initialize(metric_user, session, user_session_data)
|
5
|
+
if metric_user.nil? || session.nil? || user_session_data.nil?
|
6
|
+
raise ArgumentError.new("#{self.to_s} metric_user=#{metric_user}
|
7
|
+
session=#{session} user_session_data=#{user_session_data}")
|
8
|
+
end
|
9
|
+
@metric_user = metric_user
|
10
|
+
@session = session
|
11
|
+
@user_session_data = user_session_data
|
12
|
+
end
|
13
|
+
|
14
|
+
def execute
|
15
|
+
uniq_pages = info_uniq_page
|
16
|
+
return if uniq_pages.nil?
|
17
|
+
uniq_pages.each do |page|
|
18
|
+
data = {
|
19
|
+
metric_user: metric_user,
|
20
|
+
metric_user_session: session,
|
21
|
+
page_path: page['page_path'],
|
22
|
+
user_action: page['clicks']['clickDetails'].to_json,
|
23
|
+
time_s: page['time']['timeOnPage'],
|
24
|
+
is_buy: page['clicks']['clickDetails'].length > 0
|
25
|
+
}
|
26
|
+
::TrueandcoAnalytics::MetricUserVisit.create(data)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
private
|
31
|
+
|
32
|
+
attr_reader :metric_user, :session, :user_session_data
|
33
|
+
|
34
|
+
def info_uniq_page
|
35
|
+
length = user_session_data.length
|
36
|
+
return user_session_data if length < 2
|
37
|
+
results = []
|
38
|
+
page = user_session_data[0]['page_path']
|
39
|
+
clickDetails = []
|
40
|
+
index = 0
|
41
|
+
while index < length - 1
|
42
|
+
unless user_session_data[index]['clicks']['clickDetails'].empty?
|
43
|
+
clickDetails = user_session_data[index]['clicks']['clickDetails']
|
44
|
+
end
|
45
|
+
index += 1
|
46
|
+
unless page == user_session_data[index]['page_path']
|
47
|
+
data = user_session_data[index - 1]
|
48
|
+
data['clicks']['clickDetails'] = clickDetails
|
49
|
+
results << data
|
50
|
+
page = user_session_data[index]['page_path']
|
51
|
+
clickDetails = []
|
52
|
+
end
|
53
|
+
end
|
54
|
+
data = user_session_data[index]
|
55
|
+
unless data['clicks']['clickDetails'].empty?
|
56
|
+
clickDetails = data['clicks']['clickDetails']
|
57
|
+
end
|
58
|
+
data['clicks']['clickDetails'] = clickDetails
|
59
|
+
results << data
|
60
|
+
results
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
@@ -0,0 +1,63 @@
|
|
1
|
+
module TrueandcoAnalytics::Site::SessionC
|
2
|
+
class Create
|
3
|
+
def initialize(metric_user, first_point, timestamp_end, request_info)
|
4
|
+
|
5
|
+
if metric_user.nil? || first_point.nil? || timestamp_end.nil? ||request_info.nil?
|
6
|
+
raise ArgumentError.new("#{self.to_s} metric_user=#{metric_user}
|
7
|
+
first_point=#{first_point} timestamp_end=#{timestamp_end} request_info=#{request_info}")
|
8
|
+
end
|
9
|
+
|
10
|
+
@metric_user = metric_user
|
11
|
+
@ip = request_info['remote_ip']
|
12
|
+
@user_agent = request_info['user_agent']
|
13
|
+
@session_start = first_point['time']['timestamp']
|
14
|
+
@referer = first_point['userReferrer']
|
15
|
+
@live_time_s = timestamp_end - @session_start
|
16
|
+
end
|
17
|
+
|
18
|
+
def execute
|
19
|
+
Browser::Base.include(Browser::Aliases)
|
20
|
+
browser = Browser.new(user_agent, accept_language: "en-us")
|
21
|
+
data = {
|
22
|
+
metric_user: metric_user,
|
23
|
+
user_agent: user_agent,
|
24
|
+
referer: referer,
|
25
|
+
session_start: datetime_session_start,
|
26
|
+
live_time_s: 60,
|
27
|
+
ip_4: ip_v4(ip),
|
28
|
+
ip_6: ip_v6(ip),
|
29
|
+
browser: browser.name,
|
30
|
+
is_mobile: browser.mobile? || false
|
31
|
+
}
|
32
|
+
::TrueandcoAnalytics::MetricUserSession.create(data)
|
33
|
+
end
|
34
|
+
|
35
|
+
private
|
36
|
+
|
37
|
+
attr_reader :metric_user, :ip, :user_agent, :session_start, :live_time_s, :referer
|
38
|
+
|
39
|
+
def datetime_session_start
|
40
|
+
DateTime.strptime(session_start.to_s, '%s')
|
41
|
+
end
|
42
|
+
|
43
|
+
def ip_v4(ip)
|
44
|
+
ip_o = get_ip_object(ip)
|
45
|
+
result = 0
|
46
|
+
result = ip_o.to_i if ip_o.ipv4?
|
47
|
+
result
|
48
|
+
end
|
49
|
+
|
50
|
+
|
51
|
+
def ip_v6(ip)
|
52
|
+
ip_o = get_ip_object(ip)
|
53
|
+
result = 0
|
54
|
+
result = ip_o.data if ip_o.ipv6?
|
55
|
+
result
|
56
|
+
end
|
57
|
+
|
58
|
+
def get_ip_object(ip)
|
59
|
+
@ip_o ||= IPAddress.parse ip
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
module TrueandcoAnalytics::Site::SessionC
|
2
|
+
class PutData
|
3
|
+
|
4
|
+
def initialize(json_data, request_info, userInfo)
|
5
|
+
@json_data = json_data
|
6
|
+
@userInfo = userInfo
|
7
|
+
@request_info = request_info
|
8
|
+
@redis = ::TrueandcoAnalytics::RedisConnect.get
|
9
|
+
@time_survey = ::TrueandcoAnalytics::Config::Params.time_survey
|
10
|
+
@time_dead_session = ::TrueandcoAnalytics::Config::Params.time_dead_session
|
11
|
+
end
|
12
|
+
|
13
|
+
def execute
|
14
|
+
1.times do
|
15
|
+
break if userInfo.nil? || userInfo.empty?
|
16
|
+
user_key = ::FNV.new.fnv1_32 userInfo.to_s
|
17
|
+
mange_job(user_key)
|
18
|
+
redis.rpush(user_key, json_data)
|
19
|
+
redis.expire(user_key, time_dead_session + 3)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
private
|
24
|
+
|
25
|
+
attr_reader :json_data, :userInfo, :request_info, :redis, :time_dead_session, :time_survey
|
26
|
+
|
27
|
+
def datetime_dead_session
|
28
|
+
::DateTime.now + time_dead_session.seconds
|
29
|
+
end
|
30
|
+
|
31
|
+
def mange_job(user_key)
|
32
|
+
user_job_key = "#{user_key}:job_key"
|
33
|
+
unless redis.exists user_job_key
|
34
|
+
create_job(user_key, user_job_key)
|
35
|
+
end
|
36
|
+
if redis.ttl(user_job_key) < time_survey * 3
|
37
|
+
job_id = redis.get(user_job_key)
|
38
|
+
Sidekiq::ScheduledSet.new.find_job(job_id)&.delete
|
39
|
+
create_job(user_key, user_job_key)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
def create_job(user_key, user_job_key)
|
44
|
+
job_id = ::TrueandcoAnalytics::Site::UserSessionMetricWorker.perform_at(time_dead_session.seconds.from_now, user_key, request_info)
|
45
|
+
redis.setex(user_job_key, time_dead_session, job_id)
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
module TrueandcoAnalytics::Site::UserC
|
2
|
+
class CreateOrUpdateUserIfExist
|
3
|
+
|
4
|
+
def initialize(user_agent, timestamp_end)
|
5
|
+
if user_agent.nil? || timestamp_end.nil?
|
6
|
+
raise ArgumentError.new("#{self.to_s} user_agent=#{user_agent} timestamp_end=#{timestamp_end}")
|
7
|
+
end
|
8
|
+
@user_agent = user_agent
|
9
|
+
@timestamp_end = timestamp_end
|
10
|
+
@user_id = ::TrueandcoAnalytics::Config::Params.user_method&.id
|
11
|
+
end
|
12
|
+
|
13
|
+
def execute
|
14
|
+
user = nil
|
15
|
+
user = ::TrueandcoAnalytics::MetricUser.find_by(user_id: user_id) if user_id
|
16
|
+
user = ::TrueandcoAnalytics::MetricUser.find_by(hash_id: hash_id) if user.nil?
|
17
|
+
user = if user.nil?
|
18
|
+
::TrueandcoAnalytics::MetricUser.create(user_id: user_id || 0, datetime_create: datetime_end,
|
19
|
+
last_active_datetime: datetime_end, hash_id: hash_id)
|
20
|
+
else
|
21
|
+
user.update_attribute(:last_active_datetime, datetime_end)
|
22
|
+
user
|
23
|
+
end
|
24
|
+
user
|
25
|
+
end
|
26
|
+
|
27
|
+
private
|
28
|
+
|
29
|
+
attr_reader :user_agent, :timestamp_end, :user_id
|
30
|
+
|
31
|
+
def datetime_end
|
32
|
+
DateTime.strptime(timestamp_end.to_s, '%s')
|
33
|
+
end
|
34
|
+
|
35
|
+
def hash_id
|
36
|
+
@hash_id ||= FNV.new.fnv1_32(user_agent)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|