通用量规位置度设计程序
上周,我写了一篇关于如何将指标从Spring Boot 1.5迁移到Spring Boot 2.0的文章。
本周,是时候检查一下Spring Boot 2.0中可用的不同指标以及如何创建它们。
仪表
共有4种主要指标:
- 计数器
- 测量
- 计时器
- 发行摘要
为了使帖子可读性很强,将仅限于计数器和仪表
所有度量均继承于基本的Meter
类。 Meter
提供基本的测量存储功能。 根据文档:
一个或多个度量值的指定名称和尺寸生成器
这是一个简化的类图:
![仪表类图](https://i-blog.csdnimg.cn/blog_migrate/9361c6556ebbab3b99c6be931c0c7363.png)
计数器
Counter
是一种专用的Meter
,可以增加一个正数(包括0-可以保持不变)。 例如,页面视图的数量可以建模为一个计数器,因为它只能上升。
创建计数器非常简单,所有操作都从MeterRegistry
开始。 Spring Boot提供了MeterRegistry
bean,因此只需注入它。
@Bean
funsimpleCounter(registry:MeterRegistry)=registry.counter("simple.counter")
还有另一个选择:所有Meter
子界面都嵌入了一个流畅的生成器。 该构建器具有register(MeterRegistry)
方法。
以下代码段与上面的代码段相同:
@Bean
funsimpleCounter2(registry:MeterRegistry)=Counter
.builder("simple.counter2")
.register(registry)
生成器功能通常会更强大,因为它提供了更多选项
Counter
一种替代方法是FunctionCounter
,尽管它们在接口方面彼此无关。 FunctionCounter
允许跟踪单调递增的函数 -该函数的值只能随时间增加(或保持不变)。
classTrackedObject{
varvalue:Double=0.0
get(){
field+=1
returnfield
}
}
@Bean
funtracked()=TrackedObject()
@Bean
funsimpleFunctionCounter(registry:MeterRegistry,
tracked:TrackedObject)=registry
.more()
.counter("simple.functioncounter",arrayListOf(),tracked){it.value}
@Bean
funsimpleFunctionCounter2(registry:MeterRegistry,
tracked:TrackedObject)=FunctionCounter
.builder("simple.functioncounter2",tracked){it.value}
.register(registry)
}
Micrometer仅对对象参数(上面的TrackedObject)保持弱引用。 除非应用程序代码对其有很强的引用-就像上面的片段一样,它是应用程序上下文的一部分,否则它将被垃圾回收。 总的来说,这很好。 在此代码段中,这意味着如果未插入tracked,但是该方法创建了一个新的TrackedObject()实例,该指标将很快丢失。
上面两个都将创建一个仪表,在查询后将增加1。 显然,这不是超级有用。 但是,功能计数器可以绑定到有趣的指标:
- 页面浏览量
- 缓存逐出
- 等等
@Bean
funguavaCache(registry:MeterRegistry,guava:GuavaCacheMetrics)=FunctionCounter
.builder("cache.evictions",guava){it.evictionCount().doubleValue()}
.register(registry)
Counter
类的层次结构如下所示:
![柜台类图](https://i-blog.csdnimg.cn/blog_migrate/667b303f47c660d8d80b5fffa44491bc.png)
测量
尽管计数器必须始终上升,但仪表没有这样的约束:仪表输出一个值,该值与一次调用到下一次调用无关。
要创建量规,请使用Gauge
的构建器。
@Bean
funrandom()=SecureRandom()
@Bean
funsimpleGauge(registry:MeterRegistry,random:Random)=Gauge
.builder("simple.gauge",random)
{it.nextInt(100).toDouble()}
.register(registry)
这将创建一个将随机输出值的量规。
MeterRegistry
上的静态方法会创建一个仪表对象,但不会返回对它的引用,而是返回对参数对象的引用。 它允许“手动”更改仪表的值:
valatomic=ref<MeterRegistry>().gauge("atomic.gauge",AtomicLong())
atomic?.getAndAdd(5)
atomic?.getAndDecrement()
atomic?.getAndSet(1)
另一方面,使用这些方法无法注册bean。
Micrometer提供了专用的量规,即TimeGauge
来跟踪时间值。 除了Gauge
的值之外,它还添加一个TimeUnit
。
@Bean
funsimpleTimeGauge(registry:MeterRegistry,random:Random)=TimeGauge
.builder("simple.timegauge",random,TimeUnit.SECONDS)
{it.nextInt(100).toDouble()}
.register(registry)
Gauge
类的层次结构如下:
![量规类图](https://i-blog.csdnimg.cn/blog_migrate/eefb7cca13e3a84c7b9a208bd1030a65.png)
结论
在这篇文章中,我们介绍了计数器和仪表。 此外,Micrometer还提供了它们的替代口味,例如功能计数器和时间计。 计数器和仪表的主要区别在于前者的值只能增加,而后者的值从一个数据点到另一个数据点无关。
通用量规位置度设计程序