@@ -44,13 +44,28 @@ module VCAP::CloudController
4444
4545 context 'when there is neither a TASK_STARTED event nor a TASK_WAS_RUNNING baseline' do
4646 let! ( :start_event ) { nil }
47+ let ( :fake_logger ) { instance_double ( Steno ::Logger , info : nil , warn : nil , debug : nil , error : nil ) }
48+
49+ before do
50+ allow ( Steno ) . to receive ( :logger ) . and_return ( fake_logger )
51+ end
4752
4853 it 'does not create a TASK_STOPPED event, since no consumer ever saw the task start' do
4954 task . update ( state : TaskModel ::SUCCEEDED_STATE )
5055
5156 event = AppUsageEvent . find ( task_guid : task . guid , state : 'TASK_STOPPED' )
5257 expect ( event ) . to be_nil
5358 end
59+
60+ it 'logs a warning, because a task that reached RUNNING must have had a start record once' do
61+ task . update ( state : TaskModel ::SUCCEEDED_STATE )
62+
63+ expect ( fake_logger ) . to have_received ( :warn ) . with (
64+ "Not writing a TASK_STOPPED usage event for task #{ task . guid } : the task was running but has no " \
65+ 'TASK_STARTED or TASK_WAS_RUNNING usage event on record. This should not happen. Run ' \
66+ "'rake db:was_running_backfill' and check whether usage events were deleted or purged."
67+ )
68+ end
5469 end
5570 end
5671
@@ -81,25 +96,51 @@ module VCAP::CloudController
8196
8297 context 'when there is neither a TASK_STARTED event nor a TASK_WAS_RUNNING baseline' do
8398 let! ( :start_event ) { nil }
99+ let ( :fake_logger ) { instance_double ( Steno ::Logger , info : nil , warn : nil , debug : nil , error : nil ) }
100+
101+ before do
102+ allow ( Steno ) . to receive ( :logger ) . and_return ( fake_logger )
103+ end
84104
85105 it 'does not create a TASK_STOPPED event, since no consumer ever saw the task start' do
86106 task . update ( state : TaskModel ::FAILED_STATE )
87107
88108 event = AppUsageEvent . find ( task_guid : task . guid , state : 'TASK_STOPPED' )
89109 expect ( event ) . to be_nil
90110 end
111+
112+ it 'logs a warning, because a task that reached RUNNING must have had a start record once' do
113+ task . update ( state : TaskModel ::FAILED_STATE )
114+
115+ expect ( fake_logger ) . to have_received ( :warn ) . with (
116+ "Not writing a TASK_STOPPED usage event for task #{ task . guid } : the task was running but has no " \
117+ 'TASK_STARTED or TASK_WAS_RUNNING usage event on record. This should not happen. Run ' \
118+ "'rake db:was_running_backfill' and check whether usage events were deleted or purged."
119+ )
120+ end
91121 end
92122 end
93123
94124 context 'when the task is moving from the PENDING state' do
95125 let ( :task ) { create ( :task_model , app : parent_app , state : TaskModel ::PENDING_STATE ) }
126+ let ( :fake_logger ) { instance_double ( Steno ::Logger , info : nil , warn : nil , debug : nil , error : nil ) }
127+
128+ before do
129+ allow ( Steno ) . to receive ( :logger ) . and_return ( fake_logger )
130+ end
96131
97132 it 'does not create a TASK_STOPPED event' do
98133 task . update ( state : TaskModel ::FAILED_STATE )
99134
100135 event = AppUsageEvent . find ( task_guid : task . guid , state : 'TASK_STOPPED' )
101136 expect ( event ) . to be_nil
102137 end
138+
139+ it 'does not log a warning, because a task that never ran is not supposed to have a start record' do
140+ task . update ( state : TaskModel ::FAILED_STATE )
141+
142+ expect ( fake_logger ) . not_to have_received ( :warn )
143+ end
103144 end
104145
105146 context 'when the task is moving from the CANCELING state' do
@@ -131,13 +172,25 @@ module VCAP::CloudController
131172
132173 context 'when the task does not have a TASK_STARTED event' do
133174 let! ( :start_event ) { nil }
175+ let ( :fake_logger ) { instance_double ( Steno ::Logger , info : nil , warn : nil , debug : nil , error : nil ) }
176+
177+ before do
178+ allow ( Steno ) . to receive ( :logger ) . and_return ( fake_logger )
179+ end
134180
135181 it 'does not create a TASK_STOPPED event' do
136182 task . update ( state : TaskModel ::FAILED_STATE )
137183
138184 event = AppUsageEvent . find ( task_guid : task . guid , state : 'TASK_STOPPED' )
139185 expect ( event ) . to be_nil
140186 end
187+
188+ it 'does not log a warning, because a task canceled while PENDING also passes through CANCELING, ' \
189+ 'so we cannot be sure this task ever ran' do
190+ task . update ( state : TaskModel ::FAILED_STATE )
191+
192+ expect ( fake_logger ) . not_to have_received ( :warn )
193+ end
141194 end
142195 end
143196
@@ -203,24 +256,70 @@ module VCAP::CloudController
203256
204257 context 'when the TASK_STARTED event has been pruned and a TASK_WAS_RUNNING baseline exists' do
205258 let! ( :start_event ) { create ( :app_usage_event , task_guid : task . guid , state : 'TASK_WAS_RUNNING' ) }
259+ let ( :fake_logger ) { instance_double ( Steno ::Logger , info : nil , warn : nil , debug : nil , error : nil ) }
260+
261+ before do
262+ allow ( Steno ) . to receive ( :logger ) . and_return ( fake_logger )
263+ end
206264
207265 it 'still creates a TASK_STOPPED event' do
208266 task . destroy
209267
210268 event = AppUsageEvent . find ( task_guid : task . guid , state : 'TASK_STOPPED' )
211269 expect ( event ) . not_to be_nil
212270 end
271+
272+ it 'does not log a warning, because the stop event was written' do
273+ task . destroy
274+
275+ expect ( fake_logger ) . not_to have_received ( :warn )
276+ end
213277 end
214278
215279 context 'when there is neither a TASK_STARTED event nor a TASK_WAS_RUNNING baseline' do
216- let ( :task ) { create ( :task_model , app : parent_app , state : TaskModel ::PENDING_STATE ) }
217280 let! ( :start_event ) { nil }
281+ let ( :fake_logger ) { instance_double ( Steno ::Logger , info : nil , warn : nil , debug : nil , error : nil ) }
218282
219- it 'does not create a TASK_STOPPED event, since no consumer ever saw the task start' do
220- task . destroy
283+ before do
284+ allow ( Steno ) . to receive ( :logger ) . and_return ( fake_logger )
285+ end
221286
222- event = AppUsageEvent . find ( task_guid : task . guid , state : 'TASK_STOPPED' )
223- expect ( event ) . to be_nil
287+ context 'when the task is PENDING' do
288+ let ( :task ) { create ( :task_model , app : parent_app , state : TaskModel ::PENDING_STATE ) }
289+
290+ it 'does not create a TASK_STOPPED event, since no consumer ever saw the task start' do
291+ task . destroy
292+
293+ event = AppUsageEvent . find ( task_guid : task . guid , state : 'TASK_STOPPED' )
294+ expect ( event ) . to be_nil
295+ end
296+
297+ it 'does not log a warning, because a task that never ran is not supposed to have a start record' do
298+ task . destroy
299+
300+ expect ( fake_logger ) . not_to have_received ( :warn )
301+ end
302+ end
303+
304+ context 'when the task is RUNNING' do
305+ let ( :task ) { create ( :task_model , app : parent_app , state : TaskModel ::RUNNING_STATE ) }
306+
307+ it 'does not create a TASK_STOPPED event, since no consumer ever saw the task start' do
308+ task . destroy
309+
310+ event = AppUsageEvent . find ( task_guid : task . guid , state : 'TASK_STOPPED' )
311+ expect ( event ) . to be_nil
312+ end
313+
314+ it 'logs a warning, because a task that reached RUNNING must have had a start record once' do
315+ task . destroy
316+
317+ expect ( fake_logger ) . to have_received ( :warn ) . with (
318+ "Not writing a TASK_STOPPED usage event for task #{ task . guid } : the task was running but has no " \
319+ 'TASK_STARTED or TASK_WAS_RUNNING usage event on record. This should not happen. Run ' \
320+ "'rake db:was_running_backfill' and check whether usage events were deleted or purged."
321+ )
322+ end
224323 end
225324 end
226325
0 commit comments