@@ -9,34 +9,48 @@ module Instrumentation
9
9
class SentryTracer < ::Sbmt ::KafkaConsumer ::Instrumentation ::Tracer
10
10
CONSUMER_ERROR_TYPES = %w[
11
11
consumer.base.consume_one
12
+ consumer.base.consumed_batch
12
13
consumer.inbox.consume_one
13
14
] . freeze
14
15
15
16
def trace ( &block )
16
17
return handle_consumed_one ( &block ) if @event_id == "consumer.consumed_one"
18
+ return handle_consumed_batch ( &block ) if @event_id == "consumer.consumed_batch"
17
19
return handle_error ( &block ) if @event_id == "error.occurred"
18
20
19
21
yield
20
22
end
21
23
22
24
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
32
35
yield
33
- rescue
34
- finish_transaction ( transaction , 500 )
35
- raise
36
36
end
37
+ end
37
38
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
40
54
end
41
55
42
56
def handle_error
@@ -64,9 +78,9 @@ def handle_error
64
78
65
79
private
66
80
67
- def start_transaction ( trace_id , consumer , message )
81
+ def start_transaction ( consumer , message )
68
82
scope = ::Sentry . get_current_scope
69
- scope . set_tags ( trace_id : trace_id , topic : message . topic , offset : message . offset )
83
+ scope . set_tags ( message )
70
84
scope . set_transaction_name ( "Sbmt/KafkaConsumer/#{ consumer . class . name } " )
71
85
72
86
transaction = ::Sentry . start_transaction ( name : scope . transaction_name , op : "kafka-consumer" )
@@ -97,6 +111,22 @@ def message_payload(message)
97
111
# so in that case we return raw_payload
98
112
message . raw_payload
99
113
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
100
130
end
101
131
end
102
132
end
0 commit comments