Skip to content

Commit

Permalink
TimerPair: add update, updateFailure and start methods
Browse files Browse the repository at this point in the history
  • Loading branch information
hanny24 authored Aug 8, 2018
1 parent eb8bec1 commit 17c1263
Show file tree
Hide file tree
Showing 5 changed files with 110 additions and 0 deletions.
37 changes: 37 additions & 0 deletions api/src/main/java/com/avast/metrics/TimerPairImpl.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import com.avast.metrics.api.Timer;
import com.avast.metrics.api.TimerPair;

import java.time.Duration;
import java.util.concurrent.Callable;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.Executor;
Expand All @@ -17,6 +18,21 @@ public TimerPairImpl(Timer successTimer, Timer failureTimer) {
this.failureTimer = failureTimer;
}

@Override
public TimeContext start() {
return new Context(successTimer.start(), failureTimer.start());
}

@Override
public void update(Duration duration) {
successTimer.update(duration);
}

@Override
public void updateFailure(Duration duration) {
failureTimer.update(duration);
}

public <T> T time(Callable<T> operation) throws Exception {
Timer.TimeContext successContext = successTimer.start();
Timer.TimeContext failureContext = failureTimer.start();
Expand Down Expand Up @@ -54,4 +70,25 @@ public <T> CompletableFuture<T> timeAsync(Callable<CompletableFuture<T>> operati
throw ex;
}
}

private static class Context implements TimeContext {

private final Timer.TimeContext successContext;
private final Timer.TimeContext failureContext;

Context(Timer.TimeContext successContext, Timer.TimeContext failureContext) {
this.successContext = successContext;
this.failureContext = failureContext;
}

@Override
public void stop() {
successContext.stop();
}

@Override
public void stopFailure() {
failureContext.stop();
}
}
}
19 changes: 19 additions & 0 deletions api/src/main/java/com/avast/metrics/api/TimerPair.java
Original file line number Diff line number Diff line change
@@ -1,12 +1,31 @@
package com.avast.metrics.api;

import java.time.Duration;
import java.util.concurrent.Callable;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.Executor;

public interface TimerPair {

interface TimeContext extends AutoCloseable {
void stop();

void stopFailure();

@Override
default void close() {
stop();
}
}

TimeContext start();

void update(Duration duration);

void updateFailure(Duration duration);

<T> T time(Callable<T> operation) throws Exception;

<T> CompletableFuture<T> timeAsync(Callable<CompletableFuture<T>> operation, Executor executor) throws Exception;

}
22 changes: 22 additions & 0 deletions api/src/main/java/com/avast/metrics/test/NoOpMonitor.java
Original file line number Diff line number Diff line change
Expand Up @@ -140,6 +140,28 @@ public String getName() {
@Override
public TimerPair newTimerPair(String name) {
return new TimerPair() {

@Override
public TimeContext start() {
return new TimeContext() {
@Override
public void stop() {
}

@Override
public void stopFailure() {
}
};
}

@Override
public void update(Duration duration) {
}

@Override
public void updateFailure(Duration duration) {
}

@Override
public <T> T time(Callable<T> operation) throws Exception {
return operation.call();
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,23 @@
package com.avast.metrics.scalaapi


import java.time.Duration

import scala.concurrent.{ExecutionContext, Future}

trait TimerPair {

trait TimeContext {
def stop(): Unit
def stopFailure(): Unit
}

def start(): TimeContext

def update(duration: Duration): Unit

def updateFailure(duration: Duration): Unit

def time[A](block: => A): A

def time[A](future: => Future[A])(implicit ec: ExecutionContext): Future[A]
Expand Down
Original file line number Diff line number Diff line change
@@ -1,12 +1,30 @@
package com.avast.metrics.scalaapi.impl

import java.time.Duration

import com.avast.metrics.scalaapi.{Timer, TimerPair}

import scala.concurrent.{ExecutionContext, Future}
import scala.util.control.NonFatal
import scala.util.{Failure, Success}

private class TimerPairImpl(success: Timer, failure: Timer) extends TimerPair {

override def start(): TimeContext = {
val succCtx = success.start()
val failCtx = failure.start()

new TimeContext {
override def stop(): Unit = succCtx.stop()

override def stopFailure(): Unit = failCtx.stop()
}
}

override def update(duration: Duration): Unit = success.update(duration)

override def updateFailure(duration: Duration): Unit = failure.update(duration)

override def time[A](block: => A): A = {
val succCtx = success.start()
val failCtx = failure.start()
Expand Down

0 comments on commit 17c1263

Please sign in to comment.