zuora_connect 2.0.60b → 2.0.60c

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 1f6d2a40d21ec315aaaac1859582bc689d24d6ef0ee3e42fabc640d171cb6944
4
- data.tar.gz: 8793132888e45c9fa532ebb92c11205da312ac88df1e43dbd89f38faab9d8e49
3
+ metadata.gz: 8befa7a7baeaf53305dc7cca304df5e672f0702a79a466a527a0f21a5ae0ab22
4
+ data.tar.gz: 6fe3d6e3390df915df0f3d49815a2cf4326035815a9b240b945d206941cb8032
5
5
  SHA512:
6
- metadata.gz: cbd7542971dfedb9b2470094cde902c8b147c9f406cd864bb60e7beafa306b5f29b2c70aab457ea12b22b5dffd726a21a870c5bb238acaeeda64641b5cfd6ad9
7
- data.tar.gz: a5adffbf1799fef7bf31db82eeba2fb648ea9c1ba3c34149c6c7f4b06ca7a02a6dd6c05a5e934e9aebbc974905737848ed40c8296e172226941d0fa1e7dc172c
6
+ metadata.gz: 92604604be323a0e43faa74ece5ba4ace4c86ae79710d86164850acfeee6990ec07fdbe6c6a674e5aa9f1ab1d0a93bf2d593052cc47d5290fd04d6cf59037fc8
7
+ data.tar.gz: 6ebb61f4e49c43d426fb0bcb2dd8070d5e720ce645ded094aa132686740cd1a2706c6b6b070794fa411ce162fcb0944291091b81485c4486cb8f3bed7710b191
@@ -402,7 +402,7 @@ module ZuoraConnect
402
402
  end
403
403
 
404
404
  def self.write_to_telegraf(*args)
405
- if ZuoraConnect.configuration.enable_metrics
405
+ if ZuoraConnect.configuration.enable_metrics && !defined?(Prometheus)
406
406
  @@telegraf_host = ZuoraConnect::Telegraf.new() if @@telegraf_host == nil
407
407
  unicorn_stats = self.unicorn_listener_stats() if defined?(Unicorn) && Unicorn.respond_to?(:listener_names)
408
408
  @@telegraf_host.write(direction: 'Raindrops', tags: {}, values: unicorn_stats) unless unicorn_stats.blank?
@@ -3,38 +3,93 @@ if defined? Prometheus
3
3
  require "zuora_connect/version"
4
4
  require "zuora_api/version"
5
5
 
6
+ resque_path = "#{ENV['RESQUE_EXPORTER_PATH'] || Rails.root.join('tmp/resque_exporter')}/*.prom"
7
+ prometheus_path = Rails.root.join("tmp/prometheus")
8
+
9
+ Dir[resque_path, "#{prometheus_path}/*.bin"].each do |file_path|
10
+ File.unlink(file_path)
11
+ end
12
+
13
+ require 'prometheus/client/data_stores/direct_file_store'
14
+ Prometheus::Client.config.data_store = Prometheus::Client::DataStores::DirectFileStore.new(
15
+ dir: prometheus_path
16
+ )
17
+
18
+ class ResqueExporter
19
+ require 'prometheus/client/formats/text'
20
+ require 'fileutils'
21
+
22
+ def initialize
23
+ @lock = Monitor.new
24
+ @registry = Prometheus::Client.registry
25
+ @path = ENV['RESQUE_EXPORTER_PATH'] || Rails.root.join('tmp/resque_exporter')
26
+ FileUtils.mkdir_p(@path)
27
+ end
28
+
29
+ def export
30
+ filename = File.join(@path, 'resque_export.prom')
31
+ @lock.synchronize do
32
+ File.open(filename, 'w+') do |file|
33
+ file.write(Prometheus::Client::Formats::Text.marshal(@registry))
34
+ end
35
+ end
36
+ end
37
+ end
38
+
39
+ most_recent_aggregation = {}
40
+ sum_aggregation = {}
41
+ if defined?(Unicorn)
42
+ most_recent_aggregation[:aggregation] = :most_recent
43
+ sum_aggregation[:aggregation] = :sum
44
+ end
45
+
6
46
  # Create a default Prometheus registry for our metrics.
