@@ -44,13 +44,29 @@ 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. Find out ' \
66+ "what deleted or purged the usage events, and run 'rake db:was_running_backfill' so the other " \
67+ 'tasks that are still running get a baseline. (It cannot help this task; it is no longer running.)'
68+ )
69+ end
5470 end
5571 end
5672
@@ -81,25 +97,52 @@ module VCAP::CloudController
8197
8298 context 'when there is neither a TASK_STARTED event nor a TASK_WAS_RUNNING baseline' do
8399 let! ( :start_event ) { nil }
100+ let ( :fake_logger ) { instance_double ( Steno ::Logger , info : nil , warn : nil , debug : nil , error : nil ) }
101+
102+ before do
103+ allow ( Steno ) . to receive ( :logger ) . and_return ( fake_logger )
104+ end
84105
85106 it 'does not create a TASK_STOPPED event, since no consumer ever saw the task start' do
86107 task . update ( state : TaskModel ::FAILED_STATE )
87108
88109 event = AppUsageEvent . find ( task_guid : task . guid , state : 'TASK_STOPPED' )
89110 expect ( event ) . to be_nil
90111 end
112+
113+ it 'logs a warning, because a task that reached RUNNING must have had a start record once' do
114+ task . update ( state : TaskModel ::FAILED_STATE )
115+
116+ expect ( fake_logger ) . to have_received ( :warn ) . with (
117+ "Not writing a TASK_STOPPED usage event for task #{ task . guid } : the task was running but has no " \
118+ 'TASK_STARTED or TASK_WAS_RUNNING usage event on record. This should not happen. Find out ' \
119+ "what deleted or purged the usage events, and run 'rake db:was_running_backfill' so the other " \
120+ 'tasks that are still running get a baseline. (It cannot help this task; it is no longer running.)'
121+ )
122+ end
91123 end
92124 end
93125
94126 context 'when the task is moving from the PENDING state' do
95127 let ( :task ) { create ( :task_model , app : parent_app , state : TaskModel ::PENDING_STATE ) }
128+ let ( :fake_logger ) { instance_double ( Steno ::Logger , info : nil , warn : nil , debug : nil , error : nil ) }
129+
130+ before do
131+ allow ( Steno ) . to receive ( :logger ) . and_return ( fake_logger )
132+ end
96133
97134 it 'does not create a TASK_STOPPED event' do
98135 task . update ( state : TaskModel ::FAILED_STATE )
99136
100137 event = AppUsageEvent . find ( task_guid : task . guid , state : 'TASK_STOPPED' )
101138 expect ( event ) . to be_nil
102139 end
140+
141+ it 'does not log a warning, because a task that never ran is not supposed to have a start record' do
142+ task . update ( state : TaskModel ::FAILED_STATE )
143+
144+ expect ( fake_logger ) . not_to have_received ( :warn )
145+ end
103146 end
104147
105148 context 'when the task is moving from the CANCELING state' do
@@ -131,13 +174,25 @@ module VCAP::CloudController
131174
132175 context 'when the task does not have a TASK_STARTED event' do
133176 let! ( :start_event ) { nil }
177+ let ( :fake_logger ) { instance_double ( Steno ::Logger , info : nil , warn : nil , debug : nil , error : nil ) }
178+
179+ before do
180+ allow ( Steno ) . to receive ( :logger ) . and_return ( fake_logger )
181+ end
134182
135183 it 'does not create a TASK_STOPPED event' do
136184 task . update ( state : TaskModel ::FAILED_STATE )
137185
138186 event = AppUsageEvent . find ( task_guid : task . guid , state : 'TASK_STOPPED' )
139187 expect ( event ) . to be_nil
140188 end
189+
190+ it 'does not log a warning, because a task canceled while PENDING also passes through CANCELING, ' \
191+ 'so we cannot be sure this task ever ran' do
192+ task . update ( state : TaskModel ::FAILED_STATE )
193+
194+ expect ( fake_logger ) . not_to have_received ( :warn )
195+ end
141196 end
142197 end
143198
@@ -203,24 +258,71 @@ module VCAP::CloudController
203258
204259 context 'when the TASK_STARTED event has been pruned and a TASK_WAS_RUNNING baseline exists' do
205260 let! ( :start_event ) { create ( :app_usage_event , task_guid : task . guid , state : 'TASK_WAS_RUNNING' ) }
261+ let ( :fake_logger ) { instance_double ( Steno ::Logger , info : nil , warn : nil , debug : nil , error : nil ) }
262+
263+ before do
264+ allow ( Steno ) . to receive ( :logger ) . and_return ( fake_logger )
265+ end
206266
207267 it 'still creates a TASK_STOPPED event' do
208268 task . destroy
209269
210270 event = AppUsageEvent . find ( task_guid : task . guid , state : 'TASK_STOPPED' )
211271 expect ( event ) . not_to be_nil
212272 end
273+
274+ it 'does not log a warning, because the stop event was written' do
275+ task . destroy
276+
277+ expect ( fake_logger ) . not_to have_received ( :warn )
278+ end
213279 end
214280
215281 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 ) }
217282 let! ( :start_event ) { nil }
283+ let ( :fake_logger ) { instance_double ( Steno ::Logger , info : nil , warn : nil , debug : nil , error : nil ) }
218284
219- it 'does not create a TASK_STOPPED event, since no consumer ever saw the task start' do
220- task . destroy
285+ before do
286+ allow ( Steno ) . to receive ( :logger ) . and_return ( fake_logger )
287+ end
221288
222- event = AppUsageEvent . find ( task_guid : task . guid , state : 'TASK_STOPPED' )
223- expect ( event ) . to be_nil
289+ context 'when the task is PENDING' do
290+ let ( :task ) { create ( :task_model , app : parent_app , state : TaskModel ::PENDING_STATE ) }
291+
292+ it 'does not create a TASK_STOPPED event, since no consumer ever saw the task start' do
293+ task . destroy
294+
295+ event = AppUsageEvent . find ( task_guid : task . guid , state : 'TASK_STOPPED' )
296+ expect ( event ) . to be_nil
297+ end
298+
299+ it 'does not log a warning, because a task that never ran is not supposed to have a start record' do
300+ task . destroy
301+
302+ expect ( fake_logger ) . not_to have_received ( :warn )
303+ end
304+ end
305+
306+ context 'when the task is RUNNING' do
307+ let ( :task ) { create ( :task_model , app : parent_app , state : TaskModel ::RUNNING_STATE ) }
308+
309+ it 'does not create a TASK_STOPPED event, since no consumer ever saw the task start' do
310+ task . destroy
311+
312+ event = AppUsageEvent . find ( task_guid : task . guid , state : 'TASK_STOPPED' )
313+ expect ( event ) . to be_nil
314+ end
315+
316+ it 'logs a warning, because a task that reached RUNNING must have had a start record once' do
317+ task . destroy
318+
319+ expect ( fake_logger ) . to have_received ( :warn ) . with (
320+ "Not writing a TASK_STOPPED usage event for task #{ task . guid } : the task was running but has no " \
321+ 'TASK_STARTED or TASK_WAS_RUNNING usage event on record. This should not happen. Find out ' \
322+ "what deleted or purged the usage events, and run 'rake db:was_running_backfill' so the other " \
323+ 'tasks that are still running get a baseline. (It cannot help this task; it is no longer running.)'
324+ )
325+ end
224326 end
225327 end
226328
0 commit comments