这个神秘的Scala物体来自哪里?

这个神秘的Scala物体来自哪里?,scala,dropwizard,metrics,Scala,Dropwizard,Metrics,请注意:尽管这个问题与流行的库及其Scala API模拟有关,但从其核心来看,这是一个严格意义上的Scala问题。因此,我相信任何知识渊博的Scala开发人员都可以回答这个问题 我是Scala的新手,正在尝试构建一个简单的应用程序来利用这个度量Scala库(这也是用于DW度量的Scala API)。我发现了一个非常有用的GitHub项目,它展示了如何在现实世界中设置度量Scala,以及我下面引用的源文件 我将源文件切割成更小、更简单的版本来说明我的问题: object Metrics exte

请注意:尽管这个问题与流行的库及其Scala API模拟有关,但从其核心来看,这是一个严格意义上的Scala问题。因此,我相信任何知识渊博的Scala开发人员都可以回答这个问题


我是Scala的新手,正在尝试构建一个简单的应用程序来利用这个度量Scala库(这也是用于DW度量的Scala API)。我发现了一个非常有用的GitHub项目,它展示了如何在现实世界中设置度量Scala,以及我下面引用的源文件

我将源文件切割成更小、更简单的版本来说明我的问题:

object Metrics extends App {
  val metricRegistry = new com.codahale.metrics.MetricRegistry()
  val healthCheckRegistry = new com.codahale.metrics.health.HealthCheckRegistry()

  ConsoleReporter.forRegistry(metricRegistry)
    .convertRatesTo(TimeUnit.SECONDS)
    .convertDurationsTo(TimeUnit.MILLISECONDS)
    .build().start(10, TimeUnit.SECONDS)

  run()

  while(true){}

  def run() {
    new TimerExample().longRunningInstrumentedMethod()

    spawn {
      val gaugeExample = new RandomNumberGaugeExample()

      while (true) {
        Thread.sleep(500)
        gaugeExample.fetchingRandomNumber()
      }
    }
  }
}

trait Instrumented extends InstrumentedBuilder {
  val metricRegistry = Metrics.metricRegistry
}

class RandomNumberGaugeExample() extends Instrumented {
  def fetchingRandomNumber(): Int = {
    metrics.gauge("random-number") {
      Math.abs(new Random().nextInt() % 1000)
    }.value
  }
}
我关心的是这个神秘的
metrics
对象及其用法

我知道,
RandomNumberGaugeExample
继承了
metricsRegistry
实例,因为它扩展了
插入指令的
。但我不知道
度量
实例定义在哪里,它是什么类型,以及
RandomNumberGaugeeExample
如何访问它。
randomnumbergaugeesample
难道就不能访问
metricsRegistry

这又是什么鬼东西:

metrics.gauge("random-number") {
  Math.abs(new Random().nextInt() % 1000)
}.value
metrics.guage
如何返回整数值

我知道RandomNumberGargeExample继承了metricsRegistry实例,因为它扩展了插入指令的实例。但我没有看到度量实例是在哪里定义的,它是什么类型,以及RandomNumberGaugeeExample是如何访问它的。RandomNumberGaugeeSample难道不能访问metricsRegistry吗

metrics
实例继承自trait,如源代码所示

trait InstrumentedBuilder extends BaseBuilder {
  protected lazy val metricBuilder = new MetricBuilder(metricBaseName, metricRegistry)

  /**
   * The MetricBuilder that can be used for creating timers, counters, etc.
   */
  def metrics: MetricBuilder = metricBuilder

  /**
   * The MetricRegistry where created metrics are registered.
   */
  val metricRegistry: MetricRegistry
}
这又是什么鬼东西

metrics.gauge("random-number") {
  Math.abs(new Random().nextInt() % 1000)
}.value
对象定义了一个
apply
方法:

object Gauge {
  def apply[A](f: => A) = new Gauge[A](new DropwizardGauge[A] {
    def getValue: A = f
  })
}
这允许将返回的
Gauge
对象视为接受一个参数的函数,该参数本身就是返回值的函数

为了进一步的参考,我推荐本手册中的这些章节

我知道RandomNumberGargeExample继承了metricsRegistry实例,因为它扩展了插入指令的实例。但我没有看到度量实例是在哪里定义的,它是什么类型,以及RandomNumberGaugeeExample是如何访问它的。RandomNumberGaugeeSample难道不能访问metricsRegistry吗

metrics
实例继承自trait,如源代码所示

trait InstrumentedBuilder extends BaseBuilder {
  protected lazy val metricBuilder = new MetricBuilder(metricBaseName, metricRegistry)

  /**
   * The MetricBuilder that can be used for creating timers, counters, etc.
   */
  def metrics: MetricBuilder = metricBuilder

  /**
   * The MetricRegistry where created metrics are registered.
   */
  val metricRegistry: MetricRegistry
}
这又是什么鬼东西

metrics.gauge("random-number") {
  Math.abs(new Random().nextInt() % 1000)
}.value
对象定义了一个
apply
方法:

object Gauge {
  def apply[A](f: => A) = new Gauge[A](new DropwizardGauge[A] {
    def getValue: A = f
  })
}
这允许将返回的
Gauge
对象视为接受一个参数的函数,该参数本身就是返回值的函数

为了进一步的参考,我推荐本手册中的这些章节


仪器化的
扩展,这就是我们发现的
度量标准
<代码>度量标准是一个标准

至于
metrics.gauge
,让我们看看方法:

此方法有两个参数列表。第二个参数列表
(f:=>A)
有一个名为
f
的按名称调用参数,其类型为
A
。使用
f
创建一个新的
DropwizardGauge
,并将其传递给,从而创建一个新的
Gauge
实例。所以下面的魔鬼

metrics.gauge("random-number") {
  Math.abs(new Random().nextInt() % 1000)
}.value

…基本上是调用
gauge
方法,向其传递两个参数(
字符串
的“随机数”
Math.abs的
Int
结果(new random().nextInt()%1000)
),然后对结果调用
.value
.value
返回一个
Int
,因为正如我们所看到的,
.value
只调用所创建的
DropwizardGauge
上的
getValue
方法,这是我们找到
度量的扩展<代码>度量标准
是一个标准

至于
metrics.gauge
,让我们看看方法:

此方法有两个参数列表。第二个参数列表
(f:=>A)
有一个名为
f
的按名称调用参数,其类型为
A
。使用
f
创建一个新的
DropwizardGauge
,并将其传递给,从而创建一个新的
Gauge
实例。所以下面的魔鬼

metrics.gauge("random-number") {
  Math.abs(new Random().nextInt() % 1000)
}.value
…基本上是调用
gauge
方法,向其传递两个参数(
字符串
的“随机数”
Math.abs的
Int
结果(new random().nextInt()%1000)
),然后对结果调用
.value
.value
返回一个
Int
,因为我们可以看到,
.value
只调用所创建的
DropwizardGauge
上的
getValue
方法