指标
入门指南
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.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")
}
}
}
您可以通过更具体地指定泛型类型,将自定义配置应用于特定的注册表实现:
-
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 还会 配置内置的监控功能,您可以通过配置或专用的注解标记来控制它。
支持的监控系统
本节简要介绍每种受支持的监控系统。
AppOptics
默认情况下,AppOptics 注册表会定期将指标推送到 api.appoptics.com/v1/measurements。
要将指标导出到 SaaS AppOptics,必须提供您的 API Tokens:
-
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)。
如果您的 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 时适用。
请注意,此集成一次只能导出到 API 的 v1 或 v2 版本,其中首选 v2。
如果在 v1 命名空间中设置了 device-id(v1 需要但 v2 不使用),则指标将导出到 v1 端点。
否则,默认为 v2。
v2 API
您可以通过两种方式使用 v2 API。
自动配置
Dynatrace 自动配置适用于由 OneAgent 或 Dynatrace Kubernetes Operator 监控的主机。
本地 OneAgent:如果主机上运行着 OneAgent,指标会自动导出到 本地 OneAgent 接入端点。 接入端点会将指标转发到 Dynatrace 后端。
Dynatrace Kubernetes Operator:当在安装了 Dynatrace Operator 的 Kubernetes 环境中运行时,注册表将自动从该运算符获取您的端点 URI 和 API Tokens。
这是默认行为,除了依赖 io.micrometer:micrometer-registry-dynatrace 之外,不需要任何特殊设置。
手动配置
如果没有可用的自动配置,则需要 Metrics v2 API 的端点和 API Tokens。
API Tokens 必须具有“摄入指标”(metrics.ingest)权限。
我们建议将Tokens的范围限制为此单一权限。
您必须确保端点 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 Operator 正在运行,则使用额外的元数据(例如关于主机、进程或 Pod 的信息)来丰富指标。
-
默认维度:指定将被添加到所有导出度量的键值对。 如果使用 Micrometer 指定了具有相同键的标签,它们会覆盖默认维度。
-
使用 Dynatrace Summary 仪器:在某些情况下,Micrometer Dynatrace 注册表创建的指标会被拒绝。 在 Micrometer 1.9.x 中,通过引入 Dynatrace 特定的 summary 仪器修复了此问题。 将此开关设置为
false会强制 Micrometer 回退到 1.9.x 之前的默认行为。 它仅应在从 Micrometer 1.8.x 迁移到 1.9.x 时遇到问题时使用。 -
导出指标元数据:从 Micrometer 1.12.0 开始,Dynatrace 导出器默认还会导出指标元数据,例如单位和描述。 使用
export-meter-metadata切换开关可关闭此功能。
可以不指定URI和APITokens,如以下示例所示。 在这种情况下,使用自动配置的端点:
-
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 Tokens、设备 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 端点和Tokens之外,您还可以更改指标发送到 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,用于管理如何将维度化指标 ID 映射为扁平的分层名称。
|
要控制此行为,请定义您的
|
Humio
默认情况下,Humio 注册表会定期将指标推送到 cloud.humio.com。 要将指标导出到 SaaS Humio,您必须提供您的 API Tokens:
-
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,用于管理如何将维度化指标 ID 映射为扁平的分层名称。
|
要控制此行为,请定义您的
|
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 调用发布,但如果类路径中存在 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 期望通过抓取或轮询各个应用程序实例来获取指标。
Spring Boot 在 /actuator/prometheus 处提供了一个执行器端点,以呈现格式正确的 Prometheus 抓取。
| 默认情况下,该端点不可用,必须进行公开。有关更多详细信息,请参阅 公开端点。 |
以下示例 scrape_config 将值添加到 prometheus.yml:
scrape_configs:
- job_name: "spring"
metrics_path: "/actuator/prometheus"
static_configs:
- targets: ["HOST:PORT"]
Prometheus 示例 也受到支持。
要启用此功能,应存在一个 SpanContext bean。
如果您使用的是过时的 Prometheus simpleclient 支持并希望启用该功能,应存在一个 SpanContextSupplier bean。
如果您使用 Micrometer Tracing,它将为您自动配置,但您也可以根据需要创建自己的。
请查看 Prometheus 文档,因为此功能需要在 Prometheus 端显式启用,并且仅支持使用 OpenMetrics 格式。
对于存在时间可能不足以被抓取的临时或批处理作业,您可以使用 Prometheus Pushgateway 支持将指标暴露给 Prometheus。
要启用 Prometheus Pushgateway 支持,请将以下依赖项添加到您的项目中:
<dependency>
<groupId>io.prometheus</groupId>
<artifactId>prometheus-metrics-exporter-pushgateway</artifactId>
</dependency>
当类路径上存在 Prometheus Pushgateway 依赖项且 management.prometheus.metrics.export.pushgateway.enabled 属性设置为 true 时,会自动配置一个 PrometheusPushGatewayManager Bean。
这负责将指标推送到 Prometheus Pushgateway。
您可以使用 PrometheusPushGatewayManager 下的属性进行调整。
对于高级配置,您还可以提供自己的 PrometheusPushGatewayManager bean。
简单
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"
支持的指标和计量器
Spring Boot 为多种技术提供了自动度量注册功能。 在大多数情况下,默认值会提供可以发布到任何支持的监控系统的合理指标。
JVM 指标
自动配置通过使用核心 Micrometer 类来启用 JVM 指标。
JVM 指标发布在 jvm. 指标名称下。
提供以下 JVM 指标:
-
各种内存和缓冲区池的详细信息
-
与垃圾回收相关的统计信息
-
线程利用率
-
虚拟线程统计信息(为此,
io.micrometer:micrometer-java21必须在类路径中) -
已加载和卸载的类数量
-
JVM 版本信息
-
JIT 编译时间
系统指标
自动配置通过使用核心 Micrometer 类来启用系统指标。
系统指标发布在 system.、process. 和 disk. 计量器名称下。
提供以下系统指标:
-
CPU 指标
-
文件描述符指标
-
正常运行时间指标(包括应用程序运行的时长以及绝对启动时间的固定仪表)
-
可用磁盘空间
应用启动指标
自动配置公开了应用程序启动时间指标:
-
application.started.time:启动应用程序所花费的时间。 -
application.ready.time: 应用程序准备好处理请求所花费的时间。
指标按应用程序类的全限定名进行标记。
任务执行与调度指标
自动配置能够对所有可用的 ThreadPoolTaskExecutor 和 ThreadPoolTaskScheduler Bean 进行监控,只要底层的 ThreadPoolExecutor 可用即可。
指标会按照执行器的名称进行标记,该名称派生自 Bean 的名称。
JMS 指标
自动配置支持对所有可用的 JmsTemplate Bean 和 @JmsListener 注解方法进行插桩。
这将分别生成 "jms.message.publish" 和 "jms.message.process" 指标。
有关生成的观测数据的更多信息,请参阅 Spring Framework 参考文档。
JmsClient 和 JmsMessagingTemplate 且使用了 JmsTemplate bean 的也会被插桩。 |
Spring MVC 指标
自动配置支持对由 Spring MVC 控制器和函数式处理器处理的所有请求进行埋点。
默认情况下,生成的指标名称为 http.server.requests。
您可以通过设置 management.observations.http.server.requests.name 属性来自定义名称。
要添加到默认标签,请提供一个继承自DefaultServerRequestObservationConvention包中的@Bean的。
要替换默认标签,请提供一个实现ServerRequestObservationConvention的。
| 在某些情况下,Web 控制器中处理的异常不会被记录为请求指标标签。 应用程序可以选择通过 将处理过的异常设置为请求属性 来记录异常。 |
默认情况下,所有请求都会被处理。
要自定义过滤器,请提供一个实现 FilterRegistrationBean<ServerHttpObservationFilter> 的 @Bean。
Spring WebFlux 指标
自动配置支持对由 Spring WebFlux 控制器和函数式处理器处理的所有请求进行埋点。
默认情况下,生成的指标名称为 http.server.requests。
您可以通过设置 management.observations.http.server.requests.name 属性来自定义名称。
要添加到默认标签,请提供一个继承自DefaultServerRequestObservationConvention包中的@Bean的。
要替换默认标签,请提供一个实现ServerRequestObservationConvention的。
| 在某些情况下,控制器和处理函数中处理的异常不会被记录为请求指标标签。 应用程序可以选择通过 将处理过的异常设置为请求属性 来记录异常。 |
Jersey 服务器指标
自动配置支持对由 Jersey JAX-RS 实现处理的所有请求进行监控。
默认情况下,生成的指标名称为 http.server.requests。
您可以通过设置 management.observations.http.server.requests.name 属性来自定义名称。
默认情况下,Jersey 服务器指标会附带以下信息进行标记:
| 标签 | 描述 |
|---|---|
|
在处理请求时抛出的任何异常的简单类名。 |
|
请求的方法(例如, |
|
请求的结果,基于响应的状态码。
1xx 为 |
|
响应的 HTTP 状态码(例如, |
|
请求的 URI 模板在变量替换之前(如果可能,例如 |
要自定义标签,请提供一个实现 JerseyObservationConvention 的 @Bean。
SSL 捆绑指标
Spring Boot Actuator 发布有关 SSL 捆绑包的过期指标。
指标 ssl.chain.expiry 以秒为单位衡量每个证书链的过期日期。
如果证书链已过期,则该数字将为负数。
此指标带有以下标签信息:
| 标签 | 描述 |
|---|---|
|
包含证书链的捆绑包名称 |
|
证书链中即将过期的证书的序列号(十六进制格式) |
|
证书链的名称。 |
HTTP 客户端指标
Spring Boot Actuator 管理 RestTemplate、WebClient 和 RestClient 的监控。
为此,您需要注入自动配置的构建器并使用它来创建实例:
您还可以手动应用负责此检测的自定义器,即 ObservationRestTemplateCustomizer、ObservationWebClientCustomizer 和 ObservationRestClientCustomizer。
默认情况下,生成的指标名称为 http.client.requests。
您可以通过设置 management.observations.http.client.requests.name 属性来自定义名称。
当使用 RestTemplate 或 RestClient 时自定义标签,请提供一个实现 @Bean 的 ClientRequestObservationConvention,来自 org.springframework.http.client.observation 包。
当使用 WebClient 时自定义标签,请提供一个实现 @Bean 的 ClientRequestObservationConvention,来自 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 以简化该过程。 |
数据源指标
自动配置支持对所有可用的 DataSource 对象进行指标检测,指标前缀为 jdbc.connections。
数据源检测会生成一些仪表盘指标,分别表示连接池中当前活跃、空闲、最大允许和最小允许的连接数。
指标也会根据基于 Bean 名称计算的 DataSource 的名称进行标记。
默认情况下,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 仓库指标
自动配置支持对所有 Spring Data Repository 方法调用进行监控。
默认情况下,生成的指标名称为 spring.data.repository.invocations。
您可以通过设置 management.metrics.data.repository.metric-name 属性来自定义名称。
@Timed 注解(来自 io.micrometer.core.annotation 包)支持用于 Repository 接口和方法。
如果您不希望记录所有 Repository 调用的指标,可以将 management.metrics.data.repository.autotime.enabled 设置为 false,并仅使用 @Timed 注解。
一个 @Timed 注解与 longTask = true 一起使用可为该方法启用长时间任务计时器。
长时间任务计时器需要单独的指标名称,并且可以与短时间任务计时器叠加。 |
默认情况下,与存储库调用相关的指标会附带以下信息进行标记:
| 标签 | 描述 |
|---|---|
|
源 |
|
被调用的 |
|
结果状态( |
|
调用过程中抛出的任何异常的简单类名。 |
要替换默认标签,请提供一个实现 RepositoryTagsProvider 的 @Bean。
Spring Integration 指标
Spring Integration 在有 MeterRegistry bean 时会自动提供 Micrometer 支持。
指标将发布在 spring.integration. 指标名称下。
Kafka 指标
自动配置为自动配置的消费者工厂和生产者工厂分别注册了 MicrometerConsumerListener 和 MicrometerProducerListener。
它还为 KafkaStreamsMicrometerListener 注册了一个 StreamsBuilderFactoryBean。
有关更多详细信息,请参阅 Spring Kafka 文档中的 Micrometer 原生指标 部分。
MongoDB 指标
本节简要介绍 MongoDB 的可用指标。
MongoDB 命令指标
自动配置会将一个 MongoMetricsCommandListener 注册到自动配置的 MongoClient 中。
为向底层 MongoDB 驱动程序发出的每个命令创建一个名为 mongodb.driver.commands 的计时器指标。
默认情况下,每个指标都带有以下标签信息:
| 标签 | 描述 |
|---|---|
|
所发出命令的名称。 |
|
命令发送到的集群的标识符。 |
|
命令发送到的服务器地址。 |
|
命令的执行结果( |
要替换默认的指标标签,请定义一个 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 中。
以下为连接池创建的仪表指标:
-
mongodb.driver.pool.size报告连接池的当前大小,包括空闲和正在使用的成员。 -
mongodb.driver.pool.checkedout报告当前正在使用的连接数。 -
mongodb.driver.pool.waitqueuesize报告连接池中等待连接的队列的当前大小。
每个指标默认都带有以下信息标签:
| 标签 | 描述 |
|---|---|
|
连接池所对应的集群标识符。 |
|
连接池所对应的服务器地址。 |
要替换默认的指标标签,请定义一个 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 指标
自动配置为自动配置的 Driver 注册了一个 MicrometerObservationProvider。
要覆盖此行为,您可以注册一个 ConfigBuilderCustomizer bean,其顺序高于零。
Jetty 指标
自动配置通过使用 Micrometer 的 ThreadPool 为 Jetty 的 ThreadPool 绑定指标。
通过使用 Micrometer 的 JettyServerThreadPoolMetrics 为 Jetty 的 Connector 实例绑定指标,并且当 server.ssl.enabled 设置为 true 时,使用 Micrometer 的 JettySslHandshakeMetrics。
Redis 指标
自动配置为自动配置的 LettuceConnectionFactory 注册了一个 MicrometerTracing。
有关更多详细信息,请参阅 Lettuce 文档的 可观察性部分。
注册自定义指标
要注册自定义指标,请将 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
以下属性允许对每个指标进行自定义:
| 属性 | 描述 |
|---|---|
|
是否接受具有特定 ID 的指标。
未被接受的指标将从 |
|
是否发布适用于计算可聚合(跨维度)百分位近似值的直方图。 |
|
通过限制预期值的范围来减少发布的直方图桶数量。 |
|
发布在您的应用程序中计算的百分位数值 |
|
通过将最近的样本累积在环形缓冲区中,在可配置的过期时间后进行轮换,并设置可配置的缓冲区长度,从而对最近的样本给予更大的权重。 |
|
发布一个累积直方图,其桶由您的服务级别目标定义。 |
有关 percentiles-histogram、percentiles 和 slo 概念的更多详细信息,请参阅 Micrometer 文档中的 直方图和百分位数 部分。
指标端点
Spring Boot 提供了一个 metrics 端点,您可以使用该端点诊断性地检查应用程序收集的指标。
该端点默认不可用,必须将其公开。
有关详细信息,请参阅 公开端点。
导航到 /actuator/metrics 会显示可用指标名称的列表。
你可以通过提供其名称作为选择器来深入查看特定指标的详细信息——例如,/actuator/metrics/jvm.memory.max。
|
此处使用的名称应与代码中使用的名称相匹配,而不是将其命名规范标准化后发送到监控系统时的名称。
换句话说,如果 |
您还可以在 URL 末尾添加任意数量的 tag=KEY:VALUE 查询参数,以对指标进行维度下钻——例如,/actuator/metrics/jvm.memory.max?tag=area:nonheap。
|
报告的测量值是匹配该指标名称及已应用的任何标签的所有指标的统计信息的总和。
在前面的示例中,返回的 |
与 Micrometer Observation 集成
DefaultMeterObservationHandler 会自动注册到 ObservationRegistry,后者会为每个已完成的观测创建指标。