|
require 'net/https' |
|
require 'json' |
|
|
|
#-------------------------------------------------------------------------------- |
|
# Configuration |
|
#-------------------------------------------------------------------------------- |
|
configuration = { |
|
:uri => 'https://fabric.io', |
|
:credentials => { |
|
:username => '', |
|
:password => '', |
|
:developer_token => '' |
|
}, |
|
:refresh_rate => '30m', |
|
:app_keys => %w[] |
|
} |
|
#-------------------------------------------------------------------------------- |
|
|
|
class Crashlytics |
|
def initialize(base_uri, credentials) |
|
@base_uri = base_uri |
|
@credentials = credentials |
|
end |
|
|
|
def app_crash_rate(app_key) |
|
begin |
|
uri = URI.parse(@base_uri) |
|
http = Net::HTTP.new(uri.host, uri.port) |
|
if uri.scheme == 'https' |
|
http.use_ssl = true |
|
http.verify_mode = OpenSSL::SSL::VERIFY_NONE |
|
end |
|
|
|
#fetch the csrf token |
|
request = Net::HTTP::Get.new('/login') |
|
response = http.request(request) |
|
token = response.body.scan(/<meta content=\"(.*)\" name=\"csrf-token\" \/>/) |
|
cookie = response.header["set-cookie"] |
|
|
|
#login |
|
request = Net::HTTP::Post.new('/api/v2/session') |
|
set_headers(request, cookie, @credentials[:developer_token], token) |
|
request.set_form_data({"email" => @credentials[:username], "password" => @credentials[:password]}) |
|
response = http.request(request) |
|
response_json = JSON.parse(response.body) |
|
cookie = response.header["set-cookie"] |
|
organisation = response_json['current_organization']['id'] |
|
|
|
#get crash free percentage |
|
response_json = get_json_response(http, rate_endpoint(app_key, organisation), cookie, @credentials[:developer_token], token) |
|
|
|
crash_free = response_json['builds']['all'][-1][1] |
|
crash_free_percentage = (crash_free*1000).round.to_f / 10 |
|
|
|
#get users |
|
response_json = get_json_response(http, users_endpoint(app_key, organisation), cookie, @credentials[:developer_token], token) |
|
current_users = response_json['series'][-1][1] |
|
|
|
return { |
|
:number => "#{crash_free_percentage}%", |
|
:state => crash_free_percentage >= 99 ? 'High' : crash_free_percentage < 90 ? 'Low' : 'Medium', |
|
:current => current_users |
|
} |
|
|
|
rescue => e |
|
puts "Error getting crash free rate: #{e}" |
|
return { |
|
:number => '?', |
|
:state => 'Failed', |
|
:current => "unknown" |
|
} |
|
end |
|
end |
|
|
|
private |
|
def get_json_response(http, endpoint, cookie, developer_token, token) |
|
request = Net::HTTP::Get.new(endpoint) |
|
set_headers(request, cookie, developer_token, token) |
|
response = http.request(request) |
|
JSON.parse(response.body) |
|
end |
|
|
|
def rate_endpoint(app_key, organisation_key) |
|
now = Time.now.to_i |
|
from = (Time.now - (24*60*60)).to_i |
|
"/api/v2/organizations/#{organisation_key}/apps/#{app_key}/growth_analytics/crash_free_users_for_top_builds.json?transformation=weighted&limit=3&start=#{from}&end=#{now}" |
|
end |
|
|
|
def users_endpoint(app_key, organisation_key) |
|
now = Time.now.to_i |
|
from = (Time.now - (24*60*60)).to_i |
|
"/api/v2/organizations/#{organisation_key}/apps/#{app_key}/growth_analytics/daily_active.json?start=#{from}&end=#{now}&build=all&transformation=seasonal" |
|
end |
|
|
|
def set_headers(request, cookie, developer_token, token) |
|
request['Cookie'] = cookie.to_s |
|
request['X-CRASHLYTICS-DEVELOPER-TOKEN'] = developer_token |
|
request['X-CSRF-Token'] = token |
|
request['X-Requested-With'] = 'XMLHttpRequest' |
|
end |
|
end |
|
|
|
def get_app_crash_rate(uri, credentials, job) |
|
service = Crashlytics.new(uri, credentials) |
|
service.app_crash_rate(job) |
|
end |
|
|
|
configuration[:app_keys].each do |app_key| |
|
SCHEDULER.every configuration[:refresh_rate], :first_in => 0 do |_| |
|
status = get_app_crash_rate(configuration[:uri], configuration[:credentials], app_key) |
|
puts "#{app_key}: #{status}" |
|
send_event(app_key, status) |
|
end |
|
end |