此版本仍在开发中,尚未被视为稳定版本。如需最新稳定版本,请使用 Spring Boot 4.0.4!spring-doc.cadn.net.cn

指标

入门指南

Spring Boot 自动配置一个复合的 MeterRegistry,并为它在类路径上找到的每个受支持的实现向该复合对象中添加一个注册表。 在运行时类路径中包含对 micrometer-registry-{system} 的依赖足以让 Spring Boot 配置该注册表。spring-doc.cadn.net.cn

大多数注册表具有共同的特性。 例如,即使Micrometer注册表实现存在于类路径中,您也可以禁用特定的注册表。 以下示例禁用了Datadog:spring-doc.cadn.net.cn

management.datadog.metrics.export.enabled=false
management:
  datadog:
    metrics:
      export:
        enabled: false

除非通过注册表特定的属性另行说明,否则您也可以禁用所有注册表,如下例所示:spring-doc.cadn.net.cn

management.defaults.metrics.export.enabled=false
management:
  defaults:
    metrics:
      export:
        enabled: false

除非你明确指示不要这样做,否则 Spring Boot 还会将所有自动配置的注册表添加到 Metrics 类上的全局静态组合注册表中:spring-doc.cadn.net.cn

management.metrics.use-global-registry=false
management:
  metrics:
    use-global-registry: false

在向注册表注册任何指标之前,您可以注册任意数量的 MeterRegistryCustomizer Bean 以进一步配置注册表,例如应用通用标签:spring-doc.cadn.net.cn

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")
		}
	}

}

您可以通过更具体地指定泛型类型,将自定义配置应用于特定的注册表实现:spring-doc.cadn.net.cn

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 还会 配置内置的监控功能,您可以通过配置或专用的注解标记来控制它。spring-doc.cadn.net.cn

支持的监控系统

本节简要介绍每种受支持的监控系统。spring-doc.cadn.net.cn

AppOptics

默认情况下,AppOptics 注册表会定期将指标推送到 api.appoptics.com/v1/measurements。 要将指标导出到 SaaS AppOptics,必须提供您的 API Tokens:spring-doc.cadn.net.cn

management.appoptics.metrics.export.api-token=YOUR_TOKEN
management:
  appoptics:
    metrics:
      export:
        api-token: "YOUR_TOKEN"

Atlas

默认情况下,指标会导出到本地计算机上运行的 Atlas。 您可以提供 Atlas 服务器 的位置:spring-doc.cadn.net.cn

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

Datadog 注册表会定期将指标推送到 datadoghq。 要将指标导出到 Datadog,您必须提供您的 API 密钥:spring-doc.cadn.net.cn

management.datadog.metrics.export.api-key=YOUR_KEY
management:
  datadog:
    metrics:
      export:
        api-key: "YOUR_KEY"

如果您还提供了一个应用密钥(可选),那么诸如指标描述、类型和基本单位等元数据也将被导出:spring-doc.cadn.net.cn

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:spring-doc.cadn.net.cn

management.datadog.metrics.export.uri=https://api.datadoghq.eu
management:
  datadog:
    metrics:
      export:
        uri: "https://api.datadoghq.eu"

您还可以更改将指标发送到 Datadog 的时间间隔:spring-doc.cadn.net.cn

management.datadog.metrics.export.step=30s
management:
  datadog:
    metrics:
      export:
        step: "30s"

Dynatrace

Dynatrace 提供了两个指标摄入 API,两者都针对 Micrometer 实现。 您可以在 Dynatrace 的 Micrometer 指标摄入文档中找到 此处spring-doc.cadn.net.cn

v1 命名空间中的配置属性仅在导出到 时间序列 v1 API 时生效。 对 V1 API 的支持已弃用。spring-doc.cadn.net.cn

v2 命名空间中的配置属性仅在导出到 指标 v2 API 时适用。spring-doc.cadn.net.cn

请注意,此集成一次只能导出到API的v1v2版本,由于v1 API已弃用,强烈建议使用v2版本。 如果在v1命名空间中设置了device-id(v1所需但v2不使用),则指标将被导出到v1端点。 否则,将假设为v2spring-doc.cadn.net.cn

v2 API

您可以通过两种方式使用 v2 API。spring-doc.cadn.net.cn

自动配置

Dynatrace 自动配置适用于由 OneAgent 或 Dynatrace Kubernetes Operator 监控的主机。spring-doc.cadn.net.cn

本地 OneAgent:如果主机上运行着 OneAgent,指标会自动导出到 本地 OneAgent 接入端点。 接入端点会将指标转发到 Dynatrace 后端。spring-doc.cadn.net.cn

Dynatrace Kubernetes Operator:当在安装了 Dynatrace Operator 的 Kubernetes 环境中运行时,注册表将自动从该运算符获取您的端点 URI 和 API Tokens。spring-doc.cadn.net.cn

这是默认行为,除了依赖 io.micrometer:micrometer-registry-dynatrace 之外,不需要任何特殊设置。spring-doc.cadn.net.cn

手动配置

如果没有可用的自动配置,则需要 Metrics v2 API 的端点和 API Tokens。 API Tokens 必须具有“摄入指标”(metrics.ingest)权限。 我们建议将Tokens的范围限制为此单一权限。 您必须确保端点 URI 包含路径(例如,/api/v2/metrics/ingest):spring-doc.cadn.net.cn

Metrics API v2 摄入端点的 URL 根据您的部署选项而有所不同:spring-doc.cadn.net.cn

以下示例使用 example 环境 ID 配置指标导出:spring-doc.cadn.net.cn

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 文档):spring-doc.cadn.net.cn

  • 指标键前缀:设置一个前缀,该前缀将添加到所有导出的指标键的前面。spring-doc.cadn.net.cn

  • 使用 Dynatrace 元数据进行丰富:如果 OneAgent 或 Dynatrace Operator 正在运行,则使用额外的元数据(例如关于主机、进程或 Pod 的信息)来丰富指标。spring-doc.cadn.net.cn

  • 默认维度:指定将被添加到所有导出度量的键值对。 如果使用 Micrometer 指定了具有相同键的标签,它们会覆盖默认维度。spring-doc.cadn.net.cn

  • 使用 Dynatrace Summary 仪器:在某些情况下,Micrometer Dynatrace 注册表创建的指标会被拒绝。 在 Micrometer 1.9.x 中,通过引入 Dynatrace 特定的 summary 仪器修复了此问题。 将此开关设置为 false 会强制 Micrometer 回退到 1.9.x 之前的默认行为。 它仅应在从 Micrometer 1.8.x 迁移到 1.9.x 时遇到问题时使用。spring-doc.cadn.net.cn

  • 导出指标元数据:从 Micrometer 1.12.0 开始,Dynatrace 导出器默认还会导出指标元数据,例如单位和描述。 使用 export-meter-metadata 切换开关可关闭此功能。spring-doc.cadn.net.cn

可以不指定URI和APITokens,如以下示例所示。 在这种情况下,使用自动配置的端点:spring-doc.cadn.net.cn

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:spring-doc.cadn.net.cn

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 端点路径会自动添加。spring-doc.cadn.net.cn

版本无关设置

除了 API 端点和Tokens之外,您还可以更改指标发送到 Dynatrace 的时间间隔。 默认的导出间隔为 60s。 以下示例将导出间隔设置为 30 秒:spring-doc.cadn.net.cn

management.dynatrace.metrics.export.step=30s
management:
  dynatrace:
    metrics:
      export:
        step: "30s"

您可以在 Micrometer 文档Dynatrace 文档 中找到有关如何为 Micrometer 设置 Dynatrace 导出器的更多信息。spring-doc.cadn.net.cn

Elastic

默认情况下,指标会导出到本地计算机上运行的 Elastic。 您可以使用以下属性来指定要使用的 Elastic 服务器的位置:spring-doc.cadn.net.cn

management.elastic.metrics.export.host=https://elastic.example.com:8086
management:
  elastic:
    metrics:
      export:
        host: "https://elastic.example.com:8086"

Ganglia

默认情况下,指标会导出到本地机器上运行的 Ganglia。 您可以提供 Ganglia 服务器 的主机和端口,如下例所示:spring-doc.cadn.net.cn

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 服务器 的主机和端口,如下例所示:spring-doc.cadn.net.cn

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 映射为扁平的分层名称spring-doc.cadn.net.cn

要控制此行为,请定义您的 GraphiteMeterRegistry 并提供您自己的 HierarchicalNameMapper。 除非您定义自己的 bean,否则将提供自动配置的 GraphiteConfigClock bean:spring-doc.cadn.net.cn

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 Tokens:spring-doc.cadn.net.cn

management.humio.metrics.export.api-token=YOUR_TOKEN
management:
  humio:
    metrics:
      export:
        api-token: "YOUR_TOKEN"

您还应配置一个或多个标签,以标识指标被推送到的数据源:spring-doc.cadn.net.cn

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,请配置用于写入指标的 orgbucket 和身份验证 token。 您可以通过以下方式提供要使用的 Influx 服务器 的位置:spring-doc.cadn.net.cn

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 域。 你可以通过使用以下方式提供要使用的域:spring-doc.cadn.net.cn

management.jmx.metrics.export.domain=com.example.app.metrics
management:
  jmx:
    metrics:
      export:
        domain: "com.example.app.metrics"

Micrometer 提供了一个默认的 HierarchicalNameMapper,用于管理如何将维度化指标 ID 映射为扁平的分层名称spring-doc.cadn.net.cn

要控制此行为,请定义您的 JmxMeterRegistry 并提供您自己的 HierarchicalNameMapper。 除非您定义自己的 bean,否则将提供自动配置的 JmxConfigClock bean:spring-doc.cadn.net.cn

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 服务器 的位置:spring-doc.cadn.net.cn

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

New Relic 注册表会定期将指标推送到 New Relic。 要将指标导出到 New Relic,您必须提供 API 密钥和账户 ID:spring-doc.cadn.net.cn

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 的时间间隔:spring-doc.cadn.net.cn

management.newrelic.metrics.export.step=30s
management:
  newrelic:
    metrics:
      export:
        step: "30s"

默认情况下,指标通过 REST 调用发布,但如果类路径中存在 Java Agent API,您也可以使用它:spring-doc.cadn.net.cn

management.newrelic.metrics.export.client-provider-type=insights-agent
management:
  newrelic:
    metrics:
      export:
        client-provider-type: "insights-agent"

最后,您可以通过定义自己的 NewRelicClientProvider bean 来完全控制。spring-doc.cadn.net.cn

OTLP

默认情况下,指标通过 OpenTelemetry 协议(OTLP) 导出到本地计算机上运行的消费者。 要导出到其他位置,请使用 management.otlp.metrics.export.url 提供 OTLP 指标端点 的位置:spring-doc.cadn.net.cn

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.* 属性提供。spring-doc.cadn.net.cn

如果存在 OtlpMetricsSender Bean,它将被配置到 Spring Boot 自动配置的 OtlpMeterRegistry 上。spring-doc.cadn.net.cn

OTLP 示例 也受到支持。 要启用此功能,应存在一个 ExemplarContextProvider bean。 如果您使用 Micrometer 跟踪,这将为您自动配置。 默认情况下,仅包含采样的跟踪作为示例。 您可以使用 management.tracing.exemplars.include 属性来控制此行为。spring-doc.cadn.net.cn

Prometheus

Prometheus 期望通过抓取或轮询各个应用程序实例来获取指标。 Spring Boot 在 /actuator/prometheus 处提供了一个执行器端点,以呈现格式正确的 Prometheus 抓取spring-doc.cadn.net.cn

默认情况下,该端点不可用,必须进行公开。有关更多详细信息,请参阅 公开端点

以下示例 scrape_config 将值添加到 prometheus.ymlspring-doc.cadn.net.cn

scrape_configs:
- job_name: "spring"
  metrics_path: "/actuator/prometheus"
  static_configs:
  - targets: ["HOST:PORT"]

Prometheus 示例 也受到支持。 要启用此功能,应存在一个 SpanContext Bean。 如果您使用的是已弃用的 Prometheus simpleclient 支持并希望启用该功能,应存在一个 SpanContextSupplier Bean。 如果您使用 Micrometer Tracing,将为您自动配置,但您也可以根据需要创建自己的配置。 默认情况下,仅包含采样的跟踪作为示例。 您可以使用 management.tracing.exemplars.include 属性来控制此行为。 all 值不适用于 Prometheus。 请查看 Prometheus 文档,因为此功能需要在 Prometheus 端显式启用,并且仅支持使用 OpenMetrics 格式。spring-doc.cadn.net.cn

对于存在时间可能不足以被抓取的临时或批处理作业,您可以使用 Prometheus Pushgateway 支持将指标暴露给 Prometheus。spring-doc.cadn.net.cn

要启用 Prometheus Pushgateway 支持,请将以下依赖项添加到您的项目中:spring-doc.cadn.net.cn

<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。spring-doc.cadn.net.cn

您可以使用 PrometheusPushGatewayManager 下的属性进行调整。 对于高级配置,您还可以提供自己的 PrometheusPushGatewayManager bean。spring-doc.cadn.net.cn

简单

Micrometer 随附一个简单的内存后端,如果未配置其他注册表,它会自动用作后备。 这可以让您查看在 指标端点 中收集了哪些指标。spring-doc.cadn.net.cn

内存后端在你使用任何其他可用后端时会自动禁用。 你也可以显式地禁用它:spring-doc.cadn.net.cn

management.simple.metrics.export.enabled=false
management:
  simple:
    metrics:
      export:
        enabled: false

Stackdriver

Stackdriver 注册表会定期将指标推送到 Stackdriver。 要将指标导出到 SaaS Stackdriver,您必须提供您的 Google Cloud 项目 ID:spring-doc.cadn.net.cn

management.stackdriver.metrics.export.project-id=my-project
management:
  stackdriver:
    metrics:
      export:
        project-id: "my-project"

您还可以更改将指标发送到 Stackdriver 的时间间隔:spring-doc.cadn.net.cn

management.stackdriver.metrics.export.step=30s
management:
  stackdriver:
    metrics:
      export:
        step: "30s"

StatsD

StatsD 注册表通过 UDP 将指标主动推送到 StatsD 代理。 默认情况下,指标会导出到运行在本地机器上的 StatsD 代理。 你可以通过以下方式提供要使用的 StatsD 代理主机、端口和协议:spring-doc.cadn.net.cn

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):spring-doc.cadn.net.cn

management.statsd.metrics.export.flavor=etsy
management:
  statsd:
    metrics:
      export:
        flavor: "etsy"

支持的指标和计量器

Spring Boot 为多种技术提供了自动度量注册功能。 在大多数情况下,默认值会提供可以发布到任何支持的监控系统的合理指标。spring-doc.cadn.net.cn

JVM 指标

自动配置通过使用核心 Micrometer 类来启用 JVM 指标。 JVM 指标发布在 jvm. 指标名称下。spring-doc.cadn.net.cn

提供以下 JVM 指标:spring-doc.cadn.net.cn

系统指标

自动配置通过使用核心 Micrometer 类来启用系统指标。 系统指标发布在 system.process.disk. 计量器名称下。spring-doc.cadn.net.cn

提供以下系统指标:spring-doc.cadn.net.cn

应用启动指标

自动配置公开了应用程序启动时间指标:spring-doc.cadn.net.cn

指标按应用程序类的全限定名进行标记。spring-doc.cadn.net.cn

日志器指标

自动配置为 Logback 和 Log4J2 启用了事件指标。 详细信息发布在 log4j2.events.logback.events. 指标名称下。spring-doc.cadn.net.cn

任务执行与调度指标

自动配置能够对所有可用的 ThreadPoolTaskExecutorThreadPoolTaskScheduler Bean 进行监控,只要底层的 ThreadPoolExecutor 可用即可。 指标会按照执行器的名称进行标记,该名称派生自 Bean 的名称。spring-doc.cadn.net.cn

JMS 指标

自动配置支持对所有可用的 JmsTemplate Bean 和 @JmsListener 注解方法进行插桩。 这将分别生成 "jms.message.publish""jms.message.process" 指标。 有关生成的观测数据的更多信息,请参阅 Spring Framework 参考文档spring-doc.cadn.net.cn

JmsClientJmsMessagingTemplate 且使用了 JmsTemplate bean 的也会被插桩。

Spring MVC 指标

自动配置支持对由 Spring MVC 控制器和函数式处理器处理的所有请求进行埋点。 默认情况下,生成的指标名称为 http.server.requests。 您可以通过设置 management.observations.http.server.requests.name 属性来自定义名称。spring-doc.cadn.net.cn

要添加到默认标签,请提供一个继承自DefaultServerRequestObservationConvention包中的@Bean。 要替换默认标签,请提供一个实现ServerRequestObservationConventionspring-doc.cadn.net.cn

在某些情况下,Web 控制器中处理的异常不会被记录为请求指标标签。 应用程序可以选择通过 将处理过的异常设置为请求属性 来记录异常。

默认情况下,所有请求都会被处理。 要自定义过滤器,请提供一个实现 FilterRegistrationBean<ServerHttpObservationFilter>@Beanspring-doc.cadn.net.cn

Spring WebFlux 指标

自动配置支持对由 Spring WebFlux 控制器和函数式处理器处理的所有请求进行埋点。 默认情况下,生成的指标名称为 http.server.requests。 您可以通过设置 management.observations.http.server.requests.name 属性来自定义名称。spring-doc.cadn.net.cn

要添加到默认标签,请提供一个继承自DefaultServerRequestObservationConvention包中的@Bean。 要替换默认标签,请提供一个实现ServerRequestObservationConventionspring-doc.cadn.net.cn

在某些情况下,控制器和处理函数中处理的异常不会被记录为请求指标标签。 应用程序可以选择通过 将处理过的异常设置为请求属性 来记录异常。

Jersey 服务器指标

自动配置支持对由 Jersey JAX-RS 实现处理的所有请求进行监控。 默认情况下,生成的指标名称为 http.server.requests。 您可以通过设置 management.observations.http.server.requests.name 属性来自定义名称。spring-doc.cadn.net.cn

默认情况下,Jersey 服务器指标会附带以下信息进行标记:spring-doc.cadn.net.cn

标签 描述

exceptionspring-doc.cadn.net.cn

在处理请求时抛出的任何异常的简单类名。spring-doc.cadn.net.cn

methodspring-doc.cadn.net.cn

请求的方法(例如,GETPOSTspring-doc.cadn.net.cn

outcomespring-doc.cadn.net.cn

请求的结果,基于响应的状态码。 1xx 为 INFORMATIONAL,2xx 为 SUCCESS,3xx 为 REDIRECTION,4xx 为 CLIENT_ERROR,5xx 为 SERVER_ERRORspring-doc.cadn.net.cn

statusspring-doc.cadn.net.cn

响应的 HTTP 状态码(例如,200500spring-doc.cadn.net.cn

urispring-doc.cadn.net.cn

请求的 URI 模板在变量替换之前(如果可能,例如 /api/person/{id}spring-doc.cadn.net.cn

要自定义标签,请提供一个实现 JerseyObservationConvention@Beanspring-doc.cadn.net.cn

SSL 捆绑指标

Spring Boot Actuator 发布有关 SSL 捆绑包的过期指标。 指标 ssl.chain.expiry 以秒为单位衡量每个证书链的过期日期。 如果证书链已过期,则该数字将为负数。 此指标带有以下标签信息:spring-doc.cadn.net.cn

标签 描述

bundlespring-doc.cadn.net.cn

包含证书链的捆绑包名称spring-doc.cadn.net.cn

certificatespring-doc.cadn.net.cn

证书链中即将过期的证书的序列号(十六进制格式)spring-doc.cadn.net.cn

chainspring-doc.cadn.net.cn

证书链的名称。spring-doc.cadn.net.cn

HTTP 客户端指标

Spring Boot Actuator 管理 RestTemplateWebClientRestClient 的监控。 为此,您需要注入自动配置的构建器并使用它来创建实例:spring-doc.cadn.net.cn

默认情况下,生成的指标名称为 http.client.requests。 您可以通过设置 management.observations.http.client.requests.name 属性来自定义名称。spring-doc.cadn.net.cn

当使用 RestTemplateRestClient 时自定义标签,请提供一个实现 @BeanClientRequestObservationConvention,来自 org.springframework.http.client.observation 包。 当使用 WebClient 时自定义标签,请提供一个实现 @BeanClientRequestObservationConvention,来自 org.springframework.web.reactive.function.client 包。spring-doc.cadn.net.cn

Tomcat 指标

仅当启用 MBean Registry 时,自动配置才会启用 Tomcat 的监控。 默认情况下,MBean 注册表是禁用的,但您可以通过将 server.tomcat.mbeanregistry.enabled 设置为 true 来启用它。spring-doc.cadn.net.cn

Tomcat 指标在 tomcat. 计量名称下发布。spring-doc.cadn.net.cn

缓存指标

自动配置在启动时启用对所有可用 Cache 实例的监控,指标前缀为 cache。 缓存监控针对一组基本指标进行了标准化。 此外,还提供特定于缓存的其他指标。spring-doc.cadn.net.cn

支持以下缓存库:spring-doc.cadn.net.cn

指标应启用,以便自动配置能够检测到它们。 有关更多信息,请参阅您所使用的缓存库的文档。

指标通过缓存名称和 CacheManager 的名称进行标记,后者派生自 Bean 名称。spring-doc.cadn.net.cn

只有在启动时配置的缓存才会绑定到注册表。 对于未在缓存配置中定义的缓存(例如在启动阶段之后动态创建或以编程方式创建的缓存),需要进行显式注册。 提供了一个 CacheMetricsRegistrar bean 以简化该过程。

Spring Batch 指标

Spring GraphQL 指标

数据源指标

自动配置支持对所有可用的 DataSource 对象进行指标检测,指标前缀为 jdbc.connections。 数据源检测会生成一些仪表盘指标,分别表示连接池中当前活跃、空闲、最大允许和最小允许的连接数。spring-doc.cadn.net.cn

指标也会根据基于 Bean 名称计算的 DataSource 的名称进行标记。spring-doc.cadn.net.cn

默认情况下,Spring Boot 为所有支持的数据源提供元数据。 如果您喜爱的数据源不受支持,您可以添加额外的 DataSourcePoolMetadataProvider bean。 请参阅 DataSourcePoolMetadataProvidersConfiguration 获取示例。

此外,Hikari 特有的指标以 hikaricp 前缀暴露。 每个指标都带有连接池名称的标签(你可以使用 spring.datasource.name 来控制它)。spring-doc.cadn.net.cn

Hibernate 指标

如果 org.hibernate.orm:hibernate-micrometer 在类路径上,所有可用的且启用了统计信息的 Hibernate EntityManagerFactory 实例都将使用名为 hibernate 的指标进行监测。spring-doc.cadn.net.cn

指标还会根据 EntityManagerFactory 的名称进行标记,该名称派生自 Bean 名称。spring-doc.cadn.net.cn

要启用统计信息,必须将标准 JPA 属性 hibernate.generate_statistics 设置为 true。 您可以在自动配置的 EntityManagerFactory 上启用该功能:spring-doc.cadn.net.cn

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 属性来自定义名称。spring-doc.cadn.net.cn

@Timed 注解(来自 io.micrometer.core.annotation 包)支持用于 Repository 接口和方法。 如果您不希望记录所有 Repository 调用的指标,可以将 management.metrics.data.repository.autotime.enabled 设置为 false,并仅使用 @Timed 注解。spring-doc.cadn.net.cn

一个 @Timed 注解与 longTask = true 一起使用可为该方法启用长时间任务计时器。 长时间任务计时器需要单独的指标名称,并且可以与短时间任务计时器叠加。

默认情况下,与存储库调用相关的指标会附带以下信息进行标记:spring-doc.cadn.net.cn

标签 描述

repositoryspring-doc.cadn.net.cn

Repository 的简单类名。spring-doc.cadn.net.cn

methodspring-doc.cadn.net.cn

被调用的 Repository 方法的名称。spring-doc.cadn.net.cn

statespring-doc.cadn.net.cn

结果状态(SUCCESSERRORCANCELEDRUNNING)。spring-doc.cadn.net.cn

exceptionspring-doc.cadn.net.cn

调用过程中抛出的任何异常的简单类名。spring-doc.cadn.net.cn

要替换默认标签,请提供一个实现 RepositoryTagsProvider@Beanspring-doc.cadn.net.cn

RabbitMQ 指标

自动配置支持使用名为 rabbitmq 的指标对所有可用的 RabbitMQ 连接工厂进行监控。spring-doc.cadn.net.cn

Spring Integration 指标

Spring Integration 在有 MeterRegistry bean 时会自动提供 Micrometer 支持。 指标将发布在 spring.integration. 指标名称下。spring-doc.cadn.net.cn

Kafka 指标

自动配置为自动配置的消费者工厂和生产者工厂分别注册了 MicrometerConsumerListenerMicrometerProducerListener。 它还为 KafkaStreamsMicrometerListener 注册了一个 StreamsBuilderFactoryBean。 有关更多详细信息,请参阅 Spring Kafka 文档中的 Micrometer 原生指标 部分。spring-doc.cadn.net.cn

MongoDB 指标

本节简要介绍 MongoDB 的可用指标。spring-doc.cadn.net.cn

MongoDB 命令指标

自动配置会将一个 MongoMetricsCommandListener 注册到自动配置的 MongoClient 中。spring-doc.cadn.net.cn

为向底层 MongoDB 驱动程序发出的每个命令创建一个名为 mongodb.driver.commands 的计时器指标。 默认情况下,每个指标都带有以下标签信息:spring-doc.cadn.net.cn

标签 描述

commandspring-doc.cadn.net.cn

所发出命令的名称。spring-doc.cadn.net.cn

cluster.idspring-doc.cadn.net.cn

命令发送到的集群的标识符。spring-doc.cadn.net.cn

server.addressspring-doc.cadn.net.cn

命令发送到的服务器地址。spring-doc.cadn.net.cn

statusspring-doc.cadn.net.cn

命令的执行结果(SUCCESSFAILED)。spring-doc.cadn.net.cn

要替换默认的指标标签,请定义一个 MongoCommandTagsProvider bean,如下例所示:spring-doc.cadn.net.cn

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()
	}

}

要禁用自动配置的命令指标,请设置以下属性:spring-doc.cadn.net.cn

management.metrics.mongodb.command.enabled=false
management:
  metrics:
    mongodb:
      command:
        enabled: false

MongoDB 连接池指标

自动配置会将一个 MongoMetricsConnectionPoolListener 注册到自动配置的 MongoClient 中。spring-doc.cadn.net.cn

以下为连接池创建的仪表指标:spring-doc.cadn.net.cn

每个指标默认都带有以下信息标签:spring-doc.cadn.net.cn

标签 描述

cluster.idspring-doc.cadn.net.cn

连接池所对应的集群标识符。spring-doc.cadn.net.cn

server.addressspring-doc.cadn.net.cn

连接池所对应的服务器地址。spring-doc.cadn.net.cn

要替换默认的指标标签,请定义一个 MongoConnectionPoolTagsProvider bean:spring-doc.cadn.net.cn

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()
	}

}

要禁用自动配置的连接池指标,请设置以下属性:spring-doc.cadn.net.cn

management.metrics.mongodb.connectionpool.enabled=false
management:
  metrics:
    mongodb:
      connectionpool:
        enabled: false

Neo4j 指标

自动配置为自动配置的 Driver 注册了一个 MicrometerObservationProviderspring-doc.cadn.net.cn

要覆盖此行为,您可以注册一个 ConfigBuilderCustomizer bean,其顺序高于零。spring-doc.cadn.net.cn

Jetty 指标

自动配置通过使用 Micrometer 的 ThreadPool 为 Jetty 的 ThreadPool 绑定指标。 通过使用 Micrometer 的 JettyServerThreadPoolMetrics 为 Jetty 的 Connector 实例绑定指标,并且当 server.ssl.enabled 设置为 true 时,使用 Micrometer 的 JettySslHandshakeMetricsspring-doc.cadn.net.cn

Redis 指标

自动配置为自动配置的 LettuceConnectionFactory 注册了一个 MicrometerTracing。 有关更多详细信息,请参阅 Lettuce 文档的 可观察性部分spring-doc.cadn.net.cn

注册自定义指标

要注册自定义指标,请将 MeterRegistry 注入到您的组件中:spring-doc.cadn.net.cn

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 来注册它们:spring-doc.cadn.net.cn

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 实现也会很有用。spring-doc.cadn.net.cn

默认情况下,来自所有 MeterBinder Bean 的指标会自动绑定到由 Spring 管理的 MeterRegistry

自定义单个指标

如果您需要对特定的 Meter 实例应用自定义设置,可以使用 MeterFilter 接口。spring-doc.cadn.net.cn

例如,如果您想将所有以 com.example 开头的计量器 ID 的 mytag.region 标签重命名为 mytag.area,可以执行以下操作:spring-doc.cadn.net.cn

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 管理的全局注册表。

常用标签

常用标签通常用于对运行环境进行维度钻取,例如主机、实例、区域、堆栈等。 常用标签适用于所有计量器,并可以进行配置,如下例所示:spring-doc.cadn.net.cn

management.metrics.tags.region=us-east-1
management.metrics.tags.stack=prod
management:
  metrics:
    tags:
      region: "us-east-1"
      stack: "prod"

前面的示例将 regionstack 标签分别添加到值为 us-east-1prod 的所有仪表盘中。spring-doc.cadn.net.cn

如果使用 Graphite,公共标签的顺序非常重要。 由于使用此方法无法保证公共标签的顺序,建议 Graphite 用户定义一个自定义的 MeterFilter

按米计费的属性

除了 MeterFilter Bean 之外,您还可以使用属性对每个指标应用有限的自定义设置。 通过使用 Spring Boot 的 PropertiesMeterFilter,将对任何以给定名称开头的指标 ID 应用每指标自定义设置。 以下示例过滤掉所有 ID 以 example.remote 开头的指标。spring-doc.cadn.net.cn

management.metrics.enable.example.remote=false
management:
  metrics:
    enable:
      example:
        remote: false

以下属性允许对每个指标进行自定义:spring-doc.cadn.net.cn

表 1. 每米定制
属性 描述

management.metrics.enablespring-doc.cadn.net.cn

是否接受具有特定 ID 的指标。 未被接受的指标将从 MeterRegistry 中过滤掉。spring-doc.cadn.net.cn

management.metrics.distribution.percentiles-histogramspring-doc.cadn.net.cn

是否发布适用于计算可聚合(跨维度)百分位近似值的直方图。spring-doc.cadn.net.cn

management.metrics.distribution.minimum-expected-value, management.metrics.distribution.maximum-expected-valuespring-doc.cadn.net.cn

通过限制预期值的范围来减少发布的直方图桶数量。spring-doc.cadn.net.cn

management.metrics.distribution.percentilesspring-doc.cadn.net.cn

发布在您的应用程序中计算的百分位数值spring-doc.cadn.net.cn

management.metrics.distribution.expiry, management.metrics.distribution.buffer-lengthspring-doc.cadn.net.cn

通过将最近的样本累积在环形缓冲区中,在可配置的过期时间后进行轮换,并设置可配置的缓冲区长度,从而对最近的样本给予更大的权重。spring-doc.cadn.net.cn

management.metrics.distribution.slospring-doc.cadn.net.cn

发布一个累积直方图,其桶由您的服务级别目标定义。spring-doc.cadn.net.cn

有关 percentiles-histogrampercentilesslo 概念的更多详细信息,请参阅 Micrometer 文档中的 直方图和百分位数 部分。spring-doc.cadn.net.cn

指标端点

Spring Boot 提供了一个 metrics 端点,您可以使用该端点诊断性地检查应用程序收集的指标。 该端点默认不可用,必须将其公开。 有关详细信息,请参阅 公开端点spring-doc.cadn.net.cn

导航到 /actuator/metrics 会显示可用指标名称的列表。 你可以通过提供其名称作为选择器来深入查看特定指标的详细信息——例如,/actuator/metrics/jvm.memory.maxspring-doc.cadn.net.cn

此处使用的名称应与代码中使用的名称相匹配,而不是将其命名规范标准化后发送到监控系统时的名称。 换句话说,如果 jvm.memory.max 因其蛇形命名约定在 Prometheus 中显示为 jvm_memory_max,那么在检查 metrics 端点中的计数器时,您仍应使用 jvm.memory.max 作为选择器。spring-doc.cadn.net.cn

您还可以在 URL 末尾添加任意数量的 tag=KEY:VALUE 查询参数,以对指标进行维度下钻——例如,/actuator/metrics/jvm.memory.max?tag=area:nonheapspring-doc.cadn.net.cn

报告的测量值是匹配该指标名称及已应用的任何标签的所有指标的统计信息的总和。 在前面的示例中,返回的 Value 统计信息是堆的“Code Cache”、“Compressed Class Space”和“Metaspace”区域的最大内存占用量之和。 如果您只想查看“Metaspace”的最大大小,可以添加一个额外的 tag=id:Metaspace — 即 /actuator/metrics/jvm.memory.max?tag=area:nonheap&tag=id:Metaspacespring-doc.cadn.net.cn

与 Micrometer Observation 集成

DefaultMeterObservationHandler 会自动注册到 ObservationRegistry,后者会为每个已完成的观测创建指标。spring-doc.cadn.net.cn