7
47
  prometheus = Prometheus::Client.registry
8
48
 
9
49
  # Create your metrics.
10
- ZUORA_VERSION = Prometheus::Client::Gauge.new(:zuora_version, 'The current Zuora Gem version.')
11
- CONNECT_VERSION = Prometheus::Client::Gauge.new(:gem_version, 'The current Connect Gem version.')
12
- RAILS_VERSION = Prometheus::Client::Gauge.new(:rails_version, 'The current Rails version.')
13
- RUBY_V = Prometheus::Client::Gauge.new(:ruby_version, 'The current Ruby version.')
50
+ ZUORA_VERSION = prometheus.gauge(:zuora_version, docstring: 'The current Zuora Gem version.', labels: %i(version name), preset_labels: { version: ZuoraAPI::VERSION, name: ZuoraConnect::Telegraf.app_name }, store_settings: most_recent_aggregation)
51
+ CONNECT_VERSION = prometheus.gauge(:gem_version, docstring: 'The current Connect Gem version.', labels: %i(version name), preset_labels: { version: ZuoraConnect::VERSION, name: ZuoraConnect::Telegraf.app_name }, store_settings: most_recent_aggregation)
52
+ RAILS_VERSION = prometheus.gauge(:rails_version, docstring: 'The current Rails version.', labels: %i(version name), preset_labels: { version: Rails.version, name: ZuoraConnect::Telegraf.app_name }, store_settings: most_recent_aggregation)
53
+ RUBY_V = prometheus.gauge(:ruby_version, docstring: 'The current Ruby version.', labels: %i(version name), preset_labels: { version: RUBY_VERSION, name: ZuoraConnect::Telegraf.app_name }, store_settings: most_recent_aggregation)
14
54
 
15
- # Register your metrics with the registry we previously created.
16
- prometheus.register(ZUORA_VERSION);ZUORA_VERSION.set({version: ZuoraAPI::VERSION, name: ZuoraConnect::Telegraf.app_name},0)
17
- prometheus.register(CONNECT_VERSION);CONNECT_VERSION.set({version: ZuoraConnect::VERSION, name: ZuoraConnect::Telegraf.app_name},0)
18
- prometheus.register(RAILS_VERSION);RAILS_VERSION.set({version: Rails.version, name: ZuoraConnect::Telegraf.app_name},0)
19
- prometheus.register(RUBY_V);RUBY_V.set({version: RUBY_VERSION, name: ZuoraConnect::Telegraf.app_name},0)
55
+ ZUORA_VERSION.set(0)
56
+ CONNECT_VERSION.set(0)
57
+ RAILS_VERSION.set(0)
58
+ RUBY_V.set(0)
20
59
 
21
60
  # Do they have resque jobs?
22
61
  if defined? Resque.redis
