aboutsummaryrefslogtreecommitdiff
path: root/kamon-system/src/main/scala/kamon/metrics
diff options
context:
space:
mode:
Diffstat (limited to 'kamon-system/src/main/scala/kamon/metrics')
-rw-r--r--kamon-system/src/main/scala/kamon/metrics/CpuMetricsCollector.scala74
-rw-r--r--kamon-system/src/main/scala/kamon/metrics/JvmMetrics.scala71
-rw-r--r--kamon-system/src/main/scala/kamon/metrics/SystemMetrics.scala71
3 files changed, 216 insertions, 0 deletions
diff --git a/kamon-system/src/main/scala/kamon/metrics/CpuMetricsCollector.scala b/kamon-system/src/main/scala/kamon/metrics/CpuMetricsCollector.scala
new file mode 100644
index 00000000..17f6fb08
--- /dev/null
+++ b/kamon-system/src/main/scala/kamon/metrics/CpuMetricsCollector.scala
@@ -0,0 +1,74 @@
+package kamon.metrics
+
+import kamon.system.native.SigarLoader
+import org.hyperic.sigar.{NetInterfaceStat, Swap}
+
+trait SigarExtensionProvider {
+ self: MetricsCollector =>
+
+ lazy val sigar = SigarLoader.init
+}
+
+trait MetricsCollector extends SigarExtensionProvider {
+ def collect: MetricsMeasurement
+}
+
+sealed trait MetricsMeasurement
+case class MemoryMetricsMeasurement(memUsage: Long, memSwapPageIn: Long, memSwapPageOut: Long) extends MetricsMeasurement
+case class NetworkMetricsMeasurement(tcpCurrEstab: Long,
+ tcpEstabResets: Long,
+ netRxBytesRate: Long,
+ netTxBytesRate: Long,
+ netRxErrors: Long,
+ netTxErrors: Long) extends MetricsMeasurement
+
+case class CpuMetricsMeasurement(cpuUser: Long, cpuSys: Long, cpuCombined: Long,
+ loadAverage1min: Long,
+ loadAverage5min: Long,
+ loadAverage15min: Long) extends MetricsMeasurement
+
+
+
+class CpuMetricsCollector extends MetricsCollector {
+ val loadAverage = sigar.getLoadAverage
+ val cpuPerc = sigar.getCpuPerc
+
+
+ def collect(): CpuMetricsMeasurement = {
+ println(s"ProcCPU->${sigar.getProcCpu(sigar.getPid)}")
+ val loadAverage1min = loadAverage(0).toLong
+ val loadAverage5min = loadAverage(1).toLong
+ val loadAverage15min = loadAverage(2).toLong
+
+ CpuMetricsMeasurement(cpuPerc.getUser.toLong, cpuPerc.getSys.toLong, cpuPerc.getCombined.toLong, loadAverage1min, loadAverage5min, loadAverage15min)
+ }
+}
+
+class MemoryMetricsCollector extends MetricsCollector {
+ val swap: Swap = sigar.getSwap
+
+ def collect(): MetricsMeasurement = MemoryMetricsMeasurement(sigar.getMem.getUsedPercent.toLong, swap.getPageIn, swap.getPageOut)
+}
+
+class NetWorkMetricsCollector extends MetricsCollector {
+ val interfaces = sigar.getNetInterfaceList.toSet
+ val tcp = sigar.getTcp
+
+ var netRxBytes = 0L
+ var netTxBytes = 0L
+ var netRxErrors = 0L
+ var netTxErrors = 0L
+
+ def collect(): MetricsMeasurement = {
+ for{
+ interface <- interfaces
+ net:NetInterfaceStat <- sigar.getNetInterfaceStat(interface)
+ }{
+ netRxBytes += net.getRxBytes
+ netTxBytes += net.getTxBytes
+ netRxErrors += net.getRxErrors
+ netTxErrors += net.getTxErrors
+ }
+ NetworkMetricsMeasurement(tcp.getCurrEstab, tcp.getEstabResets,netRxBytes, netTxBytes, netRxErrors, netTxErrors)
+ }
+} \ No newline at end of file
diff --git a/kamon-system/src/main/scala/kamon/metrics/JvmMetrics.scala b/kamon-system/src/main/scala/kamon/metrics/JvmMetrics.scala
new file mode 100644
index 00000000..fb3bfeb8
--- /dev/null
+++ b/kamon-system/src/main/scala/kamon/metrics/JvmMetrics.scala
@@ -0,0 +1,71 @@
+/*
+ * =========================================================================================
+ * Copyright © 2013-2014 the kamon project <http://kamon.io/>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file
+ * except in compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the
+ * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
+ * either express or implied. See the License for the specific language governing permissions
+ * and limitations under the License.
+ * =========================================================================================
+ */
+
+package kamon.metrics
+
+import com.typesafe.config.Config
+import org.HdrHistogram.HdrRecorder
+
+case class JvmMetrics(name: String) extends MetricGroupIdentity {
+ val category = JvmMetrics
+}
+
+object JvmMetrics extends MetricGroupCategory {
+ val name = "system"
+
+ case object MaximumPoolSize extends MetricIdentity { val name, tag = "maximum-pool-size" }
+ case object RunningThreadCount extends MetricIdentity { val name, tag = "running-thread-count" }
+ case object QueueTaskCount extends MetricIdentity { val name, tag = "queued-task-count" }
+ case object PoolSize extends MetricIdentity { val name, tag = "pool-size" }
+
+ case class JvmMetricRecorder(maximumPoolSize: MetricRecorder, runningThreadCount: MetricRecorder, queueTaskCount: MetricRecorder, poolSize: MetricRecorder)
+ extends MetricGroupRecorder {
+
+ def collect: MetricGroupSnapshot = {
+ JvmMetricSnapshot(maximumPoolSize.collect(), runningThreadCount.collect(), queueTaskCount.collect(), poolSize.collect())
+ }
+ }
+
+ case class JvmMetricSnapshot(maximumPoolSize: MetricSnapshotLike, runningThreadCount: MetricSnapshotLike, queueTaskCount: MetricSnapshotLike, poolSize: MetricSnapshotLike)
+ extends MetricGroupSnapshot {
+
+ val metrics: Map[MetricIdentity, MetricSnapshotLike] = Map(
+ (MaximumPoolSize -> maximumPoolSize),
+ (RunningThreadCount -> runningThreadCount),
+ (QueueTaskCount -> queueTaskCount),
+ (PoolSize -> poolSize))
+ }
+
+ val Factory = new MetricGroupFactory {
+ type GroupRecorder = JvmMetricRecorder
+
+ def create(config: Config): JvmMetricRecorder = {
+ val settings = config.getConfig("precision.jvm")
+
+ val threadCountConfig = extractPrecisionConfig(settings.getConfig("maximum-pool-size"))
+ val RunningThreadCountConfig = extractPrecisionConfig(settings.getConfig("running-thread-count"))
+ val QueueTaskCountConfig = extractPrecisionConfig(settings.getConfig("queued-task-count"))
+ val PoolSizeConfig = extractPrecisionConfig(settings.getConfig("pool-size"))
+
+ new JvmMetricRecorder(
+ HdrRecorder(threadCountConfig.highestTrackableValue, threadCountConfig.significantValueDigits, Scale.Unit),
+ HdrRecorder(RunningThreadCountConfig.highestTrackableValue, RunningThreadCountConfig.significantValueDigits, Scale.Unit),
+ HdrRecorder(QueueTaskCountConfig.highestTrackableValue, QueueTaskCountConfig.significantValueDigits, Scale.Unit),
+ HdrRecorder(PoolSizeConfig.highestTrackableValue, PoolSizeConfig.significantValueDigits, Scale.Unit))
+ }
+ }
+}
+
diff --git a/kamon-system/src/main/scala/kamon/metrics/SystemMetrics.scala b/kamon-system/src/main/scala/kamon/metrics/SystemMetrics.scala
new file mode 100644
index 00000000..9bcd8917
--- /dev/null
+++ b/kamon-system/src/main/scala/kamon/metrics/SystemMetrics.scala
@@ -0,0 +1,71 @@
+/*
+ * =========================================================================================
+ * Copyright © 2013-2014 the kamon project <http://kamon.io/>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file
+ * except in compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the
+ * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
+ * either express or implied. See the License for the specific language governing permissions
+ * and limitations under the License.
+ * =========================================================================================
+ */
+
+package kamon.metrics
+
+import com.typesafe.config.Config
+import org.HdrHistogram.HdrRecorder
+
+case class SystemMetrics(name: String) extends MetricGroupIdentity {
+ val category = JvmMetrics
+}
+
+object SystemMetrics extends MetricGroupCategory {
+ val name = "system"
+
+ case object MaximumPoolSize extends MetricIdentity { val name, tag = "maximum-pool-size" }
+ case object RunningThreadCount extends MetricIdentity { val name, tag = "running-thread-count" }
+ case object QueueTaskCount extends MetricIdentity { val name, tag = "queued-task-count" }
+ case object PoolSize extends MetricIdentity { val name, tag = "pool-size" }
+
+ case class SystemMetricRecorder(maximumPoolSize: MetricRecorder, runningThreadCount: MetricRecorder, queueTaskCount: MetricRecorder, poolSize: MetricRecorder)
+ extends MetricGroupRecorder {
+
+ def collect: MetricGroupSnapshot = {
+ SystemMetricSnapshot(maximumPoolSize.collect(), runningThreadCount.collect(), queueTaskCount.collect(), poolSize.collect())
+ }
+ }
+
+ case class SystemMetricSnapshot(maximumPoolSize: MetricSnapshotLike, runningThreadCount: MetricSnapshotLike, queueTaskCount: MetricSnapshotLike, poolSize: MetricSnapshotLike)
+ extends MetricGroupSnapshot {
+
+ val metrics: Map[MetricIdentity, MetricSnapshotLike] = Map(
+ (MaximumPoolSize -> maximumPoolSize),
+ (RunningThreadCount -> runningThreadCount),
+ (QueueTaskCount -> queueTaskCount),
+ (PoolSize -> poolSize))
+ }
+
+ val Factory = new MetricGroupFactory {
+ type GroupRecorder = SystemMetricRecorder
+
+ def create(config: Config): SystemMetricRecorder = {
+ val settings = config.getConfig("precision.system")
+
+ val threadCountConfig = extractPrecisionConfig(settings.getConfig("maximum-pool-size"))
+ val RunningThreadCountConfig = extractPrecisionConfig(settings.getConfig("running-thread-count"))
+ val QueueTaskCountConfig = extractPrecisionConfig(settings.getConfig("queued-task-count"))
+ val PoolSizeConfig = extractPrecisionConfig(settings.getConfig("pool-size"))
+
+ new SystemMetricRecorder(
+ HdrRecorder(threadCountConfig.highestTrackableValue, threadCountConfig.significantValueDigits, Scale.Unit),
+ HdrRecorder(RunningThreadCountConfig.highestTrackableValue, RunningThreadCountConfig.significantValueDigits, Scale.Unit),
+ HdrRecorder(QueueTaskCountConfig.highestTrackableValue, QueueTaskCountConfig.significantValueDigits, Scale.Unit),
+ HdrRecorder(PoolSizeConfig.highestTrackableValue, PoolSizeConfig.significantValueDigits, Scale.Unit))
+ }
+ }
+}
+