Spring Boot Actuator 为 Micrometer 提供依赖关系管理和自动配置,Micrometer 是一个支持众多监控系统的应用程序指标外观,包括:
- Atlas
- Datadog
- Ganglia
- Graphite
- Influx
- JMX
- New Relic
- Prometheus
- SignalFx
- Simple (in-memory)
- StatsD
- Wavefront
Spring Boot 自动配置复合 MeterRegistry
,并为组合路径中找到的每个受支持的实现添加一个注册表。在运行时类路径中依赖 micrometer-registry-{system}
足以让 Spring Boot 配置注册表。
大多数注册管理机构都有共同点例如,即使 Micrometer 注册表实现位于类路径上,您也可以禁用特定的注册表。例如,要禁用 Datadog:
management.metrics.export.datadog.enabled=false
Spring Boot 还会将任何自动配置的注册表添加到 Metrics
类的全局静态复合注册表中,除非您明确告诉它不要这么做:
management.metrics.use-global-registry=false
在向注册表注册任何仪表之前,您可以注册任意数量的 MeterRegistryCustomizer
bean以进一步配置注册表,例如应用通用标记:
@Bean
MeterRegistryCustomizer<MeterRegistry> metricsCommonTags() {
return registry -> registry.config().commonTags("region", "us-east-1");
}
您可以通过更具体地说明泛型类型,将自定义应用于特定的注册表实现:
@Bean
MeterRegistryCustomizer<GraphiteMeterRegistry> graphiteMetricsNamingConvention() {
return registry -> registry.config().namingConvention(MY_CUSTOM_CONVENTION);
}
使用该设置,您可以在组件中注入 MeterRegistry
并注册指标:
@Component
public class SampleBean {
private final Counter counter;
public SampleBean(MeterRegistry registry) {
this.counter = registry.counter("received.messages");
}
public void handleMessage(String message) {
this.counter.increment();
// handle message implementation
}
}
Spring Boot also configures built-in instrumentation(即 MeterBinder
实现),您可以通过配置或专用注解标记来控制。
默认情况下,metrics 将导出到在本地计算机上运行的 Atlas。可以使用以下方式提供要使用的 Atlas Server 的位置:
management.metrics.export.atlas.uri=http://atlas.example.com:7101/api/v1/publish
Datadog 注册表定期将指标推送到 datadoghq。要将指标导出到 Datadog,必须提供您的API密钥:
management.metrics.export.datadog.api-key=YOUR_KEY
您还可以更改 metrics 发送到Datadog的时间间隔:
management.metrics.export.datadog.step=30s
默认情况下,度量标准将导出到本地计算机上运行的 Ganglia。可以使用以下方式提供要使用的 Ganglia Server 主机和端口:
management.metrics.export.graphite.host=graphite.example.com
management.metrics.export.graphite.port=9004
Micrometer 提供了一个默认的 HierarchicalNameMapper
,它管理维度计数器id如何 mapped to flat hierarchical names。
☀️ 要控制此行为,请定义
GraphiteMeterRegistry
并提供您自己的HierarchicalNameMapper
。除非您自己定义,否则会提供自动配置的GraphiteConfig
和Clock
bean:
@Bean
public GraphiteMeterRegistry graphiteMeterRegistry(GraphiteConfig config, Clock clock) {
return new GraphiteMeterRegistry(config, clock, MY_HIERARCHICAL_MAPPER);
}
默认情况下,指标会导出到本地计算机上运行的 Influx。要使用的 Influx Server 的位置可以使用:
management.metrics.export.influx.uri=http://influx.example.com:8086
Micrometer 提供了与 JMX 的分层映射,主要是一种在本地查看 metrics 的便宜且可移植的方式。Micrometer 提供了一个默认的 HierarchicalNameMapper
,它管理维度计数器id如何 mapped to flat hierarchical names。
☀️ 要控制此行为,请定义
JmxMeterRegistry
并提供您自己的HierarchicalNameMapper
。除非您自己定义,否则提供自动配置的JmxConfig
和Clock
bean:
@Bean
public JmxMeterRegistry jmxMeterRegistry(JmxConfig config, Clock clock) {
return new JmxMeterRegistry(config, clock, MY_HIERARCHICAL_MAPPER);
}
New Relic注册表定期将 metrics 推送到 New Relic。要将指标导出到 New Relic,必须提供您的API密钥和帐户ID:
management.metrics.export.newrelic.api-key=YOUR_KEY
management.metrics.export.newrelic.account-id=YOUR_ACCOUNT_I
您还可以更改度量标准发送到 New Relic 的时间间隔:
management.metrics.export.newrelic.step=30s
Prometheus 希望抓取或轮询各个应用实例以获取指标。 Spring Boot 在 /actuator/prometheus
提供执行器端点,以适当的格式呈现 Prometheus scrape。
☀️ 默认情况下端点不可用,必须公开,请参阅 公开端点 以获取更多详细信息。
以下是要添加到 prometheus.yml
的示例 scrape_config
:
scrape_configs:
- job_name: 'spring'
metrics_path: '/actuator/prometheus'
static_configs:
- targets: ['HOST:PORT']
SignalFx 注册表定期将指标推送到 SignalFx。要将指标导出到 SignalFx,必须提供您的访问令牌:
management.metrics.export.signalfx.access-token=YOUR_ACCESS_TOKEN
您还可以更改将指标发送到 SignalFx 的时间间隔:
management.metrics.export.signalfx.step=30s
Micrometer 附带一个简单的内存后端,如果没有配置其他注册表,它将自动用作后备。这使您可以查看 metrics endpoint 中收集的度量标准。
只要您使用任何其他可用后端,内存后端就会自动禁用。您也可以显式禁用它:
management.metrics.export.simple.enabled=false
StatsD注册表快速的将指标传到 StatsD agent 通过 UDP 的方式。默认情况下,度量标准将导出到本地计算机上运行的 StatsD 代理。可以使用以下方式提供要使用的 StatsD 代理主机和端口:
management.metrics.export.statsd.host=statsd.example.com
management.metrics.export.statsd.port=9125
您还可以更改要使用的StatsD线路协议(默认为Datadog):
management.metrics.export.statsd.flavor=etsy
Wavefront注册表会定期将指标推送到 Wavefront。如果要直接将指标导出到 Wavefront,则必须提供API令牌:
management.metrics.export.wavefront.api-token=YOUR_API_TOKEN
或者,您可以在环境中使用 Wavefront sidecar
或内部代理,将指标数据转发到 Wavefront API 主机:
management.metrics.export.uri=proxy://localhost:2878
☀️ 如果将度量标准发布到Wavefront代理(如文档中所述),则主机必须采用
proxy://HOST:PORT
格式。
您还可以更改将指标发送到 Wavefront 的时间间隔:
management.metrics.export.wavefront.step=30s
Spring Boot在启用时注册以下核心指标:
-
JVM 指标,报告�以下指标利用率:
-
各种内存和缓冲池
-
与垃圾收集有关的统计
-
线程利用率
-
加载/卸载的类数目
-
-
CPU 指标
-
文件描述指标
-
Logback 指标:记录每个级别记录到 Logback 的事件数
-
正常运行时间指标:报告正常运行时间表和表示应用程序绝对启动时间的固定计量表
-
Tomcat 指标
自动配置可以对 Spring MVC 处理的请求进行检测。当 management.metrics.web.server.auto-time-requests
为 true
时,将对所有请求进行此检测。或者,当设置为 false
时,您可以通过将 @Timed
添加到请求处理方法来启用检测:
@RestController
@Timed 1
public class MyController {
@GetMapping("/api/people")
@Timed(extraTags = { "region", "us-east-1" }) 2
@Timed(value = "all.people", longTask = true) 3
public List<Person> listPeople() { ... }
}
1 用于在控制器中的每个请求处理程序上启用计时。 2 一种启用单个端点的方法。如果您在类上拥有它,则不需要这样做,但可以用于进一步自定义此特定端点的计时器。 3 使用longTask = true的方法为该方法启用长任务计时器。长任务计时器需要单独的度量标准名称,并且可以使用短任务计时器进行堆叠。
默认情况下,使用名称 http.server.requests
生成度量标准。可以通过设置 management.metrics.web.server.requests-metric-name
属性来自定义名称。
默认情况下,Spring MVC 相关指标标记有以下信息:
-
method
,请求的方法(例如,GET
或POST
)。 -
uri
,变量替换之前的请求URI模板(如果可能)(例如,/api/person/{id}
)。 -
status
,响应的HTTP状态代码(例如,200
或500
)。 -
exception
,处理请求时抛出的任何异常的简单类名。
要自定义标记,请提供实现 WebMvcTagsProvider
的 @Bean
。
自动配置支持 WebFlux
控制器和功能处理程序处理的所有请求的检测。
默认情况下,使用名称 http.server.requests
生成度量标准。您可以通过设置 management.metrics.web.server.requests-metric-name
属性来自定义名称。
默认情况下,与 WebFlux 相关的指标标记有以下信息:
-
method
,请求的方法(例如,GET
或POST
)。 -
uri
,变量替换之前的请求URI模板(如果可能)(例如,/api/person/{id}
)。 -
status
,响应的HTTP状态代码(例如,200
或500
)。 -
exception
,处理请求时抛出的任何异常的简单类名。
要自定义标记,请提供实现 WebFluxTagsProvider
的 @Bean
。
使用自动配置的 RestTemplateBuilder
创建的任何 RestTemplate
的检测都已启用。也可以手动应用 MetricsRestTemplateCustomizer
。
默认情况下,使用名称 http.client.requests
生成度量标准。可以通过设置 management.metrics.web.client.requests-metric-name
属性来自定义名称。
默认情况下,由检测的 RestTemplate
生成的度量标准使用以下信息进行标记:
-
method
,请求的方法(例如,GET
或POST
)。 -
uri
,变量替换之前的请求 URI 模板(如果可能)(例如,/api/person/{id}
)。 -
status
,响应的 HTTP 状态代码(例如,200
或500
)。 -
clientName
,URI 的 host 部分。
要自定义标记,请提供实现 RestTemplateExchangeTagsProvider
的 @Bean
。 RestTemplateExchangeTags
中有方便的静态函数。
自动配置允许在启动时使用以 Cache
为前缀的度量标准检测所有可用 cache
。缓存检测针对一组基本指标进行了标准化。此外,还提供了特定于缓存的指标。
支持以下缓存库:
-
Caffeine
-
EhCache 2
-
Hazelcast
-
Any compliant JCache (JSR-107) implementation
度量标准由缓存的名称和从 bean
名称派生的 CacheManager
的名称标记。
☀️ 只有启动时可用的缓存才会绑定到注册表。对于在启动阶段之后即时或以编程方式创建的缓存,需要显式注册。 CacheMetricsRegistrar bean可用于简化该过程。
自动配置使用名为 jdbc
的度量标准启用所有可用 DataSource
对象的检测。数据源检测会生成表示池中当前活动,最大允许和最小允许连接的计量器。这些仪表中的每一个都有一个以 jdbc
为前缀的名称。
度量标准也由基于 bean 名称计算的 DataSource
的名称标记。
☀️ 默认情况下,Spring Boot 为所有支持的数据源提供元数据;如果开箱即用不支持您喜欢的数据源,则可以添加其他
DataSourcePoolMetadataProvider bean
。有关示例,请参阅DataSourcePoolMetadataProvidersConfiguration
。
此外,Hikari-specific 指标用 hikaricp
前缀公开。每个度量标准都由池的名称标记(可以使用 spring.datasource.name
控制)。
自动配置将使用名为 rabbitmq
的 metrics 启用所有可用 RabbitMQ 连接工厂的检测。
要注册自定义指标,请将 MeterRegistry
注入组件,如以下示例所示:
class Dictionary {
private final List<String> words = new CopyOnWriteArrayList<>();
Dictionary(MeterRegistry registry) {
registry.gaugeCollectionSize("dictionary.size", Tags.empty(), this.words);
}
// …
}
如果您发现跨组件或应用程序重复检测一套度量标准,则可以将此套件封装在 MeterBinder
实现中。默认情况下,所有 MeterBinder bean
的指标都将自动绑定到 Spring
管理的 MeterRegistry
。
如果需要将自定义应用于特定的 Meter
实例,可以使用 io.micrometer.core.instrument.config.MeterFilter
接口。默认情况下,所有 MeterFilter bean
都将自动应用于 micrometer MeterRegistry.Config
。
例如,如果要将 mytag.region
标记重命名为 mytag.area
以获取以 com.example
开头的所有仪表ID,则可以执行以下操作:
@Bean
public MeterFilter renameRegionTagMeterFilter() {
return MeterFilter.renameTag("com.example", "mytag.region", "mytag.area");
}
除了 MeterFilter
bean 之外,还可以使用属性在 per-meter 的基础上应用一组有限的自定义。per-meter 自定义适用于以给定名称开头的所有仪表 ID。例如,以下将禁用任何具有以 example.remote
开头的ID的计量表:
management.metrics.enable.example.remote=false
以下属性允许 per-meter 自定义:
Property | Description |
---|---|
management.metrics.enable |
是否拒绝 meters 发布任何指标。 |
management.metrics.distribution.percentiles-histogram |
是否发布适合于计算可聚合(跨维度)百分位近似的直方图。 |
management.metrics.distribution.percentiles |
发布在您的应用程序中计算的百分位数值 |
management.metrics.distribution.sla |
使用 SLA 定义的存储桶发布累积直方图。 |
有关 percentiles-histogram
, percentiles
和 sla
背后的概念的更多详细信息,请参阅 micrometer 文档的 "Histograms and percentiles" 部分。
Spring Boot 提供了一个度量标准端点,可以在诊断上用于检查应用程序收集的度量标准。默认情况下端点不可用,必须公开,请参阅 [公开端点https://docs.spring.io/spring-boot/docs/2.0.2.RELEASE/reference/htmlsingle/#production-ready-endpoints-exposing-endpoints 以获取更多详细信息。
访问 /actuator/metrics
会显示可用的仪表名称列表。您可以向下查询以查看有关特定仪表的信息,方法是将其名称作为选择器,例如, /actuator/metrics/jvm.memory.max
。
☀️ 您在此处使用的名称应与代码中使用的名称相匹配,而不是在命名之后的名称:其输送到的监视系统规范化的约定名称。换句话说,如果
jvm.memory.max
由于其 snake case 命名约定而在 Prometheus 中显示为jvm_memory_max
,则在 metrics endpoint 中的仪表时,仍应使用jvm.memory.max
作为选择器。
您还可以在 URL 的末尾添加任意数量的 tag=KEY:VALUE
查询参数,以便按比例向下获取仪表,例如 /actuator/metrics/jvm.memory.max?tag=area:nonheap
。
☀️ 报告的测量值是与仪表名称和已应用的任何标签匹配的所有仪表的统计数据的总和。因此,在上面的示例中,返回的 “Value” 统计信息是堆的 “Code Cache”,“Compressed Class Space” 和 “Metaspace” 区域的最大内存占用量的总和。如果您只想查看 “Metaspace” 的最大大小,可以添加一个额外的
tag=id:Metaspace
,即/actuator/metrics/jvm.memory.max?tag=area:nonheap&tag=id:Metaspace
。