Skip to content

Commit d26362e

Browse files
authored
Merge pull request #28324 from guardian/cloudwatch-aws-sdk-v2
Upgrade to Cloudwatch AWS SDK v2
2 parents 10ebca7 + 9d94496 commit d26362e

File tree

15 files changed

+153
-421
lines changed

15 files changed

+153
-421
lines changed

admin/app/model/AdminLifecycle.scala

Lines changed: 2 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,17 @@
11
package model
22

33
import java.util.TimeZone
4-
import java.nio.file.Files.deleteIfExists
5-
64
import app.LifecycleComponent
75
import common._
86
import conf.Configuration
97
import conf.switches.Switches._
108
import _root_.jobs._
119
import play.api.inject.ApplicationLifecycle
1210
import services.EmailService
13-
import tools.{AssetMetricsCache, CloudWatch, LoadBalancer}
11+
import tools.{CloudWatch, LoadBalancer}
1412

1513
import scala.concurrent.duration._
1614
import scala.concurrent.{ExecutionContext, Future}
17-
import conf.AdminConfiguration
1815

1916
class AdminLifecycle(
2017
appLifecycle: ApplicationLifecycle,
@@ -30,7 +27,7 @@ class AdminLifecycle(
3027
appLifecycle.addStopHook { () =>
3128
Future {
3229
descheduleJobs()
33-
CloudWatch.shutdown()
30+
CloudWatch.close()
3431
emailService.shutdown()
3532
}
3633
}
@@ -87,11 +84,6 @@ class AdminLifecycle(
8784
log.info("Starting ExpiringSwitchesAfternoonEmailJob")
8885
ExpiringSwitchesEmailJob(emailService).runReminder()
8986
}
90-
91-
jobs.scheduleEveryNMinutes("AssetMetricsCache", 60 * 6) {
92-
AssetMetricsCache.run()
93-
}
94-
9587
}
9688

9789
private def descheduleJobs(): Unit = {
@@ -114,7 +106,6 @@ class AdminLifecycle(
114106

115107
pekkoAsync.after1s {
116108
rebuildIndexJob.run()
117-
AssetMetricsCache.run()
118109
LoadBalancer.refresh()
119110
}
120111
}

admin/app/model/abtests/AbTestJob.scala

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,10 @@ object AbTestJob extends GuLogging {
1414

1515
CloudWatch.AbMetricNames() map { result =>
1616
// Group variant names by test name
17-
val tests = result.getMetrics.asScala
18-
.map(_.getMetricName.split("-").toList)
17+
val tests = result
18+
.metrics()
19+
.asScala
20+
.map(_.metricName().split("-").toList)
1921
.collect { case test :: variant =>
2022
(test, variant.mkString("-"))
2123
}
Lines changed: 0 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1,44 +1,11 @@
11
package model.abtests
22

3-
import tools.{ABDataChart, ChartFormat, CloudWatch}
4-
import com.amazonaws.services.cloudwatch.model.GetMetricStatisticsRequest
5-
import org.joda.time.DateTime
6-
7-
import scala.concurrent.{ExecutionContext, Future}
8-
import awswrappers.cloudwatch._
93
import common.Box
104

115
object AbTests {
126
private val abTests = Box[Map[String, Seq[String]]](Map.empty)
137

14-
def getTests(): Map[String, Seq[String]] = {
15-
abTests.get()
16-
}
17-
188
def update(testVariants: Map[String, Seq[String]]): Unit = {
199
abTests.send(testVariants)
2010
}
21-
22-
case class AbChart(testId: String, variants: Seq[String])
23-
24-
def getAbCharts()(implicit executionContext: ExecutionContext): Future[Seq[ABDataChart]] = {
25-
Future.traverse(getTests().keys.toSeq) { abTest =>
26-
val variants: Seq[String] = getTests()(abTest)
27-
28-
for {
29-
cloudWatchResults <- Future.traverse(variants) { variant =>
30-
CloudWatch.euWestClient.getMetricStatisticsFuture(
31-
new GetMetricStatisticsRequest()
32-
.withStartTime(new DateTime().minusHours(6).toDate)
33-
.withEndTime(new DateTime().toDate)
34-
.withPeriod(360)
35-
.withStatistics("Average")
36-
.withNamespace("AbTests")
37-
.withMetricName(s"$abTest-$variant")
38-
.withDimensions(CloudWatch.stage),
39-
)
40-
}
41-
} yield new ABDataChart(abTest, Seq("Time") ++ variants, ChartFormat.MultiLine, cloudWatchResults: _*)
42-
}
43-
}
4411
}

admin/app/services/CloudWatchStats.scala

Lines changed: 0 additions & 47 deletions
This file was deleted.

admin/app/tools/AssetMetrics.scala

Lines changed: 0 additions & 103 deletions
This file was deleted.

admin/app/tools/CloudWatch.scala

Lines changed: 31 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,37 +1,39 @@
11
package tools
22

3-
import awswrappers.cloudwatch._
4-
import com.amazonaws.services.cloudwatch.{
5-
AmazonCloudWatchAsync,
6-
AmazonCloudWatchAsyncClient,
7-
AmazonCloudWatchAsyncClientBuilder,
8-
}
9-
import com.amazonaws.services.cloudwatch.model._
103
import common.GuLogging
11-
import conf.Configuration
124
import conf.Configuration._
5+
import software.amazon.awssdk.regions.Region
6+
import software.amazon.awssdk.services.cloudwatch.{CloudWatchAsyncClient, CloudWatchAsyncClientBuilder}
7+
import software.amazon.awssdk.services.cloudwatch.model.{
8+
Dimension,
9+
DimensionFilter,
10+
ListMetricsRequest,
11+
ListMetricsResponse,
12+
}
13+
import utils.AWSv2
14+
import scala.jdk.FutureConverters._
1315

1416
import scala.concurrent.{ExecutionContext, Future}
1517

1618
object CloudWatch extends GuLogging {
17-
def shutdown(): Unit = {
18-
euWestClient.shutdown()
19-
defaultClient.shutdown()
19+
20+
def close(): Unit = {
21+
euWestClient.close()
22+
defaultClient.close()
2023
}
2124

22-
val stage = new Dimension().withName("Stage").withValue(environment.stage)
23-
val stageFilter = new DimensionFilter().withName("Stage").withValue(environment.stage)
25+
val stage = Dimension.builder().name("Stage").value(environment.stage).build()
26+
val stageFilter = DimensionFilter.builder().name("Stage").value(environment.stage).build()
2427

25-
lazy val defaultClientBuilder: AmazonCloudWatchAsyncClientBuilder = AmazonCloudWatchAsyncClient
26-
.asyncBuilder()
27-
.withCredentials(Configuration.aws.mandatoryCredentials)
28+
lazy val defaultClientBuilder: CloudWatchAsyncClientBuilder =
29+
CloudWatchAsyncClient.builder().credentialsProvider(AWSv2.credentials)
2830

29-
lazy val euWestClient: AmazonCloudWatchAsync = defaultClientBuilder
30-
.withRegion(conf.Configuration.aws.region)
31+
lazy val euWestClient: CloudWatchAsyncClient = defaultClientBuilder
32+
.region(Region.of(conf.Configuration.aws.region))
3133
.build()
3234

3335
// some metrics are only available in the 'default' region
34-
lazy val defaultClient: AmazonCloudWatchAsync = defaultClientBuilder.build()
36+
lazy val defaultClient: CloudWatchAsyncClient = defaultClientBuilder.build()
3537

3638
val v1LoadBalancerNamespace = "AWS/ELB"
3739
val v2LoadBalancerNamespace = "AWS/ApplicationELB"
@@ -63,13 +65,17 @@ object CloudWatch extends GuLogging {
6365
future
6466
}
6567

66-
def AbMetricNames()(implicit executionContext: ExecutionContext): Future[ListMetricsResult] = {
68+
def AbMetricNames()(implicit executionContext: ExecutionContext): Future[ListMetricsResponse] = {
6769
withErrorLogging(
68-
euWestClient.listMetricsFuture(
69-
new ListMetricsRequest()
70-
.withNamespace("AbTests")
71-
.withDimensions(stageFilter),
72-
),
70+
euWestClient
71+
.listMetrics(
72+
ListMetricsRequest
73+
.builder()
74+
.namespace("AbTests")
75+
.dimensions(stageFilter)
76+
.build(),
77+
)
78+
.asScala,
7379
)
7480
}
7581
}

0 commit comments

Comments
 (0)