zuora_connectD 1.7.09
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/MIT-LICENSE +20 -0
- data/Rakefile +38 -0
- data/app/assets/javascripts/zuora_connect/api/v1/app_instance.js +2 -0
- data/app/assets/javascripts/zuora_connect/application.js +13 -0
- data/app/assets/stylesheets/zuora_connect/api/v1/app_instance.css +4 -0
- data/app/assets/stylesheets/zuora_connect/application.css +15 -0
- data/app/controllers/zuora_connect/admin/tenant_controller.rb +11 -0
- data/app/controllers/zuora_connect/api/v1/app_instance_controller.rb +45 -0
- data/app/controllers/zuora_connect/application_controller.rb +8 -0
- data/app/controllers/zuora_connect/static_controller.rb +32 -0
- data/app/helpers/zuora_connect/api/v1/app_instance_helper.rb +4 -0
- data/app/helpers/zuora_connect/application_helper.rb +5 -0
- data/app/models/zuora_connect/app_instance.rb +5 -0
- data/app/models/zuora_connect/app_instance_base.rb +811 -0
- data/app/models/zuora_connect/login.rb +36 -0
- data/app/models/zuora_connect/telegraf.rb +88 -0
- data/app/views/layouts/zuora_connect/application.html.erb +14 -0
- data/app/views/sql/refresh_aggregate_table.txt +84 -0
- data/app/views/zuora_connect/static/invalid_app_instance_error.html.erb +65 -0
- data/app/views/zuora_connect/static/session_error.html.erb +63 -0
- data/config/initializers/apartment.rb +95 -0
- data/config/initializers/object_method_hooks.rb +27 -0
- data/config/initializers/postgresql_adapter.rb +32 -0
- data/config/initializers/prometheus.rb +41 -0
- data/config/initializers/redis.rb +10 -0
- data/config/initializers/resque.rb +6 -0
- data/config/initializers/to_bool.rb +24 -0
- data/config/initializers/unicorn.rb +9 -0
- data/config/routes.rb +13 -0
- data/db/migrate/20100718151733_create_connect_app_instances.rb +9 -0
- data/db/migrate/20101024162319_add_tokens_to_app_instance.rb +6 -0
- data/db/migrate/20101024220705_add_token_to_app_instance.rb +5 -0
- data/db/migrate/20110131211919_add_sessions_table.rb +13 -0
- data/db/migrate/20110411200303_add_expiration_to_app_instance.rb +5 -0
- data/db/migrate/20110413191512_add_new_api_token.rb +5 -0
- data/db/migrate/20110503003602_add_catalog_data_to_app_instance.rb +6 -0
- data/db/migrate/20110503003603_add_catalog_mappings_to_app_instance.rb +5 -0
- data/db/migrate/20110503003604_catalog_default.rb +5 -0
- data/db/migrate/20180301052853_add_catalog_attempted_at.rb +5 -0
- data/lib/metrics/influx/point_value.rb +79 -0
- data/lib/metrics/net.rb +218 -0
- data/lib/middleware/metrics_middleware.rb +110 -0
- data/lib/resque/additions.rb +53 -0
- data/lib/resque/dynamic_queues.rb +142 -0
- data/lib/resque/self_lookup.rb +19 -0
- data/lib/resque/silence_done.rb +71 -0
- data/lib/tasks/zuora_connect_tasks.rake +24 -0
- data/lib/zuora_connectD.rb +41 -0
- data/lib/zuora_connectD/configuration.rb +52 -0
- data/lib/zuora_connectD/controllers/helpers.rb +165 -0
- data/lib/zuora_connectD/engine.rb +30 -0
- data/lib/zuora_connectD/exceptions.rb +67 -0
- data/lib/zuora_connectD/railtie.rb +59 -0
- data/lib/zuora_connectD/version.rb +3 -0
- data/lib/zuora_connectD/views/helpers.rb +9 -0
- data/test/controllers/zuora_connect/api/v1/app_instance_controller_test.rb +13 -0
- data/test/dummy/README.rdoc +28 -0
- data/test/dummy/Rakefile +6 -0
- data/test/dummy/app/assets/javascripts/application.js +13 -0
- data/test/dummy/app/assets/stylesheets/application.css +15 -0
- data/test/dummy/app/controllers/application_controller.rb +5 -0
- data/test/dummy/app/helpers/application_helper.rb +2 -0
- data/test/dummy/app/views/layouts/application.html.erb +14 -0
- data/test/dummy/bin/bundle +3 -0
- data/test/dummy/bin/rails +4 -0
- data/test/dummy/bin/rake +4 -0
- data/test/dummy/bin/setup +29 -0
- data/test/dummy/config.ru +4 -0
- data/test/dummy/config/application.rb +26 -0
- data/test/dummy/config/boot.rb +5 -0
- data/test/dummy/config/database.yml +25 -0
- data/test/dummy/config/environment.rb +5 -0
- data/test/dummy/config/environments/development.rb +41 -0
- data/test/dummy/config/environments/production.rb +79 -0
- data/test/dummy/config/environments/test.rb +42 -0
- data/test/dummy/config/initializers/assets.rb +11 -0
- data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
- data/test/dummy/config/initializers/cookies_serializer.rb +3 -0
- data/test/dummy/config/initializers/filter_parameter_logging.rb +4 -0
- data/test/dummy/config/initializers/inflections.rb +16 -0
- data/test/dummy/config/initializers/mime_types.rb +4 -0
- data/test/dummy/config/initializers/session_store.rb +3 -0
- data/test/dummy/config/initializers/wrap_parameters.rb +14 -0
- data/test/dummy/config/locales/en.yml +23 -0
- data/test/dummy/config/routes.rb +4 -0
- data/test/dummy/config/secrets.yml +22 -0
- data/test/dummy/db/development.sqlite3 +0 -0
- data/test/dummy/db/test.sqlite3 +0 -0
- data/test/dummy/log/development.log +2 -0
- data/test/dummy/log/test.log +0 -0
- data/test/dummy/public/404.html +67 -0
- data/test/dummy/public/422.html +67 -0
- data/test/dummy/public/500.html +66 -0
- data/test/dummy/public/favicon.ico +0 -0
- data/test/fixtures/zuora_connect/app_instances.yml +11 -0
- data/test/integration/navigation_test.rb +8 -0
- data/test/lib/generators/zuora_connect/datatable_generator_test.rb +16 -0
- data/test/models/zuora_connect/app_instance_test.rb +9 -0
- data/test/test_helper.rb +21 -0
- data/test/zuora_connect_test.rb +7 -0
- metadata +416 -0
@@ -0,0 +1,110 @@
|
|
1
|
+
module Middleware
|
2
|
+
require 'uri'
|
3
|
+
|
4
|
+
# Object of this class is passed to the ActiveSupport::Notification hook
|
5
|
+
class PageRequest
|
6
|
+
|
7
|
+
# This method is triggered when a non error page is loaded (not 404)
|
8
|
+
def call(name, started, finished, unique_id, payload)
|
9
|
+
# If the url contains any css or JavaScript files then do not collect metrics for them
|
10
|
+
return nil if ["css", "assets", "jpg", "png", "jpeg", "ico"].any? { |word| payload[:path].include?(word) }
|
11
|
+
|
12
|
+
# Getting the endpoint and the content_type
|
13
|
+
content_hash = {:html => "text/html", :js => "application/javascript", :json => "application/json"}
|
14
|
+
content_type = content_hash.key?(payload[:format]) ? content_hash[payload[:format]] : payload[:format]
|
15
|
+
content_type = content_type.gsub('text/javascript', 'application/javascript')
|
16
|
+
|
17
|
+
# payloads with 500 requests do not have status as it is not set by the controller
|
18
|
+
# https://github.com/rails/rails/issues/33335
|
19
|
+
#status_code = payload[:status] ? payload[:status] : payload[:exception_object].present? ? 500 : ""
|
20
|
+
if payload[:exception].present?
|
21
|
+
status_code, exception = [500, payload[:exception].first]
|
22
|
+
else
|
23
|
+
status_code, exception = [payload[:status], nil]
|
24
|
+
end
|
25
|
+
|
26
|
+
tags = {method: payload[:method], status: status_code, error_type: exception, content_type: content_type, controller: payload[:controller], action: payload[:action]}.compact
|
27
|
+
|
28
|
+
values = {view_time: payload[:view_runtime], db_time: payload[:db_runtime], response_time: ((finished-started)*1000)}.compact
|
29
|
+
values = values.map{ |k,v| [k,v.round(2)]}.to_h
|
30
|
+
|
31
|
+
ZuoraConnect::AppInstanceBase.write_to_telegraf(direction: :inbound, tags: tags, values: values)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
class MetricsMiddleware
|
36
|
+
|
37
|
+
require "zuora_connectD/version"
|
38
|
+
require "zuora_apiD/version"
|
39
|
+
|
40
|
+
def initialize(app)
|
41
|
+
@app = app
|
42
|
+
end
|
43
|
+
|
44
|
+
def call(env)
|
45
|
+
start_time = Time.now
|
46
|
+
@status, @headers, @response = @app.call(env)
|
47
|
+
|
48
|
+
# If the url contains any CSS or JavaScript files then do not collect metrics for them
|
49
|
+
if ["css", "assets", "jpg", "png", "jpeg", "ico"].any? { |word| env['PATH_INFO'].include?(word) } || /.*\.js$/.match(env['PATH_INFO'])
|
50
|
+
tags = {status: @status, controller: 'ActionController', action: 'Assets', app_instance: 0}
|
51
|
+
values = {response_time: ((Time.now - start_time)*1000).round(2) }
|
52
|
+
ZuoraConnect::AppInstanceBase.write_to_telegraf(direction: 'request-inbound-assets', tags: tags, values: values)
|
53
|
+
end
|
54
|
+
|
55
|
+
if defined? Prometheus
|
56
|
+
#Prometheus Stuff
|
57
|
+
if env['PATH_INFO'] == '/connect/internal/metrics'
|
58
|
+
|
59
|
+
#Do something before each scrape
|
60
|
+
if defined? Resque.redis
|
61
|
+
|
62
|
+
app_name = ENV['DEIS_APP'].present? ? "#{ENV['DEIS_APP']}" : "#{Rails.application.class.parent_name}"
|
63
|
+
begin
|
64
|
+
|
65
|
+
Resque.redis.ping
|
66
|
+
|
67
|
+
Prometheus::REDIS_CONNECTION.set({connection:'redis',name:app_name},1)
|
68
|
+
Prometheus::FINISHED_JOBS.set({type:'resque',name:app_name},Resque.info[:processed])
|
69
|
+
Prometheus::PENDING_JOBS.set({type:'resque',name:app_name},Resque.info[:pending])
|
70
|
+
Prometheus::ACTIVE_WORKERS.set({type:'resque',name:app_name},Resque.info[:working])
|
71
|
+
Prometheus::WORKERS.set({type:'resque',name:app_name},Resque.info[:workers])
|
72
|
+
Prometheus::FAILED_JOBS.set({type:'resque',name:app_name},Resque.info[:failed])
|
73
|
+
|
74
|
+
rescue Redis::CannotConnectError
|
75
|
+
Prometheus::REDIS_CONNECTION.set({connection:'redis',name:app_name},0)
|
76
|
+
end
|
77
|
+
|
78
|
+
if ZuoraConnect.configuration.custom_prometheus_update_block != nil
|
79
|
+
ZuoraConnect.configuration.custom_prometheus_update_block.call()
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
# Uncomment following block of code for handling engine requests/requests without controller
|
87
|
+
# else
|
88
|
+
# # Handling requests which do not have controllers (engines)
|
89
|
+
if env["SCRIPT_NAME"].present?
|
90
|
+
controller_path = "#{env['SCRIPT_NAME'][1..-1]}"
|
91
|
+
controller_path = controller_path.sub("/", "::")
|
92
|
+
request_path = "#{controller_path}#UnknownAction"
|
93
|
+
else
|
94
|
+
# Writing to telegraf: Handle 404
|
95
|
+
if [404].include?(@status)
|
96
|
+
content_type = @headers['Content-Type'].split(';')[0] if @headers['Content-Type']
|
97
|
+
content_type = content_type.gsub('text/javascript', 'application/javascript')
|
98
|
+
tags = {status: @status, content_type: content_type}
|
99
|
+
|
100
|
+
tags = tags.merge({controller: 'ActionController', action: 'RoutingError' })
|
101
|
+
|
102
|
+
values = {response_time: ((Time.now - start_time)*1000).round(2) }
|
103
|
+
|
104
|
+
ZuoraConnect::AppInstanceBase.write_to_telegraf(direction: :inbound, tags: tags, values: values)
|
105
|
+
end
|
106
|
+
end
|
107
|
+
[@status, @headers, @response]
|
108
|
+
end
|
109
|
+
end
|
110
|
+
end
|
@@ -0,0 +1,53 @@
|
|
1
|
+
module Resque
|
2
|
+
module Additions
|
3
|
+
def dequeue_from(queue, klass, *args)
|
4
|
+
####### ------ Resque Job --------
|
5
|
+
# Perform before_dequeue hooks. Don't perform dequeue if any hook returns false
|
6
|
+
before_hooks = Plugin.before_dequeue_hooks(klass).collect do |hook|
|
7
|
+
klass.send(hook, *args)
|
8
|
+
end
|
9
|
+
return if before_hooks.any? { |result| result == false }
|
10
|
+
|
11
|
+
destroyed = Job.destroy(queue, klass, *args)
|
12
|
+
|
13
|
+
Plugin.after_dequeue_hooks(klass).each do |hook|
|
14
|
+
klass.send(hook, *args)
|
15
|
+
end
|
16
|
+
|
17
|
+
destroyed
|
18
|
+
end
|
19
|
+
|
20
|
+
####### ------ Resque Delayed Job --------
|
21
|
+
# Returns delayed jobs schedule timestamp for +klass+, +args+.
|
22
|
+
def scheduled_at_with_queue(queue, klass, *args)
|
23
|
+
search = encode(job_to_hash_with_queue(queue,klass, args))
|
24
|
+
redis.smembers("timestamps:#{search}").map do |key|
|
25
|
+
key.tr('delayed:', '').to_i
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
# Given an encoded item, remove it from the delayed_queue
|
30
|
+
def remove_delayed_with_queue(queue, klass, *args)
|
31
|
+
search = encode(job_to_hash_with_queue(queue,klass, args))
|
32
|
+
remove_delayed_job(search)
|
33
|
+
end
|
34
|
+
|
35
|
+
#Given a timestamp and job (klass + args) it removes all instances and
|
36
|
+
# returns the count of jobs removed.
|
37
|
+
#
|
38
|
+
# O(N) where N is the number of jobs scheduled to fire at the given
|
39
|
+
# timestamp
|
40
|
+
def remove_delayed_job_with_queue_from_timestamp(timestamp, queue, klass, *args)
|
41
|
+
return 0 if Resque.inline?
|
42
|
+
|
43
|
+
key = "delayed:#{timestamp.to_i}"
|
44
|
+
encoded_job = encode(job_to_hash_with_queue(queue, klass, args))
|
45
|
+
|
46
|
+
redis.srem("timestamps:#{encoded_job}", key)
|
47
|
+
count = redis.lrem(key, 0, encoded_job)
|
48
|
+
clean_up_timestamp(key, timestamp)
|
49
|
+
|
50
|
+
count
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
@@ -0,0 +1,142 @@
|
|
1
|
+
module Resque
|
2
|
+
module DynamicQueues
|
3
|
+
def filter_busy_queues qs
|
4
|
+
busy_queues = Resque::Worker.working.map { |worker| worker.job["queue"] }.compact
|
5
|
+
Array(qs.dup).compact - busy_queues
|
6
|
+
end
|
7
|
+
|
8
|
+
def rotated_queues
|
9
|
+
@n ||= 0
|
10
|
+
@n += 1
|
11
|
+
rot_queues = queues # since we rely on the resque-dynamic-queues plugin, this is all the queues, expanded out
|
12
|
+
if rot_queues.size > 0
|
13
|
+
@n = @n % rot_queues.size
|
14
|
+
rot_queues.rotate(@n)
|
15
|
+
else
|
16
|
+
rot_queues
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def queue_depth queuename
|
21
|
+
busy_queues = Resque::Worker.working.map { |worker| worker.job["queue"] }.compact
|
22
|
+
# find the queuename, count it.
|
23
|
+
busy_queues.select {|q| q == queuename }.size
|
24
|
+
end
|
25
|
+
|
26
|
+
DEFAULT_QUEUE_DEPTH = 0
|
27
|
+
def should_work_on_queue? queuename
|
28
|
+
return true if @queues.include? '*' # workers with QUEUES=* are special and are not subject to queue depth setting
|
29
|
+
max = DEFAULT_QUEUE_DEPTH
|
30
|
+
unless ENV["RESQUE_QUEUE_DEPTH"].nil? || ENV["RESQUE_QUEUE_DEPTH"] == ""
|
31
|
+
max = ENV["RESQUE_QUEUE_DEPTH"].to_i
|
32
|
+
end
|
33
|
+
return true if max == 0 # 0 means no limiting
|
34
|
+
cur_depth = queue_depth(queuename)
|
35
|
+
log! "queue #{queuename} depth = #{cur_depth} max = #{max}"
|
36
|
+
return true if cur_depth < max
|
37
|
+
false
|
38
|
+
end
|
39
|
+
|
40
|
+
def reserve_with_round_robin
|
41
|
+
grouped_queues = queues.sort.group_by{|u| /(\d{1,20})_.*/.match(u) ? /(\d{1,20})_.*/.match(u).captures.first : nil}
|
42
|
+
|
43
|
+
#Instance queue grouping
|
44
|
+
if !grouped_queues.keys.include?(nil) && grouped_queues.keys.size > 0
|
45
|
+
@n ||= 0
|
46
|
+
@n += 1
|
47
|
+
@n = @n % grouped_queues.keys.size
|
48
|
+
|
49
|
+
grouped_queues.keys.rotate(@n).each do |key|
|
50
|
+
grouped_queues[key].each do |queue|
|
51
|
+
log! "Checking #{queue}"
|
52
|
+
if should_work_on_queue?(queue) && @job_in_progress = Resque::Job.reserve(queue)
|
53
|
+
log! "Found job on #{queue}"
|
54
|
+
return @job_in_progress
|
55
|
+
end
|
56
|
+
end
|
57
|
+
@n += 1 # Start the next search at the queue after the one from which we pick a job.
|
58
|
+
end
|
59
|
+
nil
|
60
|
+
else
|
61
|
+
return reserve_without_round_robin
|
62
|
+
end
|
63
|
+
|
64
|
+
rescue Exception => e
|
65
|
+
log "Error reserving job: #{e.inspect}"
|
66
|
+
log e.backtrace.join("\n")
|
67
|
+
raise e
|
68
|
+
end
|
69
|
+
|
70
|
+
# Returns a list of queues to use when searching for a job.
|
71
|
+
#
|
72
|
+
# A splat ("*") means you want every queue (in alpha order) - this
|
73
|
+
# can be useful for dynamically adding new queues.
|
74
|
+
#
|
75
|
+
# The splat can also be used as a wildcard within a queue name,
|
76
|
+
# e.g. "*high*", and negation can be indicated with a prefix of "!"
|
77
|
+
#
|
78
|
+
# An @key can be used to dynamically look up the queue list for key from redis.
|
79
|
+
# If no key is supplied, it defaults to the worker's hostname, and wildcards
|
80
|
+
# and negations can be used inside this dynamic queue list. Set the queue
|
81
|
+
# list for a key with Resque.set_dynamic_queue(key, ["q1", "q2"]
|
82
|
+
#
|
83
|
+
def queues_with_dynamic
|
84
|
+
queue_names = @queues.dup
|
85
|
+
|
86
|
+
return queues_without_dynamic if queue_names.grep(/(^!)|(^@)|(\*)/).size == 0
|
87
|
+
|
88
|
+
real_queues = Resque.queues
|
89
|
+
matched_queues = []
|
90
|
+
|
91
|
+
#Remove Queues under Api Limits
|
92
|
+
api_limit_instances = Redis.current.keys('APILimits:*').map {|key| key.split('APILimits:').last.to_i}
|
93
|
+
real_queues = real_queues.select {|key| key if !api_limit_instances.include?((key.match(/^(\d*)_.*/) || [])[1].to_i)} ## 2
|
94
|
+
|
95
|
+
#Queue Pausing
|
96
|
+
paused_instances = Redis.current.keys('resque:PauseQueue:*').map {|key| key.split('resque:PauseQueue:').last.to_i}
|
97
|
+
real_queues = real_queues.select {|key| key if !paused_instances.include?((key.match(/^(\d*)_.*/) || [])[1].to_i)}
|
98
|
+
|
99
|
+
while q = queue_names.shift
|
100
|
+
q = q.to_s
|
101
|
+
|
102
|
+
if q =~ /^(!)?@(.*)/
|
103
|
+
key = $2.strip
|
104
|
+
key = hostname if key.size == 0
|
105
|
+
|
106
|
+
add_queues = Resque.get_dynamic_queue(key)
|
107
|
+
add_queues.map! { |q| q.gsub!(/^!/, '') || q.gsub!(/^/, '!') } if $1
|
108
|
+
|
109
|
+
queue_names.concat(add_queues)
|
110
|
+
next
|
111
|
+
end
|
112
|
+
|
113
|
+
if q =~ /^!/
|
114
|
+
negated = true
|
115
|
+
q = q[1..-1]
|
116
|
+
end
|
117
|
+
|
118
|
+
patstr = q.gsub(/\*/, '.*')
|
119
|
+
pattern = /^#{patstr}$/
|
120
|
+
if negated
|
121
|
+
matched_queues -= matched_queues.grep(pattern)
|
122
|
+
else
|
123
|
+
matches = real_queues.grep(/^#{pattern}$/)
|
124
|
+
matches = [q] if matches.size == 0 && q == patstr
|
125
|
+
matched_queues.concat(matches.sort)
|
126
|
+
end
|
127
|
+
end
|
128
|
+
|
129
|
+
return matched_queues.uniq
|
130
|
+
end
|
131
|
+
|
132
|
+
|
133
|
+
def self.included(receiver)
|
134
|
+
receiver.class_eval do
|
135
|
+
alias queues_without_dynamic queues
|
136
|
+
alias queues queues_with_dynamic
|
137
|
+
alias reserve_without_round_robin reserve
|
138
|
+
alias reserve reserve_with_round_robin
|
139
|
+
end
|
140
|
+
end
|
141
|
+
end
|
142
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module Resque
|
2
|
+
module SelfLookup
|
3
|
+
def payload_class_enhanced
|
4
|
+
@payload_class ||= constantize(@payload['class'])
|
5
|
+
@payload_class.instance_eval { class << self; self end }.send(:attr_accessor, :worker)
|
6
|
+
@payload_class.instance_eval { class << self; self end }.send(:attr_accessor, :job)
|
7
|
+
@payload_class.worker = self.worker
|
8
|
+
@payload_class.job = self
|
9
|
+
return @payload_class
|
10
|
+
end
|
11
|
+
|
12
|
+
def self.included(receiver)
|
13
|
+
receiver.class_eval do
|
14
|
+
alias payload_class_old payload_class
|
15
|
+
alias payload_class payload_class_enhanced
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,71 @@
|
|
1
|
+
module Resque
|
2
|
+
module SilenceDone
|
3
|
+
def perform_no_log(job)
|
4
|
+
begin
|
5
|
+
if fork_per_job?
|
6
|
+
reconnect
|
7
|
+
run_hook :after_fork, job
|
8
|
+
end
|
9
|
+
job.perform
|
10
|
+
rescue Object => e
|
11
|
+
report_failed_job(job,e)
|
12
|
+
else
|
13
|
+
# log_with_severity :info, "done: #{job.inspect}"
|
14
|
+
ensure
|
15
|
+
yield job if block_given?
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
# def work(interval = 5.0, &block)
|
20
|
+
# interval = Float(interval)
|
21
|
+
# startup
|
22
|
+
|
23
|
+
# loop do
|
24
|
+
# break if shutdown?
|
25
|
+
|
26
|
+
# unless work_one_job(&block)
|
27
|
+
# break if interval.zero?
|
28
|
+
# log_with_severity :debug, "Sleeping for #{interval} seconds"
|
29
|
+
# procline paused? ? "Paused" : "Waiting for #{queues.join(',')}"
|
30
|
+
# sleep interval
|
31
|
+
# end
|
32
|
+
# end
|
33
|
+
|
34
|
+
# unregister_worker
|
35
|
+
# rescue Exception => exception
|
36
|
+
# return if exception.class == SystemExit && !@child && run_at_exit_hooks
|
37
|
+
# log_with_severity :error, "Failed to start worker : #{exception.inspect}"
|
38
|
+
# unregister_worker(exception)
|
39
|
+
# end
|
40
|
+
|
41
|
+
def work_one_job_no_log(job = nil, &block)
|
42
|
+
return false if paused?
|
43
|
+
return false unless job ||= reserve
|
44
|
+
|
45
|
+
working_on job
|
46
|
+
procline "Processing #{job.queue} since #{Time.now.to_i} [#{job.payload_class_name}]"
|
47
|
+
|
48
|
+
#log_with_severity :info, "got: #{job.inspect}"
|
49
|
+
job.worker = self
|
50
|
+
|
51
|
+
if fork_per_job?
|
52
|
+
perform_with_fork(job, &block)
|
53
|
+
else
|
54
|
+
perform(job, &block)
|
55
|
+
end
|
56
|
+
|
57
|
+
done_working
|
58
|
+
true
|
59
|
+
end
|
60
|
+
|
61
|
+
def self.included(receiver)
|
62
|
+
receiver.class_eval do
|
63
|
+
alias work_one_job_with_log work_one_job
|
64
|
+
alias work_one_job work_one_job_no_log
|
65
|
+
|
66
|
+
alias perform_with_log perform
|
67
|
+
alias perform perform_no_log
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
# desc "Explaining what the task does"
|
2
|
+
# task :connect do
|
3
|
+
# # Task goes here
|
4
|
+
# end
|
5
|
+
|
6
|
+
namespace :db do
|
7
|
+
desc 'Also create shared_extensions Schema'
|
8
|
+
task :extensions => :environment do
|
9
|
+
# Create Schema
|
10
|
+
ActiveRecord::Base.connection.execute 'CREATE SCHEMA IF NOT EXISTS shared_extensions;'
|
11
|
+
# Enable Hstore
|
12
|
+
ActiveRecord::Base.connection.execute 'CREATE EXTENSION IF NOT EXISTS HSTORE SCHEMA shared_extensions;'
|
13
|
+
# Enable UUID-OSSP
|
14
|
+
ActiveRecord::Base.connection.execute 'CREATE EXTENSION IF NOT EXISTS "uuid-ossp" SCHEMA shared_extensions;'
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
Rake::Task["db:create"].enhance do
|
19
|
+
Rake::Task["db:extensions"].invoke
|
20
|
+
end
|
21
|
+
|
22
|
+
Rake::Task["db:test:purge"].enhance do
|
23
|
+
Rake::Task["db:extensions"].invoke
|
24
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
require 'zuora_connectD/configuration'
|
2
|
+
require "zuora_connectD/engine"
|
3
|
+
require 'zuora_connectD/exceptions'
|
4
|
+
require 'zuora_connectD/controllers/helpers'
|
5
|
+
require 'zuora_connectD/views/helpers'
|
6
|
+
require 'zuora_connectD/railtie'
|
7
|
+
require 'resque/additions'
|
8
|
+
require 'resque/dynamic_queues'
|
9
|
+
require 'resque/silence_done'
|
10
|
+
require 'resque/self_lookup'
|
11
|
+
require 'metrics/influx/point_value'
|
12
|
+
require 'metrics/net'
|
13
|
+
|
14
|
+
module ZuoraConnect
|
15
|
+
class << self
|
16
|
+
attr_accessor :configuration
|
17
|
+
end
|
18
|
+
module Controllers
|
19
|
+
autoload :Helpers, 'zuora_connect/controllers/helpers'
|
20
|
+
end
|
21
|
+
|
22
|
+
module Views
|
23
|
+
ActionView::Base.send(:include, Helpers)
|
24
|
+
end
|
25
|
+
|
26
|
+
def self.configuration
|
27
|
+
@configuration ||= Configuration.new
|
28
|
+
end
|
29
|
+
|
30
|
+
def self.reset
|
31
|
+
@configuration = Configuration.new
|
32
|
+
end
|
33
|
+
|
34
|
+
def self.configure
|
35
|
+
yield(configuration)
|
36
|
+
::Apartment.excluded_models << "Delayed::Job" if configuration.delayed_job
|
37
|
+
::Apartment.excluded_models.concat(configuration.additional_apartment_models) if configuration.additional_apartment_models.class == Array
|
38
|
+
|
39
|
+
return configuration
|
40
|
+
end
|
41
|
+
end
|