5.6 Metrics

优质
小牛编辑
130浏览
2023-12-01

Spring Boot Actuator为Micrometer提供依赖关系管理和自动配置,Micrometer是一个支持众多监控系统的应用程序指标外观,包括:

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

要了解有关Micrometer功能的更多信息,请参阅其参考文档,特别是概念部分。

5.6.1 入门

Spring Boot自动配置复合MeterRegistry,并为组合路径中找到的每个受支持的实现添加一个注册表。 在运行时类路径中依赖micrometer-registry- {system}足以让Spring Boot配置注册表。

大多数注册管理机构都有共同点。例如,即使Micrometer注册表实现位于类路径上,您也可以禁用特定的注册表。 例如,要禁用Datadog:

management.metrics.export.datadog.enabled=false

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

management.metrics.use-global-registry=false

在注册表中注册任何仪表之前,您可以注册任意数量的MeterRegistryCustomizer bean以进一步配置注册表,例如应用通用标记:

@Bean
MeterRegistryCustomizer<MeterRegistry> metricsCommonTags() {
	return registry -> registry.config().commonTags("region", "us-east-1");
}

您可以通过更具体地说明泛型类型,将自定义应用于特定的注册表实现:

@Bean
MeterRegistryCustomizer<GraphiteMeterRegistry> graphiteMetricsNamingConvention() {
	return registry -> registry.config().namingConvention(MY_CUSTOM_CONVENTION);
}

使用该设置,您可以在组件中注入MeterRegistry并注册指标:

@Component
public class SampleBean {

	private final Counter counter;

	public SampleBean(MeterRegistry registry) {
		this.counter = registry.counter("received.messages");
	}

	public void handleMessage(String message) {
		this.counter.increment();
		// handle message implementation
	}

}

Spring Boot还配置内置仪器(即MeterBinder实现),您可以通过配置或专用注释标记来控制。

5.6.2 支持的监控系统

5.6.2.1 AppOptics

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

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

5.6.2.2 Atlas

默认情况下,度量标准将导出到在本地计算机上运行的Atlas。 可以使用以下方式提供要使用的Atlas服务器的位置:

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

5.6.2.3 Datadog

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

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

您还可以更改度量标准发送到Datadog的时间间隔:

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

5.6.2.4 Dynatrace

Dynatrace注册表定期将指标推送到配置的URI。 要将指标导出到Dynatrace,必须提供API令牌,设备ID和URI:

management.metrics.export.dynatrace.api-token=YOUR_TOKEN
management.metrics.export.dynatrace.device-id=YOUR_DEVICE_ID
management.metrics.export.dynatrace.uri=YOUR_URI

您还可以更改度量标准发送到Dynatrace的时间间隔:

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

5.6.2.5 Elastic

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

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

5.6.2.6 Ganglia

默认情况下,度量标准将导出到本地计算机上运行的Ganglia。 可以使用以下方式提供要使用的Ganglia服务器主机和端口:

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

5.6.2.7 Graphite

默认情况下,度量标准将导出到在本地计算机上运行的Graphite。 可以使用以下方式提供要使用的Graphite服务器主机和端口:

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

Micrometer提供了一个默认的HierarchicalNameMapper,它管理维度计数器id如何映射到平面分层名称。

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

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

5.6.2.8 Humio

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

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

您还应配置一个或多个标记,以标识要推送指标的数据源:

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

5.6.2.9 Influx

默认情况下,度量标准将导出到本地计算机上运行的Influx。 要使用的Influx服务器的位置可以使用:

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

5.6.2.10 JMX

Micrometer提供了与JMX的分层映射,主要是作为在本地查看指标的便宜且可移植的方式。 默认情况下,度量标准将导出到度量标准JMX域。 可以使用以下方式提供要使用的域:

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

Micrometer提供了一个默认的HierarchicalNameMapper,它管理维度计数器id如何映射到平面分层名称。

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

@Bean
public JmxMeterRegistry jmxMeterRegistry(JmxConfig config, Clock clock) {
	return new JmxMeterRegistry(config, clock, MY_HIERARCHICAL_MAPPER);
}

5.6.2.11 KairosDB

