Skip to content
Snippets Groups Projects
Commit 705290a8 authored by Jeremy Nicklas's avatar Jeremy Nicklas
Browse files

added metrics gathering

parent f654b29a
No related branches found
No related tags found
No related merge requests found
......@@ -51,3 +51,6 @@ build-iPhoneSimulator/
# Ignore the Google API key
google_api_key.json
# Ignore metrics data
data.txt
source 'https://rubygems.org'
gem 'google-api-client', '~> 0.10'
GEM
remote: https://rubygems.org/
specs:
addressable (2.5.0)
public_suffix (~> 2.0, >= 2.0.2)
declarative (0.0.9)
declarative-option (0.1.0)
faraday (0.11.0)
multipart-post (>= 1.2, < 3)
google-api-client (0.10.1)
addressable (~> 2.3)
googleauth (~> 0.5)
httpclient (~> 2.7)
hurley (~> 0.1)
memoist (~> 0.11)
mime-types (>= 1.6)
representable (~> 3.0)
retriable (>= 2.0, < 4.0)
googleauth (0.5.1)
faraday (~> 0.9)
jwt (~> 1.4)
logging (~> 2.0)
memoist (~> 0.12)
multi_json (~> 1.11)
os (~> 0.9)
signet (~> 0.7)
httpclient (2.8.3)
hurley (0.2)
jwt (1.5.6)
little-plugger (1.1.4)
logging (2.2.0)
little-plugger (~> 1.1)
multi_json (~> 1.10)
memoist (0.15.0)
mime-types (3.1)
mime-types-data (~> 3.2015)
mime-types-data (3.2016.0521)
multi_json (1.12.1)
multipart-post (2.0.0)
os (0.9.6)
public_suffix (2.0.5)
representable (3.0.3)
declarative (< 0.1.0)
declarative-option (< 0.2.0)
uber (< 0.2.0)
retriable (3.0.1)
signet (0.7.3)
addressable (~> 2.3)
faraday (~> 0.9)
jwt (~> 1.5)
multi_json (~> 1.10)
uber (0.1.0)
PLATFORMS
ruby
DEPENDENCIES
google-api-client (~> 0.10)
#!/bin/env ruby
#
# Set options here
#
OUTPUT = ENV["OUTPUT"] || "data.txt"
API_KEY = ENV["GOOGLE_API_KEY"] || "google_api_key.json"
GA_PROFILE = ENV["GOOGLE_PROFILE"] || "133342836" # Open OnDemand (beta) / Authenticated Users
START_DATE = ENV["START_DATE"] || "2016-11-29" # Server side analytics code deployed in OSC OnDemand production
END_DATE = ENV["END_DATE"] || "today" # google keyword is "today"
START_STEP = ENV["START_STEP"] || 1 # google starts with 1, NOT 0
STEP_SIZE = ENV["STEP_SIZE"] || 10000 # max google step is 10,000
# max 7 dimensions
DIMENSIONS = %w(
ga:dimension3
ga:dimension1
ga:dimension2
ga:pagePath
)
USR_COLUMN = 1 # ga:dimension1
APP_COLUMN = 3 # ga:pagePath
# at least 1 metric, max 10 metrics
METRICS = %w(
ga:hits
)
SORT = %w()
FILTERS = %w(
ga:hostname==ondemand.osc.edu;ga:dimension6!~[45]..
)
# Fix app token from page path
APP_BASE_URI = "/pun"
APP_TOKEN = {
%r{^/sys/vncsim/sys/bc_osc_abaqus} => "sys/abaqus_cae",
%r{^/sys/vncsim/sys/bc_osc_ansys_workbench} => "sys/ansys_workbench",
%r{^/sys/vncsim/sys/bc_osc_comsol} => "sys/comsol",
%r{^/sys/vncsim/sys/bc_osc_oakley_desktop} => "sys/oakley_desktop",
%r{^/sys/vncsim/sys/bc_osc_oakley_vdi} => "sys/oakley_vdi",
%r{^/sys/vncsim/sys/bc_osc_paraview} => "sys/paraview",
%r{^/sys/vncsim/sys/bc_osc_ruby_desktop} => "sys/ruby_desktop",
%r{^/sys/vncsim/sys/bc_osc_ruby_vdi} => "sys/ruby_vdi",
%r{^/sys/vncsim/sys/(?<app_name>[^/]+)} => "sys/vncsim/sys/%{app_name}",
%r{^/sys/vncsim/usr/(?<app_owner>[^/]+)/(?<app_name>[^/]+)} => "sys/vncsim/usr/%{app_owner}/%{app_name}",
%r{^/sys/vncsim/dev/(?<app_name>[^/]+)} => "sys/vncsim/dev/%{user}/%{app_name}",
%r{^/sys/(?<app_name>[^/]+)} => "sys/%{app_name}",
%r{^/usr/(?<app_owner>[^/]+)/(?<app_name>[^/]+)} => "usr/%{app_owner}/%{app_name}",
%r{^/dev/(?<app_name>[^/]+)} => "dev/%{user}/%{app_name}"
}
#
# Do not modify below
#
require 'rubygems'
require 'bundler/setup'
require 'googleauth'
require 'google/apis/analytics_v3'
credentials = Google::Auth::ServiceAccountCredentials.make_creds(
json_key_io: File.open(API_KEY, 'r'),
scope: Google::Apis::AnalyticsV3::AUTH_ANALYTICS_READONLY
)
analytics = Google::Apis::AnalyticsV3::AnalyticsService.new
analytics.authorization = credentials
class InvalidToken < StandardError; end
def parse_uri(str, **opts)
raise RuntimeError, "failed to parse app uri: #{str}" unless m = /^#{APP_BASE_URI}(?<app_uri>.+)$/.match(str)
parse_token m[:app_uri], **opts
end
def parse_token(str, user: "")
APP_TOKEN.each do |regex, token|
if m = regex.match(str)
return token % Hash[m.names.map(&:to_sym).zip(m.captures)].merge(user: user)
end
end
raise InvalidToken, "failed to parse app token: #{str}"
end
def gather_data(analytics, file)
target = open(file, "w")
puts "Sending request..."
start_index = START_STEP
loop do
results = analytics.get_ga_data(
"ga:#{GA_PROFILE}",
START_DATE,
END_DATE,
METRICS.join(','),
dimensions: DIMENSIONS.empty? ? nil : DIMENSIONS.join(','),
filters: FILTERS.empty? ? nil : FILTERS.join(','),
sort: SORT.empty? ? nil : SORT.join(','),
start_index: start_index,
max_results: STEP_SIZE
)
puts "Outputting #{results.rows.size} items..."
results.rows.each do |row|
begin
app = row[APP_COLUMN]
row[APP_COLUMN] = parse_uri(app, user: row[USR_COLUMN])
row << app
target.write "#{row.join(' ')}\n"
rescue InvalidToken => e
$stderr.puts "Warning: #{e.message}"
end
end
start_index += STEP_SIZE
break unless results.next_link
end
puts "Done!"
ensure
target.close
end
gather_data(analytics, OUTPUT)
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment