aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDiego Parra <diegolparra@gmail.com>2016-03-01 01:10:15 -0300
committerDiego Parra <diegolparra@gmail.com>2016-03-01 01:10:15 -0300
commit8d47a512219714072b7cf9da8f40d8a69af56397 (patch)
tree3a966b1f14dceb5453a6455232cb07a9ae988535
parentd4ac1ce01ed419dc895f808529d720a972e42e51 (diff)
parent8a66966b5ac834164730b41f12323473a8f521e7 (diff)
downloadKamon-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.scala50
-rw-r--r--kamon-system-metrics/src/test/scala/kamon/metrics/SystemMetricsSpec.scala4
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 {