diff options
author | Diego Parra <diegolparra@gmail.com> | 2016-03-01 01:10:15 -0300 |
---|---|---|
committer | Diego Parra <diegolparra@gmail.com> | 2016-03-01 01:10:15 -0300 |
commit | 8d47a512219714072b7cf9da8f40d8a69af56397 (patch) | |
tree | 3a966b1f14dceb5453a6455232cb07a9ae988535 | |
parent | d4ac1ce01ed419dc895f808529d720a972e42e51 (diff) | |
parent | 8a66966b5ac834164730b41f12323473a8f521e7 (diff) | |
download | Kamon-8d47a512219714072b7cf9da8f40d8a69af56397.tar.gz Kamon-8d47a512219714072b7cf9da8f40d8a69af56397.tar.bz2 Kamon-8d47a512219714072b7cf9da8f40d8a69af56397.zip |
Merge pull request #317 from wehkamp/bufferPoolMetrics
+ expose memory buffer pool metrics from JMX
-rw-r--r-- | kamon-system-metrics/src/main/scala/kamon/system/jmx/MemoryUsageMetrics.scala | 50 | ||||
-rw-r--r-- | kamon-system-metrics/src/test/scala/kamon/metrics/SystemMetricsSpec.scala | 4 |
2 files changed, 45 insertions, 9 deletions
diff --git a/kamon-system-metrics/src/main/scala/kamon/system/jmx/MemoryUsageMetrics.scala b/kamon-system-metrics/src/main/scala/kamon/system/jmx/MemoryUsageMetrics.scala index 41681459..dff2c72e 100644 --- a/kamon-system-metrics/src/main/scala/kamon/system/jmx/MemoryUsageMetrics.scala +++ b/kamon-system-metrics/src/main/scala/kamon/system/jmx/MemoryUsageMetrics.scala @@ -16,7 +16,7 @@ package kamon.system.jmx -import java.lang.management.{ MemoryUsage, MemoryMXBean, ManagementFactory, MemoryPoolMXBean } +import java.lang.management.{ MemoryUsage, MemoryMXBean, BufferPoolMXBean, ManagementFactory, MemoryPoolMXBean } import kamon.metric.GenericEntityRecorder import kamon.metric.instrument.{ Memory, InstrumentFactory } @@ -29,9 +29,12 @@ import scala.collection.convert.WrapAsScala * @param instrumentFactory Helpers for metric recording. * @param beansWithNames Data sources with metric name prefixes. */ -class MemoryUsageMetrics(instrumentFactory: InstrumentFactory, - beansWithNames: Iterable[MemoryUsageWithMetricName]) extends GenericEntityRecorder(instrumentFactory) { - beansWithNames.foreach { +class MemoryUsageMetrics( + instrumentFactory: InstrumentFactory, + memoryUsageBeansWithNames: Iterable[MemoryUsageWithMetricName], + bufferPoolBeansWithNames: Iterable[BufferPoolWithMetricName] +) extends GenericEntityRecorder(instrumentFactory) { + memoryUsageBeansWithNames.foreach { case MemoryUsageWithMetricName(name, beanFun) ⇒ gauge(name + "-used", Memory.Bytes, () ⇒ { beanFun().getUsed @@ -49,6 +52,21 @@ class MemoryUsageMetrics(instrumentFactory: InstrumentFactory, beanFun().getCommitted }) } + + bufferPoolBeansWithNames.foreach { + case BufferPoolWithMetricName(name, beanFun) ⇒ + gauge(name + "-buffer-pool-count", () ⇒ { + beanFun().getCount + }) + + gauge(name + "-buffer-pool-used", Memory.Bytes, () ⇒ { + beanFun().getMemoryUsed + }) + + gauge(name + "-buffer-pool-capacity", Memory.Bytes, () ⇒ { + beanFun().getTotalCapacity + }) + } } /** @@ -59,6 +77,13 @@ class MemoryUsageMetrics(instrumentFactory: InstrumentFactory, private[jmx] final case class MemoryUsageWithMetricName(metricName: String, beanFun: () ⇒ MemoryUsage) /** + * Objects of this kind may be passed to instances of [[BufferPoolUsageMetrics]] for data collection. + * @param metricName The sanitized name for a metric. + * @param beanFun Function returning the data source for metrics. + */ +private[jmx] final case class BufferPoolWithMetricName(metricName: String, beanFun: () ⇒ BufferPoolMXBean) + +/** * Memory Pool metrics, as reported by JMX: * - @see [[http://docs.oracle.com/javase/7/docs/api/java/lang/management/MemoryMXBean.html "MemoryMXBean"]] * Pools in HotSpot Java 8: @@ -68,18 +93,25 @@ object MemoryUsageMetrics extends JmxSystemMetricRecorderCompanion("jmx-memory") private val invalidChars = """[^a-z0-9]""".r - private def sanitizedName(memoryPoolMXBean: MemoryPoolMXBean) = - invalidChars.replaceAllIn(memoryPoolMXBean.getName.toLowerCase, "-") + private def sanitize(name: String) = + invalidChars.replaceAllIn(name.toLowerCase, "-") private val usagesWithNames = ManagementFactory.getMemoryPoolMXBeans.toList.map { bean ⇒ - MemoryUsageWithMetricName(sanitizedName(bean), bean.getUsage) + MemoryUsageWithMetricName(sanitize(bean.getName), bean.getUsage) + } + + private val bufferPoolsWithNames = ManagementFactory.getPlatformMXBeans(classOf[BufferPoolMXBean]).toList.map { bean ⇒ + BufferPoolWithMetricName(sanitize(bean.getName), () ⇒ bean) } private val memoryMXBean: MemoryMXBean = ManagementFactory.getMemoryMXBean def apply(instrumentFactory: InstrumentFactory): MemoryUsageMetrics = - new MemoryUsageMetrics(instrumentFactory, + new MemoryUsageMetrics( + instrumentFactory, MemoryUsageWithMetricName("non-heap", () ⇒ memoryMXBean.getNonHeapMemoryUsage) :: MemoryUsageWithMetricName("heap", () ⇒ memoryMXBean.getHeapMemoryUsage) :: - usagesWithNames) + usagesWithNames, + bufferPoolsWithNames + ) } diff --git a/kamon-system-metrics/src/test/scala/kamon/metrics/SystemMetricsSpec.scala b/kamon-system-metrics/src/test/scala/kamon/metrics/SystemMetricsSpec.scala index 452ee0c7..2facc5a4 100644 --- a/kamon-system-metrics/src/test/scala/kamon/metrics/SystemMetricsSpec.scala +++ b/kamon-system-metrics/src/test/scala/kamon/metrics/SystemMetricsSpec.scala @@ -72,6 +72,10 @@ class SystemMetricsSpec extends BaseKamonSpec("system-metrics-spec") with Redire memoryMetrics.gauge("non-heap-used").get.numberOfMeasurements should be > 0L memoryMetrics.gauge("non-heap-max").get.numberOfMeasurements should be > 0L memoryMetrics.gauge("non-heap-committed").get.numberOfMeasurements should be > 0L + + memoryMetrics.gauge("direct-buffer-pool-count").get.numberOfMeasurements should be > 0L + memoryMetrics.gauge("direct-buffer-pool-used").get.numberOfMeasurements should be > 0L + memoryMetrics.gauge("direct-buffer-pool-capacity").get.numberOfMeasurements should be > 0L } "record correctly updatable values for heap metrics" in { |