jam-cloud/web/app/helpers/latency_helper.rb

89 lines
3.2 KiB
Ruby

module LatencyHelper
#GOOD = <40ms, FAIR = 40-60ms, and POOR = >60ms
LATENCY_SCORES = {
good: { label: 'GOOD', min: 0, max: 40 },
fair: { label: 'FAIR', min: 40, max: 60 },
high: { label: 'HIGH', min: 60, max: 10000000 },
me: { label: 'ME', min: -1, max: -1 },
unknown: { label: 'UNKNOWN', min: -2, max: -2 }
};
def users_latency_data(latency_good, latency_fair, latency_high, filter_opts, page, limit)
latency_data = []
uri = URI(filter_latency_url)
begin
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true if Rails.application.config.latency_data_host.start_with?("https://")
req = Net::HTTP::Post.new(uri)
req["Authorization"] = "Basic #{Rails.application.config.latency_data_host_auth_code}"
req["Content-Type"] = "application/json"
req_params = {
my_user_id: current_user.id,
my_public_ip: request.remote_ip,
my_device_id: nil,
my_client_id: nil,
from_location: filter_opts[:from_location] || "0",
offset: page,
limit: limit
}
req_params.merge!(instruments: filter_opts[:instruments]) if filter_opts[:instruments]
req_params.merge!(genres: filter_opts[:genres]) if filter_opts[:genres]
#TODO: enable following two lines one joined and active options are been supported by neo4j handler
#req_params.merge!(joined_within_days: filter_opts[:joined_within_days]) if filter_opts[:joined_within_days]
#req_params.merge!(active_within_days: filter_opts[:active_within_days]) if filter_opts[:active_within_days]
req.body = req_params.to_json
response = http.request(req)
if response.is_a?(Net::HTTPOK) || response.is_a?(Net::HTTPSuccess)
graph_db_users = JSON.parse(response.body)["users"]
if latency_good || latency_fair || latency_high
#fiter by latency params
graph_db_users.select! do |user|
total_latency = user["ars"]["total_latency"].to_f
(total_latency >= LATENCY_SCORES[:good][:min] && total_latency <= LATENCY_SCORES[:good][:max] && latency_good) ||
(total_latency > LATENCY_SCORES[:fair][:min] && total_latency <= LATENCY_SCORES[:fair][:max] && latency_fair) ||
(total_latency > LATENCY_SCORES[:high][:min] && latency_high)
end
end
latency_data = graph_db_users.map { | user |
{
user_id: user["user_id"],
audio_latency: user["audio_latency"].to_f,
ars_total_latency: user["ars"]["total_latency"].to_f,
ars_internet_latency: user["ars"]["internet_latency"].to_f
}
}.uniq
return latency_data
else
logger.debug("Latency response failed: #{response}")
Bugsnag.notify("LatencyResponseFailed") do |report|
report.severity = "faliure"
report.add_tab(:latency, {
user_id: current_user.id,
name: current_user.name,
params: params,
url: filter_latency_url,
code: response.code,
body: response.body,
})
end
end
rescue => exception
raise exception
end
latency_data
end
end