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); } } } }