A1-frkweiichi / RUNTEQ_ARTICLES_BOT

1 stars 0 forks source link

Google::Apis::AuthorizationError SendGmailJob@default #76

Closed A1-frkweiichi closed 3 weeks ago

A1-frkweiichi commented 1 month ago
2024-08-18T10:23:55.566299+00:00 app[worker.1]: /app/vendor/bundle/ruby/3.3.0/gems/sidekiq-7.2.4/lib/sidekiq/component.rb:19:in `block in safe_thread'
2024-08-18T10:23:55.575644+00:00 app[worker.1]: pid=2 tid=exu class=SendGmailJob jid=6b28b3fdf7da4d29774eb5b8 elapsed=0.396 INFO: fail
2024-08-18T10:23:55.575724+00:00 app[worker.1]: pid=2 tid=exu WARN: {"context":"Job raised exception","job":{"retry":5,"queue":"default","backtrace":true,"wrapped":"SendGmailJob","args":[{"job_class":"SendGmailJob","job_id":"ed2a863e-57d4-4440-a4e1-4db952376d93","provider_job_id":null,"queue_name":"default","priority":null,"arguments":[],"executions":0,"exception_executions":{},"locale":"en","timezone":"UTC","enqueued_at":"2024-08-18T10:20:00.297877633Z","scheduled_at":null}],"class":"ActiveJob::QueueAdapters::SidekiqAdapter::JobWrapper","jid":"6b28b3fdf7da4d29774eb5b8","created_at":1723976400.2979453,"enqueued_at":1723976635.1784992,"error_message":"Unauthorized","error_class":"Google::Apis::AuthorizationError","failed_at":1723976400.7997563,"retry_count":3,"error_backtrace":"eJyLVkosKNAvTi0qy0xOLdZPz03MzImHcvWKkqyMjK0y8xQSilPzUuJTQZLqSjpgLVn5ScX6YGGIHiAfpN4CrLwgtSgtvyhXXSkWAJYwIlU=","retried_at":1723976510.79841}}
2024-08-18T10:23:55.575742+00:00 app[worker.1]: pid=2 tid=exu WARN: Google::Apis::AuthorizationError: Unauthorized
2024-08-18T10:23:55.576046+00:00 app[worker.1]: pid=2 tid=exu WARN: app/services/gmail_service.rb:23:in `send_email'
2024-08-18T10:23:55.576046+00:00 app[worker.1]: app/jobs/send_gmail_job.rb:8:in `perform'
2024-08-18T10:23:55.585767+00:00 app[worker.1]: I, [2024-08-18T10:23:55.585708 #2]  INFO -- [Bugsnag]: Notifying https://notify.bugsnag.com of Google::Apis::AuthorizationError
このエラーメッセージから、Gmailの送信が成功しているにもかかわらず、Sidekiqで Google::Apis::AuthorizationError: Unauthorized が発生している理由を考察すると、以下の可能性があります。

可能性 1: トークンの有効期限切れまたは無効化
Gmailの送信が成功した後、トークンの有効期限が切れているか、リフレッシュトークンが無効化されている可能性があります。これにより、次に SendGmailJob が実行されたときに、Google API から「Unauthorized」エラーが返されます。

可能性 2: ジョブの再実行または複数のジョブの問題
一つのジョブで認証に成功してGmailを送信できたとしても、同時または直後に同じ SendGmailJob が別のスレッドで再実行されると、以前のトークンが無効化されてエラーが発生する場合があります。この場合、最初のジョブは成功していても、次のジョブが失敗する可能性があります。

可能性 3: キャッシュされた認証情報の不整合
キャッシュされた認証情報が正しく更新されていない場合、GoogleのAPIが新しいリクエストに対して「Unauthorized」エラーを返すことがあります。これが原因で、Gmail送信が成功しても、すぐに次のリクエストがエラーになる可能性があります。

解決策の提案:
トークンのリフレッシュを確認: トークンが有効期限切れになっていないか、リフレッシュトークンが正しく機能しているかを確認します。リフレッシュトークンがうまく機能していない場合、再認証が必要です。

エラーハンドリングを改善: Google::Apis::AuthorizationError が発生した場合、ジョブを再試行する前にトークンをリフレッシュするロジックを追加することができます。

ジョブの同時実行を防ぐ: 同時に複数の SendGmailJob が実行されないように、ジョブのロック機構を実装することを検討します。

トークンの永続化: 認証情報(トークン)を適切に永続化し、複数のジョブ間で使い回すことができるように設定を確認します。これにより、トークンの不整合を防ぐことができます。

これらの対策を講じることで、Gmail送信が成功しても、その後に発生する Unauthorized エラーを防ぐことができる可能性があります。
A1-frkweiichi commented 3 weeks ago