23
- REDIS_CONNECTION = Prometheus::Client::Gauge.new(:redis_connection, 'The status of the redis connection, 0 or 1')
24
- FINISHED_JOBS = Prometheus::Client::Gauge.new(:finished_jobs, 'Done resque jobs')
25
- WORKERS = Prometheus::Client::Gauge.new(:workers, 'Total resque workers')
26
- ACTIVE_WORKERS = Prometheus::Client::Gauge.new(:active_workers, 'Active resque workers')
27
- FAILED_JOBS = Prometheus::Client::Gauge.new(:failed_jobs, 'Failed resque jobs')
28
- PENDING_JOBS = Prometheus::Client::Gauge.new(:pending_jobs, 'Pending resque jobs')
29
-
30
- prometheus.register(REDIS_CONNECTION)
31
- prometheus.register(FINISHED_JOBS)
32
- prometheus.register(ACTIVE_WORKERS)
33
- prometheus.register(WORKERS)
34
- prometheus.register(FAILED_JOBS)
35
- prometheus.register(PENDING_JOBS)
36
-
62
+ REDIS_CONNECTION = prometheus.gauge(:redis_connection, docstring: 'The status of the redis connection, 0 or 1', labels: %i(connection name), preset_labels: {connection:'redis', name: ZuoraConnect::Telegraf.app_name}, store_settings: most_recent_aggregation)
63
+ JOBS_FINISHED = prometheus.gauge(:jobs_finished, docstring: 'Done resque jobs', labels: %i(type name), preset_labels: {type:'resque', name: ZuoraConnect::Telegraf.app_name}, store_settings: most_recent_aggregation)
64
+ WORKERS_TOTAL = prometheus.gauge(:workers_total, docstring: 'Total resque workers', labels: %i(type name), preset_labels: {type:'resque', name: ZuoraConnect::Telegraf.app_name}, store_settings: most_recent_aggregation)
65
+ WORKERS_ACTIVE = prometheus.gauge(:workers_active, docstring: 'Active resque workers', labels: %i(type name), preset_labels: {type:'resque', name: ZuoraConnect::Telegraf.app_name}, store_settings: most_recent_aggregation)
66
+ JOBS_FAILED = prometheus.gauge(:jobs_failed, docstring: 'Failed resque jobs', labels: %i(type name), preset_labels: {type:'resque', name: ZuoraConnect::Telegraf.app_name}, store_settings: most_recent_aggregation)
67
+ JOBS_PENDING = prometheus.gauge(:jobs_pending, docstring: 'Pending resque jobs', labels: %i(type name), preset_labels: {type:'resque', name: ZuoraConnect::Telegraf.app_name}, store_settings: most_recent_aggregation)
37
68
  end
38
69
 
70
+ if defined?(Unicorn) && Unicorn.respond_to?(:listener_names)
71
+ UNICORN_KILLS = prometheus.gauge(
72
+ :unicorn_kills,
73
+ docstring: 'Unicorn Kills',
74
+ labels: %i(type name),
75
+ preset_labels: {type:'Unicorn-Killer', name: ZuoraConnect::Telegraf.app_name},
76
+ store_settings: sum_aggregation
77
+ )
78
+
79
+ ZuoraConnect::AppInstanceBase.unicorn_listener_stats.each do |key, _|
80
+ gauge_name = "unicorn_#{key}".gsub(/[^a-zA-Z0-9_]/, '_')
81
+ gauge = prometheus.gauge(
82
+ gauge_name.to_sym,
83
+ docstring: 'Unicorn Stats',
84
+ labels: %i(type name),
85
+ preset_labels: { type: 'unicorn', name: ZuoraConnect::Telegraf.app_name },
86
+ store_settings: most_recent_aggregation
87
+ )
88
+ Prometheus.const_set(
89
+ gauge_name.upcase,
90
+ gauge
91
+ )
92
+ end
93
+ end
39
94
  end
40
95
  end
@@ -5,6 +5,20 @@ if defined?(Resque::Worker)
5
5
  Resque::Job.send(:include, Resque::SelfLookup)
6
6
  end
7
7
 
8
+ if defined?(Resque::Job) && defined?(Prometheus)
9
+ module ResquePrometheusExtensions
10
+ EXPORTER = Prometheus::ResqueExporter.new
11
+ def perform
12
+ super
13
+ EXPORTER.export
14
+ end
15
+ end
16
+
17
+ class Resque::Job
18
+ prepend ResquePrometheusExtensions
19
+ end
20
+ end
21
+
8
22
  Resque.module_eval do
9
23
  # Returns a hash, mapping queue names to queue sizes
10
24
  def queue_sizes
@@ -3,7 +3,35 @@ if defined?(Unicorn::WorkerKiller)
3
3
  self.singleton_class.send(:alias_method, :kill_self_old, :kill_self)
4
4
  def self.kill_self(logger, start_time)
5
5
  self.kill_self_old(logger, start_time)
6
- ZuoraConnect::AppInstance.write_to_telegraf(direction: 'Unicorn-Killer', tags: {app_instance: 0}, values: {kill: 1})
6
+ if defined?(Prometheus)
7
+ Prometheus::UNICORN_KILLS.set(1)
8
+ else
9
+ ZuoraConnect::AppInstance.write_to_telegraf(direction: 'Unicorn-Killer', tags: {app_instance: 0}, values: {kill: 1})
10
+ end
7
11
  end
