sbmt-kafka_consumer 3.0.0 → 3.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +18 -0
- data/lib/sbmt/kafka_consumer/base_consumer.rb +10 -15
- data/lib/sbmt/kafka_consumer/inbox_consumer.rb +14 -19
- data/lib/sbmt/kafka_consumer/instrumentation/logger_listener.rb +32 -6
- data/lib/sbmt/kafka_consumer/testing/shared_contexts/with_sbmt_karafka_consumer.rb +2 -3
- data/lib/sbmt/kafka_consumer/version.rb +1 -1
- metadata +3 -3
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA256:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: 884f55960d86ac5b756f5b7defc30298e6918a543a168f69613972b6f4dd1282
         | 
| 4 | 
            +
              data.tar.gz: 4521497f45d7c2bdf7fb78de36ddba7b077a51aee92c5c7aab41057e9b0e1f5a
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: d25efefade51458b46dd3f060983143f9de35d71d7e007dd082daf5f4a6d8a8a635daff400337d38a8621cdda1ad694e115f4816594cb9f94bd408ec8ddd2b9a
         | 
| 7 | 
            +
              data.tar.gz: 7fcf377249867d6694515bf006af17de6ade409ddf813bffc63471d437cd1752f659c72d210f071fcf937f6be99f75bf4028e25a3b803d7abfd04e8fd464fdb3
         | 
    
        data/CHANGELOG.md
    CHANGED
    
    | @@ -13,6 +13,18 @@ and this project adheres to [Semantic Versioning](http://semver.org/). | |
| 13 13 |  | 
| 14 14 | 
             
            ### Fixed
         | 
| 15 15 |  | 
| 16 | 
            +
            ## [3.2.0] - 2024-09-17
         | 
| 17 | 
            +
             | 
| 18 | 
            +
            ### Added
         | 
| 19 | 
            +
             | 
| 20 | 
            +
            - For synchronous messages and errors, we place logs in tags
         | 
| 21 | 
            +
             | 
| 22 | 
            +
            ## [3.1.0] - 2024-09-09
         | 
| 23 | 
            +
             | 
| 24 | 
            +
            ### Fixed
         | 
| 25 | 
            +
             | 
| 26 | 
            +
            - Refactor consumer class initialization
         | 
| 27 | 
            +
             | 
| 16 28 | 
             
            ## [3.0.0] - 2024-09-04
         | 
| 17 29 |  | 
| 18 30 | 
             
            ## BREAKING
         | 
| @@ -25,6 +37,12 @@ and this project adheres to [Semantic Versioning](http://semver.org/). | |
| 25 37 |  | 
| 26 38 | 
             
            - Support consumer group mappers to support backward compatibility of consumer group naming
         | 
| 27 39 |  | 
| 40 | 
            +
            ## [2.8.0] - 2024-09-09
         | 
| 41 | 
            +
             | 
| 42 | 
            +
            ### Fixed
         | 
| 43 | 
            +
             | 
| 44 | 
            +
            - Refactor consumer class initialization
         | 
| 45 | 
            +
             | 
| 28 46 | 
             
            ## [2.7.1] - 2024-08-01
         | 
| 29 47 |  | 
| 30 48 | 
             
            ### Fixed
         | 
| @@ -3,15 +3,20 @@ | |
| 3 3 | 
             
            module Sbmt
         | 
| 4 4 | 
             
              module KafkaConsumer
         | 
| 5 5 | 
             
                class BaseConsumer < Karafka::BaseConsumer
         | 
| 6 | 
            -
                   | 
| 7 | 
            -
             | 
| 8 | 
            -
                      const_set(:SKIP_ON_ERROR, skip_on_error)
         | 
| 9 | 
            -
                      const_set(:MIDDLEWARES, middlewares.map(&:constantize))
         | 
| 6 | 
            +
                  class_attribute :skip_on_error, instance_writer: false, default: false
         | 
| 7 | 
            +
                  class_attribute :middlewares, instance_writer: false, default: []
         | 
| 10 8 |  | 
| 9 | 
            +
                  def self.consumer_klass(skip_on_error: nil, middlewares: nil)
         | 
| 10 | 
            +
                    klass = Class.new(self) do
         | 
| 11 11 | 
             
                      def self.name
         | 
| 12 12 | 
             
                        superclass.name
         | 
| 13 13 | 
             
                      end
         | 
| 14 14 | 
             
                    end
         | 
| 15 | 
            +
             | 
| 16 | 
            +
                    # defaults are set in class_attribute definition
         | 
| 17 | 
            +
                    klass.skip_on_error = skip_on_error if skip_on_error
         | 
| 18 | 
            +
                    klass.middlewares = middlewares.map(&:constantize) if middlewares
         | 
| 19 | 
            +
                    klass
         | 
| 15 20 | 
             
                  end
         | 
| 16 21 |  | 
| 17 22 | 
             
                  def consume
         | 
| @@ -40,9 +45,7 @@ module Sbmt | |
| 40 45 |  | 
| 41 46 | 
             
                  def with_instrumentation(message)
         | 
| 42 47 | 
             
                    logger.tagged(
         | 
| 43 | 
            -
                      trace_id: trace_id | 
| 44 | 
            -
                      topic: message.metadata.topic, partition: message.metadata.partition,
         | 
| 45 | 
            -
                      key: message.metadata.key, offset: message.metadata.offset
         | 
| 48 | 
            +
                      trace_id: trace_id
         | 
| 46 49 | 
             
                    ) do
         | 
| 47 50 | 
             
                      ::Sbmt::KafkaConsumer.monitor.instrument(
         | 
| 48 51 | 
             
                        "consumer.consumed_one",
         | 
| @@ -112,14 +115,6 @@ module Sbmt | |
| 112 115 | 
             
                    end
         | 
| 113 116 | 
             
                  end
         | 
| 114 117 |  | 
| 115 | 
            -
                  def skip_on_error
         | 
| 116 | 
            -
                    self.class::SKIP_ON_ERROR
         | 
| 117 | 
            -
                  end
         | 
| 118 | 
            -
             | 
| 119 | 
            -
                  def middlewares
         | 
| 120 | 
            -
                    self.class::MIDDLEWARES
         | 
| 121 | 
            -
                  end
         | 
| 122 | 
            -
             | 
| 123 118 | 
             
                  # can be overridden in consumer to enable message logging
         | 
| 124 119 | 
             
                  def log_payload?
         | 
| 125 120 | 
             
                    false
         | 
| @@ -6,17 +6,20 @@ module Sbmt | |
| 6 6 | 
             
                  IDEMPOTENCY_HEADER_NAME = "Idempotency-Key"
         | 
| 7 7 | 
             
                  DEFAULT_SOURCE = "KAFKA"
         | 
| 8 8 |  | 
| 9 | 
            -
                   | 
| 10 | 
            -
             | 
| 11 | 
            -
             | 
| 12 | 
            -
             | 
| 13 | 
            -
             | 
| 14 | 
            -
             | 
| 15 | 
            -
             | 
| 16 | 
            -
             | 
| 17 | 
            -
             | 
| 18 | 
            -
             | 
| 19 | 
            -
             | 
| 9 | 
            +
                  class_attribute :inbox_item_class, instance_writer: false, default: nil
         | 
| 10 | 
            +
                  class_attribute :event_name, instance_writer: false, default: nil
         | 
| 11 | 
            +
             | 
| 12 | 
            +
                  def self.consumer_klass(inbox_item:, event_name: nil, skip_on_error: nil, name: nil, middlewares: nil)
         | 
| 13 | 
            +
                    # defaults are set in class_attribute definition
         | 
| 14 | 
            +
                    klass = super(skip_on_error: skip_on_error, middlewares: middlewares)
         | 
| 15 | 
            +
                    klass.inbox_item_class = inbox_item.constantize
         | 
| 16 | 
            +
                    klass.event_name = event_name if event_name
         | 
| 17 | 
            +
                    klass
         | 
| 18 | 
            +
                  end
         | 
| 19 | 
            +
             | 
| 20 | 
            +
                  def initialize
         | 
| 21 | 
            +
                    raise Sbmt::KafkaConsumer::Error, "inbox_item param is not set" if inbox_item_class.blank?
         | 
| 22 | 
            +
                    super
         | 
| 20 23 | 
             
                  end
         | 
| 21 24 |  | 
| 22 25 | 
             
                  def extra_message_attrs(_message)
         | 
| @@ -101,14 +104,6 @@ module Sbmt | |
| 101 104 | 
             
                    message.metadata.headers.fetch(IDEMPOTENCY_HEADER_NAME, nil).presence
         | 
| 102 105 | 
             
                  end
         | 
| 103 106 |  | 
| 104 | 
            -
                  def inbox_item_class
         | 
| 105 | 
            -
                    @inbox_item_class ||= self.class::INBOX_ITEM_CLASS_NAME.constantize
         | 
| 106 | 
            -
                  end
         | 
| 107 | 
            -
             | 
| 108 | 
            -
                  def event_name
         | 
| 109 | 
            -
                    @event_name ||= self.class::EVENT_NAME
         | 
| 110 | 
            -
                  end
         | 
| 111 | 
            -
             | 
| 112 107 | 
             
                  def inbox_name
         | 
| 113 108 | 
             
                    inbox_item_class.box_name
         | 
| 114 109 | 
             
                  end
         | 
| @@ -20,30 +20,56 @@ module Sbmt | |
| 20 20 |  | 
| 21 21 | 
             
                      logger.tagged(
         | 
| 22 22 | 
             
                        type: type,
         | 
| 23 | 
            +
                        stacktrace: log_backtrace(error),
         | 
| 23 24 | 
             
                        **tags
         | 
| 24 25 | 
             
                      ) do
         | 
| 25 26 | 
             
                        logger.error(error_message(error))
         | 
| 26 | 
            -
                        log_backtrace(error)
         | 
| 27 27 | 
             
                      end
         | 
| 28 28 | 
             
                    end
         | 
| 29 29 |  | 
| 30 30 | 
             
                    # BaseConsumer events
         | 
| 31 31 | 
             
                    def on_consumer_consumed_one(event)
         | 
| 32 | 
            -
                       | 
| 32 | 
            +
                      log_with_tags(log_tags(event), "Successfully consumed message")
         | 
| 33 33 | 
             
                    end
         | 
| 34 34 |  | 
| 35 35 | 
             
                    def on_consumer_mark_as_consumed(event)
         | 
| 36 | 
            -
                       | 
| 36 | 
            +
                      log_with_tags(log_tags(event), "Processing message")
         | 
| 37 37 | 
             
                    end
         | 
| 38 38 |  | 
| 39 39 | 
             
                    def on_consumer_process_message(event)
         | 
| 40 | 
            -
                       | 
| 40 | 
            +
                      log_with_tags(log_tags(event), "Commit offset")
         | 
| 41 41 | 
             
                    end
         | 
| 42 42 |  | 
| 43 43 | 
             
                    # InboxConsumer events
         | 
| 44 44 | 
             
                    def on_consumer_inbox_consumed_one(event)
         | 
| 45 | 
            -
                       | 
| 46 | 
            -
             | 
| 45 | 
            +
                      log_tags = log_tags(event).merge!(status: event[:status])
         | 
| 46 | 
            +
                      msg = "Successfully consumed message with uuid: #{event[:message_uuid]}"
         | 
| 47 | 
            +
             | 
| 48 | 
            +
                      log_with_tags(log_tags, msg)
         | 
| 49 | 
            +
                    end
         | 
| 50 | 
            +
             | 
| 51 | 
            +
                    private
         | 
| 52 | 
            +
             | 
| 53 | 
            +
                    def log_tags(event)
         | 
| 54 | 
            +
                      metadata = event.payload[:message].metadata
         | 
| 55 | 
            +
             | 
| 56 | 
            +
                      {
         | 
| 57 | 
            +
                        kafka: {
         | 
| 58 | 
            +
                          topic: metadata.topic,
         | 
| 59 | 
            +
                          partition: metadata.partition,
         | 
| 60 | 
            +
                          key: metadata.key,
         | 
| 61 | 
            +
                          offset: metadata.offset,
         | 
| 62 | 
            +
                          consumer_group: event.payload[:caller].topic.consumer_group.id,
         | 
| 63 | 
            +
                          consume_duration_ms: event.payload[:time]
         | 
| 64 | 
            +
                        }
         | 
| 65 | 
            +
                      }
         | 
| 66 | 
            +
                    end
         | 
| 67 | 
            +
             | 
| 68 | 
            +
                    def log_with_tags(log_tags, msg)
         | 
| 69 | 
            +
                      return unless logger.respond_to?(:tagged)
         | 
| 70 | 
            +
             | 
| 71 | 
            +
                      logger.tagged(log_tags) do
         | 
| 72 | 
            +
                        logger.send(:info, msg)
         | 
| 47 73 | 
             
                      end
         | 
| 48 74 | 
             
                    end
         | 
| 49 75 | 
             
                  end
         | 
| @@ -16,9 +16,8 @@ RSpec.shared_context "with sbmt karafka consumer" do | |
| 16 16 | 
             
              let(:kafka_client) { instance_double(Karafka::Connection::Client) }
         | 
| 17 17 | 
             
              let(:null_deserializer) { Sbmt::KafkaConsumer::Serialization::NullDeserializer.new }
         | 
| 18 18 |  | 
| 19 | 
            -
              let(: | 
| 20 | 
            -
             | 
| 21 | 
            -
              }
         | 
| 19 | 
            +
              let(:consumer_class) { described_class.consumer_klass }
         | 
| 20 | 
            +
              let(:consumer) { build_consumer(consumer_class.new) }
         | 
| 22 21 |  | 
| 23 22 | 
             
              before {
         | 
| 24 23 | 
             
                Sbmt::KafkaConsumer::ClientConfigurer.configure!
         | 
    
        metadata
    CHANGED
    
    | @@ -1,14 +1,14 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: sbmt-kafka_consumer
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 3. | 
| 4 | 
            +
              version: 3.2.0
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - Kuper Ruby-Platform Team
         | 
| 8 8 | 
             
            autorequire:
         | 
| 9 9 | 
             
            bindir: exe
         | 
| 10 10 | 
             
            cert_chain: []
         | 
| 11 | 
            -
            date: 2024-09- | 
| 11 | 
            +
            date: 2024-09-18 00:00:00.000000000 Z
         | 
| 12 12 | 
             
            dependencies:
         | 
| 13 13 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 14 14 | 
             
              name: rails
         | 
| @@ -565,7 +565,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement | |
| 565 565 | 
             
                - !ruby/object:Gem::Version
         | 
| 566 566 | 
             
                  version: '0'
         | 
| 567 567 | 
             
            requirements: []
         | 
| 568 | 
            -
            rubygems_version: 3. | 
| 568 | 
            +
            rubygems_version: 3.1.6
         | 
| 569 569 | 
             
            signing_key:
         | 
| 570 570 | 
             
            specification_version: 4
         | 
| 571 571 | 
             
            summary: Ruby gem for consuming Kafka messages
         |