|
17 | 17 | before do |
18 | 18 | Datadog.configure do |c| |
19 | 19 | c.tracing.instrument :karafka, configuration_options |
| 20 | + c.tracing.instrument :karafka, describes: /special_/, distributed_tracing: false |
20 | 21 | end |
21 | 22 | end |
22 | 23 |
|
|
31 | 32 | let(:span_name) { Datadog::Tracing::Contrib::Karafka::Ext::SPAN_MESSAGE_CONSUME } |
32 | 33 |
|
33 | 34 | it 'is expected to send a span' do |
34 | | - metadata = ::Karafka::Messages::Metadata.new |
35 | | - metadata['offset'] = 412 |
| 35 | + metadata = ::Karafka::Messages::Metadata.new(offset: 412, timestamp: Time.now, topic: 'topic_a') |
36 | 36 | raw_payload = rand.to_s |
37 | 37 |
|
38 | 38 | message = ::Karafka::Messages::Message.new(raw_payload, metadata) |
39 | | - allow(message).to receive(:timestamp).and_return(Time.now) |
40 | | - allow(message).to receive(:topic).and_return('topic_a') |
41 | | - |
42 | | - topic = ::Karafka::Routing::Topic.new('topic_a', double(id: 0)) |
43 | 39 |
|
| 40 | + topic = ::Karafka::Routing::Topic.new(message.topic, double(id: 0)) |
44 | 41 | messages = ::Karafka::Messages::Builders::Messages.call([message], topic, 0, Time.now) |
45 | 42 |
|
46 | 43 | expect(messages).to all(be_a(::Karafka::Messages::Message)) |
|
55 | 52 | end |
56 | 53 |
|
57 | 54 | context 'when the message has tracing headers' do |
| 55 | + let(:topic_name) { "topic_a" } |
58 | 56 | let(:message) do |
59 | 57 | headers = {} |
60 | 58 | producer_trace = nil |
|
64 | 62 | producer_trace = trace |
65 | 63 | Datadog::Tracing::Contrib::Karafka.inject(trace.to_digest, headers) |
66 | 64 | end |
67 | | - metadata = ::Karafka::Messages::Metadata.new |
68 | | - metadata['offset'] = 412 |
69 | | - metadata[headers_accessor] = headers |
| 65 | + metadata = ::Karafka::Messages::Metadata.new( |
| 66 | + offset: 412, |
| 67 | + headers_accessor => headers, |
| 68 | + topic: topic_name, |
| 69 | + timestamp: Time.now |
| 70 | + ) |
70 | 71 | raw_payload = rand.to_s |
71 | 72 |
|
72 | | - message = ::Karafka::Messages::Message.new(raw_payload, metadata) |
73 | | - allow(message).to receive(:timestamp).and_return(Time.now) |
74 | | - allow(message).to receive(:topic).and_return('topic_a') |
75 | | - message |
| 73 | + ::Karafka::Messages::Message.new(raw_payload, metadata) |
76 | 74 | end |
77 | 75 | let(:headers_accessor) do |
78 | 76 | ::Karafka::Messages::Metadata.members.include?(:raw_headers) ? 'raw_headers' : 'headers' |
|
89 | 87 | consumer_span = Datadog::Tracing.active_span |
90 | 88 | consumer_trace = Datadog::Tracing.active_trace |
91 | 89 |
|
92 | | - topic = ::Karafka::Routing::Topic.new('topic_a', double(id: 0)) |
| 90 | + topic = ::Karafka::Routing::Topic.new(topic_name, double(id: 0)) |
93 | 91 | messages = ::Karafka::Messages::Builders::Messages.call([message], topic, 0, Time.now) |
94 | 92 | expect(messages).to all(be_a(::Karafka::Messages::Message)) |
95 | 93 |
|
|
113 | 111 | end |
114 | 112 | end |
115 | 113 |
|
| 114 | + context "when distributed tracing is disabled for the topic in particular" do |
| 115 | + let(:topic_name) { "special_topic" } |
| 116 | + |
| 117 | + it 'does not continue the span that produced the message' do |
| 118 | + consumer_span = nil |
| 119 | + consumer_trace = nil |
| 120 | + |
| 121 | + Datadog::Tracing.trace('consumer') do |
| 122 | + consumer_span = Datadog::Tracing.active_span |
| 123 | + consumer_trace = Datadog::Tracing.active_trace |
| 124 | + |
| 125 | + topic = ::Karafka::Routing::Topic.new(topic_name, double(id: 0)) |
| 126 | + messages = ::Karafka::Messages::Builders::Messages.call([message], topic, 0, Time.now) |
| 127 | + expect(messages).to all(be_a(::Karafka::Messages::Message)) |
| 128 | + |
| 129 | + # assert that the current trace re-set to the original trace after iterating the messages |
| 130 | + expect(Datadog::Tracing.active_trace).to eq(consumer_trace) |
| 131 | + expect(Datadog::Tracing.active_span).to eq(consumer_span) |
| 132 | + end |
| 133 | + |
| 134 | + expect(spans).to have(3).items |
| 135 | + |
| 136 | + # assert that the message span is not continuation of the producer span |
| 137 | + expect(span.parent_id).to eq(consumer_span.id) |
| 138 | + expect(span.trace_id).to eq(consumer_trace.id) |
| 139 | + |
| 140 | + expect(span.links).to be_empty |
| 141 | + expect(consumer_span.links).to be_empty |
| 142 | + end |
| 143 | + end |
| 144 | + |
116 | 145 | context 'when distributed tracing is not enabled' do |
117 | 146 | let(:configuration_options) { { distributed_tracing: false } } |
118 | 147 |
|
|
124 | 153 | consumer_span = Datadog::Tracing.active_span |
125 | 154 | consumer_trace = Datadog::Tracing.active_trace |
126 | 155 |
|
127 | | - topic = ::Karafka::Routing::Topic.new('topic_a', double(id: 0)) |
| 156 | + topic = ::Karafka::Routing::Topic.new(topic_name, double(id: 0)) |
128 | 157 | messages = ::Karafka::Messages::Builders::Messages.call([message], topic, 0, Time.now) |
129 | 158 | expect(messages).to all(be_a(::Karafka::Messages::Message)) |
130 | 159 |
|
|
150 | 179 | let(:span_name) { Datadog::Tracing::Contrib::Karafka::Ext::SPAN_WORKER_PROCESS } |
151 | 180 |
|
152 | 181 | it 'is expected to send a span' do |
153 | | - metadata = ::Karafka::Messages::Metadata.new |
154 | | - metadata['offset'] = 412 |
| 182 | + metadata = ::Karafka::Messages::Metadata.new(offset: 412, topic: 'topic_a') |
155 | 183 | raw_payload = rand.to_s |
156 | 184 |
|
157 | 185 | message = ::Karafka::Messages::Message.new(raw_payload, metadata) |
158 | | - job = double(executor: double(topic: double(name: 'topic_a', consumer: 'ABC'), partition: 0), messages: [message]) |
| 186 | + job = double(executor: double(topic: double(name: message.topic, consumer: 'ABC'), partition: 0), messages: [message]) |
159 | 187 |
|
160 | 188 | Karafka.monitor.instrument('worker.processed', { job: job }) do |
161 | 189 | # Noop |
|
0 commit comments