/** * Licensed to DigitalPebble Ltd under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * DigitalPebble 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 com.digitalpebble.stormcrawler.util; import org.apache.storm.metric.api.IReducer; /** Used to return an average value per second **/ public class PerSecondReducer implements IReducer<TimeReducerState> { @Override public TimeReducerState init() { return new TimeReducerState(); } @Override public TimeReducerState reduce(TimeReducerState accumulator, Object input) { if (input instanceof Double) { accumulator.sum += (Double) input; } else if (input instanceof Long) { accumulator.sum += ((Long) input).doubleValue(); } else if (input instanceof Integer) { accumulator.sum += ((Integer) input).doubleValue(); } else { throw new RuntimeException( "MeanReducer::reduce called with unsupported input type `" + input.getClass() + "`. Supported types are Double, Long, Integer."); } return accumulator; } @Override public Object extractResult(TimeReducerState accumulator) { // time spent double msec = System.currentTimeMillis() - accumulator.started; if (msec == 0) return 0; double permsec = accumulator.sum / msec; return new Double(permsec * 1000d); } } class TimeReducerState { public long started = System.currentTimeMillis(); public double sum = 0.0; }