From 9d6cb4cb6d5cda81f21f716e6be77915e4d3672c Mon Sep 17 00:00:00 2001 From: Lee Hinman Date: Wed, 31 May 2017 09:05:22 -0600 Subject: [PATCH] Remove unused MeterMetric and specialized EWMA (#24975) This metric is not used in the ES codebase at all. It's also not as likely to be used since it relies on a periodic "tick", which we don't currently use. --- .../elasticsearch/common/metrics/EWMA.java | 119 ----------------- .../common/metrics/MeterMetric.java | 123 ------------------ 2 files changed, 242 deletions(-) delete mode 100644 core/src/main/java/org/elasticsearch/common/metrics/EWMA.java delete mode 100644 core/src/main/java/org/elasticsearch/common/metrics/MeterMetric.java diff --git a/core/src/main/java/org/elasticsearch/common/metrics/EWMA.java b/core/src/main/java/org/elasticsearch/common/metrics/EWMA.java deleted file mode 100644 index b2fca5f6605..00000000000 --- a/core/src/main/java/org/elasticsearch/common/metrics/EWMA.java +++ /dev/null @@ -1,119 +0,0 @@ -/* - * Licensed to Elasticsearch under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch licenses this file to you under - * the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -package org.elasticsearch.common.metrics; - -import java.util.concurrent.TimeUnit; -import java.util.concurrent.atomic.LongAdder; - -/** - * An exponentially-weighted moving average. - * - *

- * Taken from codahale metric module, changed to use LongAdder - * - * @see UNIX Load Average Part 1: How It Works - * @see UNIX Load Average Part 2: Not Your Average Average - */ -public class EWMA { - private static final double M1_ALPHA = 1 - Math.exp(-5 / 60.0); - private static final double M5_ALPHA = 1 - Math.exp(-5 / 60.0 / 5); - private static final double M15_ALPHA = 1 - Math.exp(-5 / 60.0 / 15); - - private volatile boolean initialized = false; - private volatile double rate = 0.0; - - private final LongAdder uncounted = new LongAdder(); - private final double alpha, interval; - - /** - * Creates a new EWMA which is equivalent to the UNIX one minute load average and which expects to be ticked every - * 5 seconds. - * - * @return a one-minute EWMA - */ - public static EWMA oneMinuteEWMA() { - return new EWMA(M1_ALPHA, 5, TimeUnit.SECONDS); - } - - /** - * Creates a new EWMA which is equivalent to the UNIX five minute load average and which expects to be ticked every - * 5 seconds. - * - * @return a five-minute EWMA - */ - public static EWMA fiveMinuteEWMA() { - return new EWMA(M5_ALPHA, 5, TimeUnit.SECONDS); - } - - /** - * Creates a new EWMA which is equivalent to the UNIX fifteen minute load average and which expects to be ticked - * every 5 seconds. - * - * @return a fifteen-minute EWMA - */ - public static EWMA fifteenMinuteEWMA() { - return new EWMA(M15_ALPHA, 5, TimeUnit.SECONDS); - } - - /** - * Create a new EWMA with a specific smoothing constant. - * - * @param alpha the smoothing constant - * @param interval the expected tick interval - * @param intervalUnit the time unit of the tick interval - */ - public EWMA(double alpha, long interval, TimeUnit intervalUnit) { - this.interval = intervalUnit.toNanos(interval); - this.alpha = alpha; - } - - /** - * Update the moving average with a new value. - * - * @param n the new value - */ - public void update(long n) { - uncounted.add(n); - } - - /** - * Mark the passage of time and decay the current rate accordingly. - */ - public void tick() { - final long count = uncounted.sumThenReset(); - double instantRate = count / interval; - if (initialized) { - rate += (alpha * (instantRate - rate)); - } else { - rate = instantRate; - initialized = true; - } - } - - /** - * Returns the rate in the given units of time. - * - * @param rateUnit the unit of time - * @return the rate - */ - public double rate(TimeUnit rateUnit) { - return rate * (double) rateUnit.toNanos(1); - } -} diff --git a/core/src/main/java/org/elasticsearch/common/metrics/MeterMetric.java b/core/src/main/java/org/elasticsearch/common/metrics/MeterMetric.java deleted file mode 100644 index 3a24df0208e..00000000000 --- a/core/src/main/java/org/elasticsearch/common/metrics/MeterMetric.java +++ /dev/null @@ -1,123 +0,0 @@ -/* - * Licensed to Elasticsearch under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch licenses this file to you under - * the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -package org.elasticsearch.common.metrics; - -import org.elasticsearch.common.util.concurrent.FutureUtils; - -import java.util.concurrent.ScheduledExecutorService; -import java.util.concurrent.ScheduledFuture; -import java.util.concurrent.TimeUnit; -import java.util.concurrent.atomic.LongAdder; - -/** - * A meter metric which measures mean throughput and one-, five-, and - * fifteen-minute exponentially-weighted moving average throughputs. - * - *

- * taken from codahale metric module, replaced with LongAdder - * - * @see EMA - */ -public class MeterMetric implements Metric { - private static final long INTERVAL = 5; // seconds - - private final EWMA m1Rate = EWMA.oneMinuteEWMA(); - private final EWMA m5Rate = EWMA.fiveMinuteEWMA(); - private final EWMA m15Rate = EWMA.fifteenMinuteEWMA(); - - private final LongAdder count = new LongAdder(); - private final long startTime = System.nanoTime(); - private final TimeUnit rateUnit; - private final ScheduledFuture future; - - public MeterMetric(ScheduledExecutorService tickThread, TimeUnit rateUnit) { - this.rateUnit = rateUnit; - this.future = tickThread.scheduleAtFixedRate(new Runnable() { - @Override - public void run() { - tick(); - } - }, INTERVAL, INTERVAL, TimeUnit.SECONDS); - } - - public TimeUnit rateUnit() { - return rateUnit; - } - - /** - * Updates the moving averages. - */ - void tick() { - m1Rate.tick(); - m5Rate.tick(); - m15Rate.tick(); - } - - /** - * Mark the occurrence of an event. - */ - public void mark() { - mark(1); - } - - /** - * Mark the occurrence of a given number of events. - * - * @param n the number of events - */ - public void mark(long n) { - count.add(n); - m1Rate.update(n); - m5Rate.update(n); - m15Rate.update(n); - } - - public long count() { - return count.sum(); - } - - public double fifteenMinuteRate() { - return m15Rate.rate(rateUnit); - } - - public double fiveMinuteRate() { - return m5Rate.rate(rateUnit); - } - - public double meanRate() { - long count = count(); - if (count == 0) { - return 0.0; - } else { - final long elapsed = (System.nanoTime() - startTime); - return convertNsRate(count / (double) elapsed); - } - } - - public double oneMinuteRate() { - return m1Rate.rate(rateUnit); - } - - private double convertNsRate(double ratePerNs) { - return ratePerNs * (double) rateUnit.toNanos(1); - } - - public void stop() { FutureUtils.cancel(future);} -}