Spring Boot提供的产品就绪功能:指标(Metrics)

https://docs.spring.io/spring-boot/docs/3.2.0/reference/htmlsingle/#actuator.metrics

Spring Boot Actuator 为 Micrometer 提供了依赖管理和自动配置功能。Micrometer 是一个应用指标外观(facade),支持众多监控系统,包括:

  • AppOptics
  • Atlas
  • Datadog
  • Dynatrace
  • Elastic
  • Ganglia
  • Graphite
  • Humio
  • Influx
  • JMX
  • KairosDB
  • New Relic
  • OpenTelemetry
  • Prometheus
  • SignalFx
  • Simple (in-memory)
  • Stackdriver
  • StatsD
  • Wavefront

入门

Spring Boot 会自动配置一个组合的 MeterRegistry,并为在类路径上找到的每个受支持的实现向组合中添加一个注册表。只需在运行时类路径上有对 micrometer-registry-{system} 的依赖,Spring Boot 就可以配置该注册表。

大多数注册表都具有共同的功能。例如,即使 Micrometer 注册表实现在类路径上,你也可以禁用特定的注册表。以下示例禁用了 Datadog

management.datadog.metrics.export.enabled=false

还可以禁用所有注册表,除非特定注册表的属性另有说明,如下所示:

management.defaults.metrics.export.enabled=false

除非明确告诉 Spring Boot 不要这样做,否则它还会将任何自动配置的注册表添加到 Metrics 类上的全局静态组合注册表中:

management.metrics.use-global-registry=false

可以在将任何计量器(meters )注册到注册表之前,注册任意数量的 MeterRegistryCustomizer bean,以进一步配置注册表,例如应用常见标签:

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.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 ...
    }

}

Spring Boot 还配置了内置的仪器(instrumentation),你可以通过配置或专门的注解标记来控制它。

支持的监控系统

本节简要描述了每个支持的监控系统。

AppOptics

默认情况下,AppOptics 注册表会定期将指标推送到 api.appoptics.com/v1/measurements。要将指标导出到 SaaS AppOptics,必须提供你的 API 标志(token):

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

Atlas

默认情况下,指标将导出到在本地计算机上运行的 Atlas。你可以提供 Atlas 服务器的位置:

management.atlas.metrics.export.uri=https://atlas.example.com:7101/api/v1/publish

Datadog

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

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

如果还提供了应用程序key(可选),则将导出诸如计量(meter)描述、类型和基本单位等元数据:

management.datadog.metrics.export.api-key=YOUR_API_KEY
management.datadog.metrics.export.application-key=YOUR_APPLICATION_KEY

默认情况下,指标将发送到 Datadog 美国站点(api.datadoghq.com)。如果你的 Datadog 项目托管在其它站点之一,或者需要通过代理发送指标,请相应地配置 URI:

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

还可以更改向 Datadog 发送指标的间隔:

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

Dynatrace

Dynatrace 为 Micrometer 提供了两种指标摄取 API。在 v1 命名空间中的配置属性仅适用于导出到 Timeseries v1 API。在 v2 命名空间中的配置属性仅适用于导出到 Metrics v2 API。请注意,此集成一次只能导出到 API 的 v1v2 版本,且首选 v2。如果在 v1 命名空间中设置了 device-idv1 必需但 v2 不使用),则将指标导出到 v1 端点。否则,假定为 v2

v2 API

可以下面两种方式使用 v2 API。

1)自动配置
对于由 OneAgent 或 Kubernetes 的 Dynatrace Operator 监控的主机,可以使用 Dynatrace 自动配置。

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

Dynatrace Kubernetes Operator:当在安装了 Dynatrace Operator 的 Kubernetes 上运行时,注册表将自动从操作员(operator )处获取你端点的 URI 和 API token。

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

2)手动配置
如果没有可用的自动配置,则需要 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
  • 托管部署:https://{your-domain}/e/{your-environment-id}/api/v2/metrics/ingest

下面的示例使用example 环境 id 配置指标导出:

management.dynatrace.metrics.export.uri=https://example.live.dynatrace.com/api/v2/metrics/ingest
management.dynatrace.metrics.export.api-token=YOUR_TOKEN

