tpt-rails 1.6.0 → 1.6.4

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: 300608f90255d2884190ff472e70781927269af457bf549d57443edc396186ca
4
- data.tar.gz: 5dd5a558b911dd7dae7486f0984ddeac4fa8c05d5d3407e5ef269d64fe7a3e4c
3
+ metadata.gz: 0f941f7fce901677f655f42b56d87869e4dde19545e0547ba27d54ff1875604d
4
+ data.tar.gz: 79f31a854f4b9baea66dbf5d45e85332426e2061350e66cd3ad770195743e9d8
5
5
  SHA512:
6
- metadata.gz: 849e1766a9d4a6668516bb1d52d313e375bd823d2723668fb9917c218e79444e71400803cfecdea4f4ec7f8521832fea4c962d36af814b93fe1d4735e228d3c0
7
- data.tar.gz: 7865a91a0e8b6553647ee022d84617aad7ef590c5e9fce5f64ea30eeeb25f7dd60ea0f71ea28702cad0f0eed20f02cd588467c657edb4610bd679437e2a63784
6
+ metadata.gz: d7132817e8d53a875af5d13f74b1b8c8dba725aaac5b8bad18615e15342c4ca5615002226c5d8cb250bc3dd8423da5b019c13013a9f82ca9b3b1afcbf48c6e15
7
+ data.tar.gz: 4aaf53023b9a035e0a13f65b380c2f9046718667d73f7663c935674c21165e77c2402f2f79c6bb15f7a1c9d5139988b25a84fb8b8bd7396998eada8090bc022c
data/README.md CHANGED
@@ -68,25 +68,53 @@ See the documentation in [lib/tpt/rails.rb](lib/tpt/rails.rb).
68
68
 
69
69
  `Tpt::Rails::EventBridgePublisher` is the class used to emit events to EventBridge (in batches). To use:
70
70
 
71
- 1. In an initializer, pass in the `Datadog::Statsd` object you're using to the class method ::set_metrics.
72
- (Failure to do so will result in an error.) When testing, you can pass in a local Statsd, eg:
71
+ 1. Add EventBridge to your gemfile:
73
72
 
74
73
  ```ruby
75
- Tpt::Rails::EventBridgePublisher.set_metrics(
76
- Datadog::Statsd.new('localhost', 8125)
77
- )
74
+ gem "aws-sdk-eventbridge", "~> 1.3.0"
78
75
  ```
79
76
 
80
- 2. By default (#new with no arguments) EventBridgePublisher will try to use the following environment
77
+ 2. Instantiate with
78
+
79
+ ```ruby
80
+ Tpt::Rails::EventBridgePublisher.new
81
+ ```
82
+
83
+ 3. By default (#new with no arguments) EventBridgePublisher will try to use the following environment
81
84
  variables: `AWS_ACCESS_KEY_ID`, `AWS_SECRET_ACCESS_KEY`, `TPT_EVENT_SOURCE`, `TPT_SHARED_EVENT_BUS_NAME`.
82
85
 
83
86
  Additional configuration can be set as part of the constructor;
84
- [see event_bridge_publisher.rb implementation](https://github.com/TeachersPayTeachers/tpt-rails/blob/ad768d3bac0c8bd28e60a48a89aed36f01c4e17b/app/models/tpt/rails/event_bridge_publisher.rb) for more details.
87
+ [see event_bridge_publisher.rb implementation](https://github.com/TeachersPayTeachers/tpt-rails/blob/master/app/models/tpt/rails/event_bridge_publisher.rb) for more details.
85
88
 
86
- 3. Create events by instantiating or inheriting from `Tpt::Rails::ApplicationEvent`. Event types are derived from the text before
89
+ 4. Create events by instantiating or inheriting from `Tpt::Rails::ApplicationEvent`. Event types are derived from the text before
87
90
  "Event", so ResourceEvent has the event_type "Resource". Pass in an event or an array of events to EventBridgePublisher#publish
88
91
  and they will be published immediately. Large arrays will be batched (default 10 per batch).
89
92
 
93
+ 5. EventBridgePublisher uses Tpt::Rails.statsd as its datadog instance by default. If you want to change that behavior, call `Tpt::Rails::EventBridgePublisher.set_metrics`
94
+ with the statsd you want to use inside an initializer, as part of a `reloader.to_prepare` call:
95
+
96
+ ```ruby
97
+ Rails.application.reloader.to_prepare do
98
+ Tpt::Rails::EventBridgePublisher.set_metrics(
99
+ # your statsd here
100
+ )
101
+ end
102
+ ```
103
+
104
+ You can also do this when testing by using the default test publisher (see below).
105
+
106
+ ### EventBridge Testing
107
+
108
+ 1. To create a ready-made test publisher, use
109
+
110
+ ```ruby
111
+ Tpt::Rails::EventBridgeTestHelper.publisher
112
+ ```
113
+
114
+ This method accepts two parameters, batch_size and stub_responses. [See implementation docs](https://github.com/TeachersPayTeachers/tpt-rails/blob/master/app/helpers/tpt/rails/event_bridge_test_helper.rb) for more details.
115
+
116
+ 2. The test publisher overwrites statsd that EventBridgePublisher uses to be a dummy statsd when called.
117
+
90
118
  ### Error reporting (e.g. Bugsnag/Rollbar)
91
119
 
92
120
  If you configure `rollbar_access_token` & `rollbar_enabled`, or `bugsnag_api_key` then your project
@@ -0,0 +1,27 @@
1
+ module Tpt::Rails
2
+ module EventBridgeTestHelper
3
+ ###
4
+ # @description: Instantiates an EventBridgePublisher ready for testing. AWS and DataDog info is faked. Note that this sets the
5
+ # metrics object for the class to be a stub. The AWS EventBridge gem will never actually be called as the gem's
6
+ # #put_events method is replaced with a stub.
7
+ # @param {batch_size}: The number of events to send per batch.
8
+ # @param {stub_responses}: Responses to stub, eg. { put_events: { failed_entry_count: 0, entries: [{ event_id: "1" }, { event_id: "2" }] } }
9
+ # @return {EventBridgePublisher}: The EventBridgePublisher object.
10
+ ###
11
+ def self.publisher(batch_size: 10, stub_responses: {})
12
+ Tpt::Rails::EventBridgePublisher.set_metrics(
13
+ Datadog::Statsd.new('localhost', 8125)
14
+ )
15
+
16
+ Tpt::Rails::EventBridgePublisher.new(
17
+ event_source: ENV.fetch('TPT_EVENT_SOURCE', 'test-source'),
18
+ batch_size: batch_size,
19
+ client_options: {
20
+ access_key_id: '1234',
21
+ secret_access_key: 'abcd',
22
+ stub_responses: stub_responses
23
+ }
24
+ )
25
+ end
26
+ end
27
+ end
@@ -12,7 +12,7 @@ module Tpt::Rails
12
12
  end
13
13
 
14
14
  def ==(other)
15
- data == other.data
15
+ @data == other.data
16
16
  end
17
17
 
18
18
  def attributes
@@ -1,5 +1,10 @@
1
1
  module Tpt::Rails
2
2
  class EventBridgePublisher
3
+ class NoEntriesInResponseData < StandardError; end
4
+
5
+ attr_accessor :batch_size
6
+ attr_reader :client
7
+
3
8
  def initialize(
4
9
  event_bus_name: default_event_bus_name,
5
10
  event_source: default_event_source,
@@ -26,7 +31,10 @@ module Tpt::Rails
26
31
  events
27
32
  end
28
33
 
29
- protected
34
+ private
35
+
36
+ attr_reader :event_bus_name, :event_source
37
+
30
38
  def publish_batch(events)
31
39
  metrics.time('tpt.event_bridge.publish_batch') do
32
40
  wrapped_events = wrap_events(events)
@@ -43,7 +51,7 @@ module Tpt::Rails
43
51
  metrics.increment('tpt.event_bridge.publish_failure', by: events.length, tags: ["error_code:publish_batch_failure"])
44
52
 
45
53
  # re-reraise the error for users to handle
46
- raise e
54
+ raise
47
55
  end
48
56
 
49
57
  def wrap_events(events)
@@ -59,6 +67,15 @@ module Tpt::Rails
59
67
  end
60
68
 
61
69
  def handle_response(res, events)
70
+ unless res&.data&.entries
71
+ logger.error({
72
+ msg: "No entries in the response data",
73
+ response: res,
74
+ events: events,
75
+ })
76
+ raise NoEntriesInResponseData, "No entries in the response data"
77
+ end
78
+
62
79
  res.data.entries.each_with_index do |entry, index|
63
80
  if entry.error_code.present?
64
81
  metrics.increment('tpt.event_bridge.publish_failure', tags: ["error_code:#{entry.error_code}"])
@@ -77,17 +94,13 @@ module Tpt::Rails
77
94
  res.data.entries
78
95
  end
79
96
 
80
- private
81
-
82
- attr_reader :client, :event_bus_name, :event_source
83
-
84
97
  def make_client(options)
85
98
  all_options = {
86
- access_key_id: ENV.fetch('AWS_ACCESS_KEY_ID'),
87
- secret_access_key: ENV.fetch('AWS_SECRET_ACCESS_KEY'),
99
+ access_key_id: ENV.fetch('AWS_ACCESS_KEY_ID', nil),
100
+ secret_access_key: ENV.fetch('AWS_SECRET_ACCESS_KEY', nil),
88
101
  region: ENV.fetch('AWS_REGION', 'us-east-1'),
89
- http_open_timeout: 1, # default is 15
90
- http_read_timeout: 1, # default is 60
102
+ http_open_timeout: 3, # default is 15
103
+ http_read_timeout: 15, # default is 60
91
104
  }.merge(options)
92
105
 
93
106
  Aws::EventBridge::Client.new(all_options)
@@ -125,8 +138,9 @@ module Tpt::Rails
125
138
  end
126
139
 
127
140
  def metrics
128
- raise "metrics object not set; use EventBridgePublisher#set_metrics" unless @@statsd
141
+ @@statsd ||= Tpt::Rails.statsd
129
142
 
143
+ raise "metrics object not set and no default found; use EventBridgePublisher#set_metrics" unless @@statsd
130
144
  @@statsd
131
145
  end
132
146
  end
@@ -1,6 +1,6 @@
1
1
  module Tpt
2
2
  module Rails
3
3
  # Do not change this manually. Our tooling will do it automatically.
4
- VERSION = '1.6.0'
4
+ VERSION = '1.6.4'
5
5
  end
6
6
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: tpt-rails
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.6.0
4
+ version: 1.6.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - TpT
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-12-20 00:00:00.000000000 Z
11
+ date: 2022-06-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -114,6 +114,7 @@ files:
114
114
  - app/controllers/tpt/rails/error_tests_controller.rb
115
115
  - app/controllers/tpt/rails/health_checks_controller.rb
116
116
  - app/helpers/tpt/rails/application_helper.rb
117
+ - app/helpers/tpt/rails/event_bridge_test_helper.rb
117
118
  - app/jobs/tpt/rails/application_job.rb
118
119
  - app/mailers/tpt/rails/application_mailer.rb
119
120
  - app/models/tpt/rails/application_event.rb