palkan / active_event_store

Rails Event Store in a more Rails way
MIT License
181 stars 13 forks source link

ArgumentError (missing keywords: :event_type, :event_id, :data, :metadata): #12

Closed remoteweb closed 1 year ago

remoteweb commented 1 year ago

What did you do?

Implementing active event store for async events with sidekiq as ActiveJob adapter.

What did you expect to happen?

The SubscriberJob to execute properly

What actually happened?

ArgumentError (missing keywords: :event_type, :event_id, :data, :metadata): upon subscriber sidekiq job execution

Additional context

image

Environment

Ruby Version: 3.2.2

Framework Version (Rails, whatever): Rails 7.0.7

Active Event Store Version: active_event_store (1.0.2)

Rails Event Store Version: rails_event_store (2.11.1)

Sidekiq Version: sidekiq (7.1.2)

remoteweb commented 1 year ago

I used rails_event_store version 2.1 and the problem disappeared.

Something might have changed with the deserialize method of Rails Event Store gem and it causes errors in Active Event Store job execution.

remoteweb commented 1 year ago

Full error backtrace

ERROR: Error performing OnHubCompanyUpdated::SyncCompany::SubscriberJob (Job ID: 6f094d2d-a383-4c48-94dc-00f63ada7221) from Sidekiq(events_subscribers) in 185291.56ms: ArgumentError (missing keywords: :event_type, :event_id, :data, :metadata):
/Users/arisxama/.rbenv/versions/3.2.2/lib/ruby/gems/3.2.0/gems/ruby_event_store-2.11.1/lib/ruby_event_store/client.rb:273:in `deserialize'
/Users/arisxama/.rbenv/versions/3.2.2/lib/ruby/gems/3.2.0/gems/active_event_store-1.0.2/lib/active_event_store/subscriber_job.rb:42:in `perform'
...
...
2023-08-18T12:07:51.359Z pid=34729 tid=4b6t class=OnHubCompanyUpdated::SyncCompany::SubscriberJob jid=76a3177eb4a9071d664c81b1 elapsed=185.342 INFO: fail
remoteweb commented 1 year ago

The problem is this part of code here

# .rbenv/versions/3.2.2/lib/ruby/gems/3.2.0/gems/active_event_store-1.0.2/lib/active_event_store/subscriber_job.rb#41
event = event_store.deserialize(**payload, serializer: ActiveEventStore.config.serializer)

Payload from Rails Event Store 2.11.1 is

 {"event_id"=>"7eac442a-6966-4241-a33f-419dd82f3a50",
 "data"=>"\"{\\\"company_guid\\\":\\\"UUID\\\"}\"",
 "metadata"=>"\"{\\\"timestamp\\\":\\\"2023-08-18 12:58:27 UTC\\\",\\\"valid_at\\\":\\\"2023-08-18 12:58:27 UTC\\\",\\\"correlation_id\\\":\\\"1a56cc7f-fa95-47d7-96bb-36db02bd8181\\\"}\"",
 "event_type"=>"hub_company_updated",
 "timestamp"=>"2023-08-18T12:58:27.114715Z",
 "valid_at"=>"2023-08-18T12:58:27.114715Z"}

while Payload from Rails Event Store 2.1 was

{:event_id=>"7eac442a-6966-4241-a33f-419dd82f3a50",
 :data=>"\"{\\\"company_guid\\\":\\\"UUID\\\"}\"",
 :metadata=>"\"{\\\"timestamp\\\":\\\"2023-08-18 12:58:27 UTC\\\",\\\"valid_at\\\":\\\"2023-08-18 12:58:27 UTC\\\",\\\"correlation_id\\\":\\\"1a56cc7f-fa95-47d7-96bb-36db02bd8181\\\"}\"",
 :event_type=>"hub_company_updated",
 :timestamp=>"2023-08-18T12:58:27.114715Z",
 :valid_at=>"2023-08-18T12:58:27.114715Z"}

due to this part of code that changed in Rails Event Store gem

# .rbenv/versions/3.2.2/lib/ruby/gems/3.2.0/gems/rails_event_store-2.11.1/lib/rails_event_store/active_job_scheduler.rb#12
klass.perform_later(record.serialize(serializer).to_h.transform_keys(&:to_s))
# .rbenv/versions/3.2.2/lib/ruby/gems/3.2.0/gems/rails_event_store-2.1.0/lib/rails_event_store/active_job_scheduler.rb#12
klass.perform_later(record.serialize(serializer).to_h)
palkan commented 1 year ago

Thanks for the detailed report. Will take a look later this week.

palkan commented 1 year ago

Fixed and released in 1.1.0.