@@ -9,34 +9,48 @@ module Instrumentation
99 class SentryTracer < ::Sbmt ::KafkaConsumer ::Instrumentation ::Tracer
1010 CONSUMER_ERROR_TYPES = %w[
1111 consumer.base.consume_one
12+ consumer.base.consumed_batch
1213 consumer.inbox.consume_one
1314 ] . freeze
1415
1516 def trace ( &block )
1617 return handle_consumed_one ( &block ) if @event_id == "consumer.consumed_one"
18+ return handle_consumed_batch ( &block ) if @event_id == "consumer.consumed_batch"
1719 return handle_error ( &block ) if @event_id == "error.occurred"
1820
1921 yield
2022 end
2123
2224 def handle_consumed_one
23- return yield unless ::Sentry . initialized?
24-
25- consumer = @payload [ :caller ]
26- message = @payload [ :message ]
27- trace_id = @payload [ :trace_id ]
28-
29- scope , transaction = start_transaction ( trace_id , consumer , message )
30-
31- begin
25+ message = {
26+ trace_id : @payload [ :trace_id ] ,
27+ topic : @payload [ :message ] . topic ,
28+ offset : @payload [ :message ] . offset
29+ }
30+
31+ with_sentry_transaction (
32+ @payload [ :caller ] ,
33+ message
34+ ) do
3235 yield
33- rescue
34- finish_transaction ( transaction , 500 )
35- raise
3636 end
37+ end
3738
38- finish_transaction ( transaction , 200 )
39- scope . clear
39+ def handle_consumed_batch
40+ message_first = @payload [ :messages ] . first
41+ message = {
42+ trace_id : @payload [ :trace_id ] ,
43+ topic : message_first . topic ,
44+ first_offset : message_first . offset ,
45+ last_offset : @payload [ :messages ] . last . offset
46+ }
47+
48+ with_sentry_transaction (
49+ @payload [ :caller ] ,
50+ message
51+ ) do
52+ yield
53+ end
4054 end
4155
4256 def handle_error
@@ -64,9 +78,9 @@ def handle_error
6478
6579 private
6680
67- def start_transaction ( trace_id , consumer , message )
81+ def start_transaction ( consumer , message )
6882 scope = ::Sentry . get_current_scope
69- scope . set_tags ( trace_id : trace_id , topic : message . topic , offset : message . offset )
83+ scope . set_tags ( message )
7084 scope . set_transaction_name ( "Sbmt/KafkaConsumer/#{ consumer . class . name } " )
7185
7286 transaction = ::Sentry . start_transaction ( name : scope . transaction_name , op : "kafka-consumer" )
@@ -97,6 +111,22 @@ def message_payload(message)
97111 # so in that case we return raw_payload
98112 message . raw_payload
99113 end
114+
115+ def with_sentry_transaction ( consumer , message )
116+ return yield unless ::Sentry . initialized?
117+
118+ scope , transaction = start_transaction ( consumer , message )
119+
120+ begin
121+ yield
122+ rescue
123+ finish_transaction ( transaction , 500 )
124+ raise
125+ end
126+
127+ finish_transaction ( transaction , 200 )
128+ scope . clear
129+ end
100130 end
101131 end
102132 end
0 commit comments