bc-prometheus-ruby 0.2.4 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +9 -0
- data/README.md +121 -0
- data/bc-prometheus-ruby.gemspec +1 -0
- data/lib/bigcommerce/prometheus/client.rb +8 -8
- data/lib/bigcommerce/prometheus/collectors/base.rb +18 -8
- data/lib/bigcommerce/prometheus/configuration.rb +25 -16
- data/lib/bigcommerce/prometheus/instrumentors/hutch.rb +8 -0
- data/lib/bigcommerce/prometheus/instrumentors/resque.rb +7 -1
- data/lib/bigcommerce/prometheus/instrumentors/web.rb +1 -1
- data/lib/bigcommerce/prometheus/integrations/resque.rb +3 -3
- data/lib/bigcommerce/prometheus/servers/thin/controllers/not_found_controller.rb +1 -1
- data/lib/bigcommerce/prometheus/servers/thin/server.rb +3 -3
- data/lib/bigcommerce/prometheus/version.rb +1 -1
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 31329daa503c8b88c1c31df265199e8fd417ddd66b10d64d3329246e43e0f215
|
4
|
+
data.tar.gz: f1a9a94e4a3ca36f5bbf4e94fe916865c661b3eabc8e9edf038c3a8eb0fbcbdc
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: '08ed46adf2df0d5d3ec9e6e97e05598bb8e9cdf467b119369427aa0f1aae5174fdac8ef6782845578df2c4f8c202ba0cb21089e7f3d55d09fde590e701cd6644'
|
7
|
+
data.tar.gz: 56b31060bba9d40eeb82e787798c2b7114b2d8869fd9ac8ba68f6cc7f123a534b7b91df17cf06ea5af980b2e6d120f80a3ee394ae9fefdb78a7ec38b9a8f367a
|
data/CHANGELOG.md
CHANGED
@@ -2,6 +2,15 @@ Changelog for the bc-prometheus-ruby gem.
|
|
2
2
|
|
3
3
|
### Pending Release
|
4
4
|
|
5
|
+
### 0.3.0
|
6
|
+
|
7
|
+
- Support for only Ruby 2.6+ going forward
|
8
|
+
- Updated README around custom metrics and collectors
|
9
|
+
- Add ability to pass custom resque and hutch Collectors/TypeCollectors
|
10
|
+
- Add ENV support for all configuration elements
|
11
|
+
- Fix issue where base collector did not use Bigcommerce::Prometheus.client
|
12
|
+
- Expose new `push` method for Collectors::Base to ease use of custom ad hoc metrics
|
13
|
+
|
5
14
|
### 0.2.4
|
6
15
|
|
7
16
|
- Fix cant modify frozen array error when using bc-prometheus-ruby outside a web process
|
data/README.md
CHANGED
@@ -49,6 +49,127 @@ After requiring the main file, you can further configure with:
|
|
49
49
|
| server_port | The port to run the exporter on | 9394 |
|
50
50
|
| process_name | What the current process name is. Used in logging. | `ENV['PROCESS']` |
|
51
51
|
|
52
|
+
## Custom Collectors
|
53
|
+
|
54
|
+
To create custom metrics and collectors, simply create two files: a collector (the class that runs and collects metrics),
|
55
|
+
and the type collector, which runs on the threaded prometheus server and
|
56
|
+
|
57
|
+
### Type Collector
|
58
|
+
|
59
|
+
First, create a type collector. Note that the "type" of this will be the full name of the class, with `TypeCollector`
|
60
|
+
stripped. This is important later. Our example here will have a "type" of "app".
|
61
|
+
|
62
|
+
```ruby
|
63
|
+
class AppTypeCollector < ::Bigcommerce::Prometheus::TypeCollectors::Base
|
64
|
+
def build_metrics
|
65
|
+
{
|
66
|
+
honks: PrometheusExporter::Metric::Counter.new('honks', 'Running counter of honks'),
|
67
|
+
points: PrometheusExporter::Metric::Gauge.new('points', 'Current amount of points')
|
68
|
+
}
|
69
|
+
end
|
70
|
+
|
71
|
+
def collect_metrics(data:, labels: {})
|
72
|
+
metric(:points).observe(data.fetch('points', 0))
|
73
|
+
metric(:honks).observe(1, labels) if data.fetch('honks', 0).to_i.positive?
|
74
|
+
end
|
75
|
+
end
|
76
|
+
```
|
77
|
+
|
78
|
+
There are two important methods here: `build_metrics`, which registers the different metrics you want to measure, and
|
79
|
+
`collect_metrics`, which actually takes in the metrics and prepares them to be rendered so that Prometheus can scrape
|
80
|
+
them.
|
81
|
+
|
82
|
+
Note also in the example the different ways of observing Gauges vs Counters.
|
83
|
+
|
84
|
+
### Collector
|
85
|
+
|
86
|
+
Next, create a collector. Your "type" of the Collector must match the type collector above, so that bc-prometheus-ruby
|
87
|
+
knows how to map the metrics to the right TypeCollector. This is inferred from the class name. Here, it is "app":
|
88
|
+
|
89
|
+
```ruby
|
90
|
+
class AppCollector < ::Bigcommerce::Prometheus::Collectors::Base
|
91
|
+
def honk!
|
92
|
+
push(
|
93
|
+
honks: 1,
|
94
|
+
custom_labels: {
|
95
|
+
volume: 'loud'
|
96
|
+
}
|
97
|
+
)
|
98
|
+
end
|
99
|
+
|
100
|
+
def collect(metrics)
|
101
|
+
metrics[:points] = rand(1..100)
|
102
|
+
metrics
|
103
|
+
end
|
104
|
+
end
|
105
|
+
```
|
106
|
+
|
107
|
+
There are two types of metrics here: on-demand, and polled. Let's look at the first:
|
108
|
+
|
109
|
+
#### On-Demand Metrics
|
110
|
+
|
111
|
+
To issue an on-demand metric (usually a counter) that then automatically updates, in your application code, you would
|
112
|
+
then run:
|
113
|
+
|
114
|
+
```ruby
|
115
|
+
app_collector = AppCollector.new
|
116
|
+
app_collector.honk!
|
117
|
+
```
|
118
|
+
|
119
|
+
This will "push" the metrics to our `AppTypeCollector` instance, which will render them as:
|
120
|
+
|
121
|
+
```
|
122
|
+
# HELP ruby_honks Running counter of honks
|
123
|
+
# TYPE ruby_honks counter
|
124
|
+
ruby_honks{volume="loud"} 2
|
125
|
+
```
|
126
|
+
|
127
|
+
As you can see this will respect any custom labels we push in as well.
|
128
|
+
|
129
|
+
### Polling Metrics
|
130
|
+
|
131
|
+
Using our same AppCollector, if you note the `collect` method: this method will run on a 15 second polled basis
|
132
|
+
(the frequency of which is configurable in the initializer of the AppCollector). Here we're just spitting out random
|
133
|
+
points, so it'll look something like this:
|
134
|
+
|
135
|
+
```
|
136
|
+
# HELP ruby_points Current amount of points
|
137
|
+
# TYPE ruby_points gauge
|
138
|
+
ruby_points 42
|
139
|
+
```
|
140
|
+
|
141
|
+
### Registering Our Collectors
|
142
|
+
|
143
|
+
Each different type of integration will need to have the collectors passed into them, where appropriate. For example,
|
144
|
+
if we want these collectors to run on our web, resque, and hutch processes, we'll need to:
|
145
|
+
|
146
|
+
```ruby
|
147
|
+
::Bigcommerce::Prometheus.configure do |c|
|
148
|
+
c.web_collectors = [AppCollector]
|
149
|
+
c.web_type_collectors = [AppTypeCollector.new]
|
150
|
+
c.resque_collectors = [AppCollector]
|
151
|
+
c.resque_type_collectors = [AppTypeCollector.new]
|
152
|
+
c.hutch_collectors = [AppCollector]
|
153
|
+
c.hutch_type_collectors = [AppTypeCollector.new]
|
154
|
+
end
|
155
|
+
```
|
156
|
+
|
157
|
+
#### Custom Server Integrations
|
158
|
+
|
159
|
+
For custom integrations that initialize their own server, you'll need to pass your TypeCollector instance via the
|
160
|
+
`.add_type_collector` method on the prometheus server instance before starting it:
|
161
|
+
|
162
|
+
```ruby
|
163
|
+
server = ::Bigcommerce::Prometheus::Server.new
|
164
|
+
Bigcommerce::Prometheus.web_type_collectors.each do |tc|
|
165
|
+
server.add_type_collector(tc)
|
166
|
+
end
|
167
|
+
|
168
|
+
# and for polling:
|
169
|
+
|
170
|
+
AppCollector.start
|
171
|
+
```
|
172
|
+
|
52
173
|
## License
|
53
174
|
|
54
175
|
Copyright (c) 2019-present, BigCommerce Pty. Ltd. All rights reserved
|
data/bc-prometheus-ruby.gemspec
CHANGED
@@ -31,6 +31,7 @@ Gem::Specification.new do |spec|
|
|
31
31
|
|
32
32
|
spec.files = Dir['README.md', 'CHANGELOG.md', 'CODE_OF_CONDUCT.md', 'lib/**/*', 'bc-prometheus-ruby.gemspec']
|
33
33
|
spec.require_paths = ['lib']
|
34
|
+
spec.required_ruby_version = '>= 2.6'
|
34
35
|
|
35
36
|
spec.add_development_dependency 'rake', '>= 10.0'
|
36
37
|
spec.add_development_dependency 'rspec', '>= 3.8'
|
@@ -24,16 +24,16 @@ module Bigcommerce
|
|
24
24
|
include Singleton
|
25
25
|
include Loggable
|
26
26
|
|
27
|
-
def initialize
|
27
|
+
def initialize(host: nil, port: nil, max_queue_size: nil, thread_sleep: nil, custom_labels: nil, process_name: nil)
|
28
28
|
super(
|
29
|
-
host: Bigcommerce::Prometheus.server_host,
|
30
|
-
port: Bigcommerce::Prometheus.server_port,
|
31
|
-
max_queue_size: Bigcommerce::Prometheus.client_max_queue_size,
|
32
|
-
thread_sleep: Bigcommerce::Prometheus.client_thread_sleep,
|
33
|
-
custom_labels: Bigcommerce::Prometheus.client_custom_labels
|
29
|
+
host: host || Bigcommerce::Prometheus.server_host,
|
30
|
+
port: port || Bigcommerce::Prometheus.server_port,
|
31
|
+
max_queue_size: max_queue_size || Bigcommerce::Prometheus.client_max_queue_size,
|
32
|
+
thread_sleep: thread_sleep || Bigcommerce::Prometheus.client_thread_sleep,
|
33
|
+
custom_labels: custom_labels || Bigcommerce::Prometheus.client_custom_labels
|
34
34
|
)
|
35
35
|
PrometheusExporter::Client.default = self
|
36
|
-
@process_name = ::Bigcommerce::Prometheus.process_name
|
36
|
+
@process_name = process_name || ::Bigcommerce::Prometheus.process_name
|
37
37
|
end
|
38
38
|
|
39
39
|
##
|
@@ -55,7 +55,7 @@ module Bigcommerce
|
|
55
55
|
|
56
56
|
##
|
57
57
|
# @param [String] path
|
58
|
-
# @return [URI]
|
58
|
+
# @return [Module<URI>]
|
59
59
|
#
|
60
60
|
def uri_path(path)
|
61
61
|
URI("http://#{@host}:#{@port}#{path}")
|
@@ -49,15 +49,15 @@ module Bigcommerce
|
|
49
49
|
end
|
50
50
|
|
51
51
|
##
|
52
|
-
# @param [
|
52
|
+
# @param [Bigcommerce::Prometheus::Client] client
|
53
53
|
# @param [String] type
|
54
54
|
# @param [Integer] frequency
|
55
55
|
# @param [Hash] options
|
56
56
|
#
|
57
57
|
def initialize(client: nil, type: nil, frequency: nil, options: nil)
|
58
|
-
@client = client ||
|
58
|
+
@client = client || Bigcommerce::Prometheus.client
|
59
59
|
@type = type || self.class.to_s.downcase.gsub('::', '_').gsub('collector', '')
|
60
|
-
@frequency = frequency ||
|
60
|
+
@frequency = frequency || Bigcommerce::Prometheus.collector_collection_frequency
|
61
61
|
@options = options || {}
|
62
62
|
@logger = Bigcommerce::Prometheus.logger
|
63
63
|
end
|
@@ -66,12 +66,9 @@ module Bigcommerce
|
|
66
66
|
# Run the collector and send stats
|
67
67
|
#
|
68
68
|
def run
|
69
|
-
metrics = {
|
69
|
+
metrics = {}
|
70
70
|
metrics = collect(metrics)
|
71
|
-
|
72
|
-
@client.send_json(metrics)
|
73
|
-
rescue StandardError => e
|
74
|
-
@logger.error("Prometheus Exporter Failed To Collect #{@type} Stats #{e}")
|
71
|
+
push(metrics)
|
75
72
|
ensure
|
76
73
|
sleep @frequency
|
77
74
|
end
|
@@ -85,6 +82,19 @@ module Bigcommerce
|
|
85
82
|
def collect(metrics = {})
|
86
83
|
metrics
|
87
84
|
end
|
85
|
+
|
86
|
+
private
|
87
|
+
|
88
|
+
##
|
89
|
+
# @param [Hash] metric
|
90
|
+
#
|
91
|
+
def push(metric)
|
92
|
+
metric[:type] = @type unless metric.key?(:type)
|
93
|
+
@logger.debug("[bigcommerce-prometheus] Pushing #{metric[:type]} metrics to type collector: #{metric.inspect}")
|
94
|
+
@client.send_json(metric)
|
95
|
+
rescue StandardError => e
|
96
|
+
@logger.error("[bigcommerce-prometheus] Prometheus Exporter failed to send #{metric[:type]} stats to type collector #{e}")
|
97
|
+
end
|
88
98
|
end
|
89
99
|
end
|
90
100
|
end
|
@@ -23,18 +23,32 @@ module Bigcommerce
|
|
23
23
|
module Configuration
|
24
24
|
VALID_CONFIG_KEYS = {
|
25
25
|
logger: nil,
|
26
|
+
enabled: ENV.fetch('PROMETHEUS_ENABLED', 1).to_i.positive?,
|
27
|
+
|
28
|
+
# Client configuration
|
26
29
|
client_custom_labels: nil,
|
27
|
-
client_max_queue_size: 10_000,
|
28
|
-
client_thread_sleep: 0.5,
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
30
|
+
client_max_queue_size: ENV.fetch('PROMETHEUS_CLIENT_MAX_QUEUE_SIZE', 10_000).to_i,
|
31
|
+
client_thread_sleep: ENV.fetch('PROMETHEUS_CLIENT_THREAD_SLEEP', 0.5).to_f,
|
32
|
+
|
33
|
+
# Integration configuration
|
34
|
+
puma_collection_frequency: ENV.fetch('PROMETHEUS_PUMA_COLLECTION_FREQUENCY', 30).to_i,
|
35
|
+
puma_process_label: ENV.fetch('PROMETHEUS_PUMA_PROCESS_LABEL', 'web').to_s,
|
36
|
+
resque_collection_frequency: ENV.fetch('PROMETHEUS_RESQUE_COLLECTION_FREQUENCY', 30).to_i,
|
37
|
+
resque_process_label: ENV.fetch('PROMETHEUS_REQUEST_PROCESS_LABEL', 'resque').to_s,
|
38
|
+
|
39
|
+
# Server configuration
|
40
|
+
not_found_body: ENV.fetch('PROMETHEUS_SERVER_NOT_FOUND_BODY', 'Not Found! The Prometheus Ruby Exporter only listens on /metrics and /send-metrics').to_s,
|
41
|
+
server_host: ENV.fetch('PROMETHEUS_SERVER_HOST', '0.0.0.0').to_s,
|
42
|
+
server_port: ENV.fetch('PROMETHEUS_SERVER_PORT', PrometheusExporter::DEFAULT_PORT).to_i,
|
43
|
+
server_timeout: ENV.fetch('PROMETHEUS_DEFAULT_TIMEOUT', PrometheusExporter::DEFAULT_TIMEOUT).to_i,
|
44
|
+
server_prefix: ENV.fetch('PROMETHEUS_DEFAULT_PREFIX', PrometheusExporter::DEFAULT_PREFIX).to_s,
|
45
|
+
|
46
|
+
# Custom collector configuration
|
47
|
+
collector_collection_frequency: ENV.fetch('PROMETHEUS_DEFAULT_COLLECTOR_COLLECTION_FREQUENCY_SEC', 15).to_i,
|
48
|
+
hutch_collectors: [],
|
49
|
+
hutch_type_collectors: [],
|
50
|
+
resque_collectors: [],
|
51
|
+
resque_type_collectors: [],
|
38
52
|
web_collectors: [],
|
39
53
|
web_type_collectors: []
|
40
54
|
}.freeze
|
@@ -85,12 +99,7 @@ module Bigcommerce
|
|
85
99
|
send("#{k}=".to_sym, v)
|
86
100
|
end
|
87
101
|
determine_logger
|
88
|
-
self.enabled = ENV.fetch('PROMETHEUS_ENABLED', 1).to_i.positive?
|
89
|
-
self.server_host = ENV.fetch('PROMETHEUS_SERVER_HOST', '0.0.0.0').to_s
|
90
|
-
self.server_port = ENV.fetch('PROMETHEUS_SERVER_PORT', PrometheusExporter::DEFAULT_PORT).to_i
|
91
102
|
|
92
|
-
self.puma_process_label = ENV.fetch('PROMETHEUS_PUMA_PROCESS_LABEL', 'web').to_s
|
93
|
-
self.puma_collection_frequency = ENV.fetch('PROMETHEUS_PUMA_COLLECTION_FREQUENCY', 30).to_i
|
94
103
|
self.web_type_collectors = []
|
95
104
|
end
|
96
105
|
|
@@ -31,6 +31,8 @@ module Bigcommerce
|
|
31
31
|
@server_port = Bigcommerce::Prometheus.server_port
|
32
32
|
@server_timeout = Bigcommerce::Prometheus.server_timeout
|
33
33
|
@server_prefix = Bigcommerce::Prometheus.server_prefix
|
34
|
+
@collectors = Bigcommerce::Prometheus.hutch_collectors || []
|
35
|
+
@type_collectors = Bigcommerce::Prometheus.hutch_type_collectors || []
|
34
36
|
end
|
35
37
|
|
36
38
|
##
|
@@ -44,6 +46,9 @@ module Bigcommerce
|
|
44
46
|
|
45
47
|
server.add_type_collector(PrometheusExporter::Server::ActiveRecordCollector.new)
|
46
48
|
server.add_type_collector(PrometheusExporter::Server::HutchCollector.new)
|
49
|
+
@type_collectors.each do |tc|
|
50
|
+
server.add_type_collector(tc)
|
51
|
+
end
|
47
52
|
server.start
|
48
53
|
setup_middleware
|
49
54
|
rescue StandardError => e
|
@@ -65,6 +70,9 @@ module Bigcommerce
|
|
65
70
|
require 'hutch'
|
66
71
|
::Hutch::Config.set(:tracer, PrometheusExporter::Instrumentation::Hutch)
|
67
72
|
@app.middleware.unshift(PrometheusExporter::Middleware, client: Bigcommerce::Prometheus.client)
|
73
|
+
@collectors.each(&:start)
|
74
|
+
rescue StandardError => e
|
75
|
+
logger.warn "[bigcommerce-prometheus][#{@process_name}] Failed to setup hutch prometheus middleware: #{e.message}"
|
68
76
|
end
|
69
77
|
end
|
70
78
|
end
|
@@ -31,6 +31,8 @@ module Bigcommerce
|
|
31
31
|
@server_port = Bigcommerce::Prometheus.server_port
|
32
32
|
@server_timeout = Bigcommerce::Prometheus.server_timeout
|
33
33
|
@server_prefix = Bigcommerce::Prometheus.server_prefix
|
34
|
+
@collectors = Bigcommerce::Prometheus.resque_collectors || []
|
35
|
+
@type_collectors = Bigcommerce::Prometheus.resque_type_collectors || []
|
34
36
|
end
|
35
37
|
|
36
38
|
##
|
@@ -44,6 +46,9 @@ module Bigcommerce
|
|
44
46
|
|
45
47
|
server.add_type_collector(PrometheusExporter::Server::ActiveRecordCollector.new)
|
46
48
|
server.add_type_collector(Bigcommerce::Prometheus::TypeCollectors::Resque.new)
|
49
|
+
@type_collectors.each do |tc|
|
50
|
+
server.add_type_collector(tc)
|
51
|
+
end
|
47
52
|
server.start
|
48
53
|
setup_middleware
|
49
54
|
rescue StandardError => e
|
@@ -63,7 +68,8 @@ module Bigcommerce
|
|
63
68
|
def setup_middleware
|
64
69
|
logger.info "[bigcommerce-prometheus][#{@process_name}] Setting up resque prometheus middleware"
|
65
70
|
::Resque.before_first_fork do
|
66
|
-
::Bigcommerce::Prometheus::Integrations::Resque.start
|
71
|
+
::Bigcommerce::Prometheus::Integrations::Resque.start(client: Bigcommerce::Prometheus.client)
|
72
|
+
@collectors.each(&:start)
|
67
73
|
end
|
68
74
|
end
|
69
75
|
end
|
@@ -77,7 +77,7 @@ module Bigcommerce
|
|
77
77
|
def setup_after_fork
|
78
78
|
@app.config.after_fork_callbacks = [] unless @app.config.after_fork_callbacks
|
79
79
|
@app.config.after_fork_callbacks << lambda do
|
80
|
-
::Bigcommerce::Prometheus::Integrations::Puma.start
|
80
|
+
::Bigcommerce::Prometheus::Integrations::Puma.start(client: Bigcommerce::Prometheus.client)
|
81
81
|
@collectors.each(&:start)
|
82
82
|
end
|
83
83
|
end
|
@@ -25,13 +25,13 @@ module Bigcommerce
|
|
25
25
|
##
|
26
26
|
# Start the resque integration
|
27
27
|
#
|
28
|
-
def self.start
|
28
|
+
def self.start(client: nil)
|
29
29
|
::PrometheusExporter::Instrumentation::Process.start(
|
30
|
-
client: ::Bigcommerce::Prometheus.client,
|
30
|
+
client: client || ::Bigcommerce::Prometheus.client,
|
31
31
|
type: ::Bigcommerce::Prometheus.resque_process_label
|
32
32
|
)
|
33
33
|
::Bigcommerce::Prometheus::Collectors::Resque.start(
|
34
|
-
client: ::Bigcommerce::Prometheus.client,
|
34
|
+
client: client || ::Bigcommerce::Prometheus.client,
|
35
35
|
frequency: ::Bigcommerce::Prometheus.resque_collection_frequency
|
36
36
|
)
|
37
37
|
end
|
@@ -26,7 +26,7 @@ module Bigcommerce
|
|
26
26
|
class NotFoundController < BaseController
|
27
27
|
def call
|
28
28
|
@response.status = 404
|
29
|
-
@response.body <<
|
29
|
+
@response.body << Bigcommerce::Prometheus.not_found_body
|
30
30
|
end
|
31
31
|
end
|
32
32
|
end
|
@@ -24,9 +24,9 @@ module Bigcommerce
|
|
24
24
|
#
|
25
25
|
class Server < ::Thin::Server
|
26
26
|
def initialize(port:, host: nil, timeout: nil, logger: nil)
|
27
|
-
@port = port || ::
|
28
|
-
@host = host ||
|
29
|
-
@timeout = timeout || ::
|
27
|
+
@port = port || ::Bigcommerce::Prometheus.server_port
|
28
|
+
@host = host || ::Bigcommerce::Prometheus.server_host
|
29
|
+
@timeout = timeout || ::Bigcommerce::Prometheus.server_timeout
|
30
30
|
@logger = logger || ::Bigcommerce::Prometheus.logger
|
31
31
|
@rack_app = ::Bigcommerce::Prometheus::Servers::Thin::RackApp.new(timeout: timeout, logger: logger)
|
32
32
|
super(@host, @port, @rack_app)
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: bc-prometheus-ruby
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Shaun McCormick
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-04-
|
11
|
+
date: 2020-04-24 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake
|
@@ -211,7 +211,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
211
211
|
requirements:
|
212
212
|
- - ">="
|
213
213
|
- !ruby/object:Gem::Version
|
214
|
-
version: '
|
214
|
+
version: '2.6'
|
215
215
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
216
216
|
requirements:
|
217
217
|
- - ">="
|