Skip to content

Commit 833c91b

Browse files
committed
feat: Add structured logging for requests made to DCR and CAPI
1 parent 686f5b3 commit 833c91b

2 files changed

Lines changed: 52 additions & 8 deletions

File tree

common/app/contentapi/ContentApiClient.scala

Lines changed: 31 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package contentapi
22

33
import java.util.concurrent.TimeUnit
4-
54
import org.apache.pekko.actor.{ActorSystem => PekkoActorSystem}
65
import com.github.nscala_time.time.Implicits._
76
import com.gu.contentapi.client.model._
@@ -18,10 +17,14 @@ import concurrent.CircuitBreakerRegistry
1817
import conf.Configuration
1918
import conf.Configuration.contentApi
2019
import conf.switches.Switches.CircuitBreakerSwitch
20+
import net.logstash.logback.marker.Markers.appendEntries
21+
import play.api.MarkerContext
2122

23+
import java.lang.System.currentTimeMillis
2224
import scala.concurrent.duration.{Duration, MILLISECONDS}
2325
import scala.concurrent.{ExecutionContext, Future}
2426
import scala.util.Try
27+
import scala.jdk.CollectionConverters._
2528

2629
object QueryDefaults {
2730
// NOTE - do NOT add body to this list
@@ -146,11 +149,33 @@ final case class CircuitBreakingContentApiClient(
146149
override def get(url: String, headers: Map[String, String])(implicit
147150
executionContext: ExecutionContext,
148151
): Future[HttpResponse] = {
149-
if (CircuitBreakerSwitch.isSwitchedOn) {
150-
circuitBreaker.withCircuitBreaker(super.get(url, headers)(executionContext))
151-
} else {
152-
super.get(url, headers)
153-
}
152+
val start = currentTimeMillis()
153+
154+
val resp =
155+
if (CircuitBreakerSwitch.isSwitchedOn) {
156+
circuitBreaker.withCircuitBreaker(super.get(url, headers)(executionContext))
157+
} else {
158+
super.get(url, headers)
159+
}
160+
161+
resp.foreach((r: HttpResponse) => {
162+
val duration: Long = currentTimeMillis() - start
163+
164+
val markers = MarkerContext(
165+
appendEntries(
166+
Map(
167+
"method" -> "GET",
168+
"status" -> r.statusCode,
169+
"duration" -> duration,
170+
"requestUri" -> url,
171+
"contentLength" -> r.body.length,
172+
).asJava,
173+
),
174+
)
175+
log.info(s"Request to Content API took ${duration}ms")(markers)
176+
})
177+
178+
resp
154179
}
155180
}
156181

common/app/renderers/DotcomRenderingService.scala

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ import model.{
2626
RelatedContentItem,
2727
SimplePage,
2828
}
29+
import net.logstash.logback.marker.Markers.appendEntries
2930
import play.api.libs.json.{JsObject, JsValue}
3031
import play.api.libs.ws.{WSClient, WSResponse}
3132
import play.api.mvc.Results.{InternalServerError, NotFound}
@@ -40,6 +41,8 @@ import java.util.concurrent.TimeoutException
4041
import scala.concurrent.ExecutionContext.Implicits.global
4142
import scala.concurrent.Future
4243
import scala.concurrent.duration._
44+
import play.api.MarkerContext
45+
import scala.jdk.CollectionConverters._
4346

4447
// Introduced as CAPI error handling elsewhere would smother these otherwise
4548
case class DCRLocalConnectException(message: String) extends ConnectException(message)
@@ -84,9 +87,25 @@ class DotcomRenderingService extends GuLogging with ResultWithPreconnectPreload
8487
case None => request.post(payload)
8588
}
8689

87-
resp.foreach(_ => {
88-
DCRMetrics.DCRLatencyMetric.recordDuration(currentTimeMillis() - start)
90+
resp.foreach((r: WSResponse) => {
91+
val duration: Long = currentTimeMillis() - start
92+
93+
DCRMetrics.DCRLatencyMetric.recordDuration(duration)
8994
DCRMetrics.DCRRequestCountMetric.increment()
95+
96+
val markers = MarkerContext(
97+
appendEntries(
98+
Map(
99+
"method" -> "POST",
100+
"status" -> r.status,
101+
"duration" -> duration,
102+
"requestUri" -> request.uri,
103+
"contentLength" -> payload.toString().length,
104+
).asJava,
105+
),
106+
)
107+
108+
log.info(s"Request to DCR took ${duration}ms")(markers)
90109
})
91110

92111
resp.recoverWith({

0 commit comments

Comments
 (0)