diff options
Diffstat (limited to 'kamon-system-metrics/src/main')
-rw-r--r-- | kamon-system-metrics/src/main/resources/reference.conf | 4 | ||||
-rw-r--r-- | kamon-system-metrics/src/main/scala/kamon/system/SystemMetricsCollector.scala | 30 |
2 files changed, 28 insertions, 6 deletions
diff --git a/kamon-system-metrics/src/main/resources/reference.conf b/kamon-system-metrics/src/main/resources/reference.conf index 0fab129f..4d564e38 100644 --- a/kamon-system-metrics/src/main/resources/reference.conf +++ b/kamon-system-metrics/src/main/resources/reference.conf @@ -2,6 +2,10 @@ # Kamon-System-Metrics Reference Configuration # # ============================================ # +# Sigar provisioner native library extract location. +# Use per-application-instance scoped location, such as program working directory. +kamon.sigar.folder = ${user.dir}"/native" + kamon { metrics { precision { diff --git a/kamon-system-metrics/src/main/scala/kamon/system/SystemMetricsCollector.scala b/kamon-system-metrics/src/main/scala/kamon/system/SystemMetricsCollector.scala index bb7fa105..8094cac4 100644 --- a/kamon-system-metrics/src/main/scala/kamon/system/SystemMetricsCollector.scala +++ b/kamon-system-metrics/src/main/scala/kamon/system/SystemMetricsCollector.scala @@ -158,16 +158,34 @@ class SystemMetricsCollector(collectInterval: FiniteDuration) extends Actor with rcs.global.record(contextSwitches) } + def verifiedSigarInstance: SigarProxy = { + val sigar = new Sigar() + printBanner(sigar) + sigar + } + + def provisionSigarLibrary: Unit = { + val folder = context.system.settings.config.getString("kamon.sigar.folder") + SigarProvisioner.provision(new File(folder)) + } + def createSigarInstance: SigarProxy = { - val tempFolder = new File(System.getProperty("java.io.tmpdir")) + // 1) Assume that library is already provisioned. + try { + return verifiedSigarInstance + } catch { + // Not using [[Try]] - any error is non-fatal in this case. + case e: Throwable ⇒ log.info(s"Sigar is not yet provisioned: ${e}") + } + + // 2) Attempt to provision library via sigar-loader. try { - SigarProvisioner.provision(tempFolder) - val sigar = new Sigar() - printBanner(sigar) - sigar + provisionSigarLibrary + return verifiedSigarInstance } catch { - case NonFatal(t) ⇒ throw new UnexpectedSigarException("Failed to load sigar") + // Not using [[Try]] - any error is non-fatal in this case. + case e: Throwable ⇒ throw new UnexpectedSigarException(s"Failed to load Sigar: ${e}") } } } |