Skip to content

Commit 2e53040

Browse files
committed
Introduces ActionMailer subscriber
Counts sending mails with mailers
1 parent 8ade32a commit 2e53040

11 files changed

+129
-0
lines changed

CHANGELOG.md

+4
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,10 @@
22

33
For the full commit log, [see here](https://github.com/influxdata/influxdb-rails/commits/master).
44

5+
## v1.0.1.beta2
6+
- Implement [`deliver.action_mailer`](https://guides.rubyonrails.org/active_support_instrumentation.html#deliver-action-mailer) subscriber
7+
- Add missing Active Job documentation
8+
59
## v1.0.1.beta1, released 2020-08-21
610
- Drop support for Ruby 2.3
711
- Drop support for Rails 4.x

README.md

+21
Original file line numberDiff line numberDiff line change
@@ -158,6 +158,27 @@ Reported tags:
158158
*Note*: Only the measurements with the hook `perform` report a duration in the value.
159159
The other hooks are counters and always report a value of `1`.
160160

161+
### Action Mailer
162+
163+
Reported ActiveSupport instrumentation hooks:
164+
165+
- [deliver.action\_mailer](https://guides.rubyonrails.org/active_support_instrumentation.html#deliver-action-mailer)
166+
167+
Reported values:
168+
169+
```ruby
170+
value: 1
171+
```
172+
173+
Reported tags:
174+
175+
```ruby
176+
hook: "deliver",
177+
mailer: "SomeMailerClassName"
178+
```
179+
180+
*Note*: The hook is just a counter and always report a value of `1`.
181+
161182
## Configuration
162183

163184
The only setting you actually need to configure is the name of the database

influxdb-rails.gemspec

+1
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ Gem::Specification.new do |spec|
2727
spec.add_runtime_dependency "influxdb", "~> 0.6", ">= 0.6.4"
2828
spec.add_runtime_dependency "railties", ">= 5.0"
2929

30+
spec.add_development_dependency "actionmailer"
3031
spec.add_development_dependency "activejob"
3132
spec.add_development_dependency "activerecord"
3233
spec.add_development_dependency "bundler", ">= 1.0.0"

lib/influxdb-rails.rb

+1
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
require "influxdb/rails/middleware/sql_subscriber"
99
require "influxdb/rails/middleware/active_record_subscriber"
1010
require "influxdb/rails/middleware/active_job_subscriber"
11+
require "influxdb/rails/middleware/action_mailer_subscriber"
1112
require "influxdb/rails/sql/query"
1213
require "influxdb/rails/version"
1314
require "influxdb/rails/configuration"
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
require "influxdb/rails/middleware/subscriber"
2+
3+
module InfluxDB
4+
module Rails
5+
module Middleware
6+
class ActionMailerSubscriber < Subscriber # :nodoc:
7+
private
8+
9+
def values
10+
{ value: 1 }
11+
end
12+
13+
def tags
14+
{
15+
hook: "deliver",
16+
mailer: payload[:mailer],
17+
}
18+
end
19+
end
20+
end
21+
end
22+
end

lib/influxdb/rails/railtie.rb

+1
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ class Railtie < ::Rails::Railtie # :nodoc:
3434
"enqueue.active_job" => Middleware::ActiveJobSubscriber,
3535
"perform_start.active_job" => Middleware::ActiveJobSubscriber,
3636
"perform.active_job" => Middleware::ActiveJobSubscriber,
37+
"deliver.action_mailer" => Middleware::ActionMailerSubscriber,
3738
"block_instrumentation.influxdb_rails" => Middleware::BlockInstrumentationSubscriber,
3839
}.each do |hook_name, subscriber|
3940
ActiveSupport::Notifications.subscribe(hook_name, subscriber)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
require File.dirname(__FILE__) + "/../spec_helper"
2+
3+
RSpec.describe "ActionMailer deliver metrics", type: :request do
4+
let(:tags_middleware) do
5+
lambda do |tags|
6+
tags.merge(tags_middleware: :tags_middleware)
7+
end
8+
end
9+
before do
10+
allow_any_instance_of(InfluxDB::Rails::Configuration).to receive(:ignored_environments).and_return(%w[development])
11+
allow_any_instance_of(ActionDispatch::Request).to receive(:request_id).and_return(:request_id)
12+
allow_any_instance_of(InfluxDB::Rails::Configuration).to receive(:application_name).and_return(:app_name)
13+
allow_any_instance_of(InfluxDB::Rails::Configuration).to receive(:tags_middleware).and_return(tags_middleware)
14+
end
15+
16+
it "writes metric" do
17+
get "/metrics"
18+
19+
expect_metric(
20+
tags: a_hash_including(
21+
hook: "deliver",
22+
mailer: "MetricMailer",
23+
location: "MetricsController#index",
24+
additional_tag: :value,
25+
server: Socket.gethostname,
26+
app_name: :app_name,
27+
tags_middleware: :tags_middleware
28+
),
29+
values: a_hash_including(
30+
additional_value: :value,
31+
request_id: :request_id,
32+
value: 1
33+
)
34+
)
35+
end
36+
37+
it "does not write metric when hook is ignored" do
38+
allow_any_instance_of(InfluxDB::Rails::Configuration).to receive(:ignored_hooks).and_return(["deliver.action_mailer"])
39+
40+
get "/metrics"
41+
42+
expect_no_metric(
43+
tags: a_hash_including(
44+
hook: "deliver",
45+
mailer: "MetricMailer"
46+
)
47+
)
48+
end
49+
end

spec/spec_helper.rb

+1
Original file line numberDiff line numberDiff line change
@@ -35,5 +35,6 @@
3535

3636
config.include ActiveSupport::Testing::TimeHelpers
3737
config.include ActiveJob::TestHelper
38+
3839
config.include InfluxDB::Rails::BrokenClient
3940
end

spec/support/rails5/app.rb

+14
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
require "action_controller/railtie"
22
require "active_record/railtie"
33
require "active_job"
4+
require "action_mailer"
45

56
app = Class.new(Rails::Application)
67
app.config.secret_key_base = "1234567890abcdef1234567890abcdef"
@@ -11,6 +12,7 @@
1112
app.config.root = __dir__
1213
Rails.backtrace_cleaner.remove_silencers!
1314
ActiveJob::Base.logger = Rails.logger
15+
ActionMailer::Base.delivery_method = :test
1416
app.initialize!
1517

1618
app.routes.draw do
@@ -38,6 +40,17 @@ def perform
3840
end
3941
end
4042

43+
class MetricMailer < ActionMailer::Base
44+
default from: "[email protected]"
45+
layout "mailer"
46+
47+
def welcome_mail
48+
mail(to: "[email protected]", subject: "Welcome to metrics!") do |format|
49+
format.text { render plain: "Hello Dieter!" }
50+
end
51+
end
52+
end
53+
4154
class Metric < ActiveRecord::Base; end
4255
class ApplicationController < ActionController::Base; end
4356
class MetricsController < ApplicationController
@@ -53,6 +66,7 @@ def index
5366
1 + 1
5467
end
5568
MetricJob.perform_later
69+
MetricMailer.with(user: "eisendieter").welcome_mail.deliver_now
5670
Metric.create!(name: "name")
5771
end
5872

spec/support/rails6/app.rb

+14
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
require "action_controller/railtie"
22
require "active_record/railtie"
33
require "active_job"
4+
require "action_mailer"
45

56
app = Class.new(Rails::Application)
67
app.config.secret_key_base = "1234567890abcdef1234567890abcdef"
@@ -11,6 +12,7 @@
1112
app.config.root = __dir__
1213
Rails.backtrace_cleaner.remove_silencers!
1314
ActiveJob::Base.logger = Rails.logger
15+
ActionMailer::Base.delivery_method = :test
1416
app.initialize!
1517

1618
app.routes.draw do
@@ -38,6 +40,17 @@ def perform
3840
end
3941
end
4042

43+
class MetricMailer < ActionMailer::Base
44+
default from: "[email protected]"
45+
layout "mailer"
46+
47+
def welcome_mail
48+
mail(to: "[email protected]", subject: "Welcome to metrics!") do |format|
49+
format.text { render plain: "Hello Dieter!" }
50+
end
51+
end
52+
end
53+
4154
class Metric < ActiveRecord::Base; end
4255
class ApplicationController < ActionController::Base; end
4356
class MetricsController < ApplicationController
@@ -53,6 +66,7 @@ def index
5366
1 + 1
5467
end
5568
MetricJob.perform_later
69+
MetricMailer.with(user: "eisendieter").welcome_mail.deliver_now
5670
Metric.create!(name: "name")
5771
end
5872

Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
<%= yield %>

0 commit comments

Comments
 (0)