Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
33 changes: 27 additions & 6 deletions common/app/contentapi/ContentApiClient.scala
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package contentapi

import java.util.concurrent.TimeUnit

import org.apache.pekko.actor.{ActorSystem => PekkoActorSystem}
import com.github.nscala_time.time.Implicits._
import com.gu.contentapi.client.model._
Expand All @@ -13,12 +12,14 @@ import com.gu.contentapi.client.{
ScheduledExecutor,
ContentApiClient => CapiContentApiClient,
}
import common.LoggingField.LogField
import common._
import concurrent.CircuitBreakerRegistry
import conf.Configuration
import conf.Configuration.contentApi
import conf.switches.Switches.CircuitBreakerSwitch

import java.lang.System.currentTimeMillis
import scala.concurrent.duration.{Duration, MILLISECONDS}
import scala.concurrent.{ExecutionContext, Future}
import scala.util.Try
Expand Down Expand Up @@ -146,11 +147,31 @@ final case class CircuitBreakingContentApiClient(
override def get(url: String, headers: Map[String, String])(implicit
executionContext: ExecutionContext,
): Future[HttpResponse] = {
if (CircuitBreakerSwitch.isSwitchedOn) {
circuitBreaker.withCircuitBreaker(super.get(url, headers)(executionContext))
} else {
super.get(url, headers)
}
val start = currentTimeMillis()

val resp =
if (CircuitBreakerSwitch.isSwitchedOn) {
circuitBreaker.withCircuitBreaker(super.get(url, headers)(executionContext))
} else {
super.get(url, headers)
}

resp.foreach((r: HttpResponse) => {
val duration: Long = currentTimeMillis() - start

val markers: List[LogField] = List[LogField](
"internal-request.target" -> "CAPI",
"internal-request.method" -> "GET",
"internal-request.status" -> r.statusCode,
"internal-request.duration" -> duration,
"internal-request.requestUri" -> url.toString,
"internal-request.contentLength" -> r.body.length,
)

logInfoWithCustomFields(s"Request to CAPI completed with status ${r.statusCode} in ${duration}ms", markers)
})

resp
}
}

Expand Down
18 changes: 16 additions & 2 deletions common/app/renderers/DotcomRenderingService.scala
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package renderers

import org.apache.pekko.actor.{ActorSystem => PekkoActorSystem}
import com.gu.contentapi.client.model.v1.{Block, Blocks}
import common.LoggingField.LogField
import common.{DCRMetrics, GuLogging}
import concurrent.CircuitBreakerRegistry
import conf.Configuration
Expand Down Expand Up @@ -84,9 +85,22 @@ class DotcomRenderingService extends GuLogging with ResultWithPreconnectPreload
case None => request.post(payload)
}

resp.foreach(_ => {
DCRMetrics.DCRLatencyMetric.recordDuration(currentTimeMillis() - start)
resp.foreach((r: WSResponse) => {
val duration: Long = currentTimeMillis() - start

DCRMetrics.DCRLatencyMetric.recordDuration(duration)
DCRMetrics.DCRRequestCountMetric.increment()

val markers: List[LogField] = List[LogField](
"internal-request.target" -> "DCR",
"internal-request.method" -> "POST",
"internal-request.status" -> r.status,
"internal-request.duration" -> duration,
"internal-request.requestUri" -> request.uri.toString,
"internal-request.contentLength" -> payload.toString.length,
)

logInfoWithCustomFields(s"Request to DCR completed with status ${r.status} in ${duration}ms", markers)
})

resp.recoverWith({
Expand Down
Loading