Apache kafka Kafka Streams K表大小监视

Apache kafka Kafka Streams K表大小监视,apache-kafka,prometheus,apache-kafka-streams,ktable,Apache Kafka,Prometheus,Apache Kafka Streams,Ktable,我有一个流拓扑,它使用一个主题,运行一个聚合,并构建一个KTable,该KTable被具体化为rocksDB 我有另一个应用程序,它每天使用来自同一主题的所有事件,并为满足某些特定条件(即不再需要)的事件发送墓碑消息。 聚合处理此问题并从状态存储中删除,但我正在监视状态存储的大小或更改日志主题—任何真正告诉我ktable大小的内容 我已经公开了JMX指标,但似乎没有任何东西可以满足我的需要。我可以看到rocksDB中的“puts”总数,但看不到键的总数。 我的应用程序是spring boot,我

我有一个流拓扑,它使用一个主题,运行一个聚合,并构建一个KTable,该KTable被具体化为rocksDB

我有另一个应用程序,它每天使用来自同一主题的所有事件,并为满足某些特定条件(即不再需要)的事件发送墓碑消息。 聚合处理此问题并从状态存储中删除,但我正在监视状态存储的大小或更改日志主题—任何真正告诉我ktable大小的内容

我已经公开了JMX指标,但似乎没有任何东西可以满足我的需要。我可以看到rocksDB中的“puts”总数,但看不到键的总数。 我的应用程序是spring boot,我想通过prometheus公开这些指标


有人解决了这个问题或者有什么想法可以帮助你吗?

你可以通过使用这个
KeyValueStore#ApproximateEnumEntries()
访问KTable的底层状态存储来获得每个分区中的近似计数,然后将该计数导出到prometheus(每个分区有一个计数)

要访问下划线状态存储,您可以使用低级处理器API通过每个StreamTask(对应于分区)中的每个处理器上下文访问
KeyValueStore
。只需在拓扑中添加一个
KStream#transformValues()

kStream
        ...
        .transformValues(ExtractCountTransformer::new, "your_ktable_name")
        ...
在ExtractCountTransformer中,将计数提取给普罗米修斯:

@Log4j2
public class ExtractCountTransformer implements ValueTransformerWithKey<String, String, String> {

    private KeyValueStore<String, String> yourKTableKvStore;
    private ProcessorContext context;

    @Override
    public void init(ProcessorContext context) {
        this.context = context;
        yourKTableKvStore = (KeyValueStore<String, String>) context.getStateStore("your_ktable_name");
    }

    @Override
    public String transform(String readOnlyKey, String value) {
        //extract count to prometheus
        log.debug("partition {} - approx count {}", context.partition(), yourKTableKvStore.approximateNumEntries());
        yourKTableKvStore.approximateNumEntries();
        return value;
    }

    @Override
    public void close() {

    }
}
@Log4j2
公共类ExtractCountTransformer实现ValueTransformerWithKey{
private KeyValueStore yourKTableKvStore;
私有处理器上下文上下文;
@凌驾
公共void init(ProcessorContext上下文){
this.context=上下文;
yourKTableKvStore=(KeyValueStore)context.getStateStore(“您的表名”);
}
@凌驾
公共字符串转换(字符串readOnlyKey,字符串值){
//向普罗米修斯提取计数
debug(“partition{}-approxist count{}”、context.partition()、yourKTableKvStore.approximateEnumEntries());
yourKTableKvStore.approximateEnumEntries();
返回值;
}
@凌驾
公众假期结束(){
}
}