【Ruby】Salesforceデータ連携失敗時にSlack通知を追加する方法
はじめに
こんにちは、Takeです。都内の自社開発企業でエンジニアとして働いています。
Salesforceとのデータ連携が失敗した際に、Slackに通知を飛ばす処理を追加してほしいという依頼がありました。その実装内容をまとめたので共有いたします。
コード
Slack通知
app/jobs/export_job.rb
では、エラーメッセージを作成し、Slackに通知を送信する処理を追加しました。
message = "【エラー】エントリーデータの書き込みに失敗しました。\n"\
"【エラー内容】#{exception.message}\n"\
"【キャンペーン】<#{set_url}/companies/#{company_id}/campaigns/#{campaign_id}|#{campaign_name}>\n"\
"【エントリーデータ】#{entry_format(entry)}"
NotifySlackJob.perform_later(message)
Salesforce連携
app/jobs/salesforce/create_job.rb
では、Salesforceとのデータ連携が失敗した際にエラーメッセージを作成してSlackに通知を送信する処理を追加しました。
class Salesforce::CreateUserCsvJob < ApplicationJob
queue_as :default
retry_on StandardError, wait: 5.seconds, attempts: 3 do |_job, exception|
message = "【エラー】Salesforceとのデータ連携に失敗しました。\n"\
"【リソース】user\n"\
"【エラー内容】#{exception.message}"
NotifySlackJob.perform_later(message)
end
end
これらのジョブはSalesforceとのデータ連携が失敗した場合にエラーメッセージを作成し、そのメッセージをSlackに通知するための別のジョブ NotifySlackJob
を呼び出します。
エラーが発生した場合には最大3回まで再試行を行い、それぞれの再試行の間に5秒の待機時間を設けています。これにより、短期的な問題が原因でジョブが失敗した場合に自動的に再試行される仕組みを整えました。
実装のポイント
前提
Job(ジョブ)とQueue(キュー)の違い
名称 | 読み方 | 概要 |
---|---|---|
Job | ジョブ | コンピュータがする仕事の単位 |
Queue | キュー | データ構造の一つ。待ち行列ともいう |
キューの設定
queue_as :default
ジョブは app/jobs
に作成され、ジョブファイルでは ApplicationJob
を継承することが推奨されています。この例ではジョブをデフォルトのキューに追加しました。
リトライの設定
retry_on StandardError, wait: 5.seconds, attempts: 3 do |_job, exception|
retry_on
メソッドを使用して特定の例外が発生した場合にジョブを再試行するように設定しました。再試行の間隔や回数も設定できます。
この例では、StandardError
が発生した場合に5秒待って最大3回まで再試行するようにしました。
retry_on StandardError, wait: 5.seconds, attempts: 3 do |_job, exception|
また、例外処理では_job
を未使用の変数として設定しています。
retry_on
メソッドのブロックはジョブオブジェクトと例外オブジェクトの2つの引数を提供します。
もし引数がexceptionのみならば、エラーが発生します。
エラーハンドリングとSlack通知
message = "【エラー】Salesforceとのデータ連携に失敗しました。\n"\
"【リソース】user\n"\
"【エラー内容】#{exception.message}"
NotifySlackJob.perform_later(message)
エラーメッセージを作成し、NotifySlackJob.perform_later(message)
によってSlack通知を非同期で実行する処理を追加しました。NotifySlackJob
は別のジョブであり、Slackへの通知を担当します。
まとめ
この記事では、Salesforceとのデータ連携が失敗した際にSlackに通知を送信する処理を追加する方法について解説しました。具体的には、export_job.rb
とSalesforce::CreateUserCsvJob
にエラーメッセージを作成し、Slackに通知するコードを追加しました。
エラーが発生した際には、最大3回まで再試行し、それぞれの再試行の間に5秒の待機時間を設けることで、短期的な問題によるジョブの失敗に対処できる仕組みを整えました。
最後に
ここまで読んでいただきありがとうございました!
今回の記事が良かったと思ったらぜひ「いいね」を押していただけると嬉しいです 🎉
noteでも記事を執筆していますので、ぜひチェックしてみてください。
他にもこのようなことについて記載しているのでお読みいただければ幸いです。
最後までお読みいただき、誠にありがとうございました!
Discussion