这个神秘的Scala物体来自哪里?
请注意:尽管这个问题与流行的库及其Scala API模拟有关,但从其核心来看,这是一个严格意义上的Scala问题。因此,我相信任何知识渊博的Scala开发人员都可以回答这个问题这个神秘的Scala物体来自哪里?,scala,dropwizard,metrics,Scala,Dropwizard,Metrics,请注意:尽管这个问题与流行的库及其Scala API模拟有关,但从其核心来看,这是一个严格意义上的Scala问题。因此,我相信任何知识渊博的Scala开发人员都可以回答这个问题 我是Scala的新手,正在尝试构建一个简单的应用程序来利用这个度量Scala库(这也是用于DW度量的Scala API)。我发现了一个非常有用的GitHub项目,它展示了如何在现实世界中设置度量Scala,以及我下面引用的源文件 我将源文件切割成更小、更简单的版本来说明我的问题: object Metrics exte
我是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
对象视为接受一个参数的函数,该参数本身就是返回值的函数
为了进一步的参考,我推荐本手册中的这些章节
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
方法