当使用 Dynatrace v2 API 时,提供以下可选功能:

  • 指标键前缀(Metric key prefix:):为所有导出的指标键设置前缀。
  • 使用 Dynatrace 元数据丰富(Enrich with Dynatrace metadata):如果运行 OneAgent 或
    Dynatrace 操作员,请使用额外的元数据(例如,关于主机、进程或pod)丰富指标。
  • 默认维度:指定要添加到所有导出指标的键值对。如果与 Micrometer 指定了具有相同键的标签,则会覆盖默认维度。
  • 使用 Dynatrace Summary 仪器:在某些情况下,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 token,如下所示。在这种情况下,将使用自动配置的端点:

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

v1 API(旧版)

Dynatrace v1 API 指标注册表使用 Timeseries v1 API 定期将指标推送到配置的 URI。为了与现有设置保持向后兼容性,当设置了 device-id(对于 v1 是必需的,但在 v2 中不使用)时,指标将导出到 Timeseries v1 端点。要将指标导出到 Dynatrace,必须提供你的 API token、设备 ID 和 URI:

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

对 v1 API,必须指定不带路径的基本环境 URI,因为 v1 端点路径将自动添加。

与版本无关的设置

除了 API 端点和token之外,还可以更改将指标发送到 Dynatrace 的间隔。默认的导出间隔为 60 秒。以下示例将导出间隔设置为 30 秒:

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

Elastic

默认情况下,指标将导出到在本地计算机上运行的 Elastic。可以通过使用以下属性来提供要使用的 Elastic 服务器的位置:

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

Ganglia

默认情况下,指标将导出到在本地计算机上运行的 Ganglia。可以提供 Ganglia 服务器的主机和端口,如下所示:

management.ganglia.metrics.export.host=ganglia.example.com
management.ganglia.metrics.export.port=9649

Graphite

默认情况下,指标将导出到在本地计算机上运行的 Graphite。可以提供 Graphite 服务器的主机和端口,如下所示:

management.graphite.metrics.export.host=graphite.example.com
management.graphite.metrics.export.port=9004

Micrometer 提供了一个默认的HierarchicalNameMapper,用于管理如何将维度计量器 ID 映射到扁平化的分层名称。

提示:要控制此行为,请定义自己的 GraphiteMeterRegistry 并提供自己的分层名称映射器(HierarchicalNameMapper)。除非定义了自己的 GraphiteConfigClock bean,否则将提供自动配置的 GraphiteConfigClock bean:

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 ...
    }

}

Humio

默认情况下,Humio 注册表会定期将指标推送到 cloud.humio.com。要将指标导出到 SaaS Humio,必须提供您的 API token:

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

还应该配置一个或多个标签,以标识将指标推送到的数据源:

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

Influx

默认情况下,将使用默认配置将指标导出到在本地计算机上运行的 Influx v1 实例。要将指标导出到 InfluxDB v2,请为写入指标配置 orgbucket 和身份验证token 。可以通过使用以下命令来提供要使用的 Influx 服务器的位置:

management.influx.metrics.export.uri=https://influx.example.com:8086

JMX

Micrometer 提供了一种层次化的 JMX 映射,主要是作为一种廉价且可移植的方式来本地查看指标。默认情况下,指标将导出到 metrics JMX 域。可以通过使用以下命令来提供要使用的域:

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

Micrometer 提供了一个默认的分层名称映射器(HierarchicalNameMapper),用于管理如何将维度计量器 ID 映射到扁平化的分层名称。

提示:要控制此行为,请定义自己的 JmxMeterRegistry 并提供自己的分层名称映射器(HierarchicalNameMapper)。除非定义了自己的 JmxConfigClock bean,否则将提供自动配置的 JmxConfigClock bean:

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 ...
    }

}

KairosDB

默认情况下,指标将导出到在本地计算机上运行的 KairosDB。可以通过使用以下命令来提供要使用的 KairosDB 服务器的位置:

management.kairos.metrics.export.uri=https://kairosdb.example.com:8080/api/v1/datapoints

New Relic

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

management.newrelic.metrics.export.api-key=YOUR_KEY
management.newrelic.metrics.export.account-id=YOUR_ACCOUNT_ID

还可以更改将指标发送到 New Relic 的间隔:

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

默认情况下,指标通过 REST 调用发布,但如果在类路径中有 Java Agent API,则也可以使用它:

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

后,可以通过定义自己的 NewRelicClientProvider bean 来完全控制。

OpenTelemetry

默认情况下,指标将导出到在本地计算机上运行的 OpenTelemetry。可以通过使用以下命令来提供要使用的 OpenTelemetry 指标端点的位置:

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

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。要启用此功能,应存在 SpanContextSupplier bean。如果使用 Micrometer Tracing,将为你自动配置此功能,但如果需要,始终可以创建自己的 bean。请检查 Prometheus 文档,因为此功能需要在 Prometheus 端明确启用,并且仅在使用 OpenMetrics 格式时。

对于短暂存在或批处理作业,可能无法长时间存在以供抓取,可以使用 Prometheus Pushgateway 支持将指标暴露给 Prometheus。要启用 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:

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

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

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

Simple

Micrometer 提供了一个简单的、基于内存的后端,该后端将自动用作回退,如果没有配置其它注册表。这可以让你在指标端点中查看收集的指标。

一旦使用任何其它可用的后端,基于内存的后端将自动禁用。也可以显式地禁用它:

management.simple.metrics.export.enabled=false

Stackdriver

Stackdriver 注册表会定期将指标推送到 Stackdriver。要将指标导出到 SaaS Stackdriver,必须提供你的 Google Cloud 项目 ID:

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

还可以更改将指标发送到 Stackdriver 的间隔:

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

StatsD

StatsD 注册表会通过 UDP 积极地将指标推送到 StatsD 代理。默认情况下,指标将导出到在本地计算机上运行的 StatsD 代理。可以通过使用以下命令来提供要使用的 StatsD 代理主机、端口和协议:

management.statsd.metrics.export.host=statsd.example.com
management.statsd.metrics.export.port=9125
management.statsd.metrics.export.protocol=udp

还可以更改要使用的 StatsD 行协议(line protocol )(默认为 Datadog):

management.statsd.metrics.export.flavor=etsy

Wavefront

Wavefront 注册表会定期将指标推送到 Wavefront。如果直接将指标导出到 Wavefront,则必须提供你的 API token:

management.wavefront.api-token=YOUR_API_TOKEN

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

management.wavefront.uri=proxy://localhost:2878

注意:如果将指标发布到 Wavefront 代理,则主机必须以 proxy://HOST:PORT 的格式进行指定。

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

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

支持的指标和测量仪(Supported Metrics and Meters)

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 的仪表化。使用带有仪表化 JmsTemplate bean 构建的 JmsMessagingTemplate 实例也将记录观测值。

Spring MVC 指标

自动配置会启用 Spring MVC 控制器和函数式处理器处理的所有请求的仪表化。默认情况下,这些指标使用名称 http.server.requests 生成。可以通过设置 management.observations.http.server.requests.name 属性来定制这个名称。

要在默认标签之外添加更多标签,请提供一个扩展自 org.springframework.http.server.observation 包中的 DefaultServerRequestObservationConvention@Bean。要替换默认标签,请提供一个实现 ServerRequestObservationConvention 接口的 @Bean

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

默认情况下,所有请求都会被处理。要自定义过滤器,请提供一个实现了 FilterRegistrationBean<WebMvcMetricsFilter> 接口的 @Bean

Spring WebFlux 指标

自动配置会启用 Spring WebFlux 控制器和函数式处理器处理的所有请求的仪表化。默认情况下,这些指标使用名称 http.server.requests 生成。可以通过设置 management.observations.http.server.requests.name 属性来定制这个名称。

要在默认标签之外添加更多标签,请提供一个扩展自 org.springframework.http.server.reactive.observation 包中的 DefaultServerRequestObservationConvention@Bean。要替换默认标签,请提供一个实现 ServerRequestObservationConvention 接口的 @Bean。

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

Jersey 服务器指标

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

默认情况下,Jersey 服务器指标会使用以下信息进行标记:
在这里插入图片描述

要自定义标签,请提供一个实现了 JerseyTagsProvider 接口的 @Bean

HTTP 客户端指标

Spring Boot Actuator 负责对 RestTemplateWebClientRestClient 的仪表化。要实现这一点,你需要注入自动配置的构建器并使用它来创建实例:

  • 对于 RestTemplate,使用 RestTemplateBuilder
  • 对于 WebClient,使用 WebClient.Builder
  • 对于 RestClient,使用 RestClient.Builder

你还可以手动应用负责仪表化的定制器,它们分别是 ObservationRestTemplateCustomizerObservationWebClientCustomizerObservationRestClientCustomizer

