java - 如何从 Java codahale Metrics Timers 中清除历史统计数据

标签 java codahale-metrics

我正在使用 codahale Metrics API for Java。

我们在整个系统中使用计时器来收集延迟。

在性能测试期间,我们通过 JMX 连接到我们的系统以收集统计数据,例如平均延迟、75% 延迟等。

问题是,除了删除所有 Metrics 对象并重新创建它们(看起来好像需要大量重构)之外,是否有一种方法可以清除历史数据,以便当我们开始新测试时,我们不会需要重新启动系统吗?

如有任何帮助,我们将不胜感激。

最佳答案

我不知道现有的方法,但您可以扩展 resetTimers() 功能并将其添加到 MetricRegistry。 您必须实现自己的 Reservoir 或来自 codahale 指标存储库的分支。 ResettableUniformReservoir 是从 UniformReservoir 复制而来的。 默认的 Reservoir 实现是 ExponentiallyDecayingReservoir 但需要复制更多代码:)

public class MyRegistry extends MetricRegistry {

    private final ConcurrentMap<String, ResettableUniformReservoir> reservoirs = new ConcurrentHashMap<>();

    @Override
    public Timer timer(String name) {
         ResettableUniformReservoir reservoir = new ResettableUniformReservoir();
         reservoirs.put(name, reservoir);
         return super.register(name, new Timer(reservoir));
    }

    public void resetTimers() {
        for (ResettableUniformReservoir reservoir : reservoirs.values()) {
            reservoir.reset();
        }
    }


    static class ResettableUniformReservoir implements Reservoir {

        private static final int DEFAULT_SIZE = 1028;
        private static final int BITS_PER_LONG = 63;

        private final AtomicLong count = new AtomicLong();
        private volatile AtomicLongArray values = new AtomicLongArray(DEFAULT_SIZE);

        @Override
        public int size() {
            final long c = count.get();
            if (c > values.length()) {
                return values.length();
            }
            return (int) c;
        }

        @Override
        public void update(long value) {
            final long c = count.incrementAndGet();
            if (c <= values.length()) {
                values.set((int) c - 1, value);
            } else {
                final long r = nextLong(c);
                if (r < values.length()) {
                    values.set((int) r, value);
                }
            }
        }

        private static long nextLong(long n) {
            long bits, val;
            do {
                bits = ThreadLocalRandom.current().nextLong() & (~(1L << BITS_PER_LONG));
                val = bits % n;
            } while (bits - val + (n - 1) < 0L);
            return val;
        }

        @Override
        public Snapshot getSnapshot() {
            final int s = size();
            final List<Long> copy = new ArrayList<Long>(s);
            for (int i = 0; i < s; i++) {
                copy.add(values.get(i));
            }
            return new UniformSnapshot(copy);
        }

        public void reset() {
            count.set(0);
            values = new AtomicLongArray(DEFAULT_SIZE);
        }
    }
}

关于java - 如何从 Java codahale Metrics Timers 中清除历史统计数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24603561/

相关文章:

java - 保留 Coda Hale 指标信息

java - VTD-XML 解析性能(速度关键因素)。请求反馈/评论

java - 如何使用表达式语言获取 boolean 属性?

java - GAE 无法使用 Java 的 Send Grid 发送邮件

java - 为什么要在 Dropwizard Metrics 中使用 CachedGauage?

java - 如何将自定义指标添加到 Dropwizard/metrics

java - 从集群收集指标

java - 在 Graphite 中显示 Java Metrics 结果

java - Swagger、jersey、jax-rs、嵌入式jetty配置问题

java - 如何将 TextView 设置为长值?