All Downloads are FREE. Search and download functionalities are using the official Maven repository.

scouter.agent.counter.meter.MeterAPI Maven / Gradle / Ivy

There is a newer version: 2.20.0
Show newest version
/*
 *  Copyright 2015 the original author or authors. 
 *  @https://github.com/scouter-project/scouter
 *
 *  Licensed 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 scouter.agent.counter.meter;

import scouter.lang.ref.INT;
import scouter.lang.ref.LONG;
import scouter.util.MeteringUtil;
import scouter.util.MeteringUtil.Handler;

public class MeterAPI {
	private static MeterAPI inst = new MeterAPI();

	public static MeterAPI getInstance() {
		return inst;
	}
	
	final static class Bucket {
		int count;
		long time;
		int error;
	}

	private MeteringUtil meter = new MeteringUtil() {
		protected Bucket create() {
			return new Bucket();
		};

		protected void clear(Bucket o) {
			o.count = 0;
			o.error = 0;
			o.time = 0L;
		}
	};

	public synchronized void add(int elapsed, boolean err) {
		Bucket b = meter.getCurrentBucket();
		b.count++;
		b.time += elapsed;
		if (err) {
			b.error++;
		}
	}

	public float getTps(int period) {
		final INT sum = new INT();
		period = meter.search(period, new Handler() {
			public void process(Bucket b) {
				sum.value += b.count;
			}
		});
		return (float) ((double) sum.value / period);
	}

	public int getAvgTime(int period) {
		final LONG sum = new LONG();
		final INT cnt = new INT();
		meter.search(period, new Handler() {
			public void process(Bucket b) {
				sum.value += b.time;
				cnt.value += b.count;

			}
		});
		return (int) ((cnt.value == 0) ? 0 : sum.value / cnt.value);
	}

	public long getSumTime(int period) {
		final LONG sum = new LONG();
		period = meter.search(period, new Handler() {
			public void process(Bucket b) {
				sum.value += b.time;
			}
		});
		return  ((period == 0) ? 0 : sum.value / period);
	}

	public int getCount(int period) {

		final INT sum = new INT();
		meter.search(period, new Handler() {
			public void process(Bucket b) {
				sum.value += b.count;
			}
		});
		return sum.value;
	}

	public int getErrorCount(int period) {
		final INT sum = new INT();
		meter.search(period, new Handler() {
			public void process(Bucket b) {
				sum.value += b.error;
			}
		});
		return sum.value;
	}

	public float getErrorRate(int period) {
		final INT cnt = new INT();
		final INT err = new INT();
		meter.search(period, new Handler() {
			public void process(Bucket b) {
				cnt.value += b.count;
				err.value += b.error;
			}
		});
		return (float) ((cnt.value == 0) ? 0 : (((double) err.value / cnt.value) * 100.0));
	}
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy