指标

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 token:

  • 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 key:

  • Properties

  • YAML

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

如果同时提供一个(可选的)应用程序 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 的 US site (api.datadoghq.com)。如果你的 Datadog 项目托管在其他 site 上,或者需要通过代理发送指标,请相应地配置 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,这两种 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 或 Dynatrace Operator for Kubernetes 监控的主机,Dynatrace 自动配置是可用的。

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

Dynatrace Kubernetes Operator: 当在安装了 Dynatrace Operator 的 Kubernetes 中运行时,注册表将自动从 Operator 获取你的端点 URI 和 API token。

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

手动配置

如果没有自动配置可用,则需要 Metrics v2 API 的端点和一个 API token。API token 必须设置“摄取指标”(metrics.ingest)权限。我们建议将 token 的范围限制在此单个权限。必须确保端点 URI 包含路径(例如,/api/v2/metrics/ingest):

Metrics API v2 摄取端点的 URL 根据你的部署选项而不同:

  • SaaS:https://{your-environment-id}.live.dynatrace.com/api/v2/metrics/ingest

  • Managed 部署: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 文档中找到):

  • 指标 key 前缀:设置一个前缀,添加到所有导出的指标 key 的前面。

  • 用 Dynatrace 元数据丰富:如果 OneAgent 或 Dynatrace Operator 正在运行,则用额外的元数据(例如,关于主机、进程或 pod)丰富指标。

  • 默认维度:指定添加到所有导出的指标的键值对。如果使用 Micrometer 指定了具有相同 key 的标签,它们会覆盖默认维度。

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

  • 导出计量器元数据:从 Micrometer 1.12.0 开始,Dynatrace 导出器默认也会导出计量器元数据,例如单位和描述。使用 export-meter-metadata 开关关闭此功能。

可以不指定 URI 和 API token,如下例所示。在此场景中,使用自动配置的端点:

  • Properties

  • YAML

management.dynatrace.metrics.export.v2.metric-key-prefix=your.key.prefix
management.dynatrace.metrics.export.v2.enrich-with-dynatrace-metadata=true
management.dynatrace.metrics.export.v2.default-dimensions.key1=value1
management.dynatrace.metrics.export.v2.default-dimensions.key2=value2
management.dynatrace.metrics.export.v2.use-dynatrace-summary-instruments=true
management.dynatrace.metrics.export.v2.export-meter-metadata=true
management:
  dynatrace:
    metrics:
      export:
        # Specify uri and api-token here if not using the local OneAgent endpoint.
        v2:
          metric-key-prefix: "your.key.prefix"
          enrich-with-dynatrace-metadata: true
          default-dimensions:
            key1: "value1"
            key2: "value2"
          use-dynatrace-summary-instruments: true # (default: true)
          export-meter-metadata: true             # (default: true)

v1 API (旧版本)

Dynatrace v1 API 指标注册表定期使用 Timeseries v1 API 将指标推送到配置的 URI。为了兼容现有设置,当设置了 device-id(v1 需要,v2 不使用)时,指标会导出到 Timeseries v1 端点。要将指标导出到 Dynatrace,必须提供你的 API token、device 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 端点和 token 外,你还可以更改发送指标到 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 如何映射到扁平的层级名称

要控制此行为,请定义你的 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 token:

  • Properties

  • YAML

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

你还应该配置一个或多个标签来标识推送指标的数据源:

  • Properties

  • YAML

management.humio.metrics.export.tags.alpha=a
management.humio.metrics.export.tags.bravo=b
management:
  humio:
    metrics:
      export:
        tags:
          alpha: "a"
          bravo: "b"

Influx

默认情况下,指标被导出到运行在你本地机器上、具有默认配置的 Influx v1 实例。要将指标导出到 InfluxDB v2,请配置用于写入指标的 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 key 和 account 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 metrics endpoint 的位置:

  • Properties

  • YAML

management.otlp.metrics.export.url=https://otlp.example.com:4318/v1/metrics
management:
  otlp:
    metrics:
      export:
        url: "https://otlp.example.com:4318/v1/metrics"

自定义头部,例如用于认证,也可以使用 management.otlp.metrics.export.headers.* 属性提供。

Prometheus

Prometheus 希望从单个应用实例中抓取或轮询指标。Spring Boot 在 /actuator/prometheus 提供了一个 actuator 端点,用于以适当的格式向 Prometheus 提供抓取

默认情况下,该端点不可用,必须暴露。有关详细信息,请参阅暴露端点

以下示例 scrape_config 添加到 prometheus.yml

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

Prometheus Exemplars 也受支持。要启用此功能,应该存在一个 SpanContext bean。如果你正在使用已弃用的 Prometheus simpleclient 支持并想启用该功能,应该存在一个 SpanContextSupplier bean。如果你使用 Micrometer Tracing,这会自动为你配置,但如果你愿意,也可以自己创建。请查阅Prometheus 文档,因为此功能需要在 Prometheus 端明确启用,并且仅支持 OpenMetrics 格式。

对于可能存在时间不够长无法被抓取的临时或批处理作业,你可以使用 Prometheus Pushgateway 支持将指标暴露给 Prometheus。

Prometheus Pushgateway 目前仅适用于已弃用的 Prometheus simpleclient,直到 Prometheus 1.x 客户端添加对其的支持。要切换到 simpleclient,请从你的项目中移除 io.micrometer:micrometer-registry-prometheus 并添加 io.micrometer:micrometer-registry-prometheus-simpleclient

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

<dependency>
	<groupId>io.prometheus</groupId>
	<artifactId>simpleclient_pushgateway</artifactId>
</dependency>

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

你可以使用 management.prometheus.metrics.export.pushgateway 下的属性来调整 PrometheusPushGatewayManager。对于高级配置,你也可以提供自己的 PrometheusPushGatewayManager bean。

SignalFx

SignalFx 注册表定期将指标推送到 SignalFx。要将指标导出到 SignalFx,必须提供你的 access token:

  • Properties

  • YAML

management.signalfx.metrics.export.access-token=YOUR_ACCESS_TOKEN
management:
  signalfx:
    metrics:
      export:
        access-token: "YOUR_ACCESS_TOKEN"

你还可以更改发送指标到 SignalFx 的时间间隔:

  • Properties

  • YAML

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

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 token:

  • Properties

  • YAML

management.wavefront.api-token=YOUR_API_TOKEN
management:
  wavefront:
    api-token: "YOUR_API_TOKEN"

或者,你可以使用环境中的 Wavefront sidecar 或内部代理将指标数据转发到 Wavefront API 主机:

  • Properties

  • YAML

management.wavefront.uri=proxy://localhost:2878
management:
  wavefront:
    uri: "proxy://localhost:2878"
如果你将指标发布到 Wavefront 代理(如Wavefront 文档中所述),主机必须是 proxy://HOST:PORT 格式。

你还可以更改发送指标到 Wavefront 的时间间隔:

  • Properties

  • YAML

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

支持的指标和计量器

Spring Boot 为各种技术提供了自动计量器注册。在大多数情况下,默认设置提供了可以发布到任何受支持监控系统的合理指标。

JVM 指标

自动配置使用核心 Micrometer 类启用 JVM 指标。JVM 指标以 jvm. 计量器名称发布。

提供以下 JVM 指标:

  • 各种内存和缓冲区池详细信息

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

  • 线程利用率

  • 加载和卸载的类数量

  • JVM 版本信息

  • JIT 编译时间

系统指标

自动配置使用核心 Micrometer 类启用系统指标。系统指标以 system.process.disk. 计量器名称发布。

提供以下系统指标:

  • CPU 指标

  • 文件描述符指标

  • 正常运行时间指标(包括应用运行的时间量和绝对开始时间的固定仪表)

  • 可用磁盘空间

应用启动指标

自动配置暴露了应用启动时间指标

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

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

指标使用应用类的全限定名称进行标记。

日志器指标

自动配置同时为 Logback 和 Log4J2 启用了事件指标。详细信息发布在 log4j2.events.logback.events. 的计量器名称下。

任务执行和调度指标

只要底层的 ThreadPoolExecutor 可用,自动配置就会为所有可用的 ThreadPoolTaskExecutorThreadPoolTaskScheduler bean 启用检测。指标使用执行器名称进行标记,执行器名称派生自 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 服务器指标使用以下信息进行标记

标签 描述

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

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.enabledtrue 来启用它。

Tomcat 指标发布在 tomcat. 计量器名称下。

缓存指标

自动配置在启动时对所有可用的 Cache 实例启用检测,指标前缀为 cache。缓存检测针对一组基本指标进行了标准化。此外,还提供特定于缓存的指标。

支持以下缓存库:

  • Cache2k

  • Caffeine

  • Hazelcast

  • 任何兼容的 JCache (JSR-107) 实现

  • Redis

必须启用指标才能让自动配置进行识别。有关更多详细信息,请参阅你正在使用的缓存库的文档。

指标通过缓存的名称和 CacheManager 的名称进行标记,后者派生自 bean 名称。

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

Spring Batch 指标

Spring GraphQL 指标

DataSource 指标

自动配置对所有可用的 DataSource 对象启用检测,指标前缀为 jdbc.connections。DataSource 检测产生计量器,表示连接池中当前处于活动状态、空闲、最大允许和最小允许的连接数。

指标还通过基于 bean 名称计算得出的 DataSource 名称进行标记。

