From dce9599ef53dcdeb035b339510b759d71ad10f1e Mon Sep 17 00:00:00 2001 From: Grzegorz Bizon Date: Mon, 16 Jul 2018 13:40:55 +0200 Subject: [PATCH] Implement action mailer delivery metrics observer --- config/initializers/action_mailer_hooks.rb | 9 +++-- .../email/hook/delivery_metrics_observer.rb | 31 ++++++++++++++++ .../hook/delivery_metrics_observer_spec.rb | 35 +++++++++++++++++++ 3 files changed, 73 insertions(+), 2 deletions(-) create mode 100644 lib/gitlab/email/hook/delivery_metrics_observer.rb create mode 100644 spec/lib/gitlab/email/hook/delivery_metrics_observer_spec.rb diff --git a/config/initializers/action_mailer_hooks.rb b/config/initializers/action_mailer_hooks.rb index f792e2dc68e..f1b3c1f8ae8 100644 --- a/config/initializers/action_mailer_hooks.rb +++ b/config/initializers/action_mailer_hooks.rb @@ -3,5 +3,10 @@ unless Gitlab.config.gitlab.email_enabled ActionMailer::Base.logger = nil end -ActionMailer::Base.register_interceptor(::Gitlab::Email::Hook::AdditionalHeadersInterceptor) -ActionMailer::Base.register_interceptor(::Gitlab::Email::Hook::EmailTemplateInterceptor) +ActionMailer::Base.register_interceptors( + ::Gitlab::Email::Hook::AdditionalHeadersInterceptor, + ::Gitlab::Email::Hook::EmailTemplateInterceptor, + ::Gitlab::Email::Hook::DeliveryMetricsObserver +) + +ActionMailer::Base.register_observer(::Gitlab::Email::Hook::DeliveryMetricsObserver) diff --git a/lib/gitlab/email/hook/delivery_metrics_observer.rb b/lib/gitlab/email/hook/delivery_metrics_observer.rb new file mode 100644 index 00000000000..1c2985f6045 --- /dev/null +++ b/lib/gitlab/email/hook/delivery_metrics_observer.rb @@ -0,0 +1,31 @@ +module Gitlab + module Email + module Hook + class DeliveryMetricsObserver + extend Gitlab::Utils::StrongMemoize + + def self.delivering_email(_message) + delivery_attempts_counter.increment + end + + def self.delivered_email(_message) + delivered_emails_counter.increment + end + + def self.delivery_attempts_counter + strong_memoize(:delivery_attempts_counter) do + Gitlab::Metrics.counter(:gitlab_emails_delivery_attempts_total, + 'Counter of total emails delivery attempts') + end + end + + def self.delivered_emails_counter + strong_memoize(:delivered_emails_counter) do + Gitlab::Metrics.counter(:gitlab_emails_delivered_total, + 'Counter of total emails delievered') + end + end + end + end + end +end diff --git a/spec/lib/gitlab/email/hook/delivery_metrics_observer_spec.rb b/spec/lib/gitlab/email/hook/delivery_metrics_observer_spec.rb new file mode 100644 index 00000000000..4497d4002da --- /dev/null +++ b/spec/lib/gitlab/email/hook/delivery_metrics_observer_spec.rb @@ -0,0 +1,35 @@ +require 'spec_helper' + +describe Gitlab::Email::Hook::DeliveryMetricsObserver do + let(:email) do + ActionMailer::Base.mail(to: 'test@example.com', + from: 'info@example.com', + body: 'hello') + end + + context 'when email has been delivered' do + it 'increments both email delivery metrics' do + expect(described_class.delivery_attempts_counter).to receive(:increment) + expect(described_class.delivered_emails_counter).to receive(:increment) + + email.deliver_now + end + end + + context 'when email has not been delivered due to an error' do + before do + allow(email.delivery_method).to receive(:deliver!) + .and_raise(StandardError, 'Some SMTP error') + end + + it 'increments only delivery attempt metric' do + expect(described_class.delivery_attempts_counter) + .to receive(:increment) + expect(described_class.delivered_emails_counter) + .not_to receive(:increment) + + expect { email.deliver_now } + .to raise_error(StandardError, 'Some SMTP error') + end + end +end