默认情况下,指标使用名称 http.client.requests 生成。你可以通过设置 management.observations.http.client.requests.name 属性来定制这个名称。

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

Tomcat 指标

自动配置仅在启用 MBeanRegistry 时才会对 Tomcat 进行仪表化。默认情况下,MBeanRegistry 是禁用的,但可以通过将 server.tomcat.mbeanregistry.enabled 设置为 true 来启用它。

Tomcat 指标在名为 tomcat. 的计量下发布。

缓存指标

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

以下缓存库受到支持:

  • Cache2k
  • Caffeine
  • Hazelcast
  • 任何符合 JCache (JSR-107) 标准的实现
  • Redis

指标通过缓存的名称和从 bean 名称派生的 CacheManager 的名称进行标记。

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

Spring Batch 指标

内置指标

指标收集不需要任何特定的配置。框架提供的所有指标都会在 Micrometer 的全局注册表中以 spring.batch 为前缀进行注册。以下表格详细解释了所有指标:
在这里插入图片描述
在这里插入图片描述

注意status 标签可以是 SUCCESSFAILURE

自定义指标

如果你想在自定义组件中使用自己的指标,建议使用 Micrometer API 直接进行。以下是一个如何为 Tasklet 计时的示例:

import io.micrometer.core.instrument.Metrics;
import io.micrometer.core.instrument.Timer;

import org.springframework.batch.core.StepContribution;
import org.springframework.batch.core.scope.context.ChunkContext;
import org.springframework.batch.core.step.tasklet.Tasklet;
import org.springframework.batch.repeat.RepeatStatus;

public class MyTimedTasklet implements Tasklet {

	@Override
	public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) {
		Timer.Sample sample = Timer.start(Metrics.globalRegistry);
		String status = "success";
		try {
			// do some work
		} catch (Exception e) {
			// handle exception
			status = "failure";
		} finally {
			sample.stop(Timer.builder("my.tasklet.timer")
					.description("Duration of MyTimedTasklet")
					.tag("status", status)
					.register(Metrics.globalRegistry));
		}
		return RepeatStatus.FINISHED;
	}
}

禁用指标

指标收集与日志记录类似,都是一项需要关注的任务。禁用日志通常是通过配置日志库来完成的,对于指标来说也不例外。Spring Batch 本身没有提供禁用 Micrometer 指标的功能。这应该在 Micrometer 这一侧进行配置。由于 Spring Batch 将指标存储在 Micrometer 的全局注册表中,并以 spring.batch 为前缀,可以使用以下代码段配置 Micrometer 以忽略或拒绝批处理指标:

Metrics.globalRegistry.config().meterFilter(MeterFilter.denyNameStartsWith("spring.batch"))

数据源指标(DataSource Metrics)

自动配置允许对所有可用的DataSource 对象进行带有 jdbc.connections 前缀的指标仪器化(instrumentation )。数据源仪器化结果会以仪表的形式表示当前活动、空闲、允许的最大和允许的最小连接数。

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

提示:默认情况下,Spring Boot 为所有受支持的数据源提供元数据。如果你喜欢的数据源不受支持,可以添加额外的 DataSourcePoolMetadataProvider bean。

此外,特定的 Hikari 指标以 hikaricp 为前缀公开。每个指标都由池的名称标记(可以使用 spring.datasource.name 控制它)。

Hibernate 指标

如果类路径中存在 org.hibernate.orm:hibernate-micrometer,则将启用统计信息的所有可用 Hibernate EntityManagerFactory 实例以名为 hibernate 的指标进行仪器化。

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

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

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

Spring Data 存储库指标(Spring Data Repository Metrics)

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

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

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

默认情况下,与存储库调用相关的指标使用以下信息进行标记:
在这里插入图片描述

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

RabbitMQ 指标

自动配置可启用所有可用的 RabbitMQ 连接工厂的仪器化,并使用名为 rabbitmq 的指标。

Spring Integration 指标

每当 MeterRegistry bean 可用时,Spring Integration 都会自动提供 Micrometer 支持。指标将在 spring.integration. 测量名称下发布。

Kafka 指标

自动配置分别为自动配置的消费者工厂和生产者工厂注册了 MicrometerConsumerListenerMicrometerProducerListener。它还为 StreamsBuilderFactoryBean 注册了 KafkaStreamsMicrometerListener

