prometheus_exporter 0.8.0 → 0.8.1

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: 562647915cd81e672056a83fc79a031d2a0ebb2b4a7a5e32f5786ae5c7d480a7
4
- data.tar.gz: 525e28d0cbe4e853c91bb463970fd231b134dba6b5a190c61a2ff7710074fb7b
3
+ metadata.gz: 47861f365c3db51e840d0c62e30120518dfc64fe208cc639ae6653903d14c578
4
+ data.tar.gz: 8e67b542b68012b0bd2cb64122eb2ba987a18eed1397449cab4363eea009ba44
5
5
  SHA512:
6
- metadata.gz: 324b3b0acd1c97e8b5535dff8f57500b4dc3f2433456372c609accbc78d1baf839d82a1e38eabb543f043bbc9fefb401ab1460ba252ee8b9330fe0a91acffc1d
7
- data.tar.gz: b2a0082d4e2431cc1f24f11a6af86d6965e2db7c93df1021ed58b38ff8651c84d1e8939b42a13b1b7cac60c9237435ff838a24918ed0ee18d13c3df2aece76d4
6
+ metadata.gz: 1f4ff589012b8f28f81ee3b63f7535c1eb138c232826da36f1b621dc6381398e7fa515aca6b6413423e965630d23b47ad9b505801d418e3c9a625c7d7a0c7030
7
+ data.tar.gz: d457d6d2c60c11960b6b241d5f2e0864994f11f808624845b9f28a42968dc3b9da07214321631d9f1644b2fdcad4b5ad443c843c53416ad6326afae68bd4d879
@@ -12,7 +12,7 @@ jobs:
12
12
  name: Ruby ${{ matrix.ruby }}
13
13
  strategy:
14
14
  matrix:
15
- ruby: ["2.7", "2.6", "2.5"]
15
+ ruby: ["3.0","2.7", "2.6"]
16
16
  steps:
17
17
  - uses: actions/checkout@master
18
18
  with:
data/CHANGELOG CHANGED
@@ -1,10 +1,14 @@
1
+ 0.8.1 - 04-08-2021
2
+
3
+ - FEATURE: swap from hardcoded STDERR to logger pattern (see README for details)
4
+
1
5
  0.8.0 - 05-07-2021
2
6
 
3
7
  - FIX: handle ThreadError more gracefully in cases where process shuts down
4
8
  - FEATURE: add job_name and queue_name labels to delayed job metrics
5
9
  - FEATURE: always scope puma metrics on hostname in collector
6
10
  - FEATURE: add customizable labels option to puma collector
7
- - FEATURE: support for Rescue
11
+ - FEATURE: support for Resque
8
12
  - DEV: Remove support for EOL ruby 2.5
9
13
  - FIX: Add source location to MethodProfiler patches
10
14
  - FEATURE: Improve Active Record instrumentation
data/README.md CHANGED
@@ -28,6 +28,7 @@ To learn more see [Instrumenting Rails with Prometheus](https://samsaffron.com/a
28
28
  * [Client default host](#client-default-host)
29
29
  * [Transport concerns](#transport-concerns)
30
30
  * [JSON generation and parsing](#json-generation-and-parsing)
31
+ * [Logging](#logging)
31
32
  * [Contributing](#contributing)
32
33
  * [License](#license)
33
34
  * [Code of Conduct](#code-of-conduct)
@@ -850,6 +851,19 @@ The `PrometheusExporter::Client` class has the method `#send-json`. This method,
850
851
 
851
852
  When `PrometheusExporter::Server::Collector` parses your JSON, by default it will use the faster Oj deserializer if available. This happens cause it only expects a simple Hash out of the box. You can opt in for the default JSON deserializer with `json_serializer: :json`.
852
853
 
854
+ ## Logging
855
+
856
+ `PrometheusExporter::Client.default` will export to `STDERR`. To change this, you can pass your own logger:
857
+ ```ruby
858
+ PrometheusExporter::Client.new(logger: Rails.logger)
859
+ PrometheusExporter::Client.new(logger: Logger.new(STDOUT))
860
+ ```
861
+
862
+ You can also pass a log level (default is [`Logger::WARN`](https://ruby-doc.org/stdlib-3.0.1/libdoc/logger/rdoc/Logger.html)):
863
+ ```ruby
864
+ PrometheusExporter::Client.new(log_level: Logger::DEBUG)
865
+ ```
866
+
853
867
  ## Contributing
854
868
 
855
869
  Bug reports and pull requests are welcome on GitHub at https://github.com/discourse/prometheus_exporter. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant](http://contributor-covenant.org) code of conduct.
@@ -3,12 +3,15 @@
3
3
 
4
4
  require 'optparse'
5
5
  require 'json'
6
+ require 'logger'
6
7
 
7
8
  require_relative "./../lib/prometheus_exporter"
8
9
  require_relative "./../lib/prometheus_exporter/server"
9
10
 
10
11
  def run
11
- options = {}
12
+ options = {
13
+ logger_path: STDERR
14
+ }
12
15
  custom_collector_filename = nil
13
16
  custom_type_collectors_filenames = []
14
17
 
@@ -61,15 +64,22 @@ def run
61
64
  opt.on('--unicorn-master PID_FILE', String, '(optional) PID file of unicorn master process to monitor unicorn') do |o|
62
65
  options[:unicorn_pid_file] = o
63
66
  end
67
+
68
+ opt.on('--logger-path PATH', String, '(optional) Path to file for logger output. Defaults to STDERR') do |o|
69
+ options[:logger_path] = o
70
+ end
64
71
  end.parse!
65
72
 
73
+ logger = Logger.new(options[:logger_path])
74
+ logger.level = Logger::WARN
75
+
66
76
  if options.has_key?(:realm) && !options.has_key?(:auth)
67
- STDERR.puts "[Warn] Providing REALM without AUTH has no effect"
77
+ logger.warn "Providing REALM without AUTH has no effect"
68
78
  end
69
79
 
70
80
  if options.has_key?(:auth)
71
81
  unless File.exist?(options[:auth]) && File.readable?(options[:auth])
72
- STDERR.puts "[Error] The AUTH file either doesn't exist or we don't have access to it"
82
+ logger.fatal "The AUTH file either doesn't exist or we don't have access to it"
73
83
  exit 1
74
84
  end
75
85
  end
@@ -88,7 +98,7 @@ def run
88
98
  end
89
99
 
90
100
  if !found
91
- STDERR.puts "[Error] Can not find a class inheriting off PrometheusExporter::Server::CollectorBase"
101
+ logger.fatal "Can not find a class inheriting off PrometheusExporter::Server::CollectorBase"
92
102
  exit 1
93
103
  end
94
104
  end
@@ -2,6 +2,7 @@
2
2
 
3
3
  require 'socket'
4
4
  require 'thread'
5
+ require 'logger'
5
6
 
6
7
  module PrometheusExporter
7
8
  class Client
@@ -53,14 +54,20 @@ module PrometheusExporter
53
54
  MAX_SOCKET_AGE = 25
54
55
  MAX_QUEUE_SIZE = 10_000
55
56
 
57
+ attr_reader :logger
58
+
56
59
  def initialize(
57
60
  host: ENV.fetch('PROMETHEUS_EXPORTER_HOST', 'localhost'),
58
61
  port: ENV.fetch('PROMETHEUS_EXPORTER_PORT', PrometheusExporter::DEFAULT_PORT),
59
62
  max_queue_size: nil,
60
63
  thread_sleep: 0.5,
61
64
  json_serializer: nil,
62
- custom_labels: nil
65
+ custom_labels: nil,
66
+ logger: Logger.new(STDERR),
67
+ log_level: Logger::WARN
63
68
  )
69
+ @logger = logger
70
+ @logger.level = log_level
64
71
  @metrics = []
65
72
 
66
73
  @queue = Queue.new
@@ -72,7 +79,7 @@ module PrometheusExporter
72
79
  max_queue_size ||= MAX_QUEUE_SIZE
73
80
  max_queue_size = max_queue_size.to_i
74
81
 
75
- if max_queue_size.to_i <= 0
82
+ if max_queue_size <= 0
76
83
  raise ArgumentError, "max_queue_size must be larger than 0"
77
84
  end
78
85
 
@@ -125,7 +132,7 @@ module PrometheusExporter
125
132
  def send(str)
126
133
  @queue << str
127
134
  if @queue.length > @max_queue_size
128
- STDERR.puts "Prometheus Exporter client is dropping message cause queue is full"
135
+ logger.warn "Prometheus Exporter client is dropping message cause queue is full"
129
136
  @queue.pop
130
137
  end
131
138
 
@@ -143,7 +150,7 @@ module PrometheusExporter
143
150
  @socket.write(message)
144
151
  @socket.write("\r\n")
145
152
  rescue => e
146
- STDERR.puts "Prometheus Exporter is dropping a message: #{e}"
153
+ logger.warn "Prometheus Exporter is dropping a message: #{e}"
147
154
  @socket = nil
148
155
  raise
149
156
  end
@@ -168,7 +175,7 @@ module PrometheusExporter
168
175
  close_socket_if_old!
169
176
  process_queue
170
177
  rescue => e
171
- STDERR.puts "Prometheus Exporter, failed to send message #{e}"
178
+ logger.error "Prometheus Exporter, failed to send message #{e}"
172
179
  end
173
180
 
174
181
  def ensure_worker_thread!
@@ -186,7 +193,7 @@ module PrometheusExporter
186
193
  end
187
194
  rescue ThreadError => e
188
195
  raise unless e.message =~ /can't alloc thread/
189
- STDERR.puts "Prometheus Exporter, failed to send message ThreadError #{e}"
196
+ logger.error "Prometheus Exporter, failed to send message ThreadError #{e}"
190
197
  end
191
198
 
192
199
  def close_socket!
@@ -7,9 +7,11 @@ module PrometheusExporter::Instrumentation
7
7
 
8
8
  def self.start(client: nil, frequency: 30, custom_labels: {}, config_labels: [])
9
9
 
10
- # Not all rails versions support coonection pool stats
10
+ client ||= PrometheusExporter::Client.default
11
+
12
+ # Not all rails versions support connection pool stats
11
13
  unless ::ActiveRecord::Base.connection_pool.respond_to?(:stat)
12
- STDERR.puts("ActiveRecord connection pool stats not supported in your rails version")
14
+ client.logger.error("ActiveRecord connection pool stats not supported in your rails version")
13
15
  return
14
16
  end
15
17
 
@@ -18,8 +20,6 @@ module PrometheusExporter::Instrumentation
18
20
 
19
21
  active_record_collector = new(custom_labels, config_labels)
20
22
 
21
- client ||= PrometheusExporter::Client.default
22
-
23
23
  stop if @thread
24
24
 
25
25
  @thread = Thread.new do
@@ -28,7 +28,7 @@ module PrometheusExporter::Instrumentation
28
28
  metrics = active_record_collector.collect
29
29
  metrics.each { |metric| client.send_json metric }
30
30
  rescue => e
31
- STDERR.puts("Prometheus Exporter Failed To Collect Process Stats #{e}")
31
+ client.logger.error("Prometheus Exporter Failed To Collect Process Stats #{e}")
32
32
  ensure
33
33
  sleep frequency
34
34
  end
@@ -27,7 +27,7 @@ module PrometheusExporter::Instrumentation
27
27
  metric = process_collector.collect
28
28
  client.send_json metric
29
29
  rescue => e
30
- STDERR.puts("Prometheus Exporter Failed To Collect Process Stats #{e}")
30
+ client.logger.error("Prometheus Exporter Failed To Collect Process Stats #{e}")
31
31
  ensure
32
32
  sleep frequency
33
33
  end
@@ -14,7 +14,7 @@ module PrometheusExporter::Instrumentation
14
14
  metric = puma_collector.collect
15
15
  client.send_json metric
16
16
  rescue => e
17
- STDERR.puts("Prometheus Exporter Failed To Collect Puma Stats #{e}")
17
+ client.logger.error("Prometheus Exporter Failed To Collect Puma Stats #{e}")
18
18
  ensure
19
19
  sleep frequency
20
20
  end
@@ -11,7 +11,7 @@ module PrometheusExporter::Instrumentation
11
11
  begin
12
12
  client.send_json(resque_collector.collect)
13
13
  rescue => e
14
- STDERR.puts("Prometheus Exporter Failed To Collect Resque Stats #{e}")
14
+ client.logger.error("Prometheus Exporter Failed To Collect Resque Stats #{e}")
15
15
  ensure
16
16
  sleep frequency
17
17
  end
@@ -11,7 +11,7 @@ module PrometheusExporter::Instrumentation
11
11
  begin
12
12
  client.send_json(sidekiq_queue_collector.collect)
13
13
  rescue StandardError => e
14
- STDERR.puts("Prometheus Exporter Failed To Collect Sidekiq Queue metrics #{e}")
14
+ client.logger.error("Prometheus Exporter Failed To Collect Sidekiq Queue metrics #{e}")
15
15
  ensure
16
16
  sleep frequency
17
17
  end
@@ -18,7 +18,7 @@ module PrometheusExporter::Instrumentation
18
18
  metric = unicorn_collector.collect
19
19
  client.send_json metric
20
20
  rescue StandardError => e
21
- STDERR.puts("Prometheus Exporter Failed To Collect Unicorn Stats #{e}")
21
+ client.logger.error("Prometheus Exporter Failed To Collect Unicorn Stats #{e}")
22
22
  ensure
23
23
  sleep frequency
24
24
  end
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'prometheus_exporter/client'
3
+ require_relative '../client'
4
4
  require_relative '../instrumentation/unicorn'
5
5
 
6
6
  module PrometheusExporter::Server
@@ -29,16 +29,17 @@ module PrometheusExporter::Server
29
29
  @bad_metrics_total.observe(0)
30
30
 
31
31
  @access_log, @logger = nil
32
+ log_target = opts[:log_target]
32
33
 
33
34
  if @verbose
34
35
  @access_log = [
35
36
  [$stderr, WEBrick::AccessLog::COMMON_LOG_FORMAT],
36
37
  [$stderr, WEBrick::AccessLog::REFERER_LOG_FORMAT],
37
38
  ]
38
- @logger = WEBrick::Log.new($stderr)
39
+ @logger = WEBrick::Log.new(log_target || $stderr)
39
40
  else
40
41
  @access_log = []
41
- @logger = WEBrick::Log.new("/dev/null")
42
+ @logger = WEBrick::Log.new(log_target || "/dev/null")
42
43
  end
43
44
 
44
45
  @logger.info "Using Basic Authentication via #{@auth}" if @verbose && @auth
@@ -87,10 +88,7 @@ module PrometheusExporter::Server
87
88
  @collector.process(block)
88
89
  rescue => e
89
90
  if @verbose
90
- STDERR.puts
91
- STDERR.puts e.inspect
92
- STDERR.puts e.backtrace
93
- STDERR.puts
91
+ logger.error "\n\n#{e.inspect}\n#{e.backtrace}\n\n"
94
92
  end
95
93
  @bad_metrics_total.observe
96
94
  res.body = "Bad Metrics #{e}"
@@ -108,7 +106,7 @@ module PrometheusExporter::Server
108
106
  begin
109
107
  @server.start
110
108
  rescue => e
111
- STDERR.puts "Failed to start prometheus collector web on port #{@port}: #{e}"
109
+ logger.error "Failed to start prometheus collector web on port #{@port}: #{e}"
112
110
  end
113
111
  end
114
112
  end
@@ -125,7 +123,7 @@ module PrometheusExporter::Server
125
123
  end
126
124
  rescue Timeout::Error
127
125
  # we timed out ... bummer
128
- STDERR.puts "Generating Prometheus metrics text timed out"
126
+ logger.error "Generating Prometheus metrics text timed out"
129
127
  end
130
128
 
131
129
  metrics = []
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module PrometheusExporter
4
- VERSION = '0.8.0'
4
+ VERSION = '0.8.1'
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: prometheus_exporter
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.8.0
4
+ version: 0.8.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sam Saffron
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-07-05 00:00:00.000000000 Z
11
+ date: 2021-08-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: webrick