diff options
Diffstat (limited to 'kamon-system-metrics/src/main/scala/kamon/system/sigar/SigarMetricsUpdater.scala')
-rw-r--r-- | kamon-system-metrics/src/main/scala/kamon/system/sigar/SigarMetricsUpdater.scala | 36 |
1 files changed, 26 insertions, 10 deletions
diff --git a/kamon-system-metrics/src/main/scala/kamon/system/sigar/SigarMetricsUpdater.scala b/kamon-system-metrics/src/main/scala/kamon/system/sigar/SigarMetricsUpdater.scala index 5e5f7518..69bc00ec 100644 --- a/kamon-system-metrics/src/main/scala/kamon/system/sigar/SigarMetricsUpdater.scala +++ b/kamon-system-metrics/src/main/scala/kamon/system/sigar/SigarMetricsUpdater.scala @@ -17,6 +17,7 @@ package kamon.system.sigar import akka.actor.{ Props, Actor } +import akka.event.{ Logging, NoLogging, LoggingAdapter } import kamon.Kamon import kamon.metric.instrument.InstrumentFactory import kamon.metric._ @@ -28,14 +29,15 @@ import scala.concurrent.duration.FiniteDuration class SigarMetricsUpdater(refreshInterval: FiniteDuration) extends Actor { val sigar = new Sigar val metricsExtension = Kamon.metrics + val logger = Logging(context.system, this) val sigarMetrics = List( - CpuMetrics.register(sigar, metricsExtension), - FileSystemMetrics.register(sigar, metricsExtension), - LoadAverageMetrics.register(sigar, metricsExtension), - MemoryMetrics.register(sigar, metricsExtension), - NetworkMetrics.register(sigar, metricsExtension), - ProcessCpuMetrics.register(sigar, metricsExtension)) + CpuMetrics.register(sigar, metricsExtension, logger), + FileSystemMetrics.register(sigar, metricsExtension, logger), + LoadAverageMetrics.register(sigar, metricsExtension, logger), + MemoryMetrics.register(sigar, metricsExtension, logger), + NetworkMetrics.register(sigar, metricsExtension, logger), + ProcessCpuMetrics.register(sigar, metricsExtension, logger)) val refreshSchedule = context.system.scheduler.schedule(refreshInterval, refreshInterval, self, UpdateSigarMetrics)(context.dispatcher) @@ -55,7 +57,7 @@ class SigarMetricsUpdater(refreshInterval: FiniteDuration) extends Actor { object SigarMetricsUpdater { def props(refreshInterval: FiniteDuration): Props = - Props(new SigarMetricsUpdater((refreshInterval))) + Props(new SigarMetricsUpdater(refreshInterval)) case object UpdateSigarMetrics } @@ -64,10 +66,24 @@ trait SigarMetric extends EntityRecorder { def update(): Unit } +object SigarSafeRunner { + private val errorLogged = scala.collection.mutable.Set[String]() + + def runSafe[T](thunk: ⇒ T, defaultValue: ⇒ T, error: String, logger: LoggingAdapter): T = { + try thunk catch { + case e: Exception ⇒ + if (!errorLogged.contains(error)) { + errorLogged += error + logger.warning("Couldn't get the metric [{}]. Due to [{}]", error, e.getMessage) + } + defaultValue + } + } +} + abstract class SigarMetricRecorderCompanion(metricName: String) { - def register(sigar: Sigar, metricsExtension: MetricsModule): SigarMetric = + def register(sigar: Sigar, metricsExtension: MetricsModule, logger: LoggingAdapter = NoLogging): SigarMetric = metricsExtension.entity(EntityRecorderFactory("system-metric", apply(sigar, _)), metricName) - def apply(sigar: Sigar, instrumentFactory: InstrumentFactory): SigarMetric + def apply(sigar: Sigar, instrumentFactory: InstrumentFactory, logger: LoggingAdapter = NoLogging): SigarMetric } - |