apisonator 2.100.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
|