跳到主要内容

Micrometer StatsD

这是一个关于 Micrometer StatsD 的文档。

DeepSeek V3 中英对照 statsD Micrometer StatsD

StatsD 是一个基于 UDP 的边车驱动(sidecar-driven)的指标收集系统。原始的 StatsD 行协议规范的维护者是 Etsy。Datadog 的 DogStatsD 和 Influx 的 Telegraf 各自接受了一个修改版的行协议,它们分别以不同的方式丰富了原始规范,引入了维度(dimensionality)。

如果您打算使用 Datadog 或 Telegraf 风格,请参阅 Micrometer 的 DatadogInflux 支持文档。

1. 安装 micrometer-registry-statsd

建议使用 Micrometer(或您的框架,如果有的话)提供的 BOM,您可以在此处查看如何配置它 here。以下示例假设您正在使用 BOM。

1.1. Gradle

配置 好 BOM 之后,添加以下依赖:

implementation 'io.micrometer:micrometer-registry-statsd'
groovy
备注

此依赖项不需要指定版本,因为它由 BOM 定义。

1.2. Maven

配置 完 BOM 之后,添加以下依赖:

<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-registry-statsd</artifactId>
</dependency>
xml
备注

此依赖项不需要指定版本,因为它由 BOM 定义。

2. 配置

此配置用于将指标发送到与原始 Etsy 协议兼容的 StatsD 代理。指标会立即通过 UDP 发送到代理。

StatsdConfig config = new StatsdConfig() {
@Override
public String get(String k) {
return null;
}

@Override
public StatsdFlavor flavor() {
return StatsdFlavor.Etsy;
}
};

MeterRegistry registry = new StatsdMeterRegistry(config, Clock.SYSTEM);
java
备注

你也可以配置 Telegraf 以接受 dogstatsd 格式。如果你使用 Telegraf,配置 Micrometer 以发送 Telegraf 格式的 StatsD 行可以简化你的 Telegraf 配置要求。

StatsdConfig 是一个带有默认方法的接口。如果在 get(String k) 的实现中,不返回 null,而是将其绑定到一个属性源,你可以覆盖默认配置。例如,Micrometer 的 Spring Boot 支持将前缀为 management.metrics.export.statsd 的属性直接绑定到 StatsdConfig

management.metrics.export.statsd:
flavor: etsy

# You will probably want to conditionally disable StatsD publishing in local development.
enabled: true

# The interval at which metrics are sent to StatsD. The default is 1 minute.
step: 1m
yml

3. 自定义指标接收器

默认情况下,Micrometer 通过 UDP 发布 StatsD 行协议,因为绝大多数现有的 StatsD 代理都是 UDP 服务器。你可以通过修改 StatsdMeterRegistry 的构建器来完全自定义行协议的传输方式:

Consumer<String> lineLogger = line -> logger.info(line); 1

MeterRegistry registry = StatsdMeterRegistry.builder(StatsdConfig.DEFAULT) 2
.clock(clock)
.lineSink(lineLogger)
.build();
java
  • 定义如何处理行。

  • flavor 配置选项决定了默认行构建器的行结构。如果你通过自定义覆盖了行构建器,则该选项不会产生任何效果。

3.1. 使用 Apache Kafka 作为行接收器

你也可以使用 Apache Kafka 作为行接收器,如下所示:

Properties properties = new Properties();
properties.setProperty(BOOTSTRAP_SERVERS_CONFIG, "localhost:9092");
properties.setProperty(KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class.getName());
properties.setProperty(VALUE_SERIALIZER_CLASS_CONFIG, StringSerializer.class.getName());

Producer<String, String> producer = new KafkaProducer<>(properties);

StatsdMeterRegistry.builder(statsdConfig)
.lineSink((line) -> producer.send(new ProducerRecord<>("my-metrics", line)))
.build();
java

现在,Micrometer 将指标数据生成到 my-metrics 主题中,您可以消费该主题中的数据。

4. 自定义线条格式

内置的 Etsy、dogstatsd 和 Telegraf 风格涵盖了大多数已知的公共 StatsD 代理,但你可以完全自定义行格式以满足封闭的、专有的代理需求。再次强调,我们使用 StatsdMeterRegistry 构建器为每个 ID 建立一个行构建器。为每个 ID 提供构建器实例,使你能够预先缓存 ID 名称和标签的序列化,以优化基于该 ID 的 StatsD 行的序列化,因为样本会被记录下来。以下清单定义了一个虚构的格式:

Function<Meter.Id, StatsdLineBuilder> nameAndUnits = id -> new StatsdLineBuilder() {
String name = id.getName() + "/" + (id.getBaseUnit() == null ? "unknown" : id.getBaseUnit());

@Override
public String count(long amount, Statistic stat) {
return name + ":" + amount + "|c";
}

... // implement gauge, histogram, and timing similarly
}

MeterRegistry registry = StatsdMeterRegistry.builder(StatsdConfig.DEFAULT) 1
.clock(clock)
.lineBuilder(nameAndUnits)
.build();
java
  • 由于你已经接管了线路构建,因此忽略了风格。