💎

【Ruby】Salesforceデータ連携失敗時にSlack通知を追加する方法

2024/05/27に公開

はじめに

こんにちは、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 キュー データ構造の一つ。待ち行列ともいう

https://qiita.com/seiyatakahashi/items/cb9ae73e5ba3020f4a89#jobジョブとqueueキュー

キューの設定

queue_as :default

ジョブは app/jobs に作成され、ジョブファイルでは ApplicationJob を継承することが推奨されています。この例ではジョブをデフォルトのキューに追加しました。

https://railsguides.jp/active_job_basics.html#ジョブを作成する-ジョブを作成する

リトライの設定

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のみならば、エラーが発生します。

https://qiita.com/jnchito/items/3cce0c057f54afa29d0a

https://railsguides.jp/active_job_basics.html#失敗したジョブをリトライまたは廃棄する

エラーハンドリングとSlack通知

message = "【エラー】Salesforceとのデータ連携に失敗しました。\n"\
         "【リソース】user\n"\
         "【エラー内容】#{exception.message}"
NotifySlackJob.perform_later(message)

エラーメッセージを作成し、NotifySlackJob.perform_later(message) によってSlack通知を非同期で実行する処理を追加しました。NotifySlackJob は別のジョブであり、Slackへの通知を担当します。

https://qiita.com/treby/items/3e6cb3f4ac835dcc6017#主にビジネス向けに作ったbot達

まとめ

この記事では、Salesforceとのデータ連携が失敗した際にSlackに通知を送信する処理を追加する方法について解説しました。具体的には、export_job.rbSalesforce::CreateUserCsvJobにエラーメッセージを作成し、Slackに通知するコードを追加しました。

エラーが発生した際には、最大3回まで再試行し、それぞれの再試行の間に5秒の待機時間を設けることで、短期的な問題によるジョブの失敗に対処できる仕組みを整えました。

最後に

ここまで読んでいただきありがとうございました!
今回の記事が良かったと思ったらぜひ「いいね」を押していただけると嬉しいです 🎉

noteでも記事を執筆していますので、ぜひチェックしてみてください。
https://note.com/take_lifelog/n/n58df7ce7af6f

他にもこのようなことについて記載しているのでお読みいただければ幸いです。

https://zenn.dev/take_tech/articles/275e5f4242973d

https://zenn.dev/take_tech/articles/374817f256ec9d

最後までお読みいただき、誠にありがとうございました!

Discussion