All Downloads are FREE. Search and download functionalities are using the official Maven repository.

kamon.instrumentation.lagom.CircuitBreakerMetricsProviderImpl.scala Maven / Gradle / Ivy

There is a newer version: 2.7.4
Show newest version
package kamon.instrumentation.lagom

import java.util.concurrent.CopyOnWriteArrayList

import com.lightbend.lagom.internal.spi.{CircuitBreakerMetrics, CircuitBreakerMetricsProvider}
import javax.inject.{Inject, Singleton}
import kamon.instrumentation.lagom.LagomMetrics.{CircuitBreakerInstruments, defaultTags}
import play.api.Logger

@Singleton
class CircuitBreakerMetricsProviderImpl @Inject() () extends CircuitBreakerMetricsProvider {

  private val metrics = new CopyOnWriteArrayList[CircuitBreakerMetricsImpl]

  override def start(breakerId: String): CircuitBreakerMetrics = {
    val m = new CircuitBreakerMetricsImpl(breakerId, this)
    metrics.add(m)
    m
  }

  private[kamon] def remove(m: CircuitBreakerMetricsImpl): Unit =
    metrics.remove(m)

}

object CircuitBreakerMetricsImpl {
  final val Open = 1
  final val HalfOpen = 2
  final val Closed = 3
}

class CircuitBreakerMetricsImpl(val breakerId: String, provider: CircuitBreakerMetricsProviderImpl)
    extends CircuitBreakerMetrics {
  import CircuitBreakerMetricsImpl._

  private val log = Logger(getClass)

  private val cbInstruments = new CircuitBreakerInstruments(breakerId, defaultTags)

  override def onOpen(): Unit = {
    cbInstruments.state.update(Open)
    log.warn(s"Circuit breaker [$breakerId] open")
  }

  override def onClose(): Unit = {
    cbInstruments.state.update(Closed)
    log.info(s"Circuit breaker [$breakerId] closed")
  }

  override def onHalfOpen(): Unit = {
    cbInstruments.state.update(HalfOpen)
    log.info(s"Circuit breaker [$breakerId] half-open")
  }

  override def onCallSuccess(elapsedNanos: Long): Unit = {
    cbInstruments.okTimer.record(elapsedNanos)
  }

  override def onCallFailure(elapsedNanos: Long): Unit = {
    cbInstruments.errorTimer.record(elapsedNanos)
  }

  override def onCallTimeoutFailure(elapsedNanos: Long): Unit = {
    cbInstruments.errorTimer.record(elapsedNanos)
    cbInstruments.timeoutTimer.record(elapsedNanos)
  }

  override def onCallBreakerOpenFailure(): Unit = {
    cbInstruments.errorTimer.record(1L)
    cbInstruments.openTimer.record(1L)
  }

  override def stop(): Unit = {
    cbInstruments.remove()
    provider.remove(this)
  }

}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy