/* * CDDL HEADER START * * The contents of this file are subject to the terms of the * Common Development and Distribution License, Version 1.0 only * (the "License"). You may not use this file except in compliance * with the License. * * You can obtain a copy of the license at * trunk/opends/resource/legal-notices/OpenDS.LICENSE * or https://OpenDS.dev.java.net/OpenDS.LICENSE. * See the License for the specific language governing permissions * and limitations under the License. * * When distributing Covered Code, include this CDDL HEADER in each * file and include the License file at * trunk/opends/resource/legal-notices/OpenDS.LICENSE. If applicable, * add the following below this CDDL HEADER, with the fields enclosed * by brackets "[]" replaced with your own identifying information: * Portions Copyright [yyyy] [name of copyright owner] * * CDDL HEADER END * * * Copyright 2008 Sun Microsystems, Inc. */ package org.opends.server.monitors; import org.opends.server.api.MonitorProvider; import org.opends.server.protocols.ldap.LDAPStatistics; import org.opends.server.types.OperationType; /** * This class defines a monitor object which are able to measure * an elapse time (nanosecs), a number of times the measurement was done, * the minimum and the maximum. */ public class OperationMonitor { /** * Undefined value for the timer. */ public static long UNDEFINED_VALUE = 0; // Lock object private Object lock = new Object(); // Type of the operation private OperationType opType; // Date of creation of the object private long creationTime; // ElapseTime private long eTime = UNDEFINED_VALUE; // Date the start method was called private long startTime = UNDEFINED_VALUE; // Date stop method was called private long stopTime = UNDEFINED_VALUE; // Accumualted time private long totalTime = UNDEFINED_VALUE; // Min time private long minTime = UNDEFINED_VALUE; // Max time private long maxTime = UNDEFINED_VALUE; // Counter private CounterMonitor counter; // Private constructor private OperationMonitor(OperationMonitor opMonitor) { this.opType = opMonitor.getType(); this.eTime = opMonitor.getTime(); this.startTime = opMonitor.getStartTime(); this.stopTime = opMonitor.getStopTime(); this.totalTime = opMonitor.getTotalTime(); this.maxTime = opMonitor.getMaxTime(); this.minTime = opMonitor.getMinTime(); this.counter = opMonitor.getCounter().duplicate(); } // Private constructor private OperationMonitor(OperationType opType) { this.opType = opType; this.counter = CounterMonitor.getCounter(); this.creationTime = System.nanoTime(); } /** * Gets a Operation Monitor object od the specified type. * @param opType of the monitor object. * @return the Operation monitor object. */ public static OperationMonitor getOperationMonitor(OperationType opType) { return new OperationMonitor(opType); } /** * Returns a duplicate object. * @return the duplicate object. */ public OperationMonitor duplicate() { return new OperationMonitor(this); } /** * Add the provider moniyot object to the current one. * @param opMonitor to add. */ public void add(OperationMonitor opMonitor) { synchronized (lock) { this.counter.add(opMonitor.getCounter()); this.totalTime += opMonitor.getTotalTime(); if ((this.minTime == UNDEFINED_VALUE) || (this.minTime > opMonitor.getMinTime())) { this.minTime = opMonitor.getMinTime(); } if (this.maxTime < opMonitor.getMaxTime()) { this.maxTime = opMonitor.getMaxTime(); } } } /** * Sets the starTime. */ public void start() { synchronized (lock) { this.counter.increment(); this.startTime = System.nanoTime(); } } /** * Sets the stopTime, process the elapseTime, min max and accumulated * time. */ public void stop() { synchronized (lock) { this.stopTime = System.nanoTime(); this.eTime = stopTime - startTime; totalTime += eTime; if ((this.minTime == UNDEFINED_VALUE) || (eTime < this.minTime)) { this.minTime = this.eTime; } if (eTime > this.maxTime) { this.maxTime = this.eTime; } } } /** * Gets a elapse time. * @return the elapse time. */ public long getTime() { return eTime; } /** * Gets the Min time. * @return the min time. */ public long getMinTime() { return this.minTime; } /** * Gets the max time. * @return the max time. */ public long getMaxTime() { return this.maxTime; } /** * Gets the accumulated time. * @return the accumulated time. */ public long getTotalTime() { return this.totalTime; } /** * Gets the startTime. * @return the date in a long format. */ public long getStartTime() { return this.startTime; } /** * Get the stopTime. * @return the date in long format. */ public long getStopTime() { return this.stopTime; } /** * Gets the counter object. * @return the counterMonitor object. */ public CounterMonitor getCounter() { return this.counter; } /** * Gets the type of the OperationMonitor object. * @return the OperationType. */ public OperationType getType() { return this.opType; } /** * Reset the values to 0. */ public void reset() { this.counter.reset(); this.totalTime=UNDEFINED_VALUE; this.minTime=UNDEFINED_VALUE; this.maxTime=UNDEFINED_VALUE; } /** * Updates the associated monitor provider object calling * updateMonitorData() method of the monitorProvider object. * @param provider to update. */ public void updateMonitorProvider(MonitorProvider provider) { provider.updateMonitorData(); } /** * Updates the associated monitor provider object. * @param stats provider to update. */ public void updateMonitorProvider(LDAPStatistics stats) { stats.updateMonitor(this); } }