lib/airbrake-ruby/remote_settings/settings_data.rb
module Airbrake
class RemoteSettings
# SettingsData is a container, which wraps JSON payload returned by the
# remote settings API. It exposes the payload via convenient methods and
# also ensures that in case some data from the payload is missing, a default
# value would be returned instead.
#
# @example
# # Create the object and pass initial data (empty hash).
# settings_data = SettingsData.new({})
#
# settings_data.interval #=> 600
#
# @since v5.0.0
# @api private
class SettingsData
# @return [Integer] how frequently we should poll the config API
DEFAULT_INTERVAL = 600
# @return [String] API version of the S3 API to poll
API_VER = '2020-06-18'.freeze
# @return [String] what path to poll
CONFIG_ROUTE_PATTERN =
"%<host>s/#{API_VER}/config/%<project_id>s/config.json".freeze
# @return [Hash{Symbol=>String}] the hash of all supported settings where
# the value is the name of the setting returned by the API
SETTINGS = {
errors: 'errors'.freeze,
apm: 'apm'.freeze,
}.freeze
# @param [Integer] project_id
# @param [Hash{String=>Object}] data
def initialize(project_id, data)
@project_id = project_id
@data = data
end
# Merges the given +hash+ with internal data.
#
# @param [Hash{String=>Object}] hash
# @return [self]
def merge!(hash)
@data.merge!(hash)
self
end
# @return [Integer] how frequently we should poll for the config
def interval
return DEFAULT_INTERVAL if !@data.key?('poll_sec') || !@data['poll_sec']
@data['poll_sec'] > 0 ? @data['poll_sec'] : DEFAULT_INTERVAL
end
# @param [String] remote_config_host
# @return [String] where the config is stored on S3.
def config_route(remote_config_host)
if @data['config_route'] && !@data['config_route'].empty?
return "#{remote_config_host.chomp('/')}/#{@data['config_route']}"
end
format(
CONFIG_ROUTE_PATTERN,
host: remote_config_host.chomp('/'),
project_id: @project_id,
)
end
# @return [Boolean] whether error notifications are enabled
def error_notifications?
return true unless (s = find_setting(SETTINGS[:errors]))
s['enabled']
end
# @return [Boolean] whether APM is enabled
def performance_stats?
return true unless (s = find_setting(SETTINGS[:apm]))
s['enabled']
end
# @return [String, nil] the host, which provides the API endpoint to which
# exceptions should be sent
def error_host
return unless (s = find_setting(SETTINGS[:errors]))
s['endpoint']
end
# @return [String, nil] the host, which provides the API endpoint to which
# APM data should be sent
def apm_host
return unless (s = find_setting(SETTINGS[:apm]))
s['endpoint']
end
# @return [Hash{String=>Object}] raw representation of JSON payload
def to_h
@data.dup
end
private
def find_setting(name)
return unless @data.key?('settings')
@data['settings'].find { |s| s['name'] == name }
end
end
end
end