prometheus_exporter 0.8.0 → 0.8.1

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