// This file is part of OpenTSDB. // Copyright (C) 2010-2012 The OpenTSDB Authors. // // This program is free software: you can redistribute it and/or modify it // under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 2.1 of the License, or (at your // option) any later version. This program is distributed in the hope that it // will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty // of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser // General Public License for more details. You should have received a copy // of the GNU Lesser General Public License along with this program. If not, // see <http://www.gnu.org/licenses/>. package net.opentsdb.core; import java.util.Map; import com.stumbleupon.async.Deferred; import org.hbase.async.HBaseException; /** * Represents a mutable sequence of continuous data points. * <p> * Implementations of this interface aren't expected to be synchronized. */ public interface WritableDataPoints extends DataPoints { /** * Perform a put to the database to store writable points into the data table. * <p> * @return A deferred object to wait on for the results to be fetched. */ Deferred<Object> persist(); /** * Sets the metric name and tags of the series. * <p> * This method can be called multiple times on the same instance to start * adding data points to another time series without having to create a new * instance. * @param metric A non-empty string. * @param tags The tags on this series. This map must be non-empty. * @throws IllegalArgumentException if the metric name is empty or contains * illegal characters. * @throws IllegalArgumentException if the tags list is empty or one of the * elements contains illegal characters. */ void setSeries(String metric, Map<String, String> tags); /** * Adds a {@code long} data point to the TSDB. * <p> * The data point is immediately persisted unless {@link #setBufferingTime} * is used. Data points must be added in chronological order. * @param timestamp The timestamp associated with the value. * @param value The value of the data point. * @return A deferred object that indicates the completion of the request. * The {@link Object} has not special meaning and can be {@code null} (think * of it as {@code Deferred<Void>}). But you probably want to attach at * least an errback to this {@code Deferred} to handle failures. * @throws IllegalArgumentException if the timestamp is less than or equal * to the previous timestamp added or 0 for the first timestamp, or if the * difference with the previous timestamp is too large. * @throws HBaseException (deferred) if there was a problem while persisting * data. */ Deferred<Object> addPoint(long timestamp, long value); /** * Appends a {@code float} data point to this sequence. * <p> * The data point is immediately persisted unless {@link #setBufferingTime} * is used. Data points must be added in chronological order. * @param timestamp The timestamp associated with the value. * @param value The value of the data point. * @return A deferred object that indicates the completion of the request. * The {@link Object} has not special meaning and can be {@code null} (think * of it as {@code Deferred<Void>}). But you probably want to attach at * least an errback to this {@code Deferred} to handle failures. * @throws IllegalArgumentException if the timestamp is less than or equal * to the previous timestamp added or 0 for the first timestamp, or if the * difference with the previous timestamp is too large. * @throws IllegalArgumentException if the value is {@code NaN} or * {@code Infinite}. * @throws HBaseException (deferred) if there was a problem while persisting * data. */ Deferred<Object> addPoint(long timestamp, float value); /** * Specifies for how long to buffer edits, in milliseconds. * <p> * By calling this method, you're allowing new data points to be buffered * before being sent to HBase. {@code 0} (the default) means data points * are persisted immediately. * <p> * Buffering improves performance, reduces the number of RPCs sent to HBase, * but can cause data loss if we die before we get a chance to send buffered * edits to HBase. It also entails that buffered data points aren't visible * to other applications using the TSDB until they're flushed to HBase. * @param time The approximate maximum number of milliseconds for which data * points should be buffered before being sent to HBase. This deadline will * be honored on a "best effort" basis. */ void setBufferingTime(short time); /** * Specifies whether or not this is a batch import. * <p> * It is preferred that this method be called for anything importing a batch * of data points (as opposed to streaming in new data points in real time). * <p> * Calling this method changes a few important things: * <ul> * <li>Data points may not be persisted immediately. In the event of an * outage in HBase during or slightly after the import, un-persisted data * points will be lost.</li> * <li>{@link #setBufferingTime} may be called with an argument * chosen by the implementation.</li> * </ul> * @param batchornot if true, then this is a batch import. */ void setBatchImport(boolean batchornot); }