hanami-events-cloud_pubsub 2.5.1 → 2.6.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: 338f493e08b2982228b7546e10c18452d48f451e88a96f34fbf36778d003b5bb
4
- data.tar.gz: 647128eda207a71c1269dd6a3ac7581fa2f2655eb8960d2f9e6bffab52a1d274
3
+ metadata.gz: 753a636d5e7a7f4e76eb1865278d0979ad5d338c0c5283f7b22c11a491a42f92
4
+ data.tar.gz: 43ba31f43a4b5255d10c4682e9859d14d9f79c9d4036786bd947bf1faa77d042
5
5
  SHA512:
6
- metadata.gz: 59c6d32caa054e83dfe743c0df16e47c2394bb8caefc03d5e6632a5f4477cd9c669e642affc3f41fab0cb76249ca4676abe673a2daf61b4be1f207550a59902a
7
- data.tar.gz: 6e29e8a65c31ef38bef0d7ef7b871dc99025d135ce57fcf1a9cf6b3eee896f133710b8bf5f918b05ad8c864ae632d205b194a52cc5af974f14c3df863f4bf332
6
+ metadata.gz: d1ae226d26f497f50c447784421861e45d99b59624149cecc224d4f6ae9bf2e74f54c9438cfb2ed33c55ab938f4d12913200025d1c40a4b0518d8305ea089762
7
+ data.tar.gz: a1a1b64ca8dc346484a699a78508e92b9057ee14d599f1097bf9b84defee04e4af35c59aa039ad30659894d0395d890c490725e4989744a39c936525362fbfd2
data/.rubocop.yml CHANGED
@@ -4,7 +4,7 @@ inherit_from: .rubocop_todo.yml
4
4
  AllCops:
5
5
  Exclude:
