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

dev.chopsticks.metric.prom.TestMetricRegistry.scala Maven / Gradle / Ivy

package dev.chopsticks.metric.prom

import dev.chopsticks.metric.MetricConfigs._
import dev.chopsticks.metric.MetricRegistry.MetricGroup
import dev.chopsticks.metric._
import dev.chopsticks.metric.prom.PromMetrics._
import io.prometheus.client.{Counter, Gauge, Histogram, Summary}
import zio.{ULayer, ZLayer}

object TestMetricRegistry {
  def apply[C <: MetricGroup](): TestMetricRegistry[C] = new TestMetricRegistry[C]()

  def live[C <: MetricGroup: zio.Tag]: ULayer[MetricRegistry[C]] = {
    ZLayer.succeed(new TestMetricRegistry[C])
  }
}

final class TestMetricRegistry[C <: MetricGroup] extends MetricRegistry.Service[C] {
  override def counter(config: CounterConfig[NoLabel] with C): MetricCounter = {
    new PromCounter(
      Counter
        .build(config.name, config.name)
        .create()
    )
  }

  override def counterWithLabels[L <: MetricLabel](
    config: CounterConfig[L] with C,
    labelValues: LabelValues[L]
  ): MetricCounter = {
    val values = config.labelNames.names.map(k => labelValues.map(k))
    val names = config.labelNames.names
    new PromChildCounter(
      Counter
        .build(config.name, config.name)
        .labelNames(names: _*)
        .create()
        .labels(values: _*)
    )
  }

  override def gauge(config: GaugeConfig[NoLabel] with C): MetricGauge = {
    new PromGauge(
      Gauge
        .build(config.name, config.name)
        .create()
    )
  }

  override def gaugeWithLabels[L <: MetricLabel](
    config: GaugeConfig[L] with C,
    labelValues: LabelValues[L]
  ): MetricGauge = {
    val values = config.labelNames.names.map(k => labelValues.map(k))
    val names = config.labelNames.names
    new PromChildGauge(
      Gauge
        .build(config.name, config.name)
        .labelNames(names: _*)
        .create()
        .labels(values: _*)
    )
  }

  override def reference[V: MetricReference.MetricReferenceValue](config: GaugeConfig[NoLabel] with C)
    : MetricReference[V] = {
    new PromReference[V](
      Gauge
        .build(config.name, config.name)
        .create()
    )
  }

  override def referenceWithLabels[L <: MetricLabel, V: MetricReference.MetricReferenceValue](
    config: GaugeConfig[L] with C,
    labelValues: LabelValues[L]
  ): MetricReference[V] = {
    val values = config.labelNames.names.map(k => labelValues.map(k))
    val names = config.labelNames.names
    new PromChildReference[V](
      Gauge
        .build(config.name, config.name)
        .labelNames(names: _*)
        .create()
        .labels(values: _*)
    )
  }

  override def histogram(config: HistogramConfig[NoLabel] with C): MetricHistogram = {
    new PromHistogram(
      Histogram
        .build(config.name, config.name)
        .buckets(config.buckets: _*)
        .create()
    )
  }

  override def histogramWithLabels[L <: MetricLabel](
    config: HistogramConfig[L] with C,
    labelValues: LabelValues[L]
  ): MetricHistogram = {
    val values = config.labelNames.names.map(k => labelValues.map(k))
    val names = config.labelNames.names
    new PromChildHistogram(
      Histogram
        .build(config.name, config.name)
        .buckets(config.buckets: _*)
        .labelNames(names: _*)
        .create()
        .labels(values: _*)
    )
  }

  override def summary(config: SummaryConfig[NoLabel] with C): MetricSummary = {
    new PromSummary(
      config.quantiles
        .foldLeft(Summary.build(config.name, config.name)) {
          case (s, (quantile, error)) =>
            s.quantile(quantile, error)
        }
        .maxAgeSeconds(config.maxAge.toSeconds)
        .ageBuckets(config.ageBuckets)
        .create()
    )
  }

  override def summaryWithLabels[L <: MetricLabel](
    config: SummaryConfig[L] with C,
    labelValues: LabelValues[L]
  ): MetricSummary = {
    val values = config.labelNames.names.map(k => labelValues.map(k))
    val names = config.labelNames.names

    new PromChildSummary(
      config.quantiles
        .foldLeft(Summary.build(config.name, config.name)) {
          case (s, (quantile, error)) =>
            s.quantile(quantile, error)
        }
        .maxAgeSeconds(config.maxAge.toSeconds)
        .ageBuckets(config.ageBuckets)
        .labelNames(names: _*)
        .create()
        .labels(values: _*)
    )
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy