diff --git a/InfluxData.Net.Common/Constants/TimeUnit.cs b/InfluxData.Net.Common/Constants/TimeUnit.cs index e6a00fa..71835d1 100644 --- a/InfluxData.Net.Common/Constants/TimeUnit.cs +++ b/InfluxData.Net.Common/Constants/TimeUnit.cs @@ -3,20 +3,61 @@ namespace InfluxData.Net.Common.Constants /// /// Time unit used in writing data points or parsing series. /// - public static class TimeUnit + /// + + public enum TimeUnit + { + Nanoseconds = 0, + Ticks = 1, + Microseconds = 2, + Milliseconds = 3, + Seconds = 4, + Minutes = 5, + Hours = 6 + } + + public static class TimeUnitExtensions { - // NOTE: currently not supported - //public const string Nanoseconds = "n"; + public static string ToEpochFormat(this TimeUnit tu) + { + switch (tu) + { + case TimeUnit.Nanoseconds: + return "ns"; + case TimeUnit.Ticks: + return "ns"; + case TimeUnit.Microseconds: + return "u"; + case TimeUnit.Milliseconds: + return "ms"; + case TimeUnit.Seconds: + return "s"; + case TimeUnit.Minutes: + return "h"; + case TimeUnit.Hours: + return "h"; + default: + return "ns"; + } + } + } - // NOTE: currently not supported - //public const string Microseconds = "u"; + //public static class TimeUnit + //{ + // // NOTE: currently not supported + // //public const string Nanoseconds = "n"; - public const string Milliseconds = "ms"; + // // NOTE: currently not supported + // //public const string Microseconds = "u"; - public const string Seconds = "s"; + // public const string Ticks = "ticks"; - public const string Minutes = "m"; + // public const string Milliseconds = "ms"; - public const string Hours = "h"; - } + // public const string Seconds = "s"; + + // public const string Minutes = "m"; + + // public const string Hours = "h"; + //} } \ No newline at end of file diff --git a/InfluxData.Net.Common/Helpers/ObjectExtensions.cs b/InfluxData.Net.Common/Helpers/ObjectExtensions.cs index 214ee25..1915a82 100644 --- a/InfluxData.Net.Common/Helpers/ObjectExtensions.cs +++ b/InfluxData.Net.Common/Helpers/ObjectExtensions.cs @@ -28,13 +28,22 @@ public static string ToJson(this object @object) /// DateTime to convert. /// Precision (optional, defaults to milliseconds) /// Unix-style timestamp in milliseconds. - public static long ToUnixTime(this DateTime date, string precision = TimeUnit.Milliseconds) + public static long ToUnixTime(this DateTime date, TimeUnit precision = TimeUnit.Ticks) { var span = date - _epoch; double fractionalSpan; switch (precision) { + case TimeUnit.Nanoseconds: + fractionalSpan = span.Ticks * 100; + break; + case TimeUnit.Ticks: + fractionalSpan = span.Ticks * 100; + break; + case TimeUnit.Microseconds: + fractionalSpan = span.Ticks / 10; + break; case TimeUnit.Milliseconds: fractionalSpan = span.TotalMilliseconds; break; @@ -61,10 +70,12 @@ public static long ToUnixTime(this DateTime date, string precision = TimeUnit.Mi /// The unix time (expects milliseconds by default). /// Precision (optional, defaults to milliseconds) /// DateTime object. - public static DateTime FromUnixTime(this long unixTime, string precision = TimeUnit.Milliseconds) + public static DateTime FromUnixTime(this long unixTime, TimeUnit precision = TimeUnit.Ticks) { switch (precision) { + case TimeUnit.Ticks: + return _epoch.AddTicks(unixTime); case TimeUnit.Milliseconds: return _epoch.AddMilliseconds(unixTime); case TimeUnit.Seconds: diff --git a/InfluxData.Net.InfluxDb/ClientModules/BasicClientModule.cs b/InfluxData.Net.InfluxDb/ClientModules/BasicClientModule.cs index 7221ac3..dc1634f 100644 --- a/InfluxData.Net.InfluxDb/ClientModules/BasicClientModule.cs +++ b/InfluxData.Net.InfluxDb/ClientModules/BasicClientModule.cs @@ -51,14 +51,14 @@ public BasicClientModule(IInfluxDbRequestClient requestClient, IBasicResponsePar _basicResponseParser = basicResponseParser; } - public virtual async Task WriteAsync(Point point, string dbName = null, string retentionPolicy = null, string precision = TimeUnit.Milliseconds) + public virtual async Task WriteAsync(Point point, string dbName = null, string retentionPolicy = null, TimeUnit precision = TimeUnit.Ticks) { var response = await WriteAsync(new [] { point }, dbName, retentionPolicy, precision).ConfigureAwait(false); return response; } - public virtual async Task WriteAsync(IEnumerable points, string dbName = null, string retentionPolicy = null, string precision = TimeUnit.Milliseconds) + public virtual async Task WriteAsync(IEnumerable points, string dbName = null, string retentionPolicy = null, TimeUnit precision = TimeUnit.Ticks) { var request = new WriteRequest(base.RequestClient.GetPointFormatter()) { diff --git a/InfluxData.Net.InfluxDb/ClientModules/IBasicClientModule.cs b/InfluxData.Net.InfluxDb/ClientModules/IBasicClientModule.cs index 87af5da..abc122a 100644 --- a/InfluxData.Net.InfluxDb/ClientModules/IBasicClientModule.cs +++ b/InfluxData.Net.InfluxDb/ClientModules/IBasicClientModule.cs @@ -63,7 +63,7 @@ public interface IBasicClientModule /// The retention policy. /// InfluxDb time precision to use (defaults to 'ms') /// - Task WriteAsync(Point point, string dbName = null, string retentionPolicy = null, string precision = TimeUnit.Milliseconds); + Task WriteAsync(Point point, string dbName = null, string retentionPolicy = null, TimeUnit precision = TimeUnit.Ticks); /// /// Writes multiple serie points to the database. @@ -73,6 +73,6 @@ public interface IBasicClientModule /// The retention policy. /// InfluxDb time precision to use (defaults to 'ms') /// - Task WriteAsync(IEnumerable points, string dbName = null, string retentionPolicy = null, string precision = TimeUnit.Milliseconds); + Task WriteAsync(IEnumerable points, string dbName = null, string retentionPolicy = null, TimeUnit precision = TimeUnit.Ticks); } } \ No newline at end of file diff --git a/InfluxData.Net.InfluxDb/ClientModules/ISerieClientModule.cs b/InfluxData.Net.InfluxDb/ClientModules/ISerieClientModule.cs index baac28b..b6b3c85 100644 --- a/InfluxData.Net.InfluxDb/ClientModules/ISerieClientModule.cs +++ b/InfluxData.Net.InfluxDb/ClientModules/ISerieClientModule.cs @@ -90,6 +90,6 @@ public interface ISerieClientModule /// Retention policy. /// Precision. /// BatchWriter instance. - IBatchWriter CreateBatchWriter(string dbName, string retenionPolicy = null, string precision = TimeUnit.Milliseconds); + IBatchWriter CreateBatchWriter(string dbName, string retenionPolicy = null, TimeUnit precision = TimeUnit.Ticks); } } \ No newline at end of file diff --git a/InfluxData.Net.InfluxDb/ClientModules/SerieClientModule.cs b/InfluxData.Net.InfluxDb/ClientModules/SerieClientModule.cs index ba15e21..315a15b 100644 --- a/InfluxData.Net.InfluxDb/ClientModules/SerieClientModule.cs +++ b/InfluxData.Net.InfluxDb/ClientModules/SerieClientModule.cs @@ -90,7 +90,7 @@ public virtual async Task> GetFieldKeysAsync(string dbName return fieldKeys; } - public IBatchWriter CreateBatchWriter(string dbName, string retenionPolicy = null, string precision = TimeUnit.Milliseconds) + public IBatchWriter CreateBatchWriter(string dbName, string retenionPolicy = null, TimeUnit precision = TimeUnit.Ticks) { return ((IBatchWriterFactory)_batchWriter).CreateBatchWriter(dbName, retenionPolicy, precision); } diff --git a/InfluxData.Net.InfluxDb/ClientModules/SubModules/BatchWriter.cs b/InfluxData.Net.InfluxDb/ClientModules/SubModules/BatchWriter.cs index 7d5ce67..c90dc38 100644 --- a/InfluxData.Net.InfluxDb/ClientModules/SubModules/BatchWriter.cs +++ b/InfluxData.Net.InfluxDb/ClientModules/SubModules/BatchWriter.cs @@ -13,7 +13,7 @@ public class BatchWriter : IBatchWriterFactory private readonly IBasicClientModule _basicClientModule; private string _dbName; private string _retentionPolicy; - private string _precision; + private TimeUnit _precision; private int _interval; private bool _continueOnError; private bool _isRunning; @@ -42,7 +42,7 @@ internal BatchWriter(IBasicClientModule basicClientModule) /// Constructor used by BatchWriter to create new instances of BatchWriter (through the CreateBatchWriter() method) with /// IBasicClientModule from InfluxDbClient. This instance BatchWriter instance is served to the end users. /// - private BatchWriter(IBasicClientModule basicClientModule, string dbName, string retenionPolicy = null, string precision = TimeUnit.Milliseconds) + private BatchWriter(IBasicClientModule basicClientModule, string dbName, string retenionPolicy = null, TimeUnit precision = TimeUnit.Ticks) { _basicClientModule = basicClientModule; _dbName = dbName; @@ -51,7 +51,7 @@ private BatchWriter(IBasicClientModule basicClientModule, string dbName, string _pointCollection = new BlockingCollection(); } - public virtual IBatchWriter CreateBatchWriter(string dbName, string retenionPolicy = null, string precision = TimeUnit.Milliseconds) + public virtual IBatchWriter CreateBatchWriter(string dbName, string retenionPolicy = null, TimeUnit precision = TimeUnit.Ticks) { return new BatchWriter(_basicClientModule, dbName, retenionPolicy, precision); } diff --git a/InfluxData.Net.InfluxDb/ClientModules/SubModules/IBatchWriter.cs b/InfluxData.Net.InfluxDb/ClientModules/SubModules/IBatchWriter.cs index ac87adb..c5e6a98 100644 --- a/InfluxData.Net.InfluxDb/ClientModules/SubModules/IBatchWriter.cs +++ b/InfluxData.Net.InfluxDb/ClientModules/SubModules/IBatchWriter.cs @@ -71,6 +71,6 @@ internal interface IBatchWriterFactory : IBatchWriter /// Retention policy. /// Precision. /// BatchWriter instance. - IBatchWriter CreateBatchWriter(string dbName, string retenionPolicy = null, string precision = TimeUnit.Milliseconds); + IBatchWriter CreateBatchWriter(string dbName, string retenionPolicy = null, TimeUnit precision = TimeUnit.Ticks); } } \ No newline at end of file diff --git a/InfluxData.Net.InfluxDb/Formatters/IPointFormatter.cs b/InfluxData.Net.InfluxDb/Formatters/IPointFormatter.cs index ebc4c3e..65b54b4 100644 --- a/InfluxData.Net.InfluxDb/Formatters/IPointFormatter.cs +++ b/InfluxData.Net.InfluxDb/Formatters/IPointFormatter.cs @@ -6,7 +6,7 @@ namespace InfluxData.Net.InfluxDb.Formatters { public interface IPointFormatter { - string PointToString(Point point, string precision = TimeUnit.Milliseconds); + string PointToString(Point point, TimeUnit precision = TimeUnit.Ticks); Serie PointToSerie(Point point); } diff --git a/InfluxData.Net.InfluxDb/Formatters/PointFormatter.cs b/InfluxData.Net.InfluxDb/Formatters/PointFormatter.cs index e71929c..c257c5a 100644 --- a/InfluxData.Net.InfluxDb/Formatters/PointFormatter.cs +++ b/InfluxData.Net.InfluxDb/Formatters/PointFormatter.cs @@ -15,7 +15,7 @@ public class PointFormatter : IPointFormatter /// Returns a point represented in line protocol format for writing to the InfluxDb API endpoint /// /// A string that represents this instance. - public virtual string PointToString(Point point, string precision = TimeUnit.Milliseconds) + public virtual string PointToString(Point point, TimeUnit precision = TimeUnit.Ticks) { Validate.IsNotNullOrEmpty(point.Name, "measurement"); Validate.IsNotNull(point.Tags, "tags"); @@ -139,7 +139,7 @@ protected virtual string FormatPointField(string key, object value) return $"{EscapeTagOrKeyValue(key)}={result}"; } - protected virtual string FormatPointTimestamp(Point point, string precision = TimeUnit.Milliseconds) + protected virtual string FormatPointTimestamp(Point point, TimeUnit precision = TimeUnit.Ticks) { return point.Timestamp.HasValue ? point.Timestamp.Value.ToUnixTime(precision).ToString() : string.Empty; } diff --git a/InfluxData.Net.InfluxDb/Models/WriteRequest.cs b/InfluxData.Net.InfluxDb/Models/WriteRequest.cs index f42baaa..15d0bee 100644 --- a/InfluxData.Net.InfluxDb/Models/WriteRequest.cs +++ b/InfluxData.Net.InfluxDb/Models/WriteRequest.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Linq; +using InfluxData.Net.Common.Constants; using InfluxData.Net.InfluxDb.Formatters; namespace InfluxData.Net.InfluxDb.Models @@ -30,7 +31,7 @@ public WriteRequest(IPointFormatter formatter) /// /// Point data time precision. /// - public string Precision { get; set; } + public TimeUnit Precision { get; set; } /// /// Data retention policy. diff --git a/InfluxData.Net.InfluxDb/RequestClients/InfluxDbRequestClient.cs b/InfluxData.Net.InfluxDb/RequestClients/InfluxDbRequestClient.cs index 7861cd2..57564da 100644 --- a/InfluxData.Net.InfluxDb/RequestClients/InfluxDbRequestClient.cs +++ b/InfluxData.Net.InfluxDb/RequestClients/InfluxDbRequestClient.cs @@ -9,6 +9,7 @@ using InfluxData.Net.InfluxDb.Models; using InfluxData.Net.Common.Helpers; using InfluxData.Net.Common.Enums; +using InfluxData.Net.Common.Constants; namespace InfluxData.Net.InfluxDb.RequestClients { @@ -36,7 +37,7 @@ public virtual async Task PostAsync(WriteRequest writeRe { var requestParams = RequestParamsBuilder.BuildRequestParams( writeRequest.DbName, - QueryParams.Precision, writeRequest.Precision, + QueryParams.Precision, writeRequest.Precision.ToEpochFormat(), QueryParams.RetentionPolicy, writeRequest.RetentionPolicy ); var httpContent = new StringContent(writeRequest.GetLines(), Encoding.UTF8, "text/plain");