Skip to content

Commit c734dbc

Browse files
java-team-github-botDagger Team
authored andcommitted
Add dependenciesRequested to ProducerMonitor
Previously, custom monitors could track when a producer was requested and when its method executed, but there was no way to know when it finished requesting its own dependencies. This new hook bridges that gap, making it easier to trace execution relationships in complex production graphs. Now, * methodStarting & methodFinished can be used to set up/tear down a scope around producer method execution, and * requested & dependenciesRequested can be used to set up/tear down a scope around producer dependency collection. RELNOTES=Added dependenciesRequested to ProducerMonitor PiperOrigin-RevId: 932109338
1 parent e820a70 commit c734dbc

6 files changed

Lines changed: 83 additions & 1 deletion

File tree

dagger-producers/main/java/dagger/producers/internal/AbstractProducesMethodProducer.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,13 @@ protected AbstractProducesMethodProducer(
7171
protected final ListenableFuture<T> compute() {
7272
monitor = monitorProvider.get().producerMonitorFor(token);
7373
monitor.requested();
74-
ListenableFuture<T> result = Futures.transformAsync(collectDependencies(), this, this);
74+
ListenableFuture<D> dependenciesFuture;
75+
try {
76+
dependenciesFuture = collectDependencies();
77+
} finally {
78+
monitor.dependenciesRequested();
79+
}
80+
ListenableFuture<T> result = Futures.transformAsync(dependenciesFuture, this, this);
7581
monitor.addCallbackTo(result);
7682
return result;
7783
}

dagger-producers/main/java/dagger/producers/monitoring/ProducerMonitor.java

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,8 @@
3131
* <p>The lifecycle of the monitor, under normal conditions, is:
3232
* <ul>
3333
* <li>{@link #requested()}
34+
* <li>{@link #dependenciesRequested()}
35+
* <li>{@link #ready()}
3436
* <li>{@link #methodStarting()}
3537
* <li>The method is called
3638
* <li>{@link #methodFinished()}
@@ -58,6 +60,9 @@
5860
* <li>A requested
5961
* <li>B requested
6062
* <li>C requested
63+
* <li>C dependenciesRequested
64+
* <li>B dependenciesRequested
65+
* <li>A dependenciesRequested
6166
* <li>C methodStarting
6267
* <li>C methodFinished
6368
* <li>C succeeded
@@ -102,6 +107,17 @@ public abstract class ProducerMonitor {
102107
*/
103108
public void requested() {}
104109

110+
/**
111+
* Called when all of the producer's dependencies have been requested. This will be called from
112+
* the same thread as {@link #requested()}.
113+
*
114+
* <p>When multiple monitors are installed, calls to this method will be in the reverse order from
115+
* calls to {@link #requested()}.
116+
*
117+
* <p>This implementation is a no-op.
118+
*/
119+
public void dependenciesRequested() {}
120+
105121
/**
106122
* Called when all of the producer's inputs are available. This is called regardless of whether
107123
* the inputs have succeeded or not; when the inputs have succeeded, this is called prior to

dagger-producers/main/java/dagger/producers/monitoring/internal/Monitors.java

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,15 @@ public void requested() {
135135
}
136136
}
137137

138+
@Override
139+
public void dependenciesRequested() {
140+
try {
141+
delegate.dependenciesRequested();
142+
} catch (RuntimeException e) {
143+
logProducerMonitorMethodException(e, delegate, "dependenciesRequested");
144+
}
145+
}
146+
138147
@Override
139148
public void ready() {
140149
try {
@@ -270,6 +279,17 @@ public void requested() {
270279
}
271280
}
272281

282+
@Override
283+
public void dependenciesRequested() {
284+
for (ProducerMonitor delegate : delegates.reverse()) {
285+
try {
286+
delegate.dependenciesRequested();
287+
} catch (RuntimeException e) {
288+
logProducerMonitorMethodException(e, delegate, "dependenciesRequested");
289+
}
290+
}
291+
}
292+
273293
@Override
274294
public void ready() {
275295
for (ProducerMonitor delegate : delegates) {

javatests/dagger/functional/producers/monitoring/MonitoringTest.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,13 +88,16 @@ public void basicMonitoring() throws Exception {
8888
inOrder.verify(callServer2Monitor).requested();
8989
inOrder.verify(callServer1Monitor).requested();
9090
inOrder.verify(requestDataMonitor).requested();
91+
inOrder.verify(requestDataMonitor).dependenciesRequested();
9192
inOrder.verify(requestDataMonitor).ready();
9293
inOrder.verify(requestDataMonitor).methodStarting();
9394
inOrder.verify(requestDataMonitor).methodFinished();
9495
inOrder.verify(requestDataMonitor).succeeded("Hello, World!");
96+
inOrder.verify(callServer1Monitor).dependenciesRequested();
9597
inOrder.verify(callServer1Monitor).ready();
9698
inOrder.verify(callServer1Monitor).methodStarting();
9799
inOrder.verify(callServer1Monitor).methodFinished();
100+
inOrder.verify(callServer2Monitor).dependenciesRequested();
98101
verifyNoMoreInteractions(requestDataMonitor, callServer1Monitor, callServer2Monitor);
99102

100103
server1Future.set("server 1 response");
@@ -133,13 +136,16 @@ public void basicMonitoringWithFailure() throws Exception {
133136
inOrder.verify(callServer2Monitor).requested();
134137
inOrder.verify(callServer1Monitor).requested();
135138
inOrder.verify(requestDataMonitor).requested();
139+
inOrder.verify(requestDataMonitor).dependenciesRequested();
136140
inOrder.verify(requestDataMonitor).ready();
137141
inOrder.verify(requestDataMonitor).methodStarting();
138142
inOrder.verify(requestDataMonitor).methodFinished();
139143
inOrder.verify(requestDataMonitor).succeeded("Hello, World!");
144+
inOrder.verify(callServer1Monitor).dependenciesRequested();
140145
inOrder.verify(callServer1Monitor).ready();
141146
inOrder.verify(callServer1Monitor).methodStarting();
142147
inOrder.verify(callServer1Monitor).methodFinished();
148+
inOrder.verify(callServer2Monitor).dependenciesRequested();
143149
verifyNoMoreInteractions(requestDataMonitor, callServer1Monitor, callServer2Monitor);
144150

145151
RuntimeException cause = new RuntimeException("monkey");

javatests/dagger/producers/internal/AbstractProducesMethodProducerTest.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,7 @@ public void monitor_success() throws Exception {
7676
assertThat(future.isDone()).isFalse();
7777
verify(monitor).ready();
7878
verify(monitor).requested();
79+
verify(monitor).dependenciesRequested();
7980
verify(monitor).addCallbackTo(anyListenableFuture());
8081
verify(monitor).methodStarting();
8182
verify(monitor).methodFinished();
@@ -94,6 +95,7 @@ public void monitor_failure() throws Exception {
9495
assertThat(future.isDone()).isFalse();
9596
verify(monitor).ready();
9697
verify(monitor).requested();
98+
verify(monitor).dependenciesRequested();
9799
verify(monitor).addCallbackTo(anyListenableFuture());
98100
verify(monitor).methodStarting();
99101
verify(monitor).methodFinished();

javatests/dagger/producers/monitoring/internal/MonitorsTest.java

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -124,12 +124,14 @@ public void singleMonitor_normalProducerMonitorSuccess() {
124124
monitor.producerMonitorFor(ProducerToken.create(Object.class));
125125
Object o = new Object();
126126
producerMonitor.requested();
127+
producerMonitor.dependenciesRequested();
127128
producerMonitor.methodStarting();
128129
producerMonitor.methodFinished();
129130
producerMonitor.succeeded(o);
130131

131132
InOrder order = inOrder(mockProducerMonitor);
132133
order.verify(mockProducerMonitor).requested();
134+
order.verify(mockProducerMonitor).dependenciesRequested();
133135
order.verify(mockProducerMonitor).methodStarting();
134136
order.verify(mockProducerMonitor).methodFinished();
135137
order.verify(mockProducerMonitor).succeeded(o);
@@ -147,12 +149,14 @@ public void singleMonitor_normalProducerMonitorFailure() {
147149
monitor.producerMonitorFor(ProducerToken.create(Object.class));
148150
Throwable t = new RuntimeException("monkey");
149151
producerMonitor.requested();
152+
producerMonitor.dependenciesRequested();
150153
producerMonitor.methodStarting();
151154
producerMonitor.methodFinished();
152155
producerMonitor.failed(t);
153156

154157
InOrder order = inOrder(mockProducerMonitor);
155158
order.verify(mockProducerMonitor).requested();
159+
order.verify(mockProducerMonitor).dependenciesRequested();
156160
order.verify(mockProducerMonitor).methodStarting();
157161
order.verify(mockProducerMonitor).methodFinished();
158162
order.verify(mockProducerMonitor).failed(t);
@@ -163,6 +167,7 @@ public void singleMonitor_normalProducerMonitorFailure() {
163167
public void singleMonitor_throwingProducerMonitorSuccess() {
164168
setUpNormalSingleMonitor();
165169
doThrow(new RuntimeException("monkey")).when(mockProducerMonitor).requested();
170+
doThrow(new RuntimeException("monkey")).when(mockProducerMonitor).dependenciesRequested();
166171
doThrow(new RuntimeException("monkey")).when(mockProducerMonitor).methodStarting();
167172
doThrow(new RuntimeException("monkey")).when(mockProducerMonitor).methodFinished();
168173
doThrow(new RuntimeException("monkey"))
@@ -176,12 +181,14 @@ public void singleMonitor_throwingProducerMonitorSuccess() {
176181
monitor.producerMonitorFor(ProducerToken.create(Object.class));
177182
Object o = new Object();
178183
producerMonitor.requested();
184+
producerMonitor.dependenciesRequested();
179185
producerMonitor.methodStarting();
180186
producerMonitor.methodFinished();
181187
producerMonitor.succeeded(o);
182188

183189
InOrder order = inOrder(mockProducerMonitor);
184190
order.verify(mockProducerMonitor).requested();
191+
order.verify(mockProducerMonitor).dependenciesRequested();
185192
order.verify(mockProducerMonitor).methodStarting();
186193
order.verify(mockProducerMonitor).methodFinished();
187194
order.verify(mockProducerMonitor).succeeded(o);
@@ -192,6 +199,7 @@ public void singleMonitor_throwingProducerMonitorSuccess() {
192199
public void singleMonitor_throwingProducerMonitorFailure() {
193200
setUpNormalSingleMonitor();
194201
doThrow(new RuntimeException("monkey")).when(mockProducerMonitor).requested();
202+
doThrow(new RuntimeException("monkey")).when(mockProducerMonitor).dependenciesRequested();
195203
doThrow(new RuntimeException("monkey")).when(mockProducerMonitor).methodStarting();
196204
doThrow(new RuntimeException("monkey")).when(mockProducerMonitor).methodFinished();
197205
doThrow(new RuntimeException("monkey")).when(mockProducerMonitor).failed(any(Throwable.class));
@@ -203,12 +211,14 @@ public void singleMonitor_throwingProducerMonitorFailure() {
203211
monitor.producerMonitorFor(ProducerToken.create(Object.class));
204212
Throwable t = new RuntimeException("gorilla");
205213
producerMonitor.requested();
214+
producerMonitor.dependenciesRequested();
206215
producerMonitor.methodStarting();
207216
producerMonitor.methodFinished();
208217
producerMonitor.failed(t);
209218

210219
InOrder order = inOrder(mockProducerMonitor);
211220
order.verify(mockProducerMonitor).requested();
221+
order.verify(mockProducerMonitor).dependenciesRequested();
212222
order.verify(mockProducerMonitor).methodStarting();
213223
order.verify(mockProducerMonitor).methodFinished();
214224
order.verify(mockProducerMonitor).failed(t);
@@ -269,12 +279,14 @@ public void multipleMonitors_someNullProductionComponentMonitors() {
269279

270280
Object o = new Object();
271281
producerMonitor.requested();
282+
producerMonitor.dependenciesRequested();
272283
producerMonitor.methodStarting();
273284
producerMonitor.methodFinished();
274285
producerMonitor.succeeded(o);
275286

276287
InOrder order = inOrder(mockProducerMonitorA);
277288
order.verify(mockProducerMonitorA).requested();
289+
order.verify(mockProducerMonitorA).dependenciesRequested();
278290
order.verify(mockProducerMonitorA).methodStarting();
279291
order.verify(mockProducerMonitorA).methodFinished();
280292
order.verify(mockProducerMonitorA).succeeded(o);
@@ -305,12 +317,14 @@ public void multipleMonitors_someThrowingProductionComponentMonitorFactories() {
305317

306318
Object o = new Object();
307319
producerMonitor.requested();
320+
producerMonitor.dependenciesRequested();
308321
producerMonitor.methodStarting();
309322
producerMonitor.methodFinished();
310323
producerMonitor.succeeded(o);
311324

312325
InOrder order = inOrder(mockProducerMonitorA);
313326
order.verify(mockProducerMonitorA).requested();
327+
order.verify(mockProducerMonitorA).dependenciesRequested();
314328
order.verify(mockProducerMonitorA).methodStarting();
315329
order.verify(mockProducerMonitorA).methodFinished();
316330
order.verify(mockProducerMonitorA).succeeded(o);
@@ -332,6 +346,7 @@ public void multipleMonitors_normalProductionComponentMonitorSuccess() {
332346

333347
Object o = new Object();
334348
producerMonitor.requested();
349+
producerMonitor.dependenciesRequested();
335350
producerMonitor.methodStarting();
336351
producerMonitor.methodFinished();
337352
producerMonitor.succeeded(o);
@@ -340,6 +355,9 @@ public void multipleMonitors_normalProductionComponentMonitorSuccess() {
340355
order.verify(mockProducerMonitorA).requested();
341356
order.verify(mockProducerMonitorB).requested();
342357
order.verify(mockProducerMonitorC).requested();
358+
order.verify(mockProducerMonitorC).dependenciesRequested();
359+
order.verify(mockProducerMonitorB).dependenciesRequested();
360+
order.verify(mockProducerMonitorA).dependenciesRequested();
343361
order.verify(mockProducerMonitorA).methodStarting();
344362
order.verify(mockProducerMonitorB).methodStarting();
345363
order.verify(mockProducerMonitorC).methodStarting();
@@ -367,6 +385,7 @@ public void multipleMonitors_normalProductionComponentMonitorFailure() {
367385

368386
Throwable t = new RuntimeException("chimpanzee");
369387
producerMonitor.requested();
388+
producerMonitor.dependenciesRequested();
370389
producerMonitor.methodStarting();
371390
producerMonitor.methodFinished();
372391
producerMonitor.failed(t);
@@ -375,6 +394,9 @@ public void multipleMonitors_normalProductionComponentMonitorFailure() {
375394
order.verify(mockProducerMonitorA).requested();
376395
order.verify(mockProducerMonitorB).requested();
377396
order.verify(mockProducerMonitorC).requested();
397+
order.verify(mockProducerMonitorC).dependenciesRequested();
398+
order.verify(mockProducerMonitorB).dependenciesRequested();
399+
order.verify(mockProducerMonitorA).dependenciesRequested();
378400
order.verify(mockProducerMonitorA).methodStarting();
379401
order.verify(mockProducerMonitorB).methodStarting();
380402
order.verify(mockProducerMonitorC).methodStarting();
@@ -391,6 +413,7 @@ public void multipleMonitors_normalProductionComponentMonitorFailure() {
391413
public void multipleMonitors_someThrowingProducerMonitorsSuccess() {
392414
setUpNormalMultipleMonitors();
393415
doThrow(new RuntimeException("monkey")).when(mockProducerMonitorA).requested();
416+
doThrow(new RuntimeException("monkey")).when(mockProducerMonitorA).dependenciesRequested();
394417
doThrow(new RuntimeException("monkey")).when(mockProducerMonitorA).methodStarting();
395418
doThrow(new RuntimeException("monkey")).when(mockProducerMonitorB).methodFinished();
396419
doThrow(new RuntimeException("monkey"))
@@ -408,6 +431,7 @@ public void multipleMonitors_someThrowingProducerMonitorsSuccess() {
408431

409432
Object o = new Object();
410433
producerMonitor.requested();
434+
producerMonitor.dependenciesRequested();
411435
producerMonitor.methodStarting();
412436
producerMonitor.methodFinished();
413437
producerMonitor.succeeded(o);
@@ -416,6 +440,9 @@ public void multipleMonitors_someThrowingProducerMonitorsSuccess() {
416440
order.verify(mockProducerMonitorA).requested();
417441
order.verify(mockProducerMonitorB).requested();
418442
order.verify(mockProducerMonitorC).requested();
443+
order.verify(mockProducerMonitorC).dependenciesRequested();
444+
order.verify(mockProducerMonitorB).dependenciesRequested();
445+
order.verify(mockProducerMonitorA).dependenciesRequested();
419446
order.verify(mockProducerMonitorA).methodStarting();
420447
order.verify(mockProducerMonitorB).methodStarting();
421448
order.verify(mockProducerMonitorC).methodStarting();
@@ -432,6 +459,7 @@ public void multipleMonitors_someThrowingProducerMonitorsSuccess() {
432459
public void multipleMonitors_someThrowingProducerMonitorsFailure() {
433460
setUpNormalMultipleMonitors();
434461
doThrow(new RuntimeException("monkey")).when(mockProducerMonitorA).requested();
462+
doThrow(new RuntimeException("monkey")).when(mockProducerMonitorA).dependenciesRequested();
435463
doThrow(new RuntimeException("monkey")).when(mockProducerMonitorA).methodStarting();
436464
doThrow(new RuntimeException("monkey")).when(mockProducerMonitorB).methodFinished();
437465
doThrow(new RuntimeException("monkey")).when(mockProducerMonitorC).failed(any(Throwable.class));
@@ -447,6 +475,7 @@ public void multipleMonitors_someThrowingProducerMonitorsFailure() {
447475

448476
Throwable t = new RuntimeException("chimpanzee");
449477
producerMonitor.requested();
478+
producerMonitor.dependenciesRequested();
450479
producerMonitor.methodStarting();
451480
producerMonitor.methodFinished();
452481
producerMonitor.failed(t);
@@ -455,6 +484,9 @@ public void multipleMonitors_someThrowingProducerMonitorsFailure() {
455484
order.verify(mockProducerMonitorA).requested();
456485
order.verify(mockProducerMonitorB).requested();
457486
order.verify(mockProducerMonitorC).requested();
487+
order.verify(mockProducerMonitorC).dependenciesRequested();
488+
order.verify(mockProducerMonitorB).dependenciesRequested();
489+
order.verify(mockProducerMonitorA).dependenciesRequested();
458490
order.verify(mockProducerMonitorA).methodStarting();
459491
order.verify(mockProducerMonitorB).methodStarting();
460492
order.verify(mockProducerMonitorC).methodStarting();

0 commit comments

Comments
 (0)