Skip to content

Latest commit

 

History

History
478 lines (298 loc) · 17.7 KB

File metadata and controls

478 lines (298 loc) · 17.7 KB

54. Metrics

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

  • Atlas
  • Datadog
  • Ganglia
  • Graphite
  • Influx
  • JMX
  • New Relic
  • Prometheus
  • SignalFx
  • Simple (in-memory)
  • StatsD
  • Wavefront

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


54.1 Getting started

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 also configures built-in instrumentation(即 MeterBinder 实现),您可以通过配置或专用注解标记来控制。


54.2 Supported monitoring systems

54.2.1 Atlas

默认情况下,metrics 将导出到在本地计算机上运行的 Atlas。可以使用以下方式提供要使用的 Atlas Server 的位置:

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

54.2.2 Datadog

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

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

您还可以更改 metrics 发送到Datadog的时间间隔:

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

54.2.3 Ganglia

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

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

Micrometer 提供了一个默认的 HierarchicalNameMapper ,它管理维度计数器id如何 mapped to flat hierarchical names

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

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

54.2.5 Influx

默认情况下,指标会导出到本地计算机上运行的 Influx。要使用的 Influx Server 的位置可以使用:

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

54.2.6 JMX

Micrometer 提供了与 JMX 的分层映射,主要是一种在本地查看 metrics 的便宜且可移植的方式。Micrometer 提供了一个默认的 HierarchicalNameMapper ,它管理维度计数器id如何 mapped to flat hierarchical names

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

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

54.2.7 New Relic

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

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

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

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

54.2.8 Prometheus

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

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

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

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

54.2.9 SignalFx

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

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

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

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

54.2.10 Simple

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

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

management.metrics.export.simple.enabled=false

54.2.11 StatsD

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

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

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

management.metrics.export.statsd.flavor=etsy

54.2.12 Wavefront

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

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

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

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

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

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

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

54.3 Supported Metrics

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

  • JVM 指标,报告�以下指标利用率:

    • 各种内存和缓冲池

    • 与垃圾收集有关的统计

    • 线程利用率

    • 加载/卸载的类数目

  • CPU 指标

  • 文件描述指标

  • Logback 指标:记录每个级别记录到 Logback 的事件数

  • 正常运行时间指标:报告正常运行时间表和表示应用程序绝对启动时间的固定计量表

  • Tomcat 指标

  • Spring Integration 指标


54.3.1 Spring MVC Metrics

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

@RestController
@Timed 1
public class MyController {

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

}

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

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

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

  • method,请求的方法(例如, GETPOST)。

  • uri,变量替换之前的请求URI模板(如果可能)(例如,/api/person/{id})。

  • status,响应的HTTP状态代码(例如,200500)。

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

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


54.3.2 Spring WebFlux Metrics

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

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

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

  • method,请求的方法(例如, GETPOST)。

  • uri,变量替换之前的请求URI模板(如果可能)(例如,/api/person/{id})。

  • status,响应的HTTP状态代码(例如,200500)。

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

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


54.3.3 RestTemplate Metrics

使用自动配置的 RestTemplateBuilder 创建的任何 RestTemplate 的检测都已启用。也可以手动应用 MetricsRestTemplateCustomizer

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

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

  • method,请求的方法(例如, GETPOST)。

  • uri,变量替换之前的请求 URI 模板(如果可能)(例如,/api/person/{id})。

  • status,响应的 HTTP 状态代码(例如,200500)。

  • clientName,URI 的 host 部分。

要自定义标记,请提供实现 RestTemplateExchangeTagsProvider@BeanRestTemplateExchangeTags 中有方便的静态函数。


54.3.4 Cache Metrics

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

支持以下缓存库:

  • Caffeine

  • EhCache 2

  • Hazelcast

  • Any compliant JCache (JSR-107) implementation

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

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


54.3.5 DataSource Metrics

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

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

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

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


54.3.6 RabbitMQ Metrics

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


54.4 Registering custom metrics

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


54.5 Customizing individual metrics

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

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

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

54.5.1 Per-meter properties

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

management.metrics.enable.example.remote=false

以下属性允许 per-meter 自定义:

Property Description
management.metrics.enable 是否拒绝 meters 发布任何指标。
management.metrics.distribution.percentiles-histogram 是否发布适合于计算可聚合(跨维度)百分位近似的直方图。
management.metrics.distribution.percentiles 发布在您的应用程序中计算的百分位数值
management.metrics.distribution.sla 使用 SLA 定义的存储桶发布累积直方图。

有关 percentiles-histogram, percentilessla 背后的概念的更多详细信息,请参阅 micrometer 文档的 "Histograms and percentiles" 部分。


54.6 Metrics endpoint

Spring Boot 提供了一个度量标准端点,可以在诊断上用于检查应用程序收集的度量标准。默认情况下端点不可用,必须公开,请参阅 [公开端点https://docs.spring.io/spring-boot/docs/2.0.2.RELEASE/reference/htmlsingle/#production-ready-endpoints-exposing-endpoints 以获取更多详细信息。

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

☀️ 您在此处使用的名称应与代码中使用的名称相匹配,而不是在命名之后的名称:其输送到的监视系统规范化的约定名称。换句话说,如果 jvm.memory.max 由于其 snake case 命名约定而在 Prometheus 中显示为 jvm_memory_max,则在 metrics endpoint 中的仪表时,仍应使用 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