默认情况下,度量标准将导出到本地计算机上运行的KairosDB。 可以使用以下方式提供要使用的KairosDB服务器的位置:

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

5.6.2.12 New Relic

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

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

您还可以更改将度量标准发送到New Relic的时间间隔:

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

5.6.2.13 Prometheus

Prometheus希望抓取或轮询各个应用实例以获取指标。 Spring Boot在/actuator/prometheus提供执行器端点,以适当的格式呈现Prometheus刮擦。

默认情况下端点不可用,必须公开,请参阅公开端点以获取更多详细信息。

以下是要添加到prometheus.yml的示例scrape_config:

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

5.6.2.14 SignalFx

SignalFx注册表定期将指标推送到SignalFx。 要将指标导出到SignalFx,必须提供您的访问令牌:

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

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

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

5.6.2.15 Simple

Micrometer附带一个简单的内存后端,如果没有配置其他注册表,它将自动用作后备。 这使您可以查看度量标准终结点中收集的度量标准。

只要您使用任何其他可用后端,内存后端就会自动禁用。 您也可以显式禁用它:

management.metrics.export.simple.enabled=false

5.6.2.16 StatsD

StatsD注册表急切地将UDP上的指标推送到StatsD代理。 默认情况下,度量标准将导出到本地计算机上运行的StatsD代理。 可以使用以下方式提供要使用的StatsD代理主机和端口:

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

您还可以更改要使用的StatsD线路协议(默认为Datadog):

management.metrics.export.statsd.flavor=etsy

5.6.2.17 Wavefront

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

management.metrics.export.wavefront.api-token=YOUR_API_TOKEN

或者,您可以在环境中使用Wavefront边线或内部代理设置,将指标数据转发到Wavefront API主机:

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

如果将度量标准发布到Wavefront代理(如文档中所述),则主机必须采用proxy://HOST:PORT格式。

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

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

5.6.3 支持的指标

Spring Boot在适用时注册以下核心指标:

  • JVM指标,报告利用率: 各种内存和缓冲池 与垃圾收集有关的统计 线程利用率 加载/卸载的类数
  • CPU指标
  • 文件描述符指标
  • Kafka消费者指标
  • Log4j2指标:记录每个级别记录到Log4j2的事件数
  • Logback指标:记录每个级别记录到Logback的事件数
  • 正常运行时间指标:报告正常运行时间表和表示应用程序绝对启动时间的固定计量表
  • Tomcat指标
  • Spring集成指标

5.6.3.1 Spring MVC指标

自动配置启用Spring MVC处理的请求的检测。 当management.metrics.web.server.auto-time-requests为true时,将对所有请求进行此检测。 或者,当设置为false时,您可以通过将@Timed添加到请求处理方法来启用检测:

@RestController
@Timed 
public class MyController {

	@GetMapping("/api/people")
	@Timed(extraTags = { "region", "us-east-1" }) 
	@Timed(value = "all.people", longTask = true) 
	public List<Person> listPeople() { ... }

}
  1. 一个控制器类,用于在控制器中的每个请求处理程序上启用计时。
  2. 一种启用单个端点的方法。 如果您在类上拥有它,则不需要这样做,但可以用于进一步自定义此特定端点的计时器。
  3. 使用longTask = true的方法为该方法启用长任务计时器。 长任务计时器需要单独的度量标准名称,并且可以使用短任务计时器进行堆叠。

默认情况下,使用名称http.server.requests生成度量标准。 可以通过设置management.metrics.web.server.requests-metric-name属性来自定义名称。

默认情况下,Spring MVC相关指标标有以下信息:

TagDescription
exception处理请求时抛出的任何异常的简单类名。
method请求的方法(例如,GET或POST)
outcome根据响应的状态代码请求结果。 1xx是INFORMATIONAL,2xx是SUCCESS,3xx是REDIRECTION,4xx CLIENT_ERROR,5xx是SERVER_ERROR
status响应的HTTP状态代码(例如,200或500)
uri如果可能,在变量替换之前请求URI模板(例如,/api/person/{id})

要自定义标记,请提供实现WebMvcTagsProvider的@Bean。

5.6.3.2 Spring WebFlux指标