6
6
  - bin/*
7
- TargetRubyVersion: 2.3
7
+ TargetRubyVersion: 2.4
8
8
 
9
9
  Metrics/BlockLength:
10
10
  Exclude:
data/.tool-versions CHANGED
@@ -1 +1 @@
1
- ruby 2.6.5
1
+ ruby 2.6.6
data/Gemfile.lock CHANGED
@@ -8,11 +8,12 @@ GIT
8
8
  PATH
9
9
  remote: .
10
10
  specs:
11
- hanami-events-cloud_pubsub (2.5.1)
11
+ hanami-events-cloud_pubsub (2.6.0)
12
12
  dry-configurable (>= 0.8)
13
13
  google-cloud-pubsub (>= 0.38.1, < 1.4)
14
14
  hanami-cli (~> 0.2)
15
15
  hanami-events (~> 0.2.0)
16
+ rack
16
17
 
17
18
  GEM
18
19
  remote: https://rubygems.org/
@@ -24,7 +25,7 @@ GEM
24
25
  concurrent-ruby (1.1.6)
25
26
  diff-lcs (1.3)
26
27
  docile (1.3.2)
27
- dry-configurable (0.11.2)
28
+ dry-configurable (0.11.5)
28
29
  concurrent-ruby (~> 1.0)
29
30
  dry-core (~> 0.4, >= 0.4.7)
30
31
  dry-equalizer (~> 0.2)
@@ -34,13 +35,13 @@ GEM
34
35
  dry-core (0.4.9)
35
36
  concurrent-ruby (~> 1.0)
36
37
  dry-equalizer (0.3.0)
37
- faraday (0.17.3)
38
+ faraday (1.0.1)
38
39
  multipart-post (>= 1.2, < 3)
39
40
  google-cloud-core (1.5.0)
40
41
  google-cloud-env (~> 1.0)
41
42
  google-cloud-errors (~> 1.0)
42
- google-cloud-env (1.3.0)
43
- faraday (~> 0.11)
43
+ google-cloud-env (1.3.1)
44
+ faraday (>= 0.17.3, < 2.0)
44
45
  google-cloud-errors (1.0.0)
45
46
  google-cloud-pubsub (1.3.1)
46
47
  concurrent-ruby (~> 1.1)
@@ -56,25 +57,26 @@ GEM
56
57
  grpc (~> 1.24)
57
58
  rly (~> 0.2.3)
58
59
  google-protobuf (3.11.4)
59
- googleapis-common-protos (1.3.9)
60
- google-protobuf (~> 3.0)
61
- googleapis-common-protos-types (~> 1.0)
62
- grpc (~> 1.0)
63
- googleapis-common-protos-types (1.0.4)
64
- google-protobuf (~> 3.0)
65
- googleauth (0.10.0)
66
- faraday (~> 0.12)
60
+ googleapis-common-protos (1.3.10)
61
+ google-protobuf (~> 3.11)
62
+ googleapis-common-protos-types (>= 1.0.5, < 2.0)
63
+ grpc (~> 1.27)
64
+ googleapis-common-protos-types (1.0.5)
65
+ google-protobuf (~> 3.11)
66
+ googleauth (0.12.0)
67
+ faraday (>= 0.17.3, < 2.0)
67
68
  jwt (>= 1.4, < 3.0)
68
69
  memoist (~> 0.16)
69
70
  multi_json (~> 1.11)
70
71
  os (>= 0.9, < 2.0)
71
- signet (~> 0.12)
72
- grpc (1.27.0)
72
+ signet (~> 0.14)
73
+ grpc (1.28.0)
73
74
  google-protobuf (~> 3.11)
74
75
  googleapis-common-protos-types (~> 1.0)
75
- grpc-google-iam-v1 (0.6.9)
76
- googleapis-common-protos (>= 1.3.1, < 2.0)
77
- grpc (~> 1.0)
76
+ grpc-google-iam-v1 (0.6.10)
77
+ google-protobuf (~> 3.11)
78
+ googleapis-common-protos (>= 1.3.10, < 2.0)
79
+ grpc (~> 1.27)
78
80
  hanami-cli (0.3.1)
79
81
  concurrent-ruby (~> 1.0)
80
82
  hanami-utils (~> 1.3)
@@ -84,17 +86,19 @@ GEM
84
86
  jaro_winkler (1.5.4)
85
87
  jwt (2.2.1)
86
88
  memoist (0.16.2)
87
- method_source (0.9.2)
89
+ method_source (1.0.0)
88
90
  multi_json (1.14.1)
89
91
  multipart-post (2.1.1)
90
- os (1.0.1)
92
+ os (1.1.0)
91
93
  parallel (1.19.1)
92
- parser (2.7.0.2)
94
+ parser (2.7.1.1)
93
95
  ast (~> 2.4.0)
94
- pry (0.12.2)
95
- coderay (~> 1.1.0)
96
- method_source (~> 0.9.0)
97
- public_suffix (4.0.3)
96
+ prometheus-client (2.0.0)
97
+ pry (0.13.1)
98
+ coderay (~> 1.1)
99
+ method_source (~> 1.0)
100
+ public_suffix (4.0.4)
101
+ rack (2.2.2)
98
102
  rainbow (3.0.0)
99
103
  rake (13.0.1)
100
104
  rexml (3.2.4)
@@ -105,33 +109,33 @@ GEM
105
109
  rspec-mocks (~> 3.9.0)
106
110
  rspec-core (3.9.1)
107
111
  rspec-support (~> 3.9.1)
108
- rspec-expectations (3.9.0)
112
+ rspec-expectations (3.9.1)
109
113
  diff-lcs (>= 1.2.0, < 2.0)
110
114
  rspec-support (~> 3.9.0)
111
115
  rspec-mocks (3.9.1)
112
116
  diff-lcs (>= 1.2.0, < 2.0)
113
117
  rspec-support (~> 3.9.0)
114
118
  rspec-support (3.9.2)
115
- rubocop (0.80.0)
119
+ rubocop (0.82.0)
116
120
  jaro_winkler (~> 1.5.1)
117
121
  parallel (~> 1.10)
118
122
  parser (>= 2.7.0.1)
119
123
  rainbow (>= 2.2.2, < 4.0)
120
124
  rexml
121
125
  ruby-progressbar (~> 1.7)
122
- unicode-display_width (>= 1.4.0, < 1.7)
126
+ unicode-display_width (>= 1.4.0, < 2.0)
123
127
  ruby-progressbar (1.10.1)
124
- signet (0.12.0)
128
+ signet (0.14.0)
125
129
  addressable (~> 2.3)
126
- faraday (~> 0.9)
130
+ faraday (>= 0.17.3, < 2.0)
127
131
  jwt (>= 1.5, < 3.0)
128
132
  multi_json (~> 1.10)
129
- simplecov (0.18.2)
133
+ simplecov (0.18.5)
130
134
  docile (~> 1.1)
131
135
  simplecov-html (~> 0.11)
132
- simplecov-html (0.12.0)
136
+ simplecov-html (0.12.2)
133
137
  transproc (1.1.1)
134
- unicode-display_width (1.6.1)
138
+ unicode-display_width (1.7.0)
135
139
 
136
140
  PLATFORMS
137
141
  ruby
@@ -140,6 +144,7 @@ DEPENDENCIES
140
144
  bundler (~> 1.16)
141
145
  hanami-events!
142
146
  hanami-events-cloud_pubsub!
147
+ prometheus-client
143
148
  pry
144
149
  rake (~> 13.0)
145
150
  rspec (~> 3.0)
@@ -147,4 +152,4 @@ DEPENDENCIES
147
152
  simplecov
148
153
 
149
154
  BUNDLED WITH
150
- 1.17.2
155
+ 1.17.3
data/README.md CHANGED
@@ -106,6 +106,13 @@ Then, run the worker process:
106
106
  bundle exec cloudpubsub run
107
107
  ```
108
108
 
109
+ # Prometheus Integration
110
+
111
+ If you have the `prometheus-client` gem installed, a `/metrics` endpoint will
112
+ be available on the health check server which can be scraped.
113
+
114
+ All you need to do to activate this is to make sure to `require 'prometheus/client'`.
115
+
109
116
  # Testing
110
117
 
111
118
  If you would like to use an emulator process for testing:
@@ -26,8 +26,10 @@ Gem::Specification.new do |spec|
26
26
  spec.add_dependency 'google-cloud-pubsub', '>= 0.38.1', '< 1.4'
27
27
  spec.add_dependency 'hanami-cli', '~> 0.2'
28
28
  spec.add_dependency 'hanami-events', '~> 0.2.0'
29
+ spec.add_dependency 'rack'
29
30
 
30
31
  spec.add_development_dependency 'bundler', '~> 1.16'
32
+ spec.add_development_dependency 'prometheus-client'
31
33
  spec.add_development_dependency 'rake', '~> 13.0'
32
34
  spec.add_development_dependency 'rspec', '~> 3.0'
33
35
  end
@@ -14,18 +14,18 @@ module Hanami
14
14
 
15
15
  def start
16
16
  logger.info 'Starting healthcheck server on port 0.0.0.0:8081'
17
- server.start
17
+ start_server
18
18
  end
19
19
 
20
20
  def shutdown
21
21
  logger.info 'Shutting down healthcheck server'
22
- server.shutdown
22
+ @server.shutdown
23
23
  end
24
24
 
25
25
  def run_in_background(on_shutdown: nil)
26
26
  prom = Concurrent::Promise.execute do
27
27
  start
28
- on_shutdown&.call(server)
28
+ on_shutdown&.call(@server)
29
29
  end
30
30
 
31
31
  prom.catch { |err| logger.error(err) }
@@ -35,22 +35,38 @@ module Hanami
35
35
 
36
36
  attr_reader :logger, :runner
37
37
 
38
- def server
39
- @server ||=
40
- WEBrick::HTTPServer.new(
41
- Port: 8081,
42
- BindAddress: '0.0.0.0',
43
- Logger: WEBrick::Log.new('/dev/null'),
44
- AccessLog: []
45
- ).tap do |srv|
46
- srv.mount_proc '/', method(:health_endpoint)
38
+ def start_server
39
+ require 'rack'
40
+
41
+ Rack::Handler::WEBrick.run(
42
+ rack_app,
43
+ AccessLog: [],
44
+ Host: '0.0.0.0',
45
+ Port: 8081,
46
+ Logger: WEBrick::Log.new('/dev/null')
47
+ ) do |server|
48
+ @server = server
49
+ end
50
+ end
51
+
52
+ def rack_app
53
+ health_endpoint_app = method(:health_endpoint)
54
+
55
+ Rack::Builder.new do |builder|
56
+ builder.use Rack::Deflater
57
+ if defined?(::Prometheus::Client)
58
+ require 'prometheus/middleware/exporter'
59
+ builder.use ::Prometheus::Middleware::Exporter
47
60
  end
61
+ builder.run health_endpoint_app
62
+ end
48
63
  end
49
64
 
50
- def health_endpoint(_req, res)
51
- res['Content-Type'] = 'text/plain'
52
- res.status = runner.healthy? ? 200 : 503
53
- res.body = runner.debug_info
65
+ def health_endpoint(_env)
66
+ headers = { 'Content-Type' => 'text/plain' }
67
+ status = runner.healthy? ? 200 : 503
68
+ body = [runner.debug_info]
69
+ [status, headers, body]
54
70
  end
55
71
  end
56
72
  end
@@ -0,0 +1,32 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Hanami
4
+ module Events
5
+ module CloudPubsub
6
+ module Middleware
7
+ # Middleware used for logging useful information about an event
8
+ class Prometheus
9
+ attr_reader :events_counter
10
+
11
+ def initialize
12
+ require 'prometheus/client'
13
+ prometheus = ::Prometheus::Client.registry
14
+ @events_counter = prometheus.counter(
15
+ :pubsub_events,
16
+ docstring: 'A counter of received pubsub events',
17
+ labels: %i[event_name subscription]
18
+ )
19
+ end
20
+
21
+ def call(msg, opts = {})
22
+ yield(opts)
23
+ ensure
24
+ sub = msg.subscription.subscriber.subscription_name
25
+ event_name = msg.attributes['event_name']
26
+ events_counter.increment(labels: { event_name: event_name, subscription: sub })
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
@@ -3,7 +3,7 @@
3
3
  module Hanami
4
4
  module Events
5
5
  module CloudPubsub
6
- VERSION = '2.5.1'
6
+ VERSION = '2.6.0'
7
7
  end
8
8
  end
9
9
  end
@@ -6,6 +6,7 @@ require 'hanami/events/cloud_pubsub/version'
6
6
  require 'hanami/events/cloud_pubsub/middleware/stack'
7
7
  require 'hanami/events/cloud_pubsub/middleware/logging'
8
8
  require 'hanami/events/cloud_pubsub/middleware/auto_retry'
9
+ require 'hanami/events/cloud_pubsub/middleware/prometheus'
9
10
  require 'hanami/events/cloud_pubsub/runner'
10
11
  require 'hanami/events/cloud_pubsub/errors'
11
12
  require 'google/cloud/pubsub'
@@ -57,11 +58,15 @@ module Hanami
57
58
  end
58
59
  ], reader: true
59
60
 
60
- setting :middleware, Middleware::Stack.new(
61
+ middleware_stack = Middleware::Stack.new(
61
62
  Middleware::Logging.new,
62
63
  Middleware::AutoRetry.new
63
64
  )
64
65
 
66
+ middleware_stack.prepend(Middleware::Prometheus) if defined?(::Prometheus::Client)
67
+
68
+ setting :middleware, middleware_stack
69
+
65
70
  setting :on_shutdown_handlers, [], reader: true
66
71
 
67
72
  def self.finalize_settings!
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hanami-events-cloud_pubsub
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.5.1
4
+ version: 2.6.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ian Ker-Seymer
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-02-20 00:00:00.000000000 Z
11
+ date: 2020-04-27 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: dry-configurable
@@ -72,6 +72,20 @@ dependencies:
72
72
  - - "~>"
73
73
  - !ruby/object:Gem::Version
74
74
  version: 0.2.0
75
+ - !ruby/object:Gem::Dependency
76
+ name: rack
77
+ requirement: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - ">="
80
+ - !ruby/object:Gem::Version
81
+ version: '0'
82
+ type: :runtime
83
+ prerelease: false
84
+ version_requirements: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - ">="
87
+ - !ruby/object:Gem::Version
88
+ version: '0'
75
89
  - !ruby/object:Gem::Dependency
76
90
  name: bundler
77
91
  requirement: !ruby/object:Gem::Requirement
@@ -86,6 +100,20 @@ dependencies:
86
100
  - - "~>"
87
101
  - !ruby/object:Gem::Version
88
102
  version: '1.16'
103
+ - !ruby/object:Gem::Dependency
104
+ name: prometheus-client
105
+ requirement: !ruby/object:Gem::Requirement
106
+ requirements:
107
+ - - ">="
108
+ - !ruby/object:Gem::Version
109
+ version: '0'
110
+ type: :development
111
+ prerelease: false
112
+ version_requirements: !ruby/object:Gem::Requirement
113
+ requirements:
114
+ - - ">="
115
+ - !ruby/object:Gem::Version
116
+ version: '0'
89
117
  - !ruby/object:Gem::Dependency
90
118
  name: rake
91
119
  requirement: !ruby/object:Gem::Requirement
@@ -152,6 +180,7 @@ files:
152
180
  - lib/hanami/events/cloud_pubsub/listener.rb
153
181
  - lib/hanami/events/cloud_pubsub/middleware/auto_retry.rb
154
182
  - lib/hanami/events/cloud_pubsub/middleware/logging.rb
183
+ - lib/hanami/events/cloud_pubsub/middleware/prometheus.rb
155
184
  - lib/hanami/events/cloud_pubsub/middleware/stack.rb
156
185
  - lib/hanami/events/cloud_pubsub/register.rb
157
186
  - lib/hanami/events/cloud_pubsub/runner.rb