3.1 用Micrometer仪表化JVM应用
Micrometer(千分尺)是Pivotal为最流行的监控系统提供的一个简单的仪表客户端门面模式,允许仪表化JVM应用,而无须关心是哪个供应商提供的指标,如图3-2所示。
Micrometer的作用和SLF4J类似,只不过它关注的不是Log(日志),而是Application Metrics(应用指标)。简而言之,它就是监控界的SLF4J。slf4j-api是facade(门面),log4j和logback才是日志的真正实现,Micrometer也是一个Metrics的facade,它是一个监控指标的度量类库。Micrometer的官网首页如图3-3所示。
图3-2 Micrometer(千分尺)
图3-3 Micrometer官网首页
Spring Boot 2.x在spring-boot-actuator中引入了Micrometer。Spring Boot 2.x对Spring Boot 1.x的指标进行了重构,除了Prometheus以外,Micrometer也支持对接其他监控系统,如AppOptics、Atlas、Datadog、Dynatrace、Elastic、Ganglia、Graphite、Humio、Influx、JMX、KairosDB、New Relic、SignalFx、Simple[in-memory]、StatsD、Wavefront等。1.x中的指标有些刻意向dropwizard-metrics看齐,而Micrometer除了一些基本的指标与dropwizard-metrics相似外,其他都有了相应的改变,其中最大的改变就是支持标签。这是一个很重要的信号,标志着老一代的StatsD、Graphite开始逐步退出历史舞台,而支持标签的Influx、Prometheus等将逐渐成为主流。在日常生产中,推荐使用Micrometer作为MDD(Metrics-Driven-Development,指标驱动开发)监控的门面。Micrometer和Spring Boot、Prometheus的桥接关系如图3-4所示。
图3-4 Micrometer和Spring Boot的桥接关系
通过门面模式接入Micrometer的监控系统,工整并且规范。用Maven依赖示例来说,其都是micrometer-registry-XXX类型的。
比如,接入Influx的依赖的示例如下:
<dependency> <groupId>io.micrometer</groupId> <artifactId>micrometer-registry-influx</artifactId> <version>${micrometer.version}</version> </dependency>
接入KairosDB的依赖示例如下:
<dependency> <groupId>io.micrometer</groupId> <artifactId>micrometer-registry-kairos</artifactId> <version>${micrometer.version}</version> </dependency>
接入Datadog的依赖示例如下:
<dependency> <groupId>io.micrometer</groupId> <artifactId>micrometer-registry-datadog</artifactId> <version>${micrometer.version}</version> </dependency>
接入JMX的依赖示例如下:
<dependency> <groupId>io.micrometer</groupId> <artifactId>micrometer-registry-jmx</artifactId> <version>${micrometer.version}</version> </dependency>
接入Graphite的依赖示例如下:
<dependency> <groupId>io.micrometer</groupId> <artifactId>micrometer-registry-graphite</artifactId> <version>${micrometer.version}</version> </dependency>
Micrometer还包括开箱即用的缓存、类加载器、垃圾收集、处理器利用率、线程池以及更多针对可操作洞察的解决方案。
Micrometer中最重要的两个概念是Meter和MeterRegistry。
·Meter:用于收集应用的一系列指标的接口。Micrometer提供一系列原生的Meter,包括Timer、Counter、Gauge、DistributionSummary、LongTaskTimer、FunctionCounter、FunctionTimer、TimeGauge。不同的Meter类型有不同的时间序列指标值。例如,增量计数用Counter表示,单个指标值用Gauge表示,计时事件的次数和总时间用Timer表示。每一项指标都有一个唯一标识的指标名称(Metric name)和标签(tag)。
·MeterRegistry:Meter是由MeterRegistry创建的。每个监控系统都必须支持Meter-Registry。
在Spring Boot 1.5.x中,Spring Boot Actuator没有使用Micrometer,所以和Micrometer没有什么关系。在Spring Boot 1.5.x中若要通过dropwizard-metrics提供一些统计指标,可以使用micrometer-spring-legacy。
在Spring Boot 2.x以后,Spring Boot Actuator中用自带的Micrometer来实现监控。接下来我们一起来看一下Spring Boot中如何集成Prometheus。