apisonator 2.100.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/CHANGELOG.md +317 -0
- data/Gemfile +11 -0
- data/Gemfile.base +65 -0
- data/Gemfile.lock +319 -0
- data/Gemfile.on_prem +1 -0
- data/Gemfile.on_prem.lock +297 -0
- data/LICENSE +202 -0
- data/NOTICE +15 -0
- data/README.md +230 -0
- data/Rakefile +287 -0
- data/apisonator.gemspec +47 -0
- data/app/api/api.rb +13 -0
- data/app/api/internal/alert_limits.rb +32 -0
- data/app/api/internal/application_keys.rb +49 -0
- data/app/api/internal/application_referrer_filters.rb +43 -0
- data/app/api/internal/applications.rb +77 -0
- data/app/api/internal/errors.rb +54 -0
- data/app/api/internal/events.rb +42 -0
- data/app/api/internal/internal.rb +104 -0
- data/app/api/internal/metrics.rb +40 -0
- data/app/api/internal/service_tokens.rb +46 -0
- data/app/api/internal/services.rb +58 -0
- data/app/api/internal/stats.rb +42 -0
- data/app/api/internal/usagelimits.rb +62 -0
- data/app/api/internal/utilization.rb +23 -0
- data/bin/3scale_backend +223 -0
- data/bin/3scale_backend_worker +26 -0
- data/config.ru +4 -0
- data/config/puma.rb +192 -0
- data/config/schedule.rb +9 -0
- data/ext/mkrf_conf.rb +64 -0
- data/lib/3scale/backend.rb +67 -0
- data/lib/3scale/backend/alert_limit.rb +56 -0
- data/lib/3scale/backend/alerts.rb +137 -0
- data/lib/3scale/backend/analytics/kinesis.rb +3 -0
- data/lib/3scale/backend/analytics/kinesis/adapter.rb +180 -0
- data/lib/3scale/backend/analytics/kinesis/exporter.rb +86 -0
- data/lib/3scale/backend/analytics/kinesis/job.rb +135 -0
- data/lib/3scale/backend/analytics/redshift.rb +3 -0
- data/lib/3scale/backend/analytics/redshift/adapter.rb +367 -0
- data/lib/3scale/backend/analytics/redshift/importer.rb +83 -0
- data/lib/3scale/backend/analytics/redshift/job.rb +33 -0
- data/lib/3scale/backend/application.rb +330 -0
- data/lib/3scale/backend/application_events.rb +76 -0
- data/lib/3scale/backend/background_job.rb +65 -0
- data/lib/3scale/backend/configurable.rb +20 -0
- data/lib/3scale/backend/configuration.rb +151 -0
- data/lib/3scale/backend/configuration/loader.rb +42 -0
- data/lib/3scale/backend/constants.rb +19 -0
- data/lib/3scale/backend/cors.rb +84 -0
- data/lib/3scale/backend/distributed_lock.rb +67 -0
- data/lib/3scale/backend/environment.rb +21 -0
- data/lib/3scale/backend/error_storage.rb +52 -0
- data/lib/3scale/backend/errors.rb +343 -0
- data/lib/3scale/backend/event_storage.rb +120 -0
- data/lib/3scale/backend/experiment.rb +84 -0
- data/lib/3scale/backend/extensions.rb +5 -0
- data/lib/3scale/backend/extensions/array.rb +19 -0
- data/lib/3scale/backend/extensions/hash.rb +26 -0
- data/lib/3scale/backend/extensions/nil_class.rb +13 -0
- data/lib/3scale/backend/extensions/redis.rb +44 -0
- data/lib/3scale/backend/extensions/string.rb +13 -0
- data/lib/3scale/backend/extensions/time.rb +110 -0
- data/lib/3scale/backend/failed_jobs_scheduler.rb +141 -0
- data/lib/3scale/backend/job_fetcher.rb +122 -0
- data/lib/3scale/backend/listener.rb +728 -0
- data/lib/3scale/backend/listener_metrics.rb +99 -0
- data/lib/3scale/backend/logging.rb +48 -0
- data/lib/3scale/backend/logging/external.rb +44 -0
- data/lib/3scale/backend/logging/external/impl.rb +93 -0
- data/lib/3scale/backend/logging/external/impl/airbrake.rb +66 -0
- data/lib/3scale/backend/logging/external/impl/bugsnag.rb +69 -0
- data/lib/3scale/backend/logging/external/impl/default.rb +18 -0
- data/lib/3scale/backend/logging/external/resque.rb +57 -0
- data/lib/3scale/backend/logging/logger.rb +18 -0
- data/lib/3scale/backend/logging/middleware.rb +62 -0
- data/lib/3scale/backend/logging/middleware/json_writer.rb +21 -0
- data/lib/3scale/backend/logging/middleware/text_writer.rb +60 -0
- data/lib/3scale/backend/logging/middleware/writer.rb +143 -0
- data/lib/3scale/backend/logging/worker.rb +107 -0
- data/lib/3scale/backend/manifest.rb +80 -0
- data/lib/3scale/backend/memoizer.rb +277 -0
- data/lib/3scale/backend/metric.rb +275 -0
- data/lib/3scale/backend/metric/collection.rb +91 -0
- data/lib/3scale/backend/oauth.rb +4 -0
- data/lib/3scale/backend/oauth/token.rb +26 -0
- data/lib/3scale/backend/oauth/token_key.rb +30 -0
- data/lib/3scale/backend/oauth/token_storage.rb +313 -0
- data/lib/3scale/backend/oauth/token_value.rb +25 -0
- data/lib/3scale/backend/period.rb +3 -0
- data/lib/3scale/backend/period/boundary.rb +107 -0
- data/lib/3scale/backend/period/cache.rb +28 -0
- data/lib/3scale/backend/period/period.rb +402 -0
- data/lib/3scale/backend/queue_storage.rb +16 -0
- data/lib/3scale/backend/rack.rb +49 -0
- data/lib/3scale/backend/rack/exception_catcher.rb +136 -0
- data/lib/3scale/backend/rack/internal_error_catcher.rb +23 -0
- data/lib/3scale/backend/rack/prometheus.rb +19 -0
- data/lib/3scale/backend/saas.rb +6 -0
- data/lib/3scale/backend/saas_analytics.rb +4 -0
- data/lib/3scale/backend/server.rb +30 -0
- data/lib/3scale/backend/server/falcon.rb +52 -0
- data/lib/3scale/backend/server/puma.rb +71 -0
- data/lib/3scale/backend/service.rb +317 -0
- data/lib/3scale/backend/service_token.rb +97 -0
- data/lib/3scale/backend/stats.rb +8 -0
- data/lib/3scale/backend/stats/aggregator.rb +170 -0
- data/lib/3scale/backend/stats/aggregators/base.rb +72 -0
- data/lib/3scale/backend/stats/aggregators/response_code.rb +58 -0
- data/lib/3scale/backend/stats/aggregators/usage.rb +34 -0
- data/lib/3scale/backend/stats/bucket_reader.rb +135 -0
- data/lib/3scale/backend/stats/bucket_storage.rb +108 -0
- data/lib/3scale/backend/stats/cleaner.rb +195 -0
- data/lib/3scale/backend/stats/codes_commons.rb +14 -0
- data/lib/3scale/backend/stats/delete_job_def.rb +60 -0
- data/lib/3scale/backend/stats/key_generator.rb +73 -0
- data/lib/3scale/backend/stats/keys.rb +104 -0
- data/lib/3scale/backend/stats/partition_eraser_job.rb +58 -0
- data/lib/3scale/backend/stats/partition_generator_job.rb +46 -0
- data/lib/3scale/backend/stats/period_commons.rb +34 -0
- data/lib/3scale/backend/stats/stats_parser.rb +141 -0
- data/lib/3scale/backend/stats/storage.rb +113 -0
- data/lib/3scale/backend/statsd.rb +14 -0
- data/lib/3scale/backend/storable.rb +35 -0
- data/lib/3scale/backend/storage.rb +40 -0
- data/lib/3scale/backend/storage_async.rb +4 -0
- data/lib/3scale/backend/storage_async/async_redis.rb +21 -0
- data/lib/3scale/backend/storage_async/client.rb +205 -0
- data/lib/3scale/backend/storage_async/pipeline.rb +79 -0
- data/lib/3scale/backend/storage_async/resque_extensions.rb +30 -0
- data/lib/3scale/backend/storage_helpers.rb +278 -0
- data/lib/3scale/backend/storage_key_helpers.rb +9 -0
- data/lib/3scale/backend/storage_sync.rb +43 -0
- data/lib/3scale/backend/transaction.rb +62 -0
- data/lib/3scale/backend/transactor.rb +177 -0
- data/lib/3scale/backend/transactor/limit_headers.rb +54 -0
- data/lib/3scale/backend/transactor/notify_batcher.rb +139 -0
- data/lib/3scale/backend/transactor/notify_job.rb +47 -0
- data/lib/3scale/backend/transactor/process_job.rb +33 -0
- data/lib/3scale/backend/transactor/report_job.rb +84 -0
- data/lib/3scale/backend/transactor/status.rb +236 -0
- data/lib/3scale/backend/transactor/usage_report.rb +182 -0
- data/lib/3scale/backend/usage.rb +63 -0
- data/lib/3scale/backend/usage_limit.rb +115 -0
- data/lib/3scale/backend/use_cases/provider_key_change_use_case.rb +60 -0
- data/lib/3scale/backend/util.rb +17 -0
- data/lib/3scale/backend/validators.rb +26 -0
- data/lib/3scale/backend/validators/base.rb +36 -0
- data/lib/3scale/backend/validators/key.rb +17 -0
- data/lib/3scale/backend/validators/limits.rb +57 -0
- data/lib/3scale/backend/validators/oauth_key.rb +15 -0
- data/lib/3scale/backend/validators/oauth_setting.rb +15 -0
- data/lib/3scale/backend/validators/redirect_uri.rb +33 -0
- data/lib/3scale/backend/validators/referrer.rb +60 -0
- data/lib/3scale/backend/validators/service_state.rb +15 -0
- data/lib/3scale/backend/validators/state.rb +15 -0
- data/lib/3scale/backend/version.rb +5 -0
- data/lib/3scale/backend/views/oauth_access_tokens.builder +14 -0
- data/lib/3scale/backend/views/oauth_app_id_by_token.builder +4 -0
- data/lib/3scale/backend/worker.rb +87 -0
- data/lib/3scale/backend/worker_async.rb +88 -0
- data/lib/3scale/backend/worker_metrics.rb +44 -0
- data/lib/3scale/backend/worker_sync.rb +32 -0
- data/lib/3scale/bundler_shim.rb +17 -0
- data/lib/3scale/prometheus_server.rb +10 -0
- data/lib/3scale/tasks/connectivity.rake +41 -0
- data/lib/3scale/tasks/helpers.rb +3 -0
- data/lib/3scale/tasks/helpers/environment.rb +23 -0
- data/lib/3scale/tasks/stats.rake +131 -0
- data/lib/3scale/tasks/swagger.rake +46 -0
- data/licenses.xml +1215 -0
- metadata +227 -0
@@ -0,0 +1,60 @@
|
|
1
|
+
module ThreeScale
|
2
|
+
module Backend
|
3
|
+
module Validators
|
4
|
+
class Referrer < Base
|
5
|
+
|
6
|
+
# There are some users that depend on a previous version of the
|
7
|
+
# pattern_matches? method. We make this configurable to avoid breaking
|
8
|
+
# changes for those users.
|
9
|
+
|
10
|
+
class << self
|
11
|
+
def define_pattern_match(legacy)
|
12
|
+
class_eval do
|
13
|
+
if legacy
|
14
|
+
def pattern_matches?(pattern, value)
|
15
|
+
/#{pattern}/ =~ value
|
16
|
+
end
|
17
|
+
else
|
18
|
+
def pattern_matches?(pattern, value)
|
19
|
+
/\A#{pattern}\z/ =~ value
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
private :define_pattern_match
|
25
|
+
|
26
|
+
def behave_as_legacy(legacy)
|
27
|
+
# don't blow up if we still didn't define it
|
28
|
+
remove_method :pattern_matches? rescue NameError
|
29
|
+
define_pattern_match legacy
|
30
|
+
end
|
31
|
+
private :behave_as_legacy unless ThreeScale::Backend.test? # leave it public for tests
|
32
|
+
end
|
33
|
+
|
34
|
+
behave_as_legacy ThreeScale::Backend.configuration.legacy_referrer_filters
|
35
|
+
|
36
|
+
BYPASS = '*'.freeze
|
37
|
+
private_constant :BYPASS
|
38
|
+
|
39
|
+
def apply
|
40
|
+
if service.referrer_filters_required? && application.has_referrer_filters?
|
41
|
+
if application.referrer_filters.any? { |filter| matches?(filter, params[:referrer]) }
|
42
|
+
succeed!
|
43
|
+
else
|
44
|
+
fail!(ReferrerNotAllowed.new(params[:referrer]))
|
45
|
+
end
|
46
|
+
else
|
47
|
+
succeed!
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
private
|
52
|
+
|
53
|
+
def matches?(pattern, value)
|
54
|
+
return true if value == BYPASS
|
55
|
+
pattern_matches?(Regexp.escape(pattern).gsub('\*', '.*'), value)
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
xml.instruct!
|
2
|
+
xml.oauth_access_tokens do
|
3
|
+
@tokens.each do |t|
|
4
|
+
# Some bright head leaked the -1 that Redis uses to indicate there is no TTL
|
5
|
+
# associated with a key. The behaviour is inconsistent because somehow we
|
6
|
+
# BOTH expect that a token with no TTL does not have a "ttl" attribute in
|
7
|
+
# the generated XML and at the same time we expect (in some tests) that such
|
8
|
+
# tokens have this field with a -1 value.
|
9
|
+
#
|
10
|
+
# Just enforce the ttl to be -1 when there is none.
|
11
|
+
attrs = { :ttl => t.ttl || -1 }
|
12
|
+
xml.oauth_access_token t.token, attrs
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,87 @@
|
|
1
|
+
require '3scale/backend/configuration'
|
2
|
+
require '3scale/backend/logging/worker'
|
3
|
+
require '3scale/backend/logging/external'
|
4
|
+
|
5
|
+
module ThreeScale
|
6
|
+
module Backend
|
7
|
+
# Worker for working off background jobs. This is very stripped down version of the
|
8
|
+
# default resque worker with parts of code shamelessly stolen from it. The reason for
|
9
|
+
# this stripping is that the resque one does fork before processing each job, and that
|
10
|
+
# is too slow.
|
11
|
+
|
12
|
+
# This is a module that's meant to be included from the different workers.
|
13
|
+
# Now we have WorkerSync and WorkerAsync. Those classes need to implement
|
14
|
+
# #work, which is responsible for fetching jobs from the queue and running
|
15
|
+
# them by calling perform(job).
|
16
|
+
module Worker
|
17
|
+
include Resque::Helpers
|
18
|
+
include Configurable
|
19
|
+
|
20
|
+
def self.new(options = {})
|
21
|
+
Logging::Worker.configure_logging(self, options[:log_file])
|
22
|
+
Logging::External.setup_worker
|
23
|
+
|
24
|
+
if configuration.worker_prometheus_metrics.enabled
|
25
|
+
require '3scale/backend/worker_metrics'
|
26
|
+
WorkerMetrics.start_metrics_server
|
27
|
+
end
|
28
|
+
|
29
|
+
if options[:async]
|
30
|
+
# Conditional require is done to require async-* libs only when
|
31
|
+
# needed and avoid possible side-effects.
|
32
|
+
require '3scale/backend/worker_async'
|
33
|
+
WorkerAsync.new(options)
|
34
|
+
else
|
35
|
+
require '3scale/backend/worker_sync'
|
36
|
+
WorkerSync.new(options)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
# == Options
|
41
|
+
#
|
42
|
+
# - :one_off - if true, will process one job, then quit
|
43
|
+
#
|
44
|
+
def self.work(options = {})
|
45
|
+
Process.setproctitle("3scale_backend_worker #{Backend::VERSION}")
|
46
|
+
options[:async] = configuration.redis.async
|
47
|
+
new(options).work
|
48
|
+
end
|
49
|
+
|
50
|
+
def work
|
51
|
+
raise 'Missing implementation of #work'
|
52
|
+
end
|
53
|
+
|
54
|
+
def shutdown
|
55
|
+
@shutdown = true
|
56
|
+
end
|
57
|
+
|
58
|
+
def to_s
|
59
|
+
@to_s ||= "#{hostname}:#{Process.pid}"
|
60
|
+
end
|
61
|
+
|
62
|
+
def one_off?
|
63
|
+
@one_off
|
64
|
+
end
|
65
|
+
|
66
|
+
private
|
67
|
+
|
68
|
+
def perform(job)
|
69
|
+
job.perform
|
70
|
+
rescue Exception => e
|
71
|
+
job.fail(e)
|
72
|
+
end
|
73
|
+
|
74
|
+
def register_worker
|
75
|
+
redis.sadd(:workers, self)
|
76
|
+
end
|
77
|
+
|
78
|
+
def unregister_worker
|
79
|
+
redis.srem(:workers, self)
|
80
|
+
end
|
81
|
+
|
82
|
+
def hostname
|
83
|
+
@hostname ||= (ENV['HOSTNAME'] || `hostname`.chomp)
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
@@ -0,0 +1,88 @@
|
|
1
|
+
require 'async'
|
2
|
+
require '3scale/backend/job_fetcher'
|
3
|
+
|
4
|
+
module ThreeScale
|
5
|
+
module Backend
|
6
|
+
class WorkerAsync
|
7
|
+
include Backend::Worker
|
8
|
+
include Configurable
|
9
|
+
|
10
|
+
DEFAULT_MAX_CONCURRENT_JOBS = 20
|
11
|
+
private_constant :DEFAULT_MAX_CONCURRENT_JOBS
|
12
|
+
|
13
|
+
def initialize(options = {})
|
14
|
+
trap('TERM') { shutdown }
|
15
|
+
trap('INT') { shutdown }
|
16
|
+
|
17
|
+
@one_off = options[:one_off]
|
18
|
+
@jobs = Queue.new # Thread-safe queue
|
19
|
+
|
20
|
+
@job_fetcher = options[:job_fetcher] || JobFetcher.new
|
21
|
+
|
22
|
+
@max_concurrent_jobs = configuration.async_worker.max_concurrent_jobs ||
|
23
|
+
DEFAULT_MAX_CONCURRENT_JOBS
|
24
|
+
|
25
|
+
@reactor = Async::Reactor.new
|
26
|
+
end
|
27
|
+
|
28
|
+
def work
|
29
|
+
if one_off?
|
30
|
+
Async { process_one }
|
31
|
+
return
|
32
|
+
end
|
33
|
+
|
34
|
+
Async { register_worker }
|
35
|
+
|
36
|
+
fetch_jobs_thread = start_thread_to_fetch_jobs
|
37
|
+
|
38
|
+
loop do
|
39
|
+
break if @shutdown
|
40
|
+
schedule_jobs
|
41
|
+
@reactor.run
|
42
|
+
end
|
43
|
+
|
44
|
+
fetch_jobs_thread.join
|
45
|
+
|
46
|
+
# Ensure that we do not leave any jobs in memory
|
47
|
+
@reactor.async { perform(@jobs.pop) } until @jobs.empty?
|
48
|
+
@reactor.run
|
49
|
+
|
50
|
+
Async { unregister_worker }
|
51
|
+
end
|
52
|
+
|
53
|
+
def shutdown
|
54
|
+
@job_fetcher.shutdown
|
55
|
+
@shutdown = true
|
56
|
+
end
|
57
|
+
|
58
|
+
private
|
59
|
+
|
60
|
+
def schedule_jobs
|
61
|
+
scheduled = 0
|
62
|
+
|
63
|
+
loop do
|
64
|
+
# unblocks when there are new jobs or when .close() is called
|
65
|
+
job = @jobs.pop
|
66
|
+
|
67
|
+
break if @shutdown
|
68
|
+
|
69
|
+
@reactor.async { perform(job) }
|
70
|
+
scheduled += 1
|
71
|
+
|
72
|
+
break if @jobs.empty? or scheduled >= @max_concurrent_jobs
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
def process_one
|
77
|
+
job = @job_fetcher.fetch
|
78
|
+
perform(job) if job
|
79
|
+
end
|
80
|
+
|
81
|
+
def start_thread_to_fetch_jobs
|
82
|
+
Thread.new do
|
83
|
+
Async { @job_fetcher.start(@jobs) }
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
require 'yabeda/prometheus'
|
2
|
+
|
3
|
+
Yabeda.configure do
|
4
|
+
group :apisonator_worker do
|
5
|
+
counter :job_count do
|
6
|
+
comment "Total number of jobs processed"
|
7
|
+
tags %i[type]
|
8
|
+
end
|
9
|
+
|
10
|
+
histogram :job_runtime do
|
11
|
+
comment "How long jobs take to run"
|
12
|
+
unit :seconds
|
13
|
+
tags %i[type]
|
14
|
+
buckets [0.005, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1]
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
Yabeda.configure!
|
19
|
+
|
20
|
+
module ThreeScale
|
21
|
+
module Backend
|
22
|
+
class WorkerMetrics
|
23
|
+
include Configurable
|
24
|
+
|
25
|
+
def self.start_metrics_server
|
26
|
+
# Yabeda does not accept the port as a param
|
27
|
+
port = configuration.worker_prometheus_metrics.port
|
28
|
+
ENV['PROMETHEUS_EXPORTER_PORT'] = port.to_s if port
|
29
|
+
|
30
|
+
Yabeda::Prometheus::Exporter.start_metrics_server!
|
31
|
+
end
|
32
|
+
|
33
|
+
def self.increase_job_count(job_class_name)
|
34
|
+
Yabeda.apisonator_worker.job_count.increment(
|
35
|
+
{ type: job_class_name }, by: 1
|
36
|
+
)
|
37
|
+
end
|
38
|
+
|
39
|
+
def self.report_runtime(job_class_name, runtime)
|
40
|
+
Yabeda.apisonator_worker.job_runtime.measure({ type: job_class_name }, runtime)
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
require '3scale/backend/job_fetcher'
|
2
|
+
|
3
|
+
module ThreeScale
|
4
|
+
module Backend
|
5
|
+
class WorkerSync
|
6
|
+
include Backend::Worker
|
7
|
+
|
8
|
+
def initialize(options = {})
|
9
|
+
trap('TERM') { shutdown }
|
10
|
+
trap('INT') { shutdown }
|
11
|
+
|
12
|
+
@one_off = options[:one_off]
|
13
|
+
@job_fetcher = options[:job_fetcher] || JobFetcher.new
|
14
|
+
end
|
15
|
+
|
16
|
+
def work
|
17
|
+
register_worker
|
18
|
+
|
19
|
+
loop do
|
20
|
+
break if @shutdown
|
21
|
+
|
22
|
+
job = @job_fetcher.fetch
|
23
|
+
perform(job) if job
|
24
|
+
|
25
|
+
break if one_off?
|
26
|
+
end
|
27
|
+
|
28
|
+
unregister_worker
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
# Setup bundler if present before anything else.
|
2
|
+
#
|
3
|
+
# We are not guaranteed to be running in a Bundler context, so make sure we get
|
4
|
+
# the correct environment set up to require the correct code.
|
5
|
+
begin
|
6
|
+
require 'bundler/setup'
|
7
|
+
if !Bundler::SharedHelpers.in_bundle?
|
8
|
+
# Gemfile not found, try with relative Gemfile from us
|
9
|
+
require 'pathname'
|
10
|
+
ENV['BUNDLE_GEMFILE'] = File.expand_path(File.join('..', '..', '..', 'Gemfile'),
|
11
|
+
Pathname.new(__FILE__).realpath)
|
12
|
+
require 'bundler'
|
13
|
+
Bundler.setup
|
14
|
+
end
|
15
|
+
rescue LoadError, Bundler::BundlerError => e
|
16
|
+
STDERR.puts "CRITICAL: Bundler could not be loaded properly - #{e.message}"
|
17
|
+
end
|
@@ -0,0 +1,10 @@
|
|
1
|
+
# When required, starts the prometheus metrics server for the listener if the
|
2
|
+
# CONFIG_LISTENER_PROMETHEUS_METRICS_ENABLED env is set to true.
|
3
|
+
|
4
|
+
require_relative '../3scale/backend/listener_metrics'
|
5
|
+
|
6
|
+
# Config is not loaded at this point, so read ENV instead.
|
7
|
+
if ENV['CONFIG_LISTENER_PROMETHEUS_METRICS_ENABLED'].to_s == 'true'
|
8
|
+
prometheus_port = ENV['CONFIG_LISTENER_PROMETHEUS_METRICS_PORT']
|
9
|
+
ThreeScale::Backend::ListenerMetrics.start_metrics_server(prometheus_port)
|
10
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
namespace :connectivity do
|
2
|
+
desc 'Check connectivity of Redis Storage'
|
3
|
+
task :redis_storage_check do
|
4
|
+
redis_instance = ThreeScale::Backend::Storage.instance
|
5
|
+
|
6
|
+
if Environment.using_async_redis?
|
7
|
+
async_ping(redis_instance, 'storage')
|
8
|
+
else
|
9
|
+
ping(redis_instance, 'storage')
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
desc 'Check connectivity of Redis Queue Storage'
|
14
|
+
task :redis_storage_queue_check do
|
15
|
+
redis_instance = ThreeScale::Backend::QueueStorage.connection(
|
16
|
+
ThreeScale::Backend.environment,
|
17
|
+
ThreeScale::Backend.configuration,
|
18
|
+
)
|
19
|
+
|
20
|
+
if Environment.using_async_redis?
|
21
|
+
async_ping(redis_instance, 'queue storage')
|
22
|
+
else
|
23
|
+
ping(redis_instance, 'queue storage')
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
private
|
28
|
+
|
29
|
+
def async_ping(redis_instance, storage_type)
|
30
|
+
Async { ping(redis_instance, storage_type) }
|
31
|
+
end
|
32
|
+
|
33
|
+
def ping(redis_instance, storage_type)
|
34
|
+
redis_instance.ping
|
35
|
+
rescue => e
|
36
|
+
warn "Error connecting to Redis #{storage_type}: #{e}"
|
37
|
+
exit(false)
|
38
|
+
else
|
39
|
+
puts "Connection to Redis #{storage_type} performed successfully"
|
40
|
+
end
|
41
|
+
end
|