infra(monitoring): ajoute le webhook pour les notifier des incidents cote sib
This commit is contained in:
parent
40ca336750
commit
3dc26efc61
6 changed files with 83 additions and 14 deletions
|
@ -1,10 +1,22 @@
|
||||||
class WebhookController < ActionController::Base
|
class WebhookController < ActionController::Base
|
||||||
before_action :verify_signature!
|
before_action :verify_helpscout_signature!, only: [:helpscout, :helpscout_support_dev]
|
||||||
skip_before_action :verify_authenticity_token
|
skip_before_action :verify_authenticity_token
|
||||||
|
|
||||||
|
def sendinblue
|
||||||
|
if Rails.application.secrets.dig(:mattermost, :send_in_blue_outage_webhook_url).present?
|
||||||
|
send_mattermost_notification(
|
||||||
|
Rails.application.secrets.dig(:mattermost, :send_in_blue_outage_webhook_url),
|
||||||
|
message_to_mattermost_send_in_blue_channel
|
||||||
|
)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
def helpscout_support_dev
|
def helpscout_support_dev
|
||||||
if tagged_dev? && status_active?
|
if tagged_dev? && status_active? && Rails.application.secrets.dig(:mattermost, :support_webhook_url).present?
|
||||||
send_mattermost_notification(message_to_mattermost_channel)
|
send_mattermost_notification(
|
||||||
|
Rails.application.secrets.dig(:mattermost, :support_webhook_url),
|
||||||
|
message_to_mattermost_support_channel
|
||||||
|
)
|
||||||
end
|
end
|
||||||
|
|
||||||
head :no_content
|
head :no_content
|
||||||
|
@ -42,17 +54,15 @@ class WebhookController < ActionController::Base
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
def send_mattermost_notification(text)
|
def send_mattermost_notification(url, text)
|
||||||
return if Rails.application.secrets.dig(:mattermost, :support_webhook_url).blank?
|
|
||||||
|
|
||||||
Net::HTTP.post(
|
Net::HTTP.post(
|
||||||
URI.parse(Rails.application.secrets.mattermost[:support_webhook_url]),
|
URI.parse(url),
|
||||||
{ "text": text }.to_json,
|
{ "text": text }.to_json,
|
||||||
"Content-Type" => "application/json"
|
"Content-Type" => "application/json"
|
||||||
)
|
)
|
||||||
end
|
end
|
||||||
|
|
||||||
def message_to_mattermost_channel
|
def message_to_mattermost_support_channel
|
||||||
%Q(
|
%Q(
|
||||||
Nouveau bug taggué #dev : https://secure.helpscout.net/conversation/#{params["id"]}/#{params["number"]}?folderId=#{params["folderId"]}
|
Nouveau bug taggué #dev : https://secure.helpscout.net/conversation/#{params["id"]}/#{params["number"]}?folderId=#{params["folderId"]}
|
||||||
|
|
||||||
|
@ -62,6 +72,13 @@ Nouveau bug taggué #dev : https://secure.helpscout.net/conversation/#{params["i
|
||||||
**utilisateur en attente depuis** : #{params['customerWaitingSince']['friendly']})
|
**utilisateur en attente depuis** : #{params['customerWaitingSince']['friendly']})
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def message_to_mattermost_send_in_blue_channel
|
||||||
|
%Q{Incident sur SIB : #{params['title']}.
|
||||||
|
Etat de SIB: #{params['current_status']}
|
||||||
|
L'Incident a commencé à #{params['datetime_start']} et est p-e terminé a #{params['datetime_resolve']}
|
||||||
|
les composant suivants sont affectés : #{params["components"].map { _1['name'] }.join(", ")}}
|
||||||
|
end
|
||||||
|
|
||||||
def threads
|
def threads
|
||||||
params['_embedded']['threads']
|
params['_embedded']['threads']
|
||||||
end
|
end
|
||||||
|
@ -83,7 +100,7 @@ Nouveau bug taggué #dev : https://secure.helpscout.net/conversation/#{params["i
|
||||||
"<a target='_blank' href='#{url}' rel='noopener'>Emails##{user.id}</a>"
|
"<a target='_blank' href='#{url}' rel='noopener'>Emails##{user.id}</a>"
|
||||||
end
|
end
|
||||||
|
|
||||||
def verify_signature!
|
def verify_helpscout_signature!
|
||||||
if generate_body_signature(request.body.read) != request.headers['X-Helpscout-Signature']
|
if generate_body_signature(request.body.read) != request.headers['X-Helpscout-Signature']
|
||||||
request_http_token_authentication
|
request_http_token_authentication
|
||||||
end
|
end
|
||||||
|
|
|
@ -159,5 +159,7 @@ SAML_DOLIST_CERTIFICATE="spcertificate"
|
||||||
SAML_DOLIST_HOST="dolisthoname"
|
SAML_DOLIST_HOST="dolisthoname"
|
||||||
DOLIST_LOGIN_URL="https://clientpreprod.dolist.net"
|
DOLIST_LOGIN_URL="https://clientpreprod.dolist.net"
|
||||||
|
|
||||||
# pour des rappel web
|
# rappel web du support
|
||||||
SUPPORT_WEBHOOK_URL=""
|
SUPPORT_WEBHOOK_URL=""
|
||||||
|
# rappel web de sendinblue
|
||||||
|
SIB_WEBHOOK_URL=""
|
||||||
|
|
|
@ -192,6 +192,7 @@ Rails.application.routes.draw do
|
||||||
|
|
||||||
get "contact-admin", to: "support#admin"
|
get "contact-admin", to: "support#admin"
|
||||||
|
|
||||||
|
post "webhooks/sendinblue", to: "webhook#sendinblue"
|
||||||
post "webhooks/helpscout", to: "webhook#helpscout"
|
post "webhooks/helpscout", to: "webhook#helpscout"
|
||||||
post "webhooks/helpscout_support_dev", to: "webhook#helpscout_support_dev"
|
post "webhooks/helpscout_support_dev", to: "webhook#helpscout_support_dev"
|
||||||
match "webhooks/helpscout", to: lambda { |_| [204, {}, nil] }, via: :head
|
match "webhooks/helpscout", to: lambda { |_| [204, {}, nil] }, via: :head
|
||||||
|
|
|
@ -59,6 +59,7 @@ defaults: &defaults
|
||||||
smtp_key: <%= ENV['SENDINBLUE_SMTP_KEY'] %>
|
smtp_key: <%= ENV['SENDINBLUE_SMTP_KEY'] %>
|
||||||
api_v3_key: <%= ENV['SENDINBLUE_API_V3_KEY'] %>
|
api_v3_key: <%= ENV['SENDINBLUE_API_V3_KEY'] %>
|
||||||
mattermost:
|
mattermost:
|
||||||
|
send_in_blue_outage_webhook_url: <%= ENV['SEND_IN_BLUE_OUTAGE_WEBHOOK_URL'] %>
|
||||||
support_webhook_url: <%= ENV['SUPPORT_WEBHOOK_URL'] %>
|
support_webhook_url: <%= ENV['SUPPORT_WEBHOOK_URL'] %>
|
||||||
matomo:
|
matomo:
|
||||||
cookie_domain: "<%= ENV['MATOMO_COOKIE_DOMAIN'] %>"
|
cookie_domain: "<%= ENV['MATOMO_COOKIE_DOMAIN'] %>"
|
||||||
|
|
|
@ -1,16 +1,16 @@
|
||||||
describe WebhookController, type: :controller do
|
describe WebhookController, type: :controller do
|
||||||
before do
|
before do
|
||||||
allow(controller).to receive(:verify_signature!).and_return(true)
|
allow(controller).to receive(:verify_helpscout_signature!).and_return(true)
|
||||||
allow(controller).to receive(:verify_authenticity_token)
|
allow(controller).to receive(:verify_authenticity_token)
|
||||||
end
|
end
|
||||||
|
|
||||||
describe '#helpscout_support_dev' do
|
describe '#helpscout_support_dev' do
|
||||||
subject(:response) { post :helpscout_support_dev, params: payload }
|
subject(:response) { post :helpscout_support_dev, params: payload }
|
||||||
let(:payload) { JSON.parse(File.read(Rails.root.join('spec', 'fixtures', 'files', 'helpscout', 'tagged-dev.json'))) }
|
let(:payload) { JSON.parse(File.read(Rails.root.join('spec', 'fixtures', 'files', 'helpscout', 'tagged-dev.json'))) }
|
||||||
|
let(:webhook_url) { "https://notification_url" }
|
||||||
it 'works' do
|
it 'works' do
|
||||||
allow(Rails.application.secrets).to receive(:dig).with(:mattermost, :support_webhook_url).and_return("https://notification_url")
|
allow(Rails.application.secrets).to receive(:dig).with(:mattermost, :support_webhook_url).and_return(webhook_url)
|
||||||
expect(controller).to receive(:send_mattermost_notification).with("\nNouveau bug taggué #dev : https://secure.helpscout.net/conversation/123456789/123456789?folderId=123456789\n\n> Bonjour, Je voudrais faire une demande de changement d'adresse et la plateforme m'indique que j'ai plusieurs comptes et que je dois d'abord les fusionner. Cela fait 3 jours que j'essaie de fusio\n\n**personnes impliquées** : anonymous@anon.fr\n**utilisateur en attente depuis** : 11 min ago")
|
expect(controller).to receive(:send_mattermost_notification).with(webhook_url, "\nNouveau bug taggué #dev : https://secure.helpscout.net/conversation/123456789/123456789?folderId=123456789\n\n> Bonjour, Je voudrais faire une demande de changement d'adresse et la plateforme m'indique que j'ai plusieurs comptes et que je dois d'abord les fusionner. Cela fait 3 jours que j'essaie de fusio\n\n**personnes impliquées** : anonymous@anon.fr\n**utilisateur en attente depuis** : 11 min ago")
|
||||||
subject
|
subject
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -65,4 +65,16 @@ describe WebhookController, type: :controller do
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
describe '#sendinblue' do
|
||||||
|
subject(:response) { post :sendinblue, params: payload }
|
||||||
|
let(:payload) { JSON.parse(File.read(Rails.root.join('spec', 'fixtures', 'files', 'sendinblue', 'incident.json'))) }
|
||||||
|
|
||||||
|
it 'sends notification to mattermost' do
|
||||||
|
notification_url = "https://notification_url"
|
||||||
|
allow(Rails.application.secrets).to receive(:dig).with(:mattermost, :send_in_blue_outage_webhook_url).and_return(notification_url)
|
||||||
|
expect(controller).to receive(:send_mattermost_notification).with(notification_url, "Incident sur SIB : Database Issues.\nEtat de SIB: Degraded Performance\nL'Incident a commencé à 2015-04-03T18:27:15+00:00 et est p-e terminé a \nles composant suivants sont affectés : Chat Service, Voice Services, Admin Dashboard")
|
||||||
|
subject
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
36
spec/fixtures/files/sendinblue/incident.json
vendored
Normal file
36
spec/fixtures/files/sendinblue/incident.json
vendored
Normal file
|
@ -0,0 +1,36 @@
|
||||||
|
{
|
||||||
|
"id":"551edb8331a9664b11000005",
|
||||||
|
"message_id":"531adb8331a9553b11000008",
|
||||||
|
"title":"Database Issues",
|
||||||
|
"datetime":"2015-04-03T18:27:15.344Z",
|
||||||
|
"datetime_start":"2015-04-03T18:27:15+00:00",
|
||||||
|
"datetime_resolve":"",
|
||||||
|
"current_status":"Degraded Performance",
|
||||||
|
"current_state":"Identified",
|
||||||
|
"previous_status":"",
|
||||||
|
"previous_state":"",
|
||||||
|
"infrastructure_affected":[
|
||||||
|
{"component":"551ed627b556f14210000005", "container":"5516e01e2e55e4e917000014"},
|
||||||
|
{"component":"551ed627b556f14210000005", "container":"551ed5d3590f5a3b10000008"},
|
||||||
|
{"component":"551ed5f5590f5a3b10000009", "container":"551ed5d3590f5a3b10000008"},
|
||||||
|
{"component":"5516e01e2e55e4e917000015", "container":"5516e01e2e55e4e917000014"},
|
||||||
|
{"component":"5516e01e2e55e4e917000015", "container":"551ed5d3590f5a3b10000008"}
|
||||||
|
],
|
||||||
|
"components":[
|
||||||
|
{"name":"Chat Service",
|
||||||
|
"_id":"551ed627b556f14210000005"},
|
||||||
|
{"name":"Voice Services",
|
||||||
|
"_id":"551ed5f5590f5a3b10000009"},
|
||||||
|
{"name":"Admin Dashboard",
|
||||||
|
"_id":"5516e01e2e55e4e917000015"}
|
||||||
|
],
|
||||||
|
"containers":[
|
||||||
|
{"name":"Ireland",
|
||||||
|
"_id":"5516e01e2e55e4e917000014"},
|
||||||
|
{"name":"London",
|
||||||
|
"_id":"551ed5d3590f5a3b10000008"}
|
||||||
|
],
|
||||||
|
"details":"A database instance has become unhealthy and removed from the cluster. Europe based endpoints will continue experiencing higher than normal latency until a new instance is fired up. Updates to follow.",
|
||||||
|
"incident_url":"https://status.io/pages/incident/5516e01e2e55e4e917000005/5116e01e2e33e4e413000001",
|
||||||
|
"status_page_url":"https://status.io/pages/5516e01e2e55e4e917000005"
|
||||||
|
}
|
Loading…
Reference in a new issue