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:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 217d7a6064aefef64ca6d358839134d52b8f56e7d3f33a69a8482ffc2d932919
|
4
|
+
data.tar.gz: 80bb1462baf09e5238a9537e916bba08f5242cbd242a77cb8b0b27ef43f8567e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8345be6719e9beb76924bfc8fcd712ad1622e4f56148e16d27301c360d91e4de617425aa968d039915f85a0b5070e3de0b3e469d7579bf17a789d955221fa3b3
|
7
|
+
data.tar.gz: b413e3ac7b3e2894d9a3b0175b9c2ffc9e45a2a9a2c30615251fe90fe496b785d2fb636fdc0e225663d491896dbeb1faf120a7d449a10fa4bf3d117cefd0f592
|
@@ -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
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
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
|
-
|
35
|
-
|
42
|
+
def stop
|
43
|
+
@thread&.kill
|
44
|
+
@thread = nil
|
45
|
+
end
|
36
46
|
|
37
|
-
|
38
|
-
|
47
|
+
def running?
|
48
|
+
defined?(@thread) && @thread
|
49
|
+
end
|
39
50
|
|
40
|
-
|
41
|
-
|
42
|
-
end
|
51
|
+
def wrap_thread_loop(*tags)
|
52
|
+
return yield if logger.nil? || !logger.respond_to?(:tagged)
|
43
53
|
|
44
|
-
|
45
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
90
|
-
self.class.
|
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
|
94
|
-
if logger.nil?
|
95
|
-
|
96
|
-
|
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
|
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.
|
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-
|
11
|
+
date: 2020-06-04 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: prometheus_exporter
|