MongoDB 指标

本节简要介绍 MongoDB 的可用指标。

MongoDB 命令指标

自动配置将 MongoMetricsCommandListener 注册到自动配置的 MongoClient

对于向底层 MongoDB 驱动程序发出的每个命令,都会创建一个名为 mongodb.driver.commands 的计时器指标。默认情况下,每个指标都会使用以下信息进行标记:
在这里插入图片描述

要替换默认的指标标签,请定义一个 MongoCommandTagsProvider bean,如下所示:

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

}

要禁用自动配置的命令指标,请设置以下属性:

management.metrics.mongo.command.enabled=false

MongoDB 连接池指标

自动配置将 MongoMetricsConnectionPoolListener 注册到自动配置的 MongoClient

连接池创建了以下指标:

  • mongodb.driver.pool.size 报告连接池的当前大小,包括空闲和正在使用的成员。
  • mongodb.driver.pool.checkedout 报告当前正在使用的连接数。
  • mongodb.driver.pool.waitqueuesize 报告从池中获取连接的等待队列的当前大小。

默认情况下,每个指标都会使用以下信息进行标记:
在这里插入图片描述

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

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

}

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

management.metrics.mongo.connectionpool.enabled=false

Jetty 指标

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

Redis 指标

自动配置为自动配置的 LettuceConnectionFactory 注册了一个 MicrometerCommandLatencyRecorder

注册自定义指标

要注册自定义指标,请将 MeterRegistry 注入到你的组件中:

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

}

如果你的指标依赖于其它 bean,建议使用 MeterBinder 来注册它们:

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

}

使用 MeterBinder 可以确保设置了正确的依赖关系,并且在检索指标值时 bean 可用。如果你发现需要在组件或应用程序之间反复对一组指标进行仪器化,则 MeterBinder 的实现也很有用。

注意:默认情况下,所有 MeterBinder bean 的指标都会自动绑定到由 Spring 管理的 MeterRegistry

自定义单个指标

如果需要对特定的 Meter 实例应用自定义设置,可以使用 io.micrometer.core.instrument.config.MeterFilter 接口。

例如,如果想将所有以 com.example 开头的指标 ID 中的 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)
public class MyMetricsFilterConfiguration {

    @Bean
    public MeterFilter renameRegionTagMeterFilter() {
        return MeterFilter.renameTag("com.example", "mytag.region", "mytag.area");
    }

}

注意:默认情况下,所有 MeterFilter bean 都会自动绑定到由 Spring 管理的 MeterRegistry。请确保使用由 Spring 管理的 MeterRegistry 注册指标,而不是 Metrics 上的任何静态方法。这些方法使用的是不受 Spring 管理的全局注册表。

常见标签

可以使用 management.observations.key-values 属性配置常见标签。

注意:如果使用 Graphite,则常见标签的顺序很重要。由于使用这种方法无法保证常见标签的顺序,因此建议 Graphite 用户定义一个自定义的 MeterFilter

每个指标的属性

除了 MeterFilter bean,还可以使用属性对每个指标应用一组有限的自定义设置。使用 Spring Boot 的 PropertiesMeterFilter,可以将每个指标的自定义设置应用于以给定名称开头的任何指标 ID。以下示例将过滤掉任何以 example.remote 开头的指标 ID。

management.metrics.enable.example.remote=false

以下属性允许每个指标进行自定义:
在这里插入图片描述
在这里插入图片描述

指标端点(Metrics Endpoint)

Spring Boot 提供了一个metrics 端点,可以使用该端点进行诊断,以检查应用程序收集的指标。默认情况下,该端点不可用,必须公开。

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

提示:在这里使用的名称应与代码中使用的名称相匹配,而不是在将其发送到监控系统后,根据命名约定规范化的名称。换句话说,如果由于 Prometheus 的蛇形命名约定,jvm.memory.max 在 Prometheus 中显示为 jvm_memory_max,则你仍应在指标端点检查仪表时使用 jvm.memory.max 作为选择器。

还可以将任意数量的 tag=KEY:VALUE 查询参数添加到 URL 的末尾,以在维度上深入了解仪表——例如,/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的集成

默认情况下,将在 ObservationRegistry 上自动注册 DefaultMeterObservationHandler,它为每个完成的observation创建指标。

  • 25
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值