指标
Spring Boot Actuator 为 Micrometer 提供了依赖管理和自动配置,Micrometer 是一个支持多种监控系统 的应用指标门面,包括:
快速开始
Spring Boot 自动配置一个复合的 MeterRegistry,并为它在类路径中找到的每个支持的实现添加一个注册表。在运行时类路径中包含 micrometer-registry-{system}
的依赖就足以让 Spring Boot 配置该注册表。
大多数注册中心都共享一些共同的功能。例如,即使 Micrometer 注册中心实现在类路径上,你也可以禁用特定的注册中心。以下示例禁用了 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 还会将所有自动配置的注册表添加到 Metrics 类的全局静态复合注册表中,除非你明确告诉它不要这样做:
- Properties
- YAML
management.metrics.use-global-registry=false
management:
metrics:
use-global-registry: false
你可以注册任意数量的 MeterRegistryCustomizer bean 来进一步配置注册表,例如在将任何计量器注册到注册表之前应用公共标签:
- Java
- Kotlin
import io.micrometer.core.instrument.MeterRegistry;
import org.springframework.boot.actuate.autoconfigure.metrics.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.actuate.autoconfigure.metrics.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")
}
}
}
你可以通过更具体地指定泛型类型,来对特定的注册表实现应用自定义配置:
- Java
- Kotlin
import io.micrometer.core.instrument.Meter;
import io.micrometer.core.instrument.config.NamingConvention;
import io.micrometer.graphite.GraphiteMeterRegistry;
import org.springframework.boot.actuate.autoconfigure.metrics.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.actuate.autoconfigure.metrics.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 还配置了内置的监控功能,你可以通过配置或专用的注解标记来控制这些功能。
支持的监控系统
本节简要介绍了每个受支持的监控系统。
AppOptics
默认情况下,AppOptics 注册表会定期将指标推送到 [api.appoptics.com/v1/measurements](https://api.appoptics.com/v1/measurements)
。要将指标导出到 SaaS 平台的 AppOptics,您必须提供您的 API 令牌:
- 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 提供两种指标摄取 API,两者均针对 Micrometer 实现。你可以在此处找到关于 Micrometer 指标摄取的 Dynatrace 文档。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 或 Dynatrace Kubernetes Operator 监控的主机。
本地 OneAgent: 如果主机上运行着 OneAgent,指标会自动导出到 本地 OneAgent 数据接收端点。该接收端点会将指标转发到 Dynatrace 后端。
Dynatrace Kubernetes Operator: 当在 Kubernetes 中运行并安装了 Dynatrace Operator 时,注册表将自动从 Operator 中获取您的端点 URI 和 API 令牌。
这是默认行为,除了依赖 io.micrometer:micrometer-registry-dynatrace
外,不需要进行特殊设置。
手动配置
如果没有自动配置可用,则需要 Metrics v2 API 的端点和 API 令牌。API 令牌 必须具有“Ingest metrics”(metrics.ingest
)权限设置。我们建议将令牌的权限范围限制在此单一权限内。您必须确保端点 URI 包含路径(例如 /api/v2/metrics/ingest
):
根据您的部署选项,Metrics API v2 的接收端点的 URL 有所不同:
-
SaaS:
https://{your-environment-id}.live.dynatrace.com/api/v2/metrics/ingest
-
托管部署:
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 文档 中找到):
-
指标键前缀:设置一个前缀,该前缀将附加到所有导出的指标键之前。
-
使用 Dynatrace 元数据丰富:如果正在运行 OneAgent 或 Dynatrace 操作符,则使用额外的元数据(例如,关于主机、进程或 pod)丰富指标。
-
默认维度:指定添加到所有导出指标的键值对。如果使用 Micrometer 指定了相同键的标签,它们将覆盖默认维度。
-
使用 Dynatrace 摘要仪表:在某些情况下,Micrometer Dynatrace 注册表创建的指标被拒绝。在 Micrometer 1.9.x 中,通过引入特定于 Dynatrace 的摘要仪表修复了此问题。将此选项设置为
false
将强制 Micrometer 回退到 1.9.x 之前的默认行为。仅当从 Micrometer 1.8.x 迁移到 1.9.x 时遇到问题时才应使用此选项。 -
导出仪表元数据:从 Micrometer 1.12.0 开始,Dynatrace 导出器默认情况下还将导出仪表元数据,例如单位和描述。使用
export-meter-metadata
选项可以关闭此功能。
可以不指定 URI 和 API 令牌,如下例所示。在这种情况下,将使用自动配置的端点:
- 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(旧版)
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 导出器的更多信息。
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。除非你定义了自己的 GraphiteConfig 和 Clock 组件,否则系统会自动配置这些组件:
- 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 注册表会定期将指标推送到 cloud.humio.com。要将指标导出到 SaaS Humio,您必须提供您的 API 令牌:
- 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.*
属性来提供。
Prometheus
Prometheus 期望通过抓取或轮询单个应用程序实例来获取指标。Spring Boot 在 /actuator/prometheus
提供了一个 actuator 端点,用于以适当的格式展示 Prometheus 抓取 的数据。
默认情况下,该端点不可用,必须显式暴露。有关更多详细信息,请参阅暴露端点。
以下示例 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 仅与已弃用的 Prometheus simpleclient 兼容,直到 Prometheus 1.x 客户端添加对其的支持。要切换到 simpleclient,请从你的项目中移除 io.micrometer:micrometer-registry-prometheus
,并改为添加 io.micrometer:micrometer-registry-prometheus-simpleclient
。
要启用 Prometheus Pushgateway 支持,请将以下依赖项添加到您的项目中:
<dependency>
<groupId>io.prometheus</groupId>
<artifactId>simpleclient_pushgateway</artifactId>
</dependency>
当类路径中存在 Prometheus Pushgateway 依赖,并且 management.prometheus.metrics.export.pushgateway.enabled
属性设置为 true
时,将会自动配置一个 PrometheusPushGatewayManager bean。该 bean 负责将指标推送到 Prometheus Pushgateway。
你可以通过使用 management.prometheus.metrics.export.pushgateway
下的属性来调整 PrometheusPushGatewayManager。对于高级配置,你还可以提供自定义的 PrometheusPushGatewayManager bean。
SignalFx
- Properties
- YAML
management.signalfx.metrics.export.access-token=YOUR_ACCESS_TOKEN
management:
signalfx:
metrics:
export:
access-token: "YOUR_ACCESS_TOKEN"
你也可以更改将指标发送到 SignalFx 的时间间隔:
- Properties
- YAML
management.signalfx.metrics.export.step=30s
management:
signalfx:
metrics:
export:
step: "30s"
简单
Micrometer 附带了一个简单的内存后端,如果没有配置其他注册表,它将自动用作备用。这使您可以在 指标端点 中查看收集到的指标。
内存后端在您使用任何其他可用后端时会自动禁用。您也可以显式地禁用它:
- Properties
- YAML
management.simple.metrics.export.enabled=false
management:
simple:
metrics:
export:
enabled: false
Stackdriver
Stackdriver 注册表会定期将指标推送到 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"
Wavefront
- Properties
- YAML
management.wavefront.api-token=YOUR_API_TOKEN
management:
wavefront:
api-token: "YOUR_API_TOKEN"
或者,您可以在您的环境中使用 Wavefront sidecar 或内部代理将指标数据转发到 Wavefront API 主机:
- Properties
- YAML
management.wavefront.uri=proxy://localhost:2878
management:
wavefront:
uri: "proxy://localhost:2878"
如果要将指标发布到 Wavefront 代理(如 Wavefront 文档 中所述),主机必须采用 proxy://HOST:PORT
格式。
你也可以更改将指标发送到 Wavefront 的时间间隔:
- Properties
- YAML
management.wavefront.metrics.export.step=30s
management:
wavefront:
metrics:
export:
step: "30s"
支持的指标和仪表
Spring Boot 为多种技术提供了自动仪表注册功能。在大多数情况下,默认配置提供了合理的指标,这些指标可以发布到任何受支持的监控系统中。
JVM 指标
自动配置通过使用核心的 Micrometer 类来启用 JVM 指标。JVM 指标会发布在 jvm.
计量器名称下。
提供了以下 JVM 指标:
-
各种内存和缓冲池的详细信息
-
与垃圾回收相关的统计信息
-
线程利用率
-
加载和卸载的类数量
-
JVM 版本信息
-
JIT 编译时间
系统指标
自动配置通过使用核心的 Micrometer 类来启用系统指标。系统指标发布在 system.
、process.
和 disk.
这些计量器名称下。
提供以下系统指标:
-
CPU 指标
-
文件描述符指标
-
运行时间指标(包括应用程序已运行的时间量以及绝对启动时间的固定测量)
-
可用磁盘空间
应用启动指标
自动配置会暴露应用程序启动时间的指标:
-
application.started.time
:应用程序启动所花费的时间。 -
application.ready.time
:应用程序准备好处理请求所花费的时间。
指标通过应用程序类的完全限定名称进行标记。
Logger 指标
自动配置启用了 Logback 和 Log4J2 的事件指标。详细信息发布在 log4j2.events.
或 logback.events.
的计量器名称下。
任务执行与调度指标
自动配置支持对所有可用的 ThreadPoolTaskExecutor 和 ThreadPoolTaskScheduler Bean 进行检测,只要底层的 ThreadPoolExecutor 可用即可。指标会通过执行器的名称进行标记,该名称从 Bean 名称派生而来。
JMS 指标
自动配置功能能够对所有可用的 JmsTemplate Bean 和 @JmsListener 注解的方法进行监控。这将分别生成 "jms.message.publish"
和 "jms.message.process"
指标。有关生成的观测信息的更多详情,请参阅 Spring Framework 参考文档。
Spring MVC 指标
自动配置能够对所有由 Spring MVC 控制器和函数式处理器处理的请求进行监控。默认情况下,生成的指标名称为 http.server.requests
。你可以通过设置 management.observations.http.server.requests.name
属性来自定义该名称。
有关生成的观测的更多信息,请参阅 Spring Framework 参考文档。
要添加到默认标签,请提供一个扩展自 org.springframework.http.server.observation
包中的 DefaultServerRequestObservationConvention 的 @Bean。要替换默认标签,请提供一个实现 ServerRequestObservationConvention 的 @Bean。
在某些情况下,Web 控制器中处理的异常不会被记录为请求指标标签。应用程序可以选择通过将处理的异常设置为请求属性来记录这些异常。
默认情况下,所有请求都会被处理。要自定义过滤器,需提供一个实现 FilterRegistrationBean<ServerHttpObservationFilter>
的 @Bean。
Spring WebFlux 指标
自动配置支持对由 Spring WebFlux 控制器和函数式处理器处理的所有请求进行仪表化监控。默认情况下,生成的指标名称为 http.server.requests
。你可以通过设置 management.observations.http.server.requests.name
属性来自定义该名称。
有关生成的观测的更多信息,请参阅 Spring Framework 参考文档。
要添加到默认标签中,提供一个 @Bean,它继承自 org.springframework.http.server.reactive.observation
包中的 DefaultServerRequestObservationConvention。要替换默认标签,提供一个 @Bean,它实现 ServerRequestObservationConvention。
在某些情况下,控制器和处理函数中处理的异常不会被记录为请求指标的标签。应用程序可以通过将处理的异常设置为请求属性来选择记录这些异常。
Jersey 服务器指标
自动配置支持对 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。
HTTP 客户端指标
Spring Boot Actuator 管理了对 RestTemplate、WebClient 和 RestClient 的监控。为此,你需要注入自动配置的构建器,并使用它来创建实例:
你也可以手动应用负责这种监控的自定义器,即 ObservationRestTemplateCustomizer,ObservationWebClientCustomizer 和 ObservationRestClientCustomizer。
默认情况下,指标会以 http.client.requests
的名称生成。你可以通过设置 management.observations.http.client.requests.name
属性来自定义该名称。
有关生成观测的更多信息,请参阅 Spring Framework 参考文档。
在使用 RestTemplate 或 RestClient 时,要自定义标签,可以提供一个实现 ClientRequestObservationConvention 的 @Bean,该接口位于 org.springframework.http.client.observation
包中。在使用 WebClient 时,要自定义标签,可以提供一个实现 ClientRequestObservationConvention 的 @Bean,该接口位于 org.springframework.web.reactive.function.client
包中。
Tomcat 指标
自动配置仅在启用 MBean Registry 时才启用 Tomcat 的检测。默认情况下,MBean 注册表是禁用的,但您可以通过将 server.tomcat.mbeanregistry.enabled
设置为 true
来启用它。
Tomcat 指标发布在 tomcat.
计量器名称下。
缓存指标
自动配置支持在启动时对所有可用的 Cache 实例进行监控,其指标前缀为 cache
。缓存监控已标准化为一组基本指标。此外,还提供特定于缓存的额外指标。
支持以下缓存库:
-
Cache2k
-
Caffeine
-
Hazelcast
-
任何兼容的 JCache(JSR-107)实现
-
Redis
指标通过缓存的名称和 CacheManager 的名称进行标记,后者是从 bean 名称派生的。
只有在启动时配置的缓存才会绑定到注册表中。对于在启动阶段之后动态创建或以编程方式创建的缓存(这些缓存未在配置中定义),需要进行显式注册。为了简化这一过程,提供了一个 CacheMetricsRegistrar bean。
Spring Batch 指标
请参阅 Spring Batch 参考文档。
Spring GraphQL 指标
请参阅 Spring GraphQL 参考文档。
数据源指标
自动配置功能能够为所有可用的 DataSource 对象添加监控,这些监控指标的命名以 jdbc.connections
为前缀。数据源的监控会生成一系列仪表,用于表示连接池中当前活跃的连接数、空闲连接数、允许的最大连接数以及允许的最小连接数。
指标还会根据 DataSource 的名称进行标记,该名称是基于 bean 名称计算得出的。
默认情况下,Spring Boot 为所有支持的数据源提供了元数据。如果您的首选数据源不被支持,您可以添加额外的 DataSourcePoolMetadataProvider Bean。有关示例,请参见 DataSourcePoolMetadataProvidersConfiguration。
此外,Hikari 特定的指标会以 hikaricp
为前缀暴露出来。每个指标都会通过连接池的名称进行标记(你可以通过 spring.datasource.name
来控制它)。
Hibernate 指标
如果 org.hibernate.orm:hibernate-micrometer
在类路径上,所有启用了统计信息的 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 注解会为该方法启用一个长任务计时器。长任务计时器需要一个独立的指标名称,并且可以与短任务计时器叠加使用。
默认情况下,与仓库调用相关的指标会带有以下信息:
标签 | 描述 |
---|---|
repository | 源 Repository 的简单类名。 |
method | 调用的 Repository 方法的名称。 |
state | 结果状态(SUCCESS 、ERROR 、CANCELED 或 RUNNING )。 |
exception | 调用过程中抛出的任何异常的简单类名。 |
要替换默认的标签,可以提供一个实现了 RepositoryTagsProvider 的 @Bean。
RabbitMQ 指标
自动配置能够为所有可用的 RabbitMQ 连接工厂进行检测,并添加一个名为 rabbitmq
的指标。
Spring Integration 指标
Spring Integration 在 MeterRegistry bean 可用时,会自动提供 Micrometer 支持。指标会以 spring.integration.
为仪表名称进行发布。
Kafka 指标
自动配置分别为自动配置的消费者工厂和生产者工厂注册了 MicrometerConsumerListener 和 MicrometerProducerListener。此外,还为 StreamsBuilderFactoryBean 注册了一个 KafkaStreamsMicrometerListener。更多详细信息,请参阅 Spring Kafka 文档中的 Micrometer Native Metrics 部分。
MongoDB 指标
本节简要介绍了 MongoDB 可用的监控指标。
MongoDB 命令指标
自动配置会注册一个 MongoMetricsCommandListener 到自动配置的 MongoClient 中。
为每个向底层 MongoDB 驱动程序发出的命令创建了一个名为 mongodb.driver.commands
的计时器指标。默认情况下,每个指标都带有以下信息:
标签 | 描述 |
---|---|
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.mongo.command.enabled=false
management:
metrics:
mongo:
command:
enabled: false
MongoDB 连接池指标
自动配置会注册一个 MongoMetricsConnectionPoolListener 到自动配置的 MongoClient 中。
以下是为连接池创建的指标(gauge metrics):
-
mongodb.driver.pool.size
报告连接池的当前大小,包括空闲和正在使用的成员。 -
mongodb.driver.pool.checkedout
报告当前正在使用的连接数量。 -
mongodb.driver.pool.waitqueuesize
报告连接池中等待队列的当前大小。
默认情况下,每个指标都带有以下信息:
标签 | 描述 |
---|---|
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.mongo.connectionpool.enabled=false
management:
metrics:
mongo:
connectionpool:
enabled: false
Jetty 指标
自动配置通过使用 Micrometer 的 JettyServerThreadPoolMetrics 来绑定 Jetty 的 ThreadPool 指标。对于 Jetty 的 Connector 实例,指标通过使用 Micrometer 的 JettyConnectionMetrics 进行绑定,并且当 server.ssl.enabled
设置为 true
时,还会使用 Micrometer 的 JettySslHandshakeMetrics。
@Timed 注解支持
要启用 @Timed 注解的扫描,您需要将 management.observations.annotations.enabled
属性设置为 true
。请参考 Micrometer 文档。
Redis 指标
自动配置会为自动配置的 LettuceConnectionFactory 注册一个 MicrometerCommandLatencyRecorder。更多详细信息,请参阅 Lettuce 文档中的 Micrometer Metrics 部分。
注册自定义指标
要注册自定义指标,请将 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
开头的仪表 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 管理的注册表。
常见标签
通用标签通常用于对操作环境进行维度下钻,例如主机、实例、区域、堆栈等。通用标签应用于所有计量器,并且可以进行配置,如下例所示:
- Properties
- YAML
management.metrics.tags.region=us-east-1
management.metrics.tags.stack=prod
management:
metrics:
tags:
region: "us-east-1"
stack: "prod"
前面的示例为所有仪表添加了 region
和 stack
标签,其值分别为 us-east-1
和 prod
。
如果您使用 Graphite,常见标签的顺序很重要。由于使用此方法无法保证常见标签的顺序,建议 Graphite 用户自定义一个 MeterFilter。
每计量器属性
除了 MeterFilter bean 之外,你还可以使用属性对每个仪表进行有限的自定义。基于每个仪表的自定义是通过 Spring Boot 的 PropertiesMeterFilter 应用到任何以给定名称开头的仪表 ID 上的。以下示例过滤掉所有 ID 以 example.remote
开头的仪表。
- Properties
- YAML
management.metrics.enable.example.remote=false
management:
metrics:
enable:
example:
remote: false
以下属性允许对每个仪表进行自定义:
表 1. 每米自定义选项
属性 | 描述 |
---|---|
management.metrics.enable | 是否接受具有特定 ID 的仪表。未接受的仪表将从 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 | 发布由您的服务级别目标定义的累积直方图。 |
有关 percentiles-histogram
、percentiles
和 slo
背后概念的更多详细信息,请参阅 Micrometer 文档中的直方图和百分位数部分。
指标端点
Spring Boot 提供了一个 metrics
端点,您可以使用它进行诊断,以检查应用程序收集的指标。默认情况下,该端点不可用,必须手动暴露。有关更多详细信息,请参阅暴露端点。
访问 /actuator/metrics
会显示可用的度量仪名称列表。您可以通过提供度量仪的名称作为选择器来深入查看特定度量仪的信息,例如 /actuator/metrics/jvm.memory.max
。
你在这里使用的名称应与代码中使用的名称一致,而不是在发送到监控系统后经过命名约定规范化的名称。换句话说,如果由于 Prometheus 的蛇形命名约定,jvm.memory.max
在 Prometheus 中显示为 jvm_memory_max
,在检查 metrics
端点中的仪表时,你仍应使用 jvm.memory.max
作为选择器。
你也可以在 URL 末尾添加任意数量的 tag=KEY:VALUE
查询参数,以便对指标进行维度下钻 —— 例如,/actuator/metrics/jvm.memory.max?tag=area:nonheap
。
报告的数据是与仪表名称和已应用的任何标签匹配的所有仪表的统计数据的总和。在前面的例子中,返回的 Value
统计数据是堆的“代码缓存”、“压缩类空间”和“元空间”区域的最大内存占用的总和。如果你只想查看“元空间”的最大大小,可以添加一个额外的 tag=id:Metaspace
— 即 /actuator/metrics/jvm.memory.max?tag=area:nonheap&tag=id:Metaspace
。
与 Micrometer Observation 的集成
一个 DefaultMeterObservationHandler 会自动注册到 ObservationRegistry 上,它会为每一个完成的观测创建指标。