From e7d0739dae3596257e3987276481e81eca0c401e Mon Sep 17 00:00:00 2001 From: Patrick Veverka Date: Tue, 19 May 2015 09:59:43 -0400 Subject: [PATCH] adding in formatted attachments for slack --- app/models/notification_services/slack_service.rb | 42 +++++++++++++++++++++++++++++++++++++++++- spec/models/notification_service/slack_service_spec.rb | 81 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++------------ 2 files changed, 110 insertions(+), 13 deletions(-) diff --git a/app/models/notification_services/slack_service.rb b/app/models/notification_services/slack_service.rb index c681403..1f00d03 100644 --- a/app/models/notification_services/slack_service.rb +++ b/app/models/notification_services/slack_service.rb @@ -18,7 +18,47 @@ class NotificationServices::SlackService < NotificationService end def post_payload(problem) - {:text => message_for_slack(problem) }.to_json + { + :attachments => [ + { + :fallback => message_for_slack(problem), + :pretext => "<#{problem_url(problem)}|Errbit - #{problem.app.name}: #{problem.error_class}>", + :color => "#D00000", + :fields => [ + { + :title => "Environment", + :value => problem.environment, + :short => false + }, + { + :title => "Location", + :value => problem.where, + :short => false + }, + { + :title => "Message", + :value => problem.message.to_s, + :short => false + }, + { + :title => "First Noticed", + :value => problem.first_notice_at, + :short => false + }, + { + :title => "Last Noticed", + :value => problem.last_notice_at, + :short => false + }, + { + :title => "Times Occurred", + :value => problem.notices_count, + :short => false + } + ] + } + ] + }.to_json end def create_notification(problem) diff --git a/spec/models/notification_service/slack_service_spec.rb b/spec/models/notification_service/slack_service_spec.rb index 43d4bb9..1f00d03 100644 --- a/spec/models/notification_service/slack_service_spec.rb +++ b/spec/models/notification_service/slack_service_spec.rb @@ -1,14 +1,71 @@ -describe NotificationService::SlackService, type: 'model' do - it "it should send a notification to Slack with hook url" do - # setup - notice = Fabricate :notice - notification_service = Fabricate :slack_notification_service, :app => notice.app, :service_url => "https://hooks.slack.com/services/XXXXXXXXX/XXXXXXXXX/XXXXXXXXX" - problem = notice.problem - - # faraday stubbing - payload = {:text => notification_service.message_for_slack(problem)}.to_json - expect(HTTParty).to receive(:post).with(notification_service.service_url, :body => payload, :headers => {"Content-Type" => "application/json"}).and_return(true) - - notification_service.create_notification(problem) +class NotificationServices::SlackService < NotificationService + Label = "slack" + Fields += [ + [:service_url, { + :placeholder => 'Slack Hook URL (https://hooks.slack.com/services/XXXXXXXXX/XXXXXXXXX/XXXXXXXXX)', + :label => 'Hook URL' + }] + ] + + def check_params + if Fields.detect {|f| self[f[0]].blank? } + errors.add :base, "You must specify your Slack Hook url." + end + end + + def message_for_slack(problem) + "[#{problem.app.name}][#{problem.environment}][#{problem.where}]: #{problem.error_class} #{problem_url(problem)}" + end + + def post_payload(problem) + { + :attachments => [ + { + :fallback => message_for_slack(problem), + :pretext => "<#{problem_url(problem)}|Errbit - #{problem.app.name}: #{problem.error_class}>", + :color => "#D00000", + :fields => [ + { + :title => "Environment", + :value => problem.environment, + :short => false + }, + { + :title => "Location", + :value => problem.where, + :short => false + }, + { + :title => "Message", + :value => problem.message.to_s, + :short => false + }, + { + :title => "First Noticed", + :value => problem.first_notice_at, + :short => false + }, + { + :title => "Last Noticed", + :value => problem.last_notice_at, + :short => false + }, + { + :title => "Times Occurred", + :value => problem.notices_count, + :short => false + } + ] + } + ] + }.to_json + end + + def create_notification(problem) + HTTParty.post(service_url, :body => post_payload(problem), :headers => { 'Content-Type' => 'application/json' }) + end + + def configured? + service_url.present? end end -- libgit2 0.21.2