membership-attribute-service/app/monitoring/Metrics.scala (23 lines of code) (raw):

package monitoring import com.amazonaws.services.cloudwatch.model.StandardUnit import com.gu.monitoring.SafeLogging import utils.SimpleEitherT import utils.SimpleEitherT.SimpleEitherT import scala.concurrent.{ExecutionContext, Future} case class Metrics(service: String, cloudwatch: CloudWatch) extends SafeLogging { def incrementCount(metricName: String): Unit = cloudwatch.put(metricName + " count", 1, StandardUnit.Count) def measureDurationEither[T](metricName: String)(block: => SimpleEitherT[T])(implicit ec: ExecutionContext): SimpleEitherT[T] = SimpleEitherT(measureDuration(metricName)(block.run)) def measureDuration[T](metricName: String)(block: => Future[T])(implicit ec: ExecutionContext): Future[T] = { logger.debug(s"$metricName started...") incrementCount(metricName) val startTime = System.currentTimeMillis() def recordEnd[A](name: String)(value: A): A = { val duration = System.currentTimeMillis() - startTime cloudwatch.put(name + " duration ms", duration.toDouble, StandardUnit.Milliseconds) logger.debug(s"$service $name completed in $duration ms") value } block.transform(recordEnd(metricName), recordEnd(s"$metricName failed")) } }