默认情况下,Spring Boot 为所有支持的 DataSource 提供元数据。如果你的常用 DataSource 不受支持,你可以添加额外的 DataSourcePoolMetadataProvider bean。有关示例,请参阅 DataSourcePoolMetadataProvidersConfiguration

此外,Hikari 特有的指标以 hikaricp 前缀暴露。每个指标都使用连接池名称进行标记(你可以通过 spring.datasource.name 控制)。

Hibernate 指标

如果 classpath 中包含 org.hibernate.orm:hibernate-micrometer,所有启用统计信息的可用的 Hibernate EntityManagerFactory 实例都会被检测,指标名称为 hibernate

指标还通过派生自 bean 名称的 EntityManagerFactory 名称进行标记。

要启用统计信息,必须将标准 JPA 属性 hibernate.generate_statistics 设置为 true。你可以在自动配置的 EntityManagerFactory 上启用它。

  • Properties

  • YAML

spring.jpa.properties[hibernate.generate_statistics]=true
spring:
  jpa:
    properties:
      "[hibernate.generate_statistics]": true

Spring Data Repository 指标

自动配置对所有 Spring Data Repository 方法调用启用检测。默认情况下,使用名称 spring.data.repository.invocations 生成指标。你可以通过设置 management.metrics.data.repository.metric-name 属性来自定义名称。

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

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

默认情况下,与 repository 调用相关的指标使用以下信息进行标记:

标签 描述

repository

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 的计时器指标。默认情况下,每个指标都使用以下信息进行标记:

标签 描述

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 报告连接池的等待队列的当前大小。

默认情况下,每个指标都使用以下信息进行标记:

标签 描述

cluster.id

连接池对应的集群标识符。

server.address

连接池对应的服务器地址。

要替换默认指标标签,请定义一个 MongoConnectionPoolTagsProvider bean。

  • Java

  • Kotlin

import io.micrometer.core.instrument.binder.mongodb.MongoConnectionPoolTagsProvider;

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

@Configuration(proxyBeanMethods = false)
public class MyConnectionPoolTagsProviderConfiguration {

	@Bean
	public MongoConnectionPoolTagsProvider customConnectionPoolTagsProvider() {
		return new CustomConnectionPoolTagsProvider();
	}

}
import io.micrometer.core.instrument.binder.mongodb.MongoConnectionPoolTagsProvider
import org.springframework.context.annotation.Bean
import org.springframework.context.annotation.Configuration

@Configuration(proxyBeanMethods = false)
class MyConnectionPoolTagsProviderConfiguration {

	@Bean
	fun customConnectionPoolTagsProvider(): MongoConnectionPoolTagsProvider {
		return CustomConnectionPoolTagsProvider()
	}

}

要禁用自动配置的连接池指标,请设置以下属性:

  • Properties

  • YAML

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

Jetty 指标

自动配置使用 Micrometer 的 JettyServerThreadPoolMetrics 绑定 Jetty 的 ThreadPool 指标。Jetty 的 Connector 实例的指标使用 Micrometer 的 JettyConnectionMetrics 绑定,当 server.ssl.enabled 设置为 true 时,还会绑定 Micrometer 的 JettySslHandshakeMetrics

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。以下示例过滤掉所有 ID 以 example.remote 开头的计量器。

  • Properties

  • YAML

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

以下属性允许按计量器自定义:

表 1. 按计量器自定义
属性 描述

management.metrics.enable

是否接受具有特定 ID 的计量器。不被接受的计量器将从 MeterRegistry 中过滤掉。

management.metrics.distribution.percentiles-histogram

是否发布适合计算可聚合(跨维度)百分位数近似值的直方图。

management.metrics.distribution.minimum-expected-value, management.metrics.distribution.maximum-expected-value

通过限制期望值的范围来发布更少的直方图桶。

management.metrics.distribution.percentiles

发布在你的应用中计算的百分位数。

management.metrics.distribution.expiry, management.metrics.distribution.buffer-length

通过将样本累积在循环缓冲区中来更加重视最近的样本,这些缓冲区在可配置的到期时间后轮换,并具有可配置的缓冲区长度。

management.metrics.distribution.slo

发布一个累积直方图,其桶由你的服务水平目标定义。

有关 percentiles-histogrampercentilesslo 背后的概念的更多详细信息,请参阅 Micrometer 文档的 直方图和百分位数部分。

Metrics 端点

Spring Boot 提供了一个 metrics 端点,你可以使用它来诊断性地检查应用收集的指标。默认情况下该端点不可用,必须进行暴露。有关详细信息,请参阅暴露端点

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

此处使用的名称应与代码中使用的名称一致,而不是针对发送到的监控系统(例如因 snake case 命名约定而在 Prometheus 中显示为 jvm_memory_max)进行命名约定规范化后的名称。换句话说,如果 jvm.memory.max 在 Prometheus 中因为其 snake case 命名约定显示为 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,它为每个完成的观测创建指标。