自动配置可以检测WebFlux控制器和功能处理程序处理的所有请求。

默认情况下,使用名称http.server.requests生成度量标准。 您可以通过设置management.metrics.web.server.requests-metric-name属性来自定义名称。

默认情况下,与WebFlux相关的指标标记有以下信息:

TagDescription
exception处理请求时抛出的任何异常的简单类名。
method请求的方法(例如,GET或POST)
outcome根据响应的状态代码请求结果。 1xx是INFORMATIONAL,2xx是SUCCESS,3xx是REDIRECTION,4xx CLIENT_ERROR,5xx是SERVER_ERROR
status响应的HTTP状态代码(例如,200或500)
uri如果可能,在变量替换之前请求URI模板(例如,/api/person/{id})

要自定义标记,请提供实现WebFluxTagsProvider的@Bean。

5.6.3.3 Jersey Server指标

自动配置可以对Jersey JAX-RS实现处理的请求进行检测。 当management.metrics.web.server.auto-time-requests为true时,将对所有请求进行此检测。 或者,当设置为false时,您可以通过将@Timed添加到请求处理方法来启用检测:

@Component
@Path("/api/people")
@Timed 
public class Endpoint {
	@GET
	@Timed(extraTags = { "region", "us-east-1" }) 
	@Timed(value = "all.people", longTask = true) 
	public List<Person> listPeople() { ... }
}
  1. 在资源类上,为资源中的每个请求处理程序启用计时。
  2. 在启用单个端点的方法上。 如果您在类上拥有它,则不需要这样做,但可以用于进一步自定义此特定端点的计时器。
  3. 在具有longTask = true的方法上,为该方法启用长任务计时器。 长任务计时器需要单独的度量标准名称,并且可以使用短任务计时器进行堆叠。

默认情况下,使用名称http.server.requests生成度量标准。 可以通过设置management.metrics.web.server.requests-metric-name属性来自定义名称。

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

TagDescription
exception处理请求时抛出的任何异常的简单类名。
method请求的方法(例如,GET或POST)
outcome根据响应的状态代码请求结果。 1xx是INFORMATIONAL,2xx是SUCCESS,3xx是REDIRECTION,4xx CLIENT_ERROR,5xx是SERVER_ERROR
status响应的HTTP状态代码(例如,200或500)
uri如果可能,在变量替换之前请求URI模板(例如,/api/person/{id})

要自定义标记,请提供实现JerseyTagsProvider的@Bean。

5.6.3.4 HTTP Client指标

Spring Boot Actuator管理RestTemplate和WebClient的工具。 为此,您必须注入一个自动配置的构建器并使用它来创建实例:

  • 用于RestTemplate的RestTemplateBuilder
  • 用于WebClient的WebClient.Builder

也可以手动应用负责此检测的定制程序,即MetricsRestTemplateCustomizer和MetricsWebClientCustomizer。

默认情况下,使用名称http.client.requests生成度量标准。 可以通过设置management.metrics.web.client.requests-metric-name属性来自定义名称。

默认情况下,已检测客户端生成的度量标准使用以下信息进行标记:

  • method,请求的方法(例如,GET或POST)。
  • uri,变量替换之前的请求URI模板(如果可能)(例如,/api/person/{id})。
  • status,响应的HTTP状态代码(例如,200或500)。
  • clientName,URI的主机部分。

要自定义标记,并根据您选择的客户端,您可以提供实现RestTemplateExchangeTagsProvider或WebClientExchangeTagsProvider的@Bean。 RestTemplateExchangeTags和WebClientExchangeTags中有方便的静态函数。

5.6.3.5 Cache指标

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

支持以下缓存库:

  • Caffeine
  • EhCache 2
  • Hazelcast
  • 任何兼容的JCache(JSR-107)实现

度量标准由缓存的名称和从bean名称派生的CacheManager的名称标记。

只有启动时可用的缓存才会绑定到注册表。 对于在启动阶段后即时或以编程方式创建的缓存,需要显式注册。 CacheMetricsRegistrar bean可用于简化该过程。

5.6.3.6 DataSource指标

