99import java .util .concurrent .ExecutorService ;
1010import java .util .concurrent .ForkJoinPool ;
1111import java .util .concurrent .Future ;
12+ import java .util .concurrent .RejectedExecutionHandler ;
1213import java .util .concurrent .ThreadPoolExecutor ;
1314import java .util .concurrent .TimeUnit ;
1415import java .util .concurrent .TimeoutException ;
@@ -30,6 +31,7 @@ public class InstrumentedExecutorService implements ExecutorService {
3031 private final Meter submitted ;
3132 private final Counter running ;
3233 private final Meter completed ;
34+ private final Counter rejected ;
3335 private final Timer idle ;
3436 private final Timer duration ;
3537
@@ -57,6 +59,7 @@ public InstrumentedExecutorService(ExecutorService delegate, MetricRegistry regi
5759 this .submitted = registry .meter (MetricRegistry .name (name , "submitted" ));
5860 this .running = registry .counter (MetricRegistry .name (name , "running" ));
5961 this .completed = registry .meter (MetricRegistry .name (name , "completed" ));
62+ this .rejected = registry .counter (MetricRegistry .name (name , "rejected" ));
6063 this .idle = registry .timer (MetricRegistry .name (name , "idle" ));
6164 this .duration = registry .timer (MetricRegistry .name (name , "duration" ));
6265
@@ -81,6 +84,8 @@ private void registerInternalMetrics() {
8184 queue ::size );
8285 registry .registerGauge (MetricRegistry .name (name , "tasks.capacity" ),
8386 queue ::remainingCapacity );
87+ RejectedExecutionHandler delegateHandler = executor .getRejectedExecutionHandler ();
88+ executor .setRejectedExecutionHandler (new InstrumentedRejectedExecutionHandler (delegateHandler ));
8489 } else if (delegate instanceof ForkJoinPool ) {
8590 ForkJoinPool forkJoinPool = (ForkJoinPool ) delegate ;
8691 registry .registerGauge (MetricRegistry .name (name , "tasks.stolen" ),
@@ -223,6 +228,20 @@ public boolean awaitTermination(long l, TimeUnit timeUnit) throws InterruptedExc
223228 return delegate .awaitTermination (l , timeUnit );
224229 }
225230
231+ private class InstrumentedRejectedExecutionHandler implements RejectedExecutionHandler {
232+ private final RejectedExecutionHandler delegateHandler ;
233+
234+ public InstrumentedRejectedExecutionHandler (RejectedExecutionHandler delegateHandler ) {
235+ this .delegateHandler = delegateHandler ;
236+ }
237+
238+ @ Override
239+ public void rejectedExecution (Runnable r , ThreadPoolExecutor executor ) {
240+ rejected .inc ();
241+ this .delegateHandler .rejectedExecution (r , executor );
242+ }
243+ }
244+
226245 private class InstrumentedRunnable implements Runnable {
227246 private final Runnable task ;
228247 private final Timer .Context idleContext ;
0 commit comments