8
12
  end
13
+ end
14
+
15
+ if defined?(Unicorn::HttpServer) && defined?(Prometheus)
16
+ module HttpServerExtensions
17
+ def kill_worker(signal, wpid)
18
+ Prometheus::UNICORN_KILLS.increment
19
+ super
20
+ end
21
+ end
22
+
23
+ module WorkerExtensions
24
+ def soft_kill(sig)
25
+ Prometheus::UNICORN_KILLS.increment
26
+ super
27
+ end
28
+ end
29
+
30
+ class Unicorn::HttpServer
31
+ prepend HttpServerExtensions
32
+ end
33
+
34
+ class Unicorn::Worker
35
+ prepend WorkerExtensions
36
+ end
9
37
  end
@@ -64,6 +64,22 @@ module ZuoraConnect
64
64
  #Remove bad headers
65
65
  @bad_headers.each { |header| env.delete(header) }
66
66
 
67
+ if defined?(Prometheus) && env['PATH_INFO'] == '/connect/internal/metrics'
68
+ # Prometheus Stuff
69
+ metrics = ZuoraConnect::AppInstance.get_metrics('stats')
70
+ redis_up = metrics.present? && metrics.dig(:Resque, :Workers_Total).present? ? 1 : 0
71
+ Prometheus::REDIS_CONNECTION.set(redis_up)
72
+
73
+ process_prometheus_metric(metrics: metrics)
74
+
75
+ if defined?(Unicorn) && Unicorn.respond_to?(:listener_names)
76
+ ZuoraConnect::AppInstanceBase.unicorn_listener_stats.each do |key, value|
77
+ gauge = Prometheus.const_get("unicorn_#{key}".gsub(/[^a-zA-Z0-9_]/, '_').upcase)
78
+ gauge.set(value) if gauge.present?
79
+ end
80
+ end
81
+ end
82
+
67
83
  #Thread.current[:appinstance] = nil
68
84
  start_time = Time.now
69
85
  begin
@@ -77,35 +93,6 @@ module ZuoraConnect
77
93
  ZuoraConnect::AppInstanceBase.write_to_telegraf(direction: 'request-inbound-assets', tags: tags, values: values)
78
94
  end
79
95
 
80
- if defined? Prometheus
81
- #Prometheus Stuff
82
- if env['PATH_INFO'] == '/connect/internal/metrics'
83
-
84
- #Do something before each scrape
85
- if defined? Resque.redis
86
- begin
87
-
88
- Resque.redis.ping
89
-
90
- Prometheus::REDIS_CONNECTION.set({connection:'redis',name: ZuoraConnect::Telegraf.app_name},1)
91
- Prometheus::FINISHED_JOBS.set({type:'resque',name: ZuoraConnect::Telegraf.app_name},Resque.info[:processed])
92
- Prometheus::PENDING_JOBS.set({type:'resque',name: ZuoraConnect::Telegraf.app_name},Resque.info[:pending])
93
- Prometheus::ACTIVE_WORKERS.set({type:'resque',name: ZuoraConnect::Telegraf.app_name},Resque.info[:working])
94
- Prometheus::WORKERS.set({type:'resque',name: ZuoraConnect::Telegraf.app_name},Resque.info[:workers])
95
- Prometheus::FAILED_JOBS.set({type:'resque',name: ZuoraConnect::Telegraf.app_name},Resque.info[:failed])
96
-
97
- rescue Redis::CannotConnectError
98
- Prometheus::REDIS_CONNECTION.set({connection:'redis',name: ZuoraConnect::Telegraf.app_name},0)
99
- end
100
-
101
- if ZuoraConnect.configuration.custom_prometheus_update_block != nil
102
- ZuoraConnect.configuration.custom_prometheus_update_block.call()
103
- end
104
- end
105
-
106
- end
107
- end
108
-
109
96
  # Uncomment following block of code for handling engine requests/requests without controller
110
97
  # else
111
98
  # # Handling requests which do not have controllers (engines)