自动配置使用名为jdbc的度量标准启用所有可用DataSource对象的检测。 数据源检测会生成表示池中当前活动,最大允许和最小允许连接的计量器。 这些仪表中的每一个都有一个以jdbc为前缀的名称。

度量标准也由基于bean名称计算的DataSource的名称标记。

默认情况下,Spring Boot为所有支持的数据源提供元数据; 如果开箱即用不支持您喜欢的数据源,则可以添加其他DataSourcePoolMetadataProvider bean。 有关示例,请参阅DataSourcePoolMetadataProvidersConfiguration。

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

5.6.3.7 Hibernate指标

自动配置启用所有可用Hibernate EntityManagerFactory实例的检测,这些实例使用名为hibernate的度量标准启用统计信息。

度量标准也由从bean名称派生的EntityManagerFactory的名称标记。

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

spring.jpa.properties.hibernate.generate_statistics=true

5.6.3.8 RabbitMQ指标

自动配置将使用名为rabbitmq的度量标准启用所有可用RabbitMQ连接工厂的检测。

5.6.4 注册自定义指标

要注册自定义指标,请将MeterRegistry注入组件,如以下示例所示:

class Dictionary {

	private final List<String> words = new CopyOnWriteArrayList<>();

	Dictionary(MeterRegistry registry) {
		registry.gaugeCollectionSize("dictionary.size", Tags.empty(), this.words);
	}

	// …

}

如果您发现跨组件或应用程序重复检测一套度量标准,则可以将此套件封装在MeterBinder实现中。 默认情况下,所有MeterBinder bean的指标都将自动绑定到Spring管理的MeterRegistry。

5.6.5 定制个人指标

如果需要将自定义应用于特定的Meter实例,可以使用io.micrometer.core.instrument.config.MeterFilter接口。 默认情况下,所有MeterFilter bean都将自动应用于MeterRegistry.Config。

例如,如果要将mytag.region标记重命名为mytag.area以获取以com.example开头的所有仪表ID,则可以执行以下操作:

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

5.6.5.1 常用标签

通用标签通常用于操作环境中的维度向下钻取,例如主机,实例,区域,堆栈等。共用标签应用于所有仪表,并且可以按照以下示例所示进行配置:

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

上面的示例将region和stack标签添加到所有仪表,其值分别为us-east-1和prod。

如果您使用Graphite,常用标签的顺序很重要。 由于使用此方法无法保证常用标记的顺序,因此建议Graphite用户定义自定义MeterFilter。

5.6.5.2 单位属性

除了MeterFilter bean之外,还可以使用属性在每米的基础上应用一组有限的自定义。 单位自定义适用于以给定名称开头的所有仪表ID。 例如,以下将禁用任何具有以example.remote开头的ID的仪表

management.metrics.enable.example.remote=false

以下属性允许单位定制:

PropertyDescription
management.metrics.enable是否拒绝仪表发射任何指标。
management.metrics.distribution.percentiles-histogram是否发布适合于计算聚合(跨维度)百分位数近似的直方图。
management.metrics.distribution.minimum-expected-value,management.metrics.distribution.maximum-expected-value通过限制预期值的范围来发布较少的直方图桶。
management.metrics.distribution.percentiles发布应用程序中计算的百分位数
management.metrics.distribution.sla使用SLA定义的桶发布累积直方图。

有关百分位数 - 直方图,百分位数和斜率背后的概念的更多详细信息,请参阅micrometer文档的“直方图和百分位数”部分。

5.6.6 指标端点

Spring Boot提供了一个度量端点,可以在诊断中用于检查应用程序收集的度量标准。 默认情况下端点不可用,必须公开,请参阅公开端点以获取更多详细信息。

导航到/actuator/metrics会显示可用的仪表名称列表。 您可以向下钻取以查看有关特定仪表的信息,方法是将其名称作为选择器,例如,/actuator/metrics/jvm.memory.max。

您在这里使用的名称应该与代码中使用的名称相匹配,而不是在命名之后使用的名称。换句话说,如果jvm.memory.max在Prometheus中以jvm_memory_max的形式出现,因为它的下划线式命名约定,那么在检查度量端点中的仪表时,仍然应该使用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。