using System;
using System.Reactive.Concurrency;
using InfluxDB.Client.Core;
namespace InfluxDB.Client
{
///
/// WriteOptions are used to configure writes the data point into InfluxDB 2.x.
///
///
///The default setting use the batching configured to (consistent with Telegraf):
///
/// - batchSize1000
/// - flushInterval1000 ms
/// - retryInterval5000 ms
/// - jitterInterval0
///
///
///
///
public class WriteOptions
{
private const int DefaultBatchSize = 1000;
private const int DefaultFlushInterval = 1000;
private const int DefaultJitterInterval = 0;
private const int DefaultRetryInterval = 5000;
private const int DefaultMaxRetries = 5;
private const int DefaultMaxRetryDelay = 125_000;
private const int DefaultExponentialBase = 2;
private int _batchSize;
private int _flushInterval;
private int _jitterInterval;
private int _retryInterval;
private int _maxRetries;
private int _maxRetryDelay;
private int _exponentialBase;
private IScheduler _writeScheduler;
///
/// The number of data point to collect in batch.
///
///
public int BatchSize
{
get => _batchSize;
set
{
Arguments.CheckPositiveNumber(value, "batchSize");
_batchSize = value;
}
}
///
/// The time to wait at most (milliseconds).
///
///
public int FlushInterval
{
get => _flushInterval;
set
{
Arguments.CheckPositiveNumber(value, "flushInterval");
_flushInterval = value;
}
}
///
/// The batch flush jitter interval value (milliseconds).
///
///
public int JitterInterval
{
get => _jitterInterval;
set
{
Arguments.CheckNotNegativeNumber(value, "jitterInterval");
_jitterInterval = value;
}
}
///
/// The time to wait before retry unsuccessful write (milliseconds).
///
/// The retry interval is used when the InfluxDB server does not specify "Retry-After" header.
///
///
/// Retry-After: A non-negative decimal integer indicating the seconds to delay after the response is received.
///
///
///
public int RetryInterval
{
get => _retryInterval;
set
{
Arguments.CheckPositiveNumber(value, "retryInterval");
_retryInterval = value;
}
}
///
/// The number of max retries when write fails.
///
///
public int MaxRetries
{
get => _maxRetries;
set
{
Arguments.CheckPositiveNumber(value, "MaxRetries");
_maxRetries = value;
}
}
///
/// The maximum delay between each retry attempt in milliseconds.
///
///
public int MaxRetryDelay
{
get => _maxRetryDelay;
set
{
Arguments.CheckPositiveNumber(value, "MaxRetryDelay");
_maxRetryDelay = value;
}
}
///
/// The base for the exponential retry delay.
///
///
public int ExponentialBase
{
get => _exponentialBase;
set
{
Arguments.CheckPositiveNumber(value, "ExponentialBase");
_exponentialBase = value;
}
}
///
/// Set the scheduler which is used for write data points.
///
///
public IScheduler WriteScheduler
{
get => _writeScheduler;
set
{
Arguments.CheckNotNull(value, "Write scheduler");
_writeScheduler = value;
}
}
///
/// Create an instance of WriteOptions.
///
/// WriteOptions properties and their default values:
///
/// - BatchSize: 1000
/// - FlushInterval: 1000(ms)
/// - JitterInterval: 0
/// - RetryInterval: 5000(ms)
/// - MaxRetries: 5
/// - MaxRetryDelay: 125_000
/// - ExponentialBase: 2
///
///
///
public WriteOptions()
{
_batchSize = DefaultBatchSize;
_flushInterval = DefaultFlushInterval;
_jitterInterval = DefaultJitterInterval;
_retryInterval = DefaultRetryInterval;
_maxRetries = DefaultMaxRetries;
_maxRetryDelay = DefaultMaxRetryDelay;
_exponentialBase = DefaultExponentialBase;
_writeScheduler = ThreadPoolScheduler.Instance;
}
private WriteOptions(Builder builder)
{
Arguments.CheckNotNull(builder, "builder");
BatchSize = builder.BatchSizeBuilder;
FlushInterval = builder.FlushIntervalBuilder;
JitterInterval = builder.JitterIntervalBuilder;
RetryInterval = builder.RetryIntervalBuilder;
MaxRetries = builder.MaxRetriesBuilder;
MaxRetryDelay = builder.MaxRetryDelayBuilder;
ExponentialBase = builder.ExponentialBaseBuilder;
WriteScheduler = builder.WriteSchedulerBuilder;
}
///
/// Create a builder.
///
/// builder
public static Builder CreateNew()
{
return new Builder();
}
public sealed class Builder
{
internal int BatchSizeBuilder = DefaultBatchSize;
internal int FlushIntervalBuilder = DefaultFlushInterval;
internal int JitterIntervalBuilder = DefaultJitterInterval;
internal int RetryIntervalBuilder = DefaultRetryInterval;
internal int MaxRetriesBuilder = DefaultMaxRetries;
internal int MaxRetryDelayBuilder = DefaultMaxRetryDelay;
internal int ExponentialBaseBuilder = DefaultExponentialBase;
internal IScheduler WriteSchedulerBuilder = ThreadPoolScheduler.Instance;
///
/// Set the number of data point to collect in batch.
///
/// the number of data point to collect in batch
/// this
public Builder BatchSize(int batchSize)
{
Arguments.CheckPositiveNumber(batchSize, "batchSize");
BatchSizeBuilder = batchSize;
return this;
}
///
/// Set the time to wait at most (milliseconds).
///
/// the time to wait at most (milliseconds).
/// this
public Builder FlushInterval(int milliseconds)
{
Arguments.CheckPositiveNumber(milliseconds, "flushInterval");
FlushIntervalBuilder = milliseconds;
return this;
}
///
/// Jitters the batch flush interval by a random amount.
/// This is primarily to avoid large write spikes for users running a large number of client instances.
/// ie, a jitter of 5s and flush duration 10s means flushes will happen every 10-15s.
///
/// Jitter interval in milliseconds
/// this
public Builder JitterInterval(int milliseconds)
{
Arguments.CheckNotNegativeNumber(milliseconds, "jitterInterval");
JitterIntervalBuilder = milliseconds;
return this;
}
///
/// Set the the time to wait before retry unsuccessful write (milliseconds).
///
/// The retry interval is used when the InfluxDB server does not specify "Retry-After" header.
///
///
/// Retry-After: A non-negative decimal integer indicating the seconds to delay after the response is received.
///
///
/// the time to wait before retry unsuccessful write
/// this
public Builder RetryInterval(int milliseconds)
{
Arguments.CheckPositiveNumber(milliseconds, "retryInterval");
RetryIntervalBuilder = milliseconds;
return this;
}
///
/// The number of max retries when write fails.
///
/// number of max retries
/// this
public Builder MaxRetries(int count)
{
Arguments.CheckPositiveNumber(count, "MaxRetries");
MaxRetriesBuilder = count;
return this;
}
///
/// The maximum delay between each retry attempt in milliseconds.
///
/// maximum delay
/// this
public Builder MaxRetryDelay(int milliseconds)
{
Arguments.CheckPositiveNumber(milliseconds, "MaxRetryDelay");
MaxRetryDelayBuilder = milliseconds;
return this;
}
///
/// The base for the exponential retry delay.
///
/// exponential base
/// this
public Builder ExponentialBase(int exponentialBase)
{
Arguments.CheckPositiveNumber(exponentialBase, "ExponentialBase");
ExponentialBaseBuilder = exponentialBase;
return this;
}
///
/// Set the scheduler which is used for write data points. It is useful for disabling batch writes or
/// for tuning the performance. Default value is
///
///
///
public Builder WriteScheduler(IScheduler writeScheduler)
{
Arguments.CheckNotNull(writeScheduler, "Write scheduler");
WriteSchedulerBuilder = writeScheduler;
return this;
}
///
/// Build an instance of WriteOptions.
///
///
/// Deprecated - please use use object initializer
[Obsolete("This method is deprecated. Call 'WriteOptions' initializer instead.", false)]
public WriteOptions Build()
{
return new WriteOptions(this);
}
}
}
}