Micrometer StatsD
这是一个关于 Micrometer StatsD 的文档。
DeepSeek V3 中英对照 statsD Micrometer StatsDStatsD 是一个基于 UDP 的边车驱动(sidecar-driven)的指标收集系统。原始的 StatsD 行协议规范的维护者是 Etsy。Datadog 的 DogStatsD 和 Influx 的 Telegraf 各自接受了一个修改版的行协议,它们分别以不同的方式丰富了原始规范,引入了维度(dimensionality)。
1. 安装 micrometer-registry-statsd
建议使用 Micrometer(或您的框架,如果有的话)提供的 BOM,您可以在此处查看如何配置它 here。以下示例假设您正在使用 BOM。
1.1. Gradle
在 配置 好 BOM 之后,添加以下依赖:
implementation 'io.micrometer:micrometer-registry-statsd'
此依赖项不需要指定版本,因为它由 BOM 定义。
1.2. Maven
在 配置 完 BOM 之后,添加以下依赖:
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-registry-statsd</artifactId>
</dependency>
此依赖项不需要指定版本,因为它由 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);
你也可以配置 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
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();
定义如何处理行。
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();
现在,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();
由于你已经接管了线路构建,因此忽略了风格。