pgq_prometheus 0.1.0 → 0.2.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 7bfd83bd5e5c4ff547cc53f7424922ba0a25c957ede3a2b5564a91ecefb015f3
4
- data.tar.gz: 88a8700c82abf2513a91a4c389831401e76f7f51c35f61b4c292c3dce816006a
3
+ metadata.gz: 217d7a6064aefef64ca6d358839134d52b8f56e7d3f33a69a8482ffc2d932919
4
+ data.tar.gz: 80bb1462baf09e5238a9537e916bba08f5242cbd242a77cb8b0b27ef43f8567e
5
5
  SHA512:
6
- metadata.gz: fcd9e6f57018fd3e8451c35799e9f2d5c0d39871f177e24de8ebe65e7c7abc4f6d8329832033f0fb7ce442bde1342268c24f9a43448825216943e0f312db2f2b
7
- data.tar.gz: 92174e946b347278960575e6bfb83a141e71b3df55f65b688866b1093e2994437c6b5a2b6ae4b4386c7d2b7a02f97eb33a537831f36c7dcd4fc7317a41be888a
6
+ metadata.gz: 8345be6719e9beb76924bfc8fcd712ad1622e4f56148e16d27301c360d91e4de617425aa968d039915f85a0b5070e3de0b3e469d7579bf17a789d955221fa3b3
7
+ data.tar.gz: b413e3ac7b3e2894d9a3b0175b9c2ffc9e45a2a9a2c30615251fe90fe496b785d2fb636fdc0e225663d491896dbeb1faf120a7d449a10fa4bf3d117cefd0f592
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require_relative 'config'
2
4
  require 'prometheus_exporter/server'
3
5
 
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'prometheus_exporter/metric'
2
4
 
3
5
  module PgqPrometheus
@@ -1,48 +1,58 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'prometheus_exporter/client'
2
4
 
3
5
  module PgqPrometheus
4
6
  class Processor
5
7
  class << self
6
8
  attr_accessor :sql_caller, :logger, :on_error
7
- end
8
-
9
- def self.start(client: nil, frequency: 30, labels: nil)
10
- raise ArgumentError, "#{name}.sql_caller must be defined" if sql_caller.nil?
11
-
12
- client ||= PrometheusExporter::Client.default
13
- metric_labels = labels&.dup || {}
14
- process_collector = new(metric_labels)
15
9
 
16
- stop if running?
17
-
18
- @thread = Thread.new do
19
- while true
20
- begin
21
- metrics = process_collector.collect
22
- metrics.each do |metric|
23
- client.send_json metric
10
+ def start(client: nil, frequency: 30, labels: nil)
11
+ raise ArgumentError, "#{name}.sql_caller must be defined" if sql_caller.nil?
12
+
13
+ stop
14
+
15
+ client ||= PrometheusExporter::Client.default
16
+ metric_labels = labels&.dup || {}
17
+ process_collector = new(metric_labels)
18
+
19
+ @thread = Thread.new do
20
+ wrap_thread_loop(name) do
21
+ sql_caller.release_connection
22
+ logger&.info { "Start #{name}" }
23
+ while true
24
+ begin
25
+ metrics = process_collector.collect
26
+ metrics.each do |metric|
27
+ client.send_json metric
28
+ end
29
+ rescue => e
30
+ STDERR.puts "#{self.class} Failed To Collect Stats #{e.class} #{e.message}"
31
+ log(:error) { "#{e.class} #{e.message} #{e.backtrace.join("\n")}" }
32
+ on_error&.call(e)
33
+ end
34
+ sleep frequency
24
35
  end
25
- rescue => e
26
- STDERR.puts "#{self.class} Failed To Collect Stats #{e.class} #{e.message}"
27
- logger&.error { "#{e.class} #{e.message} #{e.backtrace.join("\n")}" }
28
- on_error&.call(e)
29
36
  end
30
- sleep frequency
31
37
  end
38
+
39
+ true
32
40
  end
33
41
 
34
- true
35
- end
42
+ def stop
43
+ @thread&.kill
44
+ @thread = nil
45
+ end
36
46
 
37
- def self.stop
38
- return unless running?
47
+ def running?
48
+ defined?(@thread) && @thread
49
+ end
39
50
 
40
- @thread.kill
41
- @thread = nil
42
- end
51
+ def wrap_thread_loop(*tags)
52
+ return yield if logger.nil? || !logger.respond_to?(:tagged)
43
53
 
44
- def self.running?
45
- defined?(@thread) && @thread
54
+ logger.tagged(*tags) { yield }
55
+ end
46
56
  end
47
57
 
48
58
  def initialize(labels = {})
@@ -51,10 +61,9 @@ module PgqPrometheus
51
61
 
52
62
  def collect
53
63
  metrics = []
64
+ sql_caller.with_connection do
54
65
 
55
- within_logger_tags(self.class.name) do
56
-
57
- self.class.sql_caller.queue_info.each do |queue_info|
66
+ sql_caller.queue_info.each do |queue_info|
58
67
  queue = queue_info[:queue_name]
59
68
 
60
69
  queue_metric_opts.each do |name, opts|
@@ -63,7 +72,7 @@ module PgqPrometheus
63
72
  metrics << format_metric(name, value, labels)
64
73
  end
65
74
 
66
- self.class.sql_caller.consumer_info(queue).each do |consumer_info|
75
+ sql_caller.consumer_info(queue).each do |consumer_info|
67
76
  consumer = consumer_info[:consumer_name]
68
77
 
69
78
  consumer_metric_opts.each do |name, opts|
@@ -86,16 +95,14 @@ module PgqPrometheus
86
95
 
87
96
  private
88
97
 
89
- def logger
90
- self.class.logger
98
+ [:sql_caller, :logger].each do |meth|
99
+ define_method(meth) { |*args, &block| self.class.public_send(meth, *args, &block) }
91
100
  end
92
101
 
93
- def within_logger_tags(*tags)
94
- if logger.nil? || !logger.respond_to?(:tagged)
95
- yield
96
- else
97
- logger.tagged(*tags) { yield }
98
- end
102
+ def log(severity)
103
+ return yield if logger.nil?
104
+
105
+ logger.public_send(severity) { yield }
99
106
  end
100
107
 
101
108
  def queue_metric_opts
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module PgqPrometheus
2
4
  module SqlCaller
3
5
  class ActiveRecord
@@ -38,6 +40,19 @@ module PgqPrometheus
38
40
  end
39
41
  end
40
42
 
43
+ # Releases active pg connection in thread.
44
+ # Do nothing if no connection captured.
45
+ def release_connection
46
+ model_class.release_connection
47
+ end
48
+
49
+ # Acquires pg connection during block execution.
50
+ # Release it after block executed.
51
+ # @yield
52
+ def with_connection
53
+ model_class.with_connection { yield }
54
+ end
55
+
41
56
  private
42
57
 
43
58
  def model_class
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module PgqPrometheus
4
- VERSION = '0.1.0'
4
+ VERSION = '0.2.0'
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pgq_prometheus
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Denis Talakevich
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-02-26 00:00:00.000000000 Z
11
+ date: 2020-06-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: prometheus_exporter