Metrics
Spring Boot Actuator 为 Micrometer 提供了依赖管理和自动配置。Micrometer 是一个应用指标门面,支持 众多监控系统,包括:
入门
Spring Boot 会自动配置一个复合的 MeterRegistry,并为它在 classpath 中找到的每个受支持的实现向该复合注册表中添加一个对应的 registry。只要在运行时 classpath 中存在 micrometer-registry-{system} 依赖,Spring Boot 就会自动配置相应的 registry。
大多数注册表共享一些通用特性。例如,即使 Micrometer 注册表实现位于 classpath 中,你也可以禁用某个特定的注册表。以下示例禁用了 Datadog:
- Properties
- YAML
management.datadog.metrics.export.enabled=false
management:
datadog:
metrics:
export:
enabled: false
你也可以禁用所有注册中心,除非通过注册中心特定的属性另行指定,如下例所示:
- Properties
- YAML
management.defaults.metrics.export.enabled=false
management:
defaults:
metrics:
export:
enabled: false
Spring Boot 还会将所有自动配置的 registries 添加到 Metrics 类的全局静态复合 registry 中,除非你明确指示它不要这样做:
- Properties
- YAML
management.metrics.use-global-registry=false
management:
metrics:
use-global-registry: false
你可以注册任意数量的 MeterRegistryCustomizer Bean,以在任何计量器(meter)注册到 registry 之前进一步配置该 registry,例如应用通用标签(common tags):
- Java
- Kotlin
import io.micrometer.core.instrument.MeterRegistry;
import org.springframework.boot.micrometer.metrics.autoconfigure.MeterRegistryCustomizer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration(proxyBeanMethods = false)
public class MyMeterRegistryConfiguration {
@Bean
public MeterRegistryCustomizer<MeterRegistry> metricsCommonTags() {
return (registry) -> registry.config().commonTags("region", "us-east-1");
}
}
import io.micrometer.core.instrument.MeterRegistry
import org.springframework.boot.micrometer.metrics.autoconfigure.MeterRegistryCustomizer
import org.springframework.context.annotation.Bean
import org.springframework.context.annotation.Configuration
@Configuration(proxyBeanMethods = false)
class MyMeterRegistryConfiguration {
@Bean
fun metricsCommonTags(): MeterRegistryCustomizer<MeterRegistry> {
return MeterRegistryCustomizer { registry ->
registry.config().commonTags("region", "us-east-1")
}
}
}
你可以通过更具体地指定泛型类型,将自定义应用到特定的 registry 实现上:
- Java
- Kotlin
import io.micrometer.core.instrument.Meter;
import io.micrometer.core.instrument.config.NamingConvention;
import io.micrometer.graphite.GraphiteMeterRegistry;
import org.springframework.boot.micrometer.metrics.autoconfigure.MeterRegistryCustomizer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration(proxyBeanMethods = false)
public class MyMeterRegistryConfiguration {
@Bean
public MeterRegistryCustomizer<GraphiteMeterRegistry> graphiteMetricsNamingConvention() {
return (registry) -> registry.config().namingConvention(this::name);
}
private String name(String name, Meter.Type type, String baseUnit) {
return ...
}
}
import io.micrometer.core.instrument.Meter
import io.micrometer.core.instrument.config.NamingConvention
import io.micrometer.graphite.GraphiteMeterRegistry
import org.springframework.boot.micrometer.metrics.autoconfigure.MeterRegistryCustomizer
import org.springframework.context.annotation.Bean
import org.springframework.context.annotation.Configuration
@Configuration(proxyBeanMethods = false)
class MyMeterRegistryConfiguration {
@Bean
fun graphiteMetricsNamingConvention(): MeterRegistryCustomizer<GraphiteMeterRegistry> {
return MeterRegistryCustomizer { registry: GraphiteMeterRegistry ->
registry.config().namingConvention(this::name)
}
}
private fun name(name: String, type: Meter.Type, baseUnit: String?): String {
return ...
}
}
Spring Boot 还 配置了内置的 instrumentation,你可以通过配置或专用的注解标记来控制它。
支持的监控系统
本节简要描述了每个支持的监控系统。
AppOptics
默认情况下,AppOptics 注册表会定期将指标推送到 [api.appoptics.com/v1/measurements](https://api.appoptics.com/v1/measurements)。要将指标导出到 SaaS AppOptics,必须提供你的 API token:
- Properties
- YAML
management.appoptics.metrics.export.api-token=YOUR_TOKEN
management:
appoptics:
metrics:
export:
api-token: "YOUR_TOKEN"
Atlas
- Properties
- YAML
management.atlas.metrics.export.uri=https://atlas.example.com:7101/api/v1/publish
management:
atlas:
metrics:
export:
uri: "https://atlas.example.com:7101/api/v1/publish"
Datadog
- Properties
- YAML
management.datadog.metrics.export.api-key=YOUR_KEY
management:
datadog:
metrics:
export:
api-key: "YOUR_KEY"
如果你额外提供一个应用密钥(可选),那么诸如仪表描述、类型和基本单位等元数据也会被导出:
- Properties
- YAML
management.datadog.metrics.export.api-key=YOUR_API_KEY
management.datadog.metrics.export.application-key=YOUR_APPLICATION_KEY
management:
datadog:
metrics:
export:
api-key: "YOUR_API_KEY"
application-key: "YOUR_APPLICATION_KEY"
默认情况下,指标会发送到 Datadog 美国 站点([api.datadoghq.com](https://api.datadoghq.com))。如果你的 Datadog 项目托管在其他站点之一,或者你需要通过代理发送指标,请相应地配置 URI:
- Properties
- YAML
management.datadog.metrics.export.uri=https://api.datadoghq.eu
management:
datadog:
metrics:
export:
uri: "https://api.datadoghq.eu"
你也可以更改指标发送到 Datadog 的间隔时间:
- Properties
- YAML
management.datadog.metrics.export.step=30s
management:
datadog:
metrics:
export:
step: "30s"
Dynatrace
Dynatrace 提供了两种指标摄入(metrics ingest)API,这两种 API 均已为 Micrometer 实现。你可以在 Dynatrace 文档中找到关于 Micrometer 指标摄入的说明:此处。v1 命名空间中的配置属性仅在导出到 Timeseries v1 API 时生效。v2 命名空间中的配置属性仅在导出到 Metrics v2 API 时生效。请注意,此集成在同一时间只能向 v1 或 v2 版本的 API 中的一个导出指标,并且优先使用 v2。如果在 v1 命名空间中设置了 device-id(v1 所必需,但在 v2 中不使用),则指标将被导出到 v1 端点;否则,默认使用 v2。
v2 API
你可以通过两种方式使用 v2 API。
自动配置
Dynatrace 自动配置适用于由 OneAgent 或 Kubernetes 的 Dynatrace Operator 监控的主机。
Local OneAgent: 如果主机上运行着 OneAgent,指标会自动导出到 本地 OneAgent 摄取端点。该摄取端点会将指标转发到 Dynatrace 后端。
Dynatrace Kubernetes Operator: 在 Kubernetes 中运行且已安装 Dynatrace Operator 时,registry 将自动从该 Operator 获取您的 endpoint URI 和 API token。
这是默认行为,除了依赖 io.micrometer:micrometer-registry-dynatrace 之外,无需任何特殊设置。
手动配置
如果没有可用的自动配置,则需要提供 Metrics v2 API 的端点和一个 API token。该 API token 必须具有 “Ingest metrics”(metrics.ingest)权限。我们建议将该 token 的作用范围限制为仅此一项权限。您必须确保端点 URI 中包含路径(例如 /api/v2/metrics/ingest):
Metrics API v2 的 ingest 端点 URL 根据您的部署选项而有所不同:
-
SaaS:
https://{your-environment-id}.live.dynatrace.com/api/v2/metrics/ingest -
Managed deployments:
https://{your-domain}/e/{your-environment-id}/api/v2/metrics/ingest
下面的示例使用 example 环境 ID 配置指标导出:
- Properties
- YAML
management.dynatrace.metrics.export.uri=https://example.live.dynatrace.com/api/v2/metrics/ingest
management.dynatrace.metrics.export.api-token=YOUR_TOKEN
management:
dynatrace:
metrics:
export:
uri: "https://example.live.dynatrace.com/api/v2/metrics/ingest"
api-token: "YOUR_TOKEN"
使用 Dynatrace v2 API 时,以下可选功能可用(更多详细信息请参见 Dynatrace 文档):
-
Metric key prefix:设置一个前缀,该前缀将被添加到所有导出的指标键之前。
-
Enrich with Dynatrace metadata:如果运行了 OneAgent 或 Dynatrace operator,则使用额外的元数据(例如关于主机、进程或 Pod 的信息)丰富指标。
-
Default dimensions:指定将被添加到所有导出指标中的键值对。如果使用 Micrometer 指定了具有相同键的标签,则会覆盖默认维度。
-
Use Dynatrace Summary instruments:在某些情况下,Micrometer Dynatrace registry 创建的指标会被拒绝。在 Micrometer 1.9.x 中,通过引入 Dynatrace 特定的 summary instruments 修复了此问题。将此开关设置为
false会强制 Micrometer 回退到 1.9.x 之前的默认行为。仅在从 Micrometer 1.8.x 迁移到 1.9.x 时遇到问题才应使用此选项。 -
Export meter metadata:从 Micrometer 1.12.0 开始,Dynatrace 导出器默认还会导出计量器元数据,例如单位和描述。使用
export-meter-metadata开关可关闭此功能。
可以不指定 URI 和 API token,如下例所示。在这种情况下,将使用自动配置的端点:
- Properties
- YAML
management.dynatrace.metrics.export.v2.metric-key-prefix=your.key.prefix
management.dynatrace.metrics.export.v2.enrich-with-dynatrace-metadata=true
management.dynatrace.metrics.export.v2.default-dimensions.key1=value1
management.dynatrace.metrics.export.v2.default-dimensions.key2=value2
management.dynatrace.metrics.export.v2.use-dynatrace-summary-instruments=true
management.dynatrace.metrics.export.v2.export-meter-metadata=true
management:
dynatrace:
metrics:
export:
# Specify uri and api-token here if not using the local OneAgent endpoint.
v2:
metric-key-prefix: "your.key.prefix"
enrich-with-dynatrace-metadata: true
default-dimensions:
key1: "value1"
key2: "value2"
use-dynatrace-summary-instruments: true # (default: true)
export-meter-metadata: true # (default: true)
v1 API(Legacy)
Dynatrace v1 API 指标注册表会定期使用 Timeseries v1 API 将指标推送到配置的 URI。为了向后兼容现有设置,当设置了 device-id(v1 所必需,但在 v2 中未使用)时,指标将被导出到 Timeseries v1 端点。要将指标导出到 Dynatrace,必须提供您的 API 令牌、设备 ID 和 URI:
- Properties
- YAML
management.dynatrace.metrics.export.uri=https://{your-environment-id}.live.dynatrace.com
management.dynatrace.metrics.export.api-token=YOUR_TOKEN
management.dynatrace.metrics.export.v1.device-id=YOUR_DEVICE_ID
management:
dynatrace:
metrics:
export:
uri: "https://{your-environment-id}.live.dynatrace.com"
api-token: "YOUR_TOKEN"
v1:
device-id: "YOUR_DEVICE_ID"
对于 v1 API,您必须指定不带路径的基础环境 URI,因为 v1 端点路径会自动添加。
与版本无关的设置
除了 API 端点和令牌外,你还可以更改指标发送到 Dynatrace 的间隔时间。默认的导出间隔为 60s。以下示例将导出间隔设置为 30 秒:
- Properties
- YAML
management.dynatrace.metrics.export.step=30s
management:
dynatrace:
metrics:
export:
step: "30s"
你可以在 Micrometer 文档 和 Dynatrace 文档 中找到有关如何为 Micrometer 设置 Dynatrace exporter 的更多信息。
Elastic
默认情况下,指标会被导出到运行在本地机器上的 Elastic。你可以通过以下属性来指定要使用的 Elastic 服务器的位置:
- Properties
- YAML
management.elastic.metrics.export.host=https://elastic.example.com:8086
management:
elastic:
metrics:
export:
host: "https://elastic.example.com:8086"
Ganglia
默认情况下,指标会导出到运行在本地机器上的 Ganglia。你可以提供 Ganglia 服务器 的主机和端口,如下例所示:
- Properties
- YAML
management.ganglia.metrics.export.host=ganglia.example.com
management.ganglia.metrics.export.port=9649
management:
ganglia:
metrics:
export:
host: "ganglia.example.com"
port: 9649
Graphite
默认情况下,指标会被导出到运行在本地机器上的 Graphite。你可以提供 Graphite 服务器 的主机和端口,如下例所示:
- Properties
- YAML
management.graphite.metrics.export.host=graphite.example.com
management.graphite.metrics.export.port=9004
management:
graphite:
metrics:
export:
host: "graphite.example.com"
port: 9004
Micrometer 提供了一个默认的 HierarchicalNameMapper,用于控制维度化的 meter ID 如何映射为扁平的分层名称。
要控制此行为,请定义你自己的 GraphiteMeterRegistry,并提供你自己的 HierarchicalNameMapper。除非你自行定义,否则 Spring Boot 会自动配置 GraphiteConfig 和 Clock 的 Bean:
- Java
- Kotlin
import io.micrometer.core.instrument.Clock;
import io.micrometer.core.instrument.Meter;
import io.micrometer.core.instrument.config.NamingConvention;
import io.micrometer.core.instrument.util.HierarchicalNameMapper;
import io.micrometer.graphite.GraphiteConfig;
import io.micrometer.graphite.GraphiteMeterRegistry;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration(proxyBeanMethods = false)
public class MyGraphiteConfiguration {
@Bean
public GraphiteMeterRegistry graphiteMeterRegistry(GraphiteConfig config, Clock clock) {
return new GraphiteMeterRegistry(config, clock, this::toHierarchicalName);
}
private String toHierarchicalName(Meter.Id id, NamingConvention convention) {
return ...
}
}
import io.micrometer.core.instrument.Clock
import io.micrometer.core.instrument.Meter
import io.micrometer.core.instrument.config.NamingConvention
import io.micrometer.core.instrument.util.HierarchicalNameMapper
import io.micrometer.graphite.GraphiteConfig
import io.micrometer.graphite.GraphiteMeterRegistry
import org.springframework.context.annotation.Bean
import org.springframework.context.annotation.Configuration
@Configuration(proxyBeanMethods = false)
class MyGraphiteConfiguration {
@Bean
fun graphiteMeterRegistry(config: GraphiteConfig, clock: Clock): GraphiteMeterRegistry {
return GraphiteMeterRegistry(config, clock, this::toHierarchicalName)
}
private fun toHierarchicalName(id: Meter.Id, convention: NamingConvention): String {
return ...
}
}
Humio
默认情况下,Humio registry 会定期将指标推送到 cloud.humio.com。要将指标导出到 SaaS 版 Humio,你必须提供你的 API token:
- Properties
- YAML
management.humio.metrics.export.api-token=YOUR_TOKEN
management:
humio:
metrics:
export:
api-token: "YOUR_TOKEN"
你还应配置一个或多个标签,以标识指标所推送的数据源:
- Properties
- YAML
management.humio.metrics.export.tags.alpha=a
management.humio.metrics.export.tags.bravo=b
management:
humio:
metrics:
export:
tags:
alpha: "a"
bravo: "b"
Influx
默认情况下,指标会导出到运行在本地机器上的 Influx v1 实例,并使用默认配置。要将指标导出到 InfluxDB v2,请配置用于写入指标的 org、bucket 和认证 token。你可以通过以下方式指定要使用的 Influx 服务器 的位置:
- Properties
- YAML
management.influx.metrics.export.uri=https://influx.example.com:8086
management:
influx:
metrics:
export:
uri: "https://influx.example.com:8086"
JMX
Micrometer 提供了一种分层映射到 JMX 的方式,主要作为一种廉价且可移植的本地查看指标的方法。默认情况下,指标会被导出到 metrics JMX 域。你可以通过以下方式指定要使用的域:
- Properties
- YAML
management.jmx.metrics.export.domain=com.example.app.metrics
management:
jmx:
metrics:
export:
domain: "com.example.app.metrics"
Micrometer 提供了一个默认的 HierarchicalNameMapper,用于控制维度化的 meter ID 如何映射为扁平的层次化名称。
要控制此行为,请定义你自己的 JmxMeterRegistry,并提供你自己的 HierarchicalNameMapper。除非你自行定义,否则会自动配置 JmxConfig 和 Clock Bean:
- Java
- Kotlin
import io.micrometer.core.instrument.Clock;
import io.micrometer.core.instrument.Meter;
import io.micrometer.core.instrument.config.NamingConvention;
import io.micrometer.core.instrument.util.HierarchicalNameMapper;
import io.micrometer.jmx.JmxConfig;
import io.micrometer.jmx.JmxMeterRegistry;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration(proxyBeanMethods = false)
public class MyJmxConfiguration {
@Bean
public JmxMeterRegistry jmxMeterRegistry(JmxConfig config, Clock clock) {
return new JmxMeterRegistry(config, clock, this::toHierarchicalName);
}
private String toHierarchicalName(Meter.Id id, NamingConvention convention) {
return ...
}
}
import io.micrometer.core.instrument.Clock
import io.micrometer.core.instrument.Meter
import io.micrometer.core.instrument.config.NamingConvention
import io.micrometer.core.instrument.util.HierarchicalNameMapper
import io.micrometer.jmx.JmxConfig
import io.micrometer.jmx.JmxMeterRegistry
import org.springframework.context.annotation.Bean
import org.springframework.context.annotation.Configuration
@Configuration(proxyBeanMethods = false)
class MyJmxConfiguration {
@Bean
fun jmxMeterRegistry(config: JmxConfig, clock: Clock): JmxMeterRegistry {
return JmxMeterRegistry(config, clock, this::toHierarchicalName)
}
private fun toHierarchicalName(id: Meter.Id, convention: NamingConvention): String {
return ...
}
}
KairosDB
默认情况下,指标会被导出到运行在本地机器上的 KairosDB。你可以通过以下方式指定要使用的 KairosDB 服务器 的位置:
- Properties
- YAML
management.kairos.metrics.export.uri=https://kairosdb.example.com:8080/api/v1/datapoints
management:
kairos:
metrics:
export:
uri: "https://kairosdb.example.com:8080/api/v1/datapoints"
New Relic
- Properties
- YAML
management.newrelic.metrics.export.api-key=YOUR_KEY
management.newrelic.metrics.export.account-id=YOUR_ACCOUNT_ID
management:
newrelic:
metrics:
export:
api-key: "YOUR_KEY"
account-id: "YOUR_ACCOUNT_ID"
你也可以更改向 New Relic 发送指标的间隔时间:
- Properties
- YAML
management.newrelic.metrics.export.step=30s
management:
newrelic:
metrics:
export:
step: "30s"
默认情况下,指标通过 REST 调用发布,但如果你在 classpath 中有 Java Agent API,也可以使用它:
- Properties
- YAML
management.newrelic.metrics.export.client-provider-type=insights-agent
management:
newrelic:
metrics:
export:
client-provider-type: "insights-agent"
最后,你可以通过定义自己的 NewRelicClientProvider bean 来完全掌控。
OTLP
默认情况下,指标会通过 OpenTelemetry 协议(OTLP) 导出到运行在本地机器上的消费者。若要导出到其他位置,请使用 management.otlp.metrics.export.url 指定 OTLP 指标端点 的地址:
- Properties
- YAML
management.otlp.metrics.export.url=https://otlp.example.com:4318/v1/metrics
management:
otlp:
metrics:
export:
url: "https://otlp.example.com:4318/v1/metrics"
也可以使用 management.otlp.metrics.export.headers.* 属性提供自定义标头,例如用于身份验证的标头。
如果存在 OtlpMetricsSender bean,它将被配置到 Spring Boot 自动配置的 OtlpMeterRegistry 上。
Prometheus
Prometheus 期望通过抓取(scrape)或轮询(poll)各个应用实例来获取指标。Spring Boot 在 /actuator/prometheus 提供了一个 Actuator 端点,用于以 Prometheus 抓取 所需的格式暴露指标。
默认情况下,该端点不可用,必须显式暴露。更多详情请参见 exposing endpoints。
以下示例 scrape_config 添加到 prometheus.yml 中:
scrape_configs:
- job_name: "spring"
metrics_path: "/actuator/prometheus"
static_configs:
- targets: ["HOST:PORT"]
也支持 Prometheus Exemplars。要启用此功能,应存在一个 SpanContext Bean。如果你使用的是已弃用的 Prometheus simpleclient 支持并希望启用该功能,则应存在一个 SpanContextSupplier Bean。如果你使用 Micrometer Tracing,该功能将为你自动配置,但你也可以随时自行创建。请查阅 Prometheus 文档,因为此功能需要在 Prometheus 侧显式启用,并且仅在使用 OpenMetrics 格式时才受支持。
对于生命周期较短或批处理作业(可能在被 Prometheus 抓取前就已结束),你可以使用 Prometheus Pushgateway 将指标暴露给 Prometheus。
要启用 Prometheus Pushgateway 支持,请在项目中添加以下依赖项:
<dependency>
<groupId>io.prometheus</groupId>
<artifactId>prometheus-metrics-exporter-pushgateway</artifactId>
</dependency>
当 Prometheus Pushgateway 依赖存在于 classpath 中,并且 management.prometheus.metrics.export.pushgateway.enabled 属性设置为 true 时,会自动配置一个 PrometheusPushGatewayManager bean。该 bean 负责管理将指标推送到 Prometheus Pushgateway。
你可以通过 management.prometheus.metrics.export.pushgateway 下的属性来调整 PrometheusPushGatewayManager。对于高级配置,你也可以提供自己的 PrometheusPushGatewayManager Bean。
Simple
Micrometer 自带一个简单的内存后端,如果未配置其他 registry,该后端会自动作为后备使用。这让你可以在 metrics 端点 查看收集了哪些指标。
内存后端在你使用任何其他可用后端时会自动禁用。你也可以显式地禁用它:
- Properties
- YAML
management.simple.metrics.export.enabled=false
management:
simple:
metrics:
export:
enabled: false
Stackdriver
Stackdriver registry 会定期将指标推送到 Stackdriver。要将指标导出到 SaaS Stackdriver,你必须提供你的 Google Cloud 项目 ID:
- Properties
- YAML
management.stackdriver.metrics.export.project-id=my-project
management:
stackdriver:
metrics:
export:
project-id: "my-project"
你也可以更改指标发送到 Stackdriver 的间隔时间:
- Properties
- YAML
management.stackdriver.metrics.export.step=30s
management:
stackdriver:
metrics:
export:
step: "30s"
StatsD
StatsD 注册表会通过 UDP 主动将指标推送到 StatsD 代理。默认情况下,指标会被导出到运行在本地机器上的 StatsD 代理。你可以通过以下方式指定要使用的 StatsD 代理主机、端口和协议:
- Properties
- YAML
management.statsd.metrics.export.host=statsd.example.com
management.statsd.metrics.export.port=9125
management.statsd.metrics.export.protocol=udp
management:
statsd:
metrics:
export:
host: "statsd.example.com"
port: 9125
protocol: "udp"
你也可以更改 StatsD 行协议以使用其他格式(默认为 Datadog):
- Properties
- YAML
management.statsd.metrics.export.flavor=etsy
management:
statsd:
metrics:
export:
flavor: "etsy"
支持的 Metrics 和 Meters
Spring Boot 为各种技术提供了自动的 meter 注册功能。在大多数情况下,默认配置提供了合理的指标,可以发布到任意受支持的监控系统中。
JVM 指标
自动配置通过使用核心 Micrometer 类来启用 JVM 指标。JVM 指标以 jvm. 作为 meter 名称发布。
提供以下 JVM 指标:
-
各种内存和缓冲池的详细信息
-
与垃圾回收相关的统计信息
-
线程利用率
-
虚拟线程统计信息(为此,
io.micrometer:micrometer-java21必须在 classpath 中) -
已加载和已卸载的类的数量
-
JVM 版本信息
-
JIT 编译时间
系统指标
自动配置通过使用核心的 Micrometer 类来启用系统指标。系统指标以 system.、process. 和 disk. 作为 meter 名称发布。
提供以下系统指标:
-
CPU 指标
-
文件描述符指标
-
运行时间指标(包括应用程序已运行的时间量,以及一个表示绝对启动时间的固定 gauge)
-
可用磁盘空间
应用启动指标
自动配置会暴露应用程序启动时间的指标:
-
application.started.time:应用程序启动所花费的时间。 -
application.ready.time:应用程序准备好处理请求所花费的时间。
指标会以应用程序类的全限定名进行标记。
Logger Metrics
自动配置为 Logback 和 Log4J2 启用了事件指标。详细信息以 log4j2.events. 或 logback.events. 作为 meter 名称发布。
任务执行与调度指标
自动配置会启用对所有可用的 ThreadPoolTaskExecutor 和 ThreadPoolTaskScheduler Bean 的监控,前提是底层的 ThreadPoolExecutor 可用。指标会通过执行器的名称打上标签,该名称源自 Bean 的名称。
JMS Metrics
自动配置能够对所有可用的 JmsTemplate Bean 和使用 @JmsListener 注解的方法进行监控。这将分别生成 "jms.message.publish" 和 "jms.message.process" 指标。有关所生成观测数据的更多信息,请参阅 Spring Framework 参考文档。
使用 JmsTemplate bean 的 JmsClient 和 JmsMessagingTemplate 也会被植入(instrumented)。
Spring MVC 指标
自动配置启用了对所有由 Spring MVC 控制器和函数式处理器处理的请求的监控。默认情况下,生成的指标名称为 http.server.requests。你可以通过设置 management.observations.http.server.requests.name 属性来自定义该名称。
有关生成的 Observations 的更多信息,请参阅 Spring Framework 参考文档。
要向默认标签中添加内容,请提供一个 @Bean,该 Bean 扩展自 org.springframework.http.server.observation 包中的 DefaultServerRequestObservationConvention。
要替换默认标签,请提供一个 @Bean,该 Bean 实现 ServerRequestObservationConvention。
在某些情况下,Web 控制器中处理的异常不会被记录为请求指标的标签。应用程序可以通过将已处理的异常设置为请求属性来选择记录这些异常。
默认情况下,所有请求都会被处理。要自定义该过滤器,请提供一个实现 FilterRegistrationBean<ServerHttpObservationFilter> 的 @Bean。
Spring WebFlux 指标
自动配置启用了对所有由 Spring WebFlux 控制器和函数式处理器处理的请求的监控。默认情况下,生成的指标名称为 http.server.requests。你可以通过设置 management.observations.http.server.requests.name 属性来自定义该名称。
有关生成的 Observations 的更多信息,请参阅 Spring Framework 参考文档。
要向默认标签中添加内容,请提供一个 @Bean,该 Bean 扩展自 org.springframework.http.server.reactive.observation 包中的 DefaultServerRequestObservationConvention。
要替换默认标签,请提供一个 @Bean,该 Bean 实现 ServerRequestObservationConvention。
在某些情况下,控制器和处理函数中处理的异常不会被记录为请求指标的标签。应用程序可以通过将已处理的异常设置为请求属性来选择记录这些异常。
Jersey Server Metrics
自动配置启用了对 Jersey JAX-RS 实现所处理的所有请求的监控。默认情况下,生成的指标名称为 http.server.requests。你可以通过设置 management.observations.http.server.requests.name 属性来自定义该名称。
默认情况下,Jersey 服务器指标会带有以下信息标签:
| 标签 | 描述 |
|---|---|
exception | 处理请求时抛出的任何异常的简单类名。 |
method | 请求的方法(例如,GET 或 POST) |
outcome | 基于响应状态码的请求结果。1xx 为 INFORMATIONAL,2xx 为 SUCCESS,3xx 为 REDIRECTION,4xx 为 CLIENT_ERROR,5xx 为 SERVER_ERROR |
status | 响应的 HTTP 状态码(例如,200 或 500) |
uri | 请求的 URI 模板(在变量替换之前,如果可能的话,例如 /api/person/{id}) |
要自定义标签,请提供一个实现 JerseyObservationConvention 的 @Bean。
SSL Bundle 指标
Spring Boot Actuator 会发布有关 SSL bundles 的过期指标。指标 ssl.chain.expiry 以秒为单位衡量每个证书链的过期时间。如果证书链已经过期,该数值将为负数。此指标带有以下标签信息:
| Tag | Description |
|---|---|
bundle | 包含证书链的 bundle 名称 |
certificate | 证书链中最早过期的证书的序列号(十六进制格式) |
chain | 证书链的名称 |
HTTP 客户端指标
Spring Boot Actuator 负责对 RestTemplate、WebClient 和 RestClient 进行指标监控(instrumentation)。为此,你需要注入自动配置的 builder,并使用它来创建实例:
你也可以手动应用负责此 instrumentation 的定制器,即 ObservationRestTemplateCustomizer、ObservationWebClientCustomizer 和 ObservationRestClientCustomizer。
默认情况下,指标会以名称 http.client.requests 生成。你可以通过设置 management.observations.http.client.requests.name 属性来自定义该名称。
有关生成的 Observations 的更多信息,请参阅 Spring Framework 参考文档。
要自定义使用 RestTemplate 或 RestClient 时的标签,请提供一个实现 org.springframework.http.client.observation 包中 ClientRequestObservationConvention 接口的 @Bean。
要自定义使用 WebClient 时的标签,请提供一个实现 org.springframework.web.reactive.function.client 包中 ClientRequestObservationConvention 接口的 @Bean。
Tomcat 指标
自动配置仅在启用了 MBean Registry 时才会对 Tomcat 进行 instrumentation。默认情况下,MBean 注册表是禁用的,但你可以通过将 server.tomcat.mbeanregistry.enabled 设置为 true 来启用它。
Tomcat 指标以 tomcat. 作为 meter 名称发布。
缓存指标
自动配置会在启动时对所有可用的 Cache 实例进行监控,其指标前缀为 cache。缓存监控针对一组基本指标进行了标准化,同时也提供了额外的、特定于缓存的指标。
支持以下缓存库:
-
Cache2k
-
Caffeine
-
Hazelcast
-
任何符合 JCache(JSR-107)规范的实现
-
Redis
应启用 Metrics,以便自动配置能够获取它们。更多详情请参阅你所使用的缓存库的文档。
指标会根据缓存的名称以及 CacheManager 的名称进行标记,而 CacheManager 的名称是从 Bean 名称派生而来的。
只有在启动时配置的缓存才会绑定到注册表中。对于未在缓存配置中定义的缓存(例如在启动阶段之后动态创建或以编程方式创建的缓存),需要显式注册。Spring Boot 提供了一个 CacheMetricsRegistrar Bean,以简化该过程。
Spring Batch 指标
Spring GraphQL 指标
DataSource Metrics
自动配置会为所有可用的 DataSource 对象添加指标,这些指标的前缀为 jdbc.connections。数据源的监控会生成若干 Gauge 指标,分别表示连接池中当前活跃的、空闲的、允许的最大以及允许的最小连接数。
指标还会根据基于 bean 名称计算出的 DataSource 名称进行标记。
默认情况下,Spring Boot 为所有支持的数据源提供元数据。如果你偏好的数据源未被支持,可以添加额外的 DataSourcePoolMetadataProvider bean。示例请参见 DataSourcePoolMetadataProvidersConfiguration。
此外,Hikari 特有的指标会以 hikaricp 为前缀暴露出来。每个指标都会通过连接池的名称打上标签(你可以通过 spring.datasource.name 来控制该名称)。
Hibernate Metrics
如果 org.hibernate.orm:hibernate-micrometer 在 classpath 中,则所有启用了统计信息的可用 Hibernate EntityManagerFactory 实例都会被注入一个名为 hibernate 的指标。
指标还会根据 EntityManagerFactory 的名称进行标记,该名称源自 bean 名称。
要启用统计信息,必须将标准 JPA 属性 hibernate.generate_statistics 设置为 true。你可以在自动配置的 EntityManagerFactory 上启用该属性:
- Properties
- YAML
spring.jpa.properties[hibernate.generate_statistics]=true
spring:
jpa:
properties:
"[hibernate.generate_statistics]": true
Spring Data Repository 指标
自动配置启用了对所有 Spring Data Repository 方法调用的监控。默认情况下,生成的指标名称为 spring.data.repository.invocations。你可以通过设置 management.metrics.data.repository.metric-name 属性来自定义该名称。
io.micrometer.core.annotation 包中的 @Timed 注解支持用于 Repository 接口及其方法。如果你不希望为所有 Repository 调用记录指标,可以将 management.metrics.data.repository.autotime.enabled 设置为 false,并仅使用 @Timed 注解。
带有 longTask = true 的 @Timed 注解会为该方法启用一个长任务计时器(long task timer)。长任务计时器需要一个独立的指标名称,并且可以与短任务计时器叠加使用。
默认情况下,仓库调用相关的指标会带有以下信息标签:
| Tag | Description |
|---|---|
repository | 源 Repository 的简单类名。 |
method | 被调用的 Repository 方法的名称。 |
state | 结果状态(SUCCESS、ERROR、CANCELED 或 RUNNING)。 |
exception | 调用过程中抛出的异常的简单类名。 |
要替换默认的标签,请提供一个实现 RepositoryTagsProvider 的 @Bean。
RabbitMQ 指标
自动配置会使用名为 rabbitmq 的指标,对所有可用的 RabbitMQ 连接工厂进行自动检测(instrumentation)。
Spring Integration 指标
只要存在 MeterRegistry bean,Spring Integration 会自动提供 Micrometer 支持。指标会以 spring.integration. 作为 meter 名称发布。
Kafka Metrics
自动配置会分别为自动配置的消费者工厂和生产者工厂注册一个 MicrometerConsumerListener 和 MicrometerProducerListener。此外,它还会为 StreamsBuilderFactoryBean 注册一个 KafkaStreamsMicrometerListener。更多详细信息,请参阅 Spring Kafka 文档中的 Micrometer Native Metrics 章节。
MongoDB 指标
本节简要描述了 MongoDB 可用的指标。
MongoDB 命令指标
自动配置会将一个 MongoMetricsCommandListener 注册到自动配置的 MongoClient 中。
为每个发送到底层 MongoDB 驱动的命令都会创建一个名为 mongodb.driver.commands 的 timer 指标。每个指标默认带有以下标签信息:
| Tag | Description |
|---|---|
command | 所发出命令的名称。 |
cluster.id | 命令所发送到的集群的标识符。 |
server.address | 命令所发送到的服务器地址。 |
status | 命令的执行结果(SUCCESS 或 FAILED)。 |
要替换默认的指标标签,请定义一个 MongoCommandTagsProvider Bean,如下例所示:
- Java
- Kotlin
import io.micrometer.core.instrument.binder.mongodb.MongoCommandTagsProvider;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration(proxyBeanMethods = false)
public class MyCommandTagsProviderConfiguration {
@Bean
public MongoCommandTagsProvider customCommandTagsProvider() {
return new CustomCommandTagsProvider();
}
}
import io.micrometer.core.instrument.binder.mongodb.MongoCommandTagsProvider
import org.springframework.context.annotation.Bean
import org.springframework.context.annotation.Configuration
@Configuration(proxyBeanMethods = false)
class MyCommandTagsProviderConfiguration {
@Bean
fun customCommandTagsProvider(): MongoCommandTagsProvider? {
return CustomCommandTagsProvider()
}
}
要禁用自动配置的命令指标,请设置以下属性:
- Properties
- YAML
management.metrics.mongodb.command.enabled=false
management:
metrics:
mongodb:
command:
enabled: false
MongoDB 连接池指标
自动配置会将一个 MongoMetricsConnectionPoolListener 注册到自动配置的 MongoClient 中。
为连接池创建了以下 gauge 指标:
-
mongodb.driver.pool.size报告连接池的当前大小,包括空闲和正在使用的成员。 -
mongodb.driver.pool.checkedout报告当前正在使用的连接数量。 -
mongodb.driver.pool.waitqueuesize报告从连接池中等待获取连接的等待队列的当前大小。
每个指标默认都会带有以下信息:
| Tag | 描述 |
|---|---|
cluster.id | 连接池所对应的集群的标识符。 |
server.address | 连接池所对应的服务器地址。 |
要替换默认的指标标签,请定义一个 MongoConnectionPoolTagsProvider Bean:
- Java
- Kotlin
import io.micrometer.core.instrument.binder.mongodb.MongoConnectionPoolTagsProvider;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration(proxyBeanMethods = false)
public class MyConnectionPoolTagsProviderConfiguration {
@Bean
public MongoConnectionPoolTagsProvider customConnectionPoolTagsProvider() {
return new CustomConnectionPoolTagsProvider();
}
}
import io.micrometer.core.instrument.binder.mongodb.MongoConnectionPoolTagsProvider
import org.springframework.context.annotation.Bean
import org.springframework.context.annotation.Configuration
@Configuration(proxyBeanMethods = false)
class MyConnectionPoolTagsProviderConfiguration {
@Bean
fun customConnectionPoolTagsProvider(): MongoConnectionPoolTagsProvider {
return CustomConnectionPoolTagsProvider()
}
}
要禁用自动配置的连接池指标,请设置以下属性:
- Properties
- YAML
management.metrics.mongodb.connectionpool.enabled=false
management:
metrics:
mongodb:
connectionpool:
enabled: false
Neo4j Metrics
自动配置会为自动配置的 Driver 注册一个 MicrometerObservationProvider。
要覆盖此行为,你可以注册一个 ConfigBuilderCustomizer Bean,并将其 order 设置为大于零的值。
Jetty Metrics
自动配置通过使用 Micrometer 的 JettyServerThreadPoolMetrics 为 Jetty 的 ThreadPool 绑定指标。Jetty 的 Connector 实例的指标则通过使用 Micrometer 的 JettyConnectionMetrics 进行绑定;当 server.ssl.enabled 设置为 true 时,还会使用 Micrometer 的 JettySslHandshakeMetrics。
Redis 指标
自动配置会为自动配置的 LettuceConnectionFactory 注册一个 MicrometerTracing。更多详细信息,请参阅 Lettuce 文档的 Observability 章节。
注册自定义指标
要注册自定义指标,请将 MeterRegistry 注入到你的组件中:
- Java
- Kotlin
import io.micrometer.core.instrument.MeterRegistry;
import io.micrometer.core.instrument.Tags;
import org.springframework.stereotype.Component;
@Component
public class MyBean {
private final Dictionary dictionary;
public MyBean(MeterRegistry registry) {
this.dictionary = Dictionary.load();
registry.gauge("dictionary.size", Tags.empty(), this.dictionary.getWords().size());
}
}
import io.micrometer.core.instrument.MeterRegistry
import io.micrometer.core.instrument.Tags
import org.springframework.stereotype.Component
@Component
class MyBean(registry: MeterRegistry) {
private val dictionary: Dictionary
init {
dictionary = Dictionary.load()
registry.gauge("dictionary.size", Tags.empty(), dictionary.words.size)
}
}
如果你的指标依赖于其他 Bean,我们建议你使用 MeterBinder 来注册它们:
- Java
- Kotlin
import io.micrometer.core.instrument.Gauge;
import io.micrometer.core.instrument.binder.MeterBinder;
import org.springframework.context.annotation.Bean;
public class MyMeterBinderConfiguration {
@Bean
public MeterBinder queueSize(Queue queue) {
return (registry) -> Gauge.builder("queueSize", queue::size).register(registry);
}
}
import io.micrometer.core.instrument.Gauge
import io.micrometer.core.instrument.binder.MeterBinder
import org.springframework.context.annotation.Bean
class MyMeterBinderConfiguration {
@Bean
fun queueSize(queue: Queue): MeterBinder {
return MeterBinder { registry ->
Gauge.builder("queueSize", queue::size).register(registry)
}
}
}
使用 MeterBinder 可以确保正确设置依赖关系,并保证在检索指标值时该 bean 可用。如果你发现需要在多个组件或应用程序中重复地对一组指标进行监控,实现一个 MeterBinder 也会很有帮助。
默认情况下,所有 MeterBinder Bean 的指标会自动绑定到 Spring 管理的 MeterRegistry。
自定义单个指标
如果你需要对特定的 Meter 实例应用自定义配置,可以使用 MeterFilter 接口。
例如,如果你想将所有以 com.example 开头的 meter ID 的 mytag.region 标签重命名为 mytag.area,可以执行以下操作:
- Java
- Kotlin
import io.micrometer.core.instrument.config.MeterFilter;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration(proxyBeanMethods = false)
public class MyMetricsFilterConfiguration {
@Bean
public MeterFilter renameRegionTagMeterFilter() {
return MeterFilter.renameTag("com.example", "mytag.region", "mytag.area");
}
}
import io.micrometer.core.instrument.config.MeterFilter
import org.springframework.context.annotation.Bean
import org.springframework.context.annotation.Configuration
@Configuration(proxyBeanMethods = false)
class MyMetricsFilterConfiguration {
@Bean
fun renameRegionTagMeterFilter(): MeterFilter {
return MeterFilter.renameTag("com.example", "mytag.region", "mytag.area")
}
}
默认情况下,所有的 MeterFilter Bean 会自动绑定到 Spring 管理的 MeterRegistry。请确保使用 Spring 管理的 MeterRegistry 来注册你的指标,而不是使用 Metrics 类上的任何静态方法。这些静态方法使用的是全局注册表,而该注册表并非由 Spring 管理。
通用标签
通用标签(Common tags)通常用于对运行环境进行维度下钻分析,例如主机(host)、实例(instance)、区域(region)、堆栈(stack)等。通用标签会应用到所有指标(meters)上,并且可以进行配置,如下例所示:
- Properties
- YAML
management.metrics.tags.region=us-east-1
management.metrics.tags.stack=prod
management:
metrics:
tags:
region: "us-east-1"
stack: "prod"
前面的示例为所有 meter 分别添加了 region 和 stack 标签,其值分别为 us-east-1 和 prod。
如果你使用 Graphite,通用标签(common tags)的顺序非常重要。由于使用此方法无法保证通用标签的顺序,因此建议 Graphite 用户改用自定义的 MeterFilter。
每米属性
除了 MeterFilter Bean 之外,你还可以使用属性对每个 meter 应用一组有限的自定义配置。这些 per-meter 自定义配置会通过 Spring Boot 的 PropertiesMeterFilter 应用于所有以给定名称开头的 meter ID。以下示例会过滤掉所有 ID 以 example.remote 开头的 meters。
- Properties
- YAML
management.metrics.enable.example.remote=false
management:
metrics:
enable:
example:
remote: false
以下属性允许对每个计量器进行自定义:
表 1. 每米定制选项
| 属性 | 说明 |
|---|---|
management.metrics.enable | 是否接受具有特定 ID 的 meters。未被接受的 meters 会从 MeterRegistry 中过滤掉。 |
management.metrics.distribution.percentiles-histogram | 是否发布适合用于计算可聚合(跨维度)百分位近似值的直方图。 |
management.metrics.distribution.minimum-expected-value, management.metrics.distribution.maximum-expected-value | 通过限制预期值的范围,发布更少的直方图桶。 |
management.metrics.distribution.percentiles | 发布在应用程序中计算的百分位数值。 |
management.metrics.distribution.expiry, management.metrics.distribution.buffer-length | 通过将近期样本累积到环形缓冲区中,以赋予近期样本更高的权重;环形缓冲区在可配置的过期时间后轮转,并具有可配置的缓冲区长度。 |
management.metrics.distribution.slo | 发布一个累积直方图,其桶由你的服务等级目标(SLO)定义。 |
有关 percentiles-histogram、percentiles 和 slo 背后概念的更多详细信息,请参阅 Micrometer 文档中的 Histograms and percentiles 章节。
Metrics Endpoint
Spring Boot 提供了一个 metrics 端点,可用于诊断目的,以检查应用程序收集的指标。该端点默认不可用,必须显式暴露。更多详情请参见 暴露端点。
导航到 /actuator/metrics 会显示可用的 meter 名称列表。你可以通过提供某个 meter 的名称作为选择器来深入查看其详细信息,例如 /actuator/metrics/jvm.memory.max。
此处使用的名称应与代码中使用的名称一致,而不是与发送到监控系统后根据其命名规范标准化后的名称一致。换句话说,如果 jvm.memory.max 因 Prometheus 的 snake_case 命名规范而显示为 jvm_memory_max,在通过 metrics 端点检查该 meter 时,仍应使用 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。
与 Micrometer Observation 的集成
一个 DefaultMeterObservationHandler 会自动注册到 ObservationRegistry 上,它会为每个已完成的 observation 创建指标。