pgq_prometheus 0.1.0 → 0.2.0

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: 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