All Downloads are FREE. Search and download functionalities are using the official Maven repository.

zio.metrics.jvm.BufferPools.scala Maven / Gradle / Ivy

There is a newer version: 2.1.16
Show newest version
package zio.metrics.jvm

import zio._
import zio.metrics._

import java.lang.management.{BufferPoolMXBean, ManagementFactory}
import scala.annotation.nowarn
import scala.collection.JavaConverters._

final case class BufferPools(
  bufferPoolUsedBytes: PollingMetric[Any, Throwable, Chunk[MetricState.Gauge]],
  bufferPoolCapacityBytes: PollingMetric[Any, Throwable, Chunk[MetricState.Gauge]],
  bufferPoolUsedBuffers: PollingMetric[Any, Throwable, Chunk[MetricState.Gauge]]
)

object BufferPools {
  @nowarn("msg=JavaConverters")
  val live: ZLayer[JvmMetricsSchedule, Throwable, Reloadable[BufferPools]] =
    ZLayer.scoped {
      for {
        bufferPoolMXBeans <- ZIO.attempt(ManagementFactory.getPlatformMXBeans(classOf[BufferPoolMXBean]).asScala)
        bufferPoolUsedBytes = PollingMetric.collectAll(bufferPoolMXBeans.map { mxBean =>
                                PollingMetric(
                                  Metric
                                    .gauge("jvm_buffer_pool_used_bytes")
                                    .tagged("pool", mxBean.getName)
                                    .contramap[Long](_.toDouble),
                                  ZIO.attempt(mxBean.getMemoryUsed)
                                )
                              })
        bufferPoolCapacityBytes = PollingMetric.collectAll(bufferPoolMXBeans.map { mxBean =>
                                    PollingMetric(
                                      Metric
                                        .gauge("jvm_buffer_pool_capacity_bytes")
                                        .tagged("pool", mxBean.getName)
                                        .contramap[Long](_.toDouble),
                                      ZIO.attempt(mxBean.getTotalCapacity)
                                    )
                                  })
        bufferPoolUsedBuffers = PollingMetric.collectAll(bufferPoolMXBeans.map { mxBean =>
                                  PollingMetric(
                                    Metric
                                      .gauge("jvm_buffer_pool_used_buffers")
                                      .tagged("pool", mxBean.getName)
                                      .contramap[Long](_.toDouble),
                                    ZIO.attempt(mxBean.getCount)
                                  )
                                })

        schedule <- ZIO.service[JvmMetricsSchedule]
        // use interruptible to ensure the forked fibers can be interrupted
        // (reloadableAutoFromConfig causes this layer to be in an uninterruptible region)
        _ <- bufferPoolUsedBytes.launch(schedule.updateMetrics).interruptible
        _ <- bufferPoolCapacityBytes.launch(schedule.updateMetrics).interruptible
        _ <- bufferPoolUsedBuffers.launch(schedule.updateMetrics).interruptible
      } yield BufferPools(bufferPoolUsedBytes, bufferPoolCapacityBytes, bufferPoolUsedBuffers)
    }.reloadableAutoFromConfig[JvmMetricsSchedule](config => config.get.reloadDynamicMetrics)
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy