指标

Spring Boot Actuator 为 Micrometer 提供依赖管理和自动配置,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。 要将指标导出到 SaaS AppOptics,必须提供您的 API 令牌:

  • Properties

  • YAML

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

Atlas

默认情况下,指标导出到在本地机器上运行的 Atlas。 您可以提供 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

Datadog 注册表定期将指标推送到 datadoghq。 要将指标导出到 Datadog,您必须提供您的 API 密钥:

  • 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 实现。 您可以在 这里 找到 Dynatrace 关于 Micrometer 指标摄取的文档。 v1 命名空间中的配置属性仅在导出到 Timeseries v1 API 时适用。 v2 命名空间中的配置属性仅在导出到 Metrics v2 API 时适用。 请注意,此集成一次只能导出到 API 的 v1v2 版本,推荐使用 v2。 如果在 v1 命名空间中设置了 device-id(v1 必需,v2 不使用),指标将导出到 v1 端点。 否则,假定为 v2

v2 API

您可以通过两种方式使用 v2 API。

自动配置

对于由 OneAgent 或 Kubernetes 的 Dynatrace Operator 监控的主机,Dynatrace 提供自动配置。

本地 OneAgent: 如果主机上运行 OneAgent,指标将自动导出到 本地 OneAgent 摄取端点。 摄取端点将指标转发到 Dynatrace 后端。

Dynatrace Kubernetes Operator: 在安装了 Dynatrace Operator 的 Kubernetes 中运行时,注册表将自动从 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 Operator,使用额外的元数据(例如,主机、进程或 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:
        # 如果不使用本地 OneAgent 端点,请在此指定 uri 和 api-token。
        v2:
          metric-key-prefix: "your.key.prefix"
          enrich-with-dynatrace-metadata: true
          default-dimensions:
            key1: "value1"
            key2: "value2"
          use-dynatrace-summary-instruments: true #(默认:true)
          export-meter-metadata: true             #(默认: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 文档 中找到更多关于如何设置 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 如何 映射到平面层次名称

要控制此行为,定义您自己的 GraphiteMeterRegistry 并提供您自己的 HierarchicalNameMapper。 除非您定义了自己的,否则会提供自动配置的 GraphiteConfigClock bean:

  • Java

  • Kotlin

import io.micrometer.core.instrument.Clock;
import io.micrometer.core.instrument.Meter;
import io.micrometer.core.instrument.config.NamingConvention;
import io.micrometer.core.instrument.util.HierarchicalNameMapper;
import io.micrometer.graphite.GraphiteConfig;
import io.micrometer.graphite.GraphiteMeterRegistry;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration(proxyBeanMethods = false)
public class MyGraphiteConfiguration {

	@Bean
	public GraphiteMeterRegistry graphiteMeterRegistry(GraphiteConfig config, Clock clock) {
		return new GraphiteMeterRegistry(config, clock, this::toHierarchicalName);
	}

	private String toHierarchicalName(Meter.Id id, NamingConvention convention) {
		return ...
	}

}
import io.micrometer.core.instrument.Clock
import io.micrometer.core.instrument.Meter
import io.micrometer.core.instrument.config.NamingConvention
import io.micrometer.core.instrument.util.HierarchicalNameMapper
import io.micrometer.graphite.GraphiteConfig
import io.micrometer.graphite.GraphiteMeterRegistry
import org.springframework.context.annotation.Bean
import org.springframework.context.annotation.Configuration

@Configuration(proxyBeanMethods = false)
class MyGraphiteConfiguration {

	@Bean
	fun graphiteMeterRegistry(config: GraphiteConfig, clock: Clock): GraphiteMeterRegistry {
		return GraphiteMeterRegistry(config, clock, this::toHierarchicalName)
	}
	private fun toHierarchicalName(id: Meter.Id, convention: NamingConvention): String {
		return  ...
	}

}

Humio

默认情况下,Humio 注册表定期将指标推送到 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,请配置用于写入指标的 orgbucket 和认证 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 如何 映射到平面层次名称

要控制此行为,定义您自己的 JmxMeterRegistry 并提供您自己的 HierarchicalNameMapper。 除非您定义了自己的,否则会提供自动配置的 JmxConfigClock 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

New Relic 注册表定期将指标推送到 New Relic。 要将指标导出到 New Relic,您必须提供您的 API 密钥和账户 ID:

  • 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 提供了一个 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 Pushgateway 支持将指标暴露给 Prometheus。

要启用 Prometheus Pushgateway 支持,请将以下依赖添加到您的项目:

<dependency>
    <groupId>io.prometheus</groupId>
    <artifactId>io.prometheus:prometheus-metrics-exporter-pushgateway</artifactId>
</dependency>

当类路径上存在 Prometheus Pushgateway 依赖且 management.prometheus.metrics.export.pushgateway.enabled 属性设置为 true 时,将自动配置一个 PrometheusPushGatewayManager bean。 这管理将指标推送到 Prometheus Pushgateway。

您可以通过 management.prometheus.metrics.export.pushgateway 下的属性调整 PrometheusPushGatewayManager。 对于高级配置,您还可以提供自己的 PrometheusPushGatewayManager bean。

Simple

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

Wavefront 注册表定期将指标推送到 Wavefront。 如果您直接将指标导出到 Wavefront,必须提供您的 API 令牌:

  • 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 指标:

  • 各种内存和缓冲池详情

  • 与垃圾回收相关的统计信息

  • 线程利用率

  • 虚拟线程统计(为此,io.micrometer:micrometer-java21 必须在类路径上)

  • 加载和卸载的类数量

  • JVM 版本信息

  • JIT 编译时间

系统指标

自动配置通过使用核心 Micrometer 类启用系统指标。 系统指标以 system.process.disk. 仪表名称发布。

提供以下系统指标:

  • CPU 指标

  • 文件描述符指标

  • 运行时间指标(应用程序运行的时间量和绝对启动时间的固定仪表)

  • 可用磁盘空间

应用程序启动指标

自动配置暴露应用程序启动时间指标:

  • application.started.time:启动应用程序所需的时间。

  • application.ready.time:应用程序准备好服务请求所需的时间。

指标通过应用程序类的完全限定名称进行标记。

日志记录器指标

自动配置为 Logback 和 Log4J2 启用事件指标。 详情以 log4j2.events.logback.events. 仪表名称发布。

任务执行和调度指标

自动配置启用所有可用 ThreadPoolTaskExecutorThreadPoolTaskScheduler 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 参考文档

要添加默认标签,提供一个扩展自 org.springframework.http.server.reactive.observation 包中 DefaultServerRequestObservationConvention@Bean。 要替换默认标签,提供一个实现 ServerRequestObservationConvention@Bean

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

Jersey 服务器指标

自动配置启用由 Jersey JAX-RS 实现处理的所有请求的仪表。 默认情况下,指标以名称 http.server.requests 生成。 您可以通过设置 management.observations.http.server.requests.name 属性自定义名称。

默认情况下,Jersey 服务器指标带有以下信息标签:

Tag Description

exception

处理请求时抛出的任何异常的简单类名称。

method

请求的方法(例如,GETPOST

outcome

根据响应状态码的请求结果。 1xx 为 INFORMATIONAL,2xx 为 SUCCESS,3xx 为 REDIRECTION,4xx 为 CLIENT_ERROR,5xx 为 SERVER_ERROR

status

响应的 HTTP 状态码(例如,200500

uri

请求的 URI 模板,在变量替换之前(例如,/api/person/{id}

要自定义标签,提供一个实现 JerseyObservationConvention@Bean

SSL Bundle 指标

Spring Boot Actuator 发布关于 SSL bundle 的到期指标。 指标 ssl.chain.expiry 以秒为单位测量每个证书链的到期日期。 如果链已过期,此数字将为负值。 此指标带有以下信息标签:

Tag Description

bundle

包含证书链的 bundle 名称

certificate

链中最快到期的证书的序列号(以十六进制格式)

chain

证书链的名称。

HTTP 客户端指标

Spring Boot Actuator 管理 RestTemplateWebClientRestClient 的仪表。 为此,您必须注入自动配置的构建器并使用它创建实例:

您还可以手动应用负责此仪表的自定义器,即 ObservationRestTemplateCustomizerObservationWebClientCustomizerObservationRestClientCustomizer

默认情况下,指标以名称 http.client.requests 生成。 您可以通过设置 management.observations.http.client.requests.name 属性自定义名称。

有关生成观察的更多信息,请参阅 Spring Framework 参考文档

要在使用 RestTemplateRestClient 时自定义标签,提供一个实现 org.springframework.http.client.observation 包中 ClientRequestObservationConvention@Bean。 要在使用 WebClient 时自定义标签,提供一个实现 org.springframework.web.reactive.function.client 包中 ClientRequestObservationConvention@Bean

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 GraphQL 指标

数据源指标

自动配置启用所有可用 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 属性自定义名称。

来自 io.micrometer.core.annotation 包的 @Timed 注解在 Repository 接口和方法上受支持。 如果您不想为所有 Repository 调用记录指标,可以将 management.metrics.data.repository.autotime.enabled 设置为 false,并仅使用 @Timed 注解。

带有 longTask = true@Timed 注解为方法启用长任务计时器。 长任务计时器需要单独的指标名称,并且可以与短任务计时器堆叠。

默认情况下,存储库调用相关指标带有以下信息标签:

Tag Description

repository

Repository 的简单类名称。

method

被调用的 Repository 方法的名称。

state

结果状态(SUCCESSERRORCANCELEDRUNNING)。

exception

调用中抛出的任何异常的简单类名称。

要替换默认标签,提供一个实现 RepositoryTagsProvider@Bean

RabbitMQ 指标

自动配置启用所有可用 RabbitMQ 连接工厂的仪表,指标名称为 rabbitmq

Spring Integration 指标

只要有 MeterRegistry bean 可用,Spring Integration 就会自动提供 Micrometer 支持。 指标以 spring.integration. 仪表名称发布。

Kafka 指标

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

MongoDB 指标

本节简要描述 MongoDB 可用的指标。

MongoDB 命令指标

自动配置为自动配置的 MongoClient 注册一个 MongoMetricsCommandListener

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

Tag Description

command

发出的命令名称。

cluster.id

命令发送到的集群的标识符。

server.address

命令发送到的服务器地址。

status

命令的结果(SUCCESSFAILED)。

要替换默认指标标签,定义一个 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 连接池指标

自动配置为自动配置的 MongoClient 注册一个 MongoMetricsConnectionPoolListener

为连接池创建以下仪表指标:

  • mongodb.driver.pool.size 报告连接池的当前大小,包括空闲和使用中的成员。

  • mongodb.driver.pool.checkedout 报告当前正在使用的连接数。

  • mongodb.driver.pool.waitqueuesize 报告从池中获取连接的等待队列的当前大小。

默认情况下,每个指标带有以下信息标签:

Tag Description

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 指标。 通过使用 Micrometer 的 JettyConnectionMetrics 绑定 Jetty 的 Connector 实例的指标,当 server.ssl.enabled 设置为 true 时,还使用 Micrometer 的 JettySslHandshakeMetrics

Redis 指标

自动配置为自动配置的 LettuceConnectionFactory 注册一个 MicrometerCommandLatencyRecorder。 有关更多详细信息,请参阅 Lettuce 文档的 Micrometer 指标部分

注册自定义指标

要注册自定义指标,将 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"

上述示例为所有仪表添加 regionstack 标签,值分别为 us-east-1prod

如果您使用 Graphite,通用标签的顺序很重要。 由于这种方法无法保证通用标签的顺序,建议 Graphite 用户定义一个自定义 MeterFilter

每仪表属性

除了 MeterFilter bean,您还可以使用属性对每仪表基础进行有限的自定义。 每仪表自定义通过 Spring Boot 的 PropertiesMeterFilter 应用于以给定名称开头的任何仪表 ID。 以下示例过滤掉以 example.remote 开头的任何仪表的 ID。

  • Properties

  • YAML

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

以下属性允许每仪表自定义:

Table 1. 每仪表自定义
Property Description

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-histogrampercentilesslo 的概念背景的更多详细信息,请参见 Micrometer 文档的 Histograms and percentiles 部分。

指标端点

Spring Boot 提供了一个 metrics 端点,可用于诊断检查应用程序收集的指标。 该端点默认不可用,必须暴露。 有关更多详细信息,请参见 暴露端点

导航到 /actuator/metrics 显示可用的仪表名称列表。 您可以通过提供仪表名称作为选择器来深入查看特定仪表的信息,例如 /actuator/metrics/jvm.memory.max

您在此处使用的名称应与代码中使用的名称匹配,而不是发送到监控系统后因命名约定规范化后的名称。 换句话说,如果 jvm.memory.max 在 Prometheus 中因其下划线命名约定而显示为 jvm_memory_max,您在检查 metrics 端点的仪表时仍应使用 jvm.memory.max 作为选择器。

您还可以在 URL 末尾添加任意数量的 tag=KEY:VALUE 查询参数,以在仪表上进行维度下钻,例如 /actuator/metrics/jvm.memory.max?tag=area:nonheap

报告的测量值是所有匹配仪表名称和已应用的任何标签的仪表统计数据的 总和。 在上述示例中,返回的 Value 统计数据是堆的 "Code Cache""Compressed Class Space""Metaspace" 区域的最大内存占用量之和。 如果您只想查看 "Metaspace" 的最大大小,可以添加额外的 tag=id:Metaspace,即 /actuator/metrics/jvm.memory.max?tag=area:nonheap&tag=id:Metaspace

与 Micrometer Observation 集成

DefaultMeterObservationHandler 会在 ObservationRegistry 上自动注册,为每个完成的观察创建指标。