| New file |
| | |
| | | /* |
| | | * 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); |
| | | } |
| | | } |