Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何从Java codahale度量计时器中清除历史统计信息_Java_Codahale Metrics - Fatal编程技术网

如何从Java codahale度量计时器中清除历史统计信息

如何从Java codahale度量计时器中清除历史统计信息,java,codahale-metrics,Java,Codahale Metrics,我正在使用Java的codahale Metrics API 我们在整个系统中使用定时器来收集延迟 在性能测试期间,我们通过JMX连接到我们的系统以收集统计数据,例如平均延迟、第75百分位延迟等 问题是,除了删除所有度量对象并重新创建它们(这似乎需要很多重构)之外,有没有一种方法可以清除历史数据,这样当我们开始一个新的测试时,就不需要重新启动系统了 任何帮助都将不胜感激。我不知道现有的方法,但您可以将resetTimers()功能扩展并添加到MetricRegistry。 您必须从codahal

我正在使用Java的codahale Metrics API

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

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

问题是,除了删除所有度量对象并重新创建它们(这似乎需要很多重构)之外,有没有一种方法可以清除历史数据,这样当我们开始一个新的测试时,就不需要重新启动系统了


任何帮助都将不胜感激。

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

公共类MyRegistry扩展了MetricRegistry{
私有最终ConcurrentMap库=新ConcurrentHashMap();
@凌驾
公共计时器(字符串名称){
ResettableUniformReservoir储液罐=新的ResettableUniformReservoir();
水库。put(名称、水库);
返回超级寄存器(名称、新定时器(储存器));
}
公共无效重置计时器(){
对于(ResettableUniformReservoir储液罐:储液罐.values()){
reset();
}
}
静态类ResettableUniformReservoir执行储液罐{
私有静态最终int默认值_SIZE=1028;
私有静态最终整数位每长=63;
私有最终AtomicLong计数=新的AtomicLong();
私有volatile AtomicLongArray值=新的AtomicLongArray(默认大小);
@凌驾
公共整数大小(){
final long c=count.get();
如果(c>values.length()){
返回值。length();
}
返回(int)c;
}
@凌驾
公共无效更新(长值){
final long c=count.incrementAndGet();

如果(c)打开一个功能请求,看起来已经有一张关于重置状态的票证-
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);
        }
    }
}