diff --git a/app/metrics/FrontendMetrics.scala b/app/metrics/FrontendMetrics.scala index 5cc86c0b89e..78bd38c3b7b 100644 --- a/app/metrics/FrontendMetrics.scala +++ b/app/metrics/FrontendMetrics.scala @@ -2,12 +2,9 @@ package metrics import java.util.concurrent.atomic.AtomicLong -import akka.agent.Agent import com.amazonaws.services.cloudwatch.model.StandardUnit import org.joda.time.DateTime -import scala.concurrent.ExecutionContext.Implicits.global -import scala.concurrent.Future import scala.util.Try sealed trait DataPoint { @@ -64,25 +61,3 @@ case class CountMetric(name: String, description: String) extends FrontendMetric def increment(): Unit = record() def isEmpty: Boolean = count.get() == 0L } - -case class DurationMetric(name: String, metricUnit: StandardUnit) extends FrontendMetric { - - private val dataPoints: Agent[List[DataPoint]] = Agent(List[DurationDataPoint]()) - - def getDataPoints: List[DataPoint] = dataPoints.get() - - def getDataFuture: Future[List[DataPoint]] = dataPoints.future() - - def getAndResetDataPoints: List[DataPoint] = { - val points = dataPoints.get() - dataPoints.alter(_.diff(points)) - points - } - - def putDataPoints(points: List[DataPoint]): Unit = dataPoints.alter(points ::: _) - - def record(dataPoint: DurationDataPoint): Unit = dataPoints.alter(dataPoint :: _) - - def recordDuration(timeInMillis: Long): Unit = record(DurationDataPoint(timeInMillis, Option(DateTime.now))) - def isEmpty: Boolean = dataPoints.get().isEmpty -} diff --git a/app/metrics/metrics.scala b/app/metrics/metrics.scala index b54ed48cf43..aa48790a8e7 100644 --- a/app/metrics/metrics.scala +++ b/app/metrics/metrics.scala @@ -165,5 +165,5 @@ class CloudWatchApplicationMetrics(appName: String, stage: String, cloudWatch: C } logger.info("Starting cloudwatch metrics") - scheduler.schedule(initialDelay = 1.seconds, interval = 1.minute) { report() } + scheduler.scheduleWithFixedDelay(initialDelay = 1.seconds, delay = 1.minute) { () => report() } } diff --git a/app/services/ConfigAgent.scala b/app/services/ConfigAgent.scala index 5293f011e49..a89fc15b440 100644 --- a/app/services/ConfigAgent.scala +++ b/app/services/ConfigAgent.scala @@ -1,11 +1,10 @@ package services -import akka.agent.Agent +import java.util.concurrent.atomic.AtomicReference import com.gu.facia.api.models.CollectionConfig -import com.gu.facia.client.models.{FrontJson, ConfigJson => Config} +import com.gu.facia.client.models.{ConfigJson => Config} import conf.ApplicationConfiguration import logging.Logging -import permissions.{EditionsPermission, PermissionsPriority} import scala.concurrent.ExecutionContext.Implicits.global import scala.concurrent.Future @@ -14,8 +13,8 @@ import scala.util.{Failure, Success} case class CollectionConfigWithId(id: String, config: CollectionConfig) class ConfigAgent(val config: ApplicationConfiguration, val frontsApi: FrontsApi) extends Logging { - private lazy val configAgent = Agent[Option[Config]](None) + private val configAgent: AtomicReference[Option[Config]] = new AtomicReference(None) def get = configAgent.get() def refresh() = { @@ -24,16 +23,16 @@ class ConfigAgent(val config: ApplicationConfiguration, val frontsApi: FrontsApi case Success(config) => logger.info(s"Successfully got config") case Failure(t) => logger.error(s"Getting config failed with $t", t) } - futureConfig.map(Option.apply).map(configAgent.send) + futureConfig.map(Option.apply).map(configAgent.set) } def refreshWith(config: Config): Unit = { - configAgent.send(Option(config)) + configAgent.set(Option(config)) } def refreshAndReturn(): Future[Option[Config]] = frontsApi.amazonClient.config - .flatMap(config => configAgent.alter{_ => Option(config)}) + .map { config => configAgent.set(Option(config)); Option(config) } .recover{case err => logger.warn("Falling back to current ConfigAgent contents on refreshAndReturn", err) configAgent.get()} diff --git a/app/switchboard/Switchboard.scala b/app/switchboard/Switchboard.scala index b4bfdbe7f97..fe50b7d20ee 100644 --- a/app/switchboard/Switchboard.scala +++ b/app/switchboard/Switchboard.scala @@ -19,8 +19,8 @@ class Lifecycle(conf: SwitchboardConfiguration, scheduler: Scheduler) extends Lo lazy val client: S3client = new S3client(conf, conf.endpoint) logger.info("Starting switchboard cache") - scheduler.schedule(0.seconds, 1.minute) { refreshSwitches() } - scheduler.scheduleOnce(1.seconds) { refreshSwitches() } + scheduler.scheduleWithFixedDelay(0.seconds, 1.minute) { () => refreshSwitches() } + scheduler.scheduleWithFixedDelay(0.seconds, 1.seconds) { () => refreshSwitches() } def refreshSwitches(): Unit = { logger.info("Refreshing switches from switchboard") diff --git a/build.sbt b/build.sbt index 0022b01f0be..b1d617ad53b 100644 --- a/build.sbt +++ b/build.sbt @@ -12,7 +12,6 @@ ThisBuild / scalaVersion := "2.13.5" import com.gu.riffraff.artifact.BuildInfo import sbt.Resolver -import sbt.io.Path._ debianPackageDependencies := Seq("openjdk-8-jre-headless") @@ -78,7 +77,6 @@ libraryDependencies ++= Seq( filters, evolutions, jdbc, - "com.typesafe.akka" %% "akka-agent" % "2.5.23", "com.amazonaws" % "aws-java-sdk-rds" % awsVersion, "com.amazonaws" % "aws-java-sdk-core" % awsVersion, "com.amazonaws" % "aws-java-sdk-cloudwatch" % awsVersion, diff --git a/test/metrics/DurationMetricTest.scala b/test/metrics/DurationMetricTest.scala deleted file mode 100644 index d0472706a45..00000000000 --- a/test/metrics/DurationMetricTest.scala +++ /dev/null @@ -1,54 +0,0 @@ -package metrics - -import com.amazonaws.services.cloudwatch.model.StandardUnit -import org.scalatest.{FlatSpec, Matchers} - -import scala.concurrent.Await -import scala.concurrent.duration._ - -class DurationMetricTest extends FlatSpec with Matchers { - - "DurationMetric" should "start off empty" in { - val durationMetric: DurationMetric = DurationMetric("TestMetric", StandardUnit.Count) - - durationMetric.getAndResetDataPoints should be (List()) - } - - it should "record some metrics" in { - val durationMetric: DurationMetric = DurationMetric("TestMetric", StandardUnit.Count) - - durationMetric.recordDuration(1000) - durationMetric.recordDuration(1000) - durationMetric.recordDuration(1000) - - Await.result(durationMetric.getDataFuture, 10.seconds) - - durationMetric.getDataPoints.length should be (3) - durationMetric.getAndResetDataPoints.forall(_.value == 1000) should be (true) - - Await.result(durationMetric.getDataFuture, 10.seconds) - - durationMetric.getDataPoints.length should be(0) - } - - it should "add datapoints to the head of the list" in { - val durationMetric: DurationMetric = DurationMetric("TestMetric", StandardUnit.Count) - - val metricOne = DurationDataPoint(1000, None) - val metricTwo = DurationDataPoint(1000, None) - val metricThree = DurationDataPoint(1000, None) - val metricFour = DurationDataPoint(1000, None) - val allMetrics = List(metricOne, metricTwo, metricThree, metricFour) - - durationMetric.recordDuration(1000) - durationMetric.recordDuration(1000) - durationMetric.recordDuration(1000) - durationMetric.putDataPoints(List(metricOne, metricTwo, metricThree, metricFour)) - - Await.result(durationMetric.getDataFuture, 10.seconds) - - val dataPoints = durationMetric.getDataPoints - dataPoints.length should be (7) - dataPoints.splitAt(4)._1 should be (allMetrics) - } -}