|
8 | 8 | let(:tracer) { ::OpenTelemetry.tracer_provider.tracer('sentry', '1.0') }
|
9 | 9 | let(:empty_context) { ::OpenTelemetry::Context.empty }
|
10 | 10 | let(:invalid_span) { ::OpenTelemetry::SDK::Trace::Span::INVALID }
|
| 11 | + let(:error_span) do |
| 12 | + attributes = { |
| 13 | + 'http.method' => 'GET', |
| 14 | + 'http.host' => 'sentry.io', |
| 15 | + 'http.scheme' => 'https' |
| 16 | + } |
| 17 | + |
| 18 | + tracer.start_root_span('HTTP GET', attributes: attributes, kind: :server).tap do |span| |
| 19 | + span.status = OpenTelemetry::Trace::Status.error("not a success") |
| 20 | + end |
| 21 | + end |
| 22 | + let(:http_error_span) do |
| 23 | + attributes = { |
| 24 | + 'http.method' => 'GET', |
| 25 | + 'http.host' => 'sentry.io', |
| 26 | + 'http.scheme' => 'https', |
| 27 | + 'http.status_code' => '409' |
| 28 | + } |
| 29 | + |
| 30 | + tracer.start_root_span('HTTP GET', attributes: attributes, kind: :server) |
| 31 | + end |
11 | 32 |
|
12 | 33 | let(:root_span) do
|
13 | 34 | attributes = {
|
|
197 | 218 | subject.on_start(root_span, empty_context)
|
198 | 219 | subject.on_start(child_db_span, root_parent_context)
|
199 | 220 | subject.on_start(child_http_span, root_parent_context)
|
| 221 | + subject.on_start(error_span, empty_context) |
| 222 | + subject.on_start(http_error_span, empty_context) |
200 | 223 | end
|
201 | 224 |
|
202 | 225 | let(:finished_db_span) { child_db_span.finish }
|
203 | 226 | let(:finished_http_span) { child_http_span.finish }
|
204 | 227 | let(:finished_root_span) { root_span.finish }
|
205 | 228 | let(:finished_invalid_span) { invalid_span.finish }
|
| 229 | + let(:finished_error_span) { error_span.finish } |
| 230 | + let(:finished_http_error_span) { http_error_span.finish } |
206 | 231 |
|
207 | 232 | it 'noops when not initialized' do
|
208 | 233 | expect(Sentry).to receive(:initialized?).and_return(false)
|
|
224 | 249 | subject.on_finish(finished_invalid_span)
|
225 | 250 | end
|
226 | 251 |
|
| 252 | + it 'updates span status on error' do |
| 253 | + expect(subject.span_map).to receive(:delete).and_call_original |
| 254 | + |
| 255 | + span_id = finished_error_span.context.hex_span_id |
| 256 | + sentry_span = subject.span_map[span_id] |
| 257 | + |
| 258 | + expect(sentry_span).to receive(:finish).and_call_original |
| 259 | + subject.on_finish(finished_error_span) |
| 260 | + |
| 261 | + expect(sentry_span.status).to eq('internal_error') |
| 262 | + end |
| 263 | + |
| 264 | + it 'updates span status on HTTP error' do |
| 265 | + expect(subject.span_map).to receive(:delete).and_call_original |
| 266 | + |
| 267 | + span_id = finished_http_error_span.context.hex_span_id |
| 268 | + sentry_span = subject.span_map[span_id] |
| 269 | + |
| 270 | + expect(sentry_span).to receive(:finish).and_call_original |
| 271 | + subject.on_finish(finished_http_error_span) |
| 272 | + |
| 273 | + expect(sentry_span.status).to eq('already_exists') |
| 274 | + end |
| 275 | + |
227 | 276 | it 'finishes sentry child span on otel child db span finish' do
|
228 | 277 | expect(subject.span_map).to receive(:delete).and_call_original
|
229 | 278 |
|
|
241 | 290 | expect(sentry_span.data).to include({ 'otel.kind' => finished_db_span.kind })
|
242 | 291 | expect(sentry_span.timestamp).to eq(finished_db_span.end_timestamp / 1e9)
|
243 | 292 |
|
244 |
| - expect(subject.span_map.size).to eq(2) |
| 293 | + expect(subject.span_map.size).to eq(4) |
245 | 294 | expect(subject.span_map.keys).not_to include(span_id)
|
246 | 295 | end
|
247 | 296 |
|
|
263 | 312 | expect(sentry_span.timestamp).to eq(finished_http_span.end_timestamp / 1e9)
|
264 | 313 | expect(sentry_span.status).to eq('ok')
|
265 | 314 |
|
266 |
| - expect(subject.span_map.size).to eq(2) |
| 315 | + expect(subject.span_map.size).to eq(4) |
267 | 316 | expect(subject.span_map.keys).not_to include(span_id)
|
268 | 317 | end
|
269 | 318 |
|
270 | 319 | it 'finishes sentry transaction on otel root span finish' do
|
271 | 320 | subject.on_finish(finished_db_span)
|
272 | 321 | subject.on_finish(finished_http_span)
|
| 322 | + subject.on_finish(finished_error_span) |
| 323 | + subject.on_finish(finished_http_error_span) |
273 | 324 |
|
274 | 325 | expect(subject.span_map).to receive(:delete).and_call_original
|
275 | 326 |
|
|
0 commit comments