@@ -119,10 +106,10 @@ module ZuoraConnect
119
106
  content_type = @headers['Content-Type'].split(';')[0] if @headers['Content-Type']
120
107
  content_type = content_type.gsub('text/javascript', 'application/javascript')
121
108
  tags = {status: @status, content_type: content_type}
122
-
109
+
123
110
  tags = tags.merge({controller: 'ActionController'})
124
111
  tags = tags.merge({action: 'RoutingError' }) if @status == 404
125
-
112
+
126
113
  values = {response_time: ((Time.now - start_time)*1000).round(2) }
127
114
 
128
115
  ZuoraConnect::AppInstanceBase.write_to_telegraf(direction: :inbound, tags: tags, values: values)
@@ -133,5 +120,32 @@ module ZuoraConnect
133
120
  [@status, @headers, @response]
134
121
  end
135
122
  end
123
+
124
+ def process_prometheus_metric(type: 'none', metrics: {})
125
+ return if metrics.blank?
126
+
127
+ prometheus = Prometheus::Client.registry
128
+ most_recent_aggregation = {}
129
+ if Prometheus::Client.config.data_store.is_a?(Prometheus::Client::DataStores::DirectFileStore)
130
+ most_recent_aggregation[:aggregation] = :most_recent
131
+ end
132
+ metrics.each do |key, value|
133
+ next if %w[app_name url].include?(key.to_s)
134
+
135
+ if value.is_a?(Hash)
136
+ process_prometheus_metric(type: key.to_s, metrics: value)
137
+ else
138
+ gauge_name = key.to_s.downcase.gsub(/[^a-z0-9_]/, '_')
139
+ gauge = prometheus.get(gauge_name.to_sym) || prometheus.gauge(
140
+ gauge_name.to_sym,
141
+ docstring: "#{key} metric",
142
+ labels: %i(type name),
143
+ preset_labels: { type: type, name: ZuoraConnect::Telegraf.app_name },
144
+ store_settings: most_recent_aggregation
145
+ )
146
+ gauge.set(value)
147
+ end
148
+ end
149
+ end
136
150
  end
137
151
  end
@@ -28,11 +28,6 @@ module ZuoraConnect
28
28
  ::Rails.configuration.action_dispatch.x_sendfile_header = nil
29
29
  end
30
30
 
31
- if defined? Prometheus
32
- initializer "prometheus.configure_rails_initialization" do |app|
33
- app.middleware.use Prometheus::Middleware::Exporter,(options ={:path => '/connect/internal/metrics'})
34
- end
35
- end
36
31
  initializer "zuora_connect.configure_rails_initialization" do |app|
37
32
  app.middleware.insert_after Rack::Sendfile, ZuoraConnect::MetricsMiddleware
38
33
  app.middleware.insert_after ActionDispatch::RequestId, ZuoraConnect::RequestIdMiddleware
@@ -40,6 +35,15 @@ module ZuoraConnect
40
35
  app.config.middleware.use ZuoraConnect::JsonParseErrors
41
36
  end
42
37
 
38
+ if defined? Prometheus
39
+ require 'rack'
40
+ require 'prometheus/middleware/exporter'
41
+ initializer "prometheus.configure_rails_initialization" do |app|
42
+ app.middleware.insert_after ZuoraConnect::MetricsMiddleware, Prometheus::Middleware::Exporter, path: '/connect/internal/metrics'
43
+ app.config.middleware.use Rack::Deflater, if: ->(env, *) { env['PATH_INFO'] == '/connect/internal/metrics' }
44
+ end
45
+ end
46
+
43
47
  # hook to process_action
44
48
  ActiveSupport::Notifications.subscribe('process_action.action_controller', ZuoraConnect::PageRequest.new)
45
49
 
@@ -1,3 +1,3 @@
1
1
  module ZuoraConnect
2
- VERSION = "2.0.60b"
2
+ VERSION = "2.0.60c"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: zuora_connect
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.60b
4
+ version: 2.0.60c
5
5
  platform: ruby
6
6
  authors:
7
7
  - Connect Team
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-07-27 00:00:00.000000000 Z
11
+ date: 2020-08-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: apartment