|
5 | 5 | RSpec.describe Datadog::Tracing::Contrib::Rack::TraceProxyMiddleware do |
6 | 6 | describe '#call' do |
7 | 7 | let(:service) { 'nginx' } |
| 8 | + let(:env) { { 'HTTP_X_REQUEST_START' => timestamp.to_i * 1000 } } |
8 | 9 |
|
9 | 10 | context 'when given timestamp' do |
10 | | - let(:timestamp) { Time.now.utc } |
| 11 | + let(:timestamp) { Time.at(1757000000) } |
11 | 12 |
|
12 | 13 | context 'when request_queuing: true' do |
13 | 14 | it 'behaves like request_queuing: :exclude_request' do |
14 | | - env = double |
15 | | - expect(Datadog::Tracing::Contrib::Rack::QueueTime).to receive(:get_request_start).with(env).and_return(timestamp) |
16 | | - |
17 | 15 | result = described_class.call(env, request_queuing: true, web_service_name: service) { :success } |
18 | 16 |
|
19 | 17 | expect(result).to eq :success |
|
41 | 39 | expect(queue_span.get_tag('span.kind')).to eq('proxy') |
42 | 40 | expect(queue_span).to be_measured |
43 | 41 | end |
| 42 | + |
| 43 | + context 'when the request fails' do |
| 44 | + it 'finishes the spans even if an exception is raised' do |
| 45 | + expect do |
| 46 | + described_class.call(env, request_queuing: true, web_service_name: service) { raise 'error' } |
| 47 | + end.to raise_error('error') |
| 48 | + |
| 49 | + expect(spans).to have(2).items |
| 50 | + queue_span, request_span = spans |
| 51 | + expect(request_span).to be_root_span |
| 52 | + expect(queue_span.parent_id).to eq(request_span.id) |
| 53 | + expect(request_span).to be_finished |
| 54 | + expect(queue_span).to be_finished |
| 55 | + end |
| 56 | + end |
44 | 57 | end |
45 | 58 |
|
46 | 59 | context 'when request_queuing: false' do |
47 | 60 | it 'does not create spans' do |
48 | | - env = double |
49 | | - allow(Datadog::Tracing::Contrib::Rack::QueueTime).to receive(:get_request_start).with(env).and_return(timestamp) |
50 | | - |
51 | 61 | result = described_class.call(env, request_queuing: false, web_service_name: service) { :success } |
52 | 62 |
|
53 | 63 | expect(result).to eq :success |
|
57 | 67 | end |
58 | 68 | end |
59 | 69 |
|
60 | | - context 'when given withouht timestamp' do |
| 70 | + context 'when given without timestamp' do |
61 | 71 | let(:timestamp) { nil } |
62 | 72 |
|
63 | 73 | context 'when request_queuing: true' do |
64 | 74 | it 'does not create spans' do |
65 | | - env = double |
66 | | - expect(Datadog::Tracing::Contrib::Rack::QueueTime).to receive(:get_request_start).with(env).and_return(timestamp) |
67 | | - |
68 | 75 | result = described_class.call(env, request_queuing: true, web_service_name: service) { :success } |
69 | 76 |
|
70 | 77 | expect(result).to eq :success |
|
75 | 82 |
|
76 | 83 | context 'when request_queuing: false' do |
77 | 84 | it 'does not create spans' do |
78 | | - env = double |
79 | | - allow(Datadog::Tracing::Contrib::Rack::QueueTime).to receive(:get_request_start).with(env).and_return(timestamp) |
80 | | - |
81 | 85 | result = described_class.call(env, request_queuing: false, web_service_name: service) { :success } |
82 | 86 |
|
83 | 87 | expect(result).to eq :success |
|
0 commit comments