AdysTech.InfluxDB.Client.Net.InfluxDBClient.PostPointsAsync C# (CSharp) Метод

PostPointsAsync() приватный Метод

private PostPointsAsync ( string dbName, TimePrecision precision, string retention, IEnumerable points ) : Task
dbName string
precision TimePrecision
retention string
points IEnumerable
Результат Task
        private async Task<bool> PostPointsAsync (string dbName, TimePrecision precision, string retention, IEnumerable<IInfluxDatapoint> points)
        {
            Regex multiLinePattern = new Regex (@"([\P{Cc}].*?) '([\P{Cc}].*?)':([\P{Cc}].*?)\\n", RegexOptions.Compiled, TimeSpan.FromSeconds (5));
            Regex oneLinePattern = new Regex (@"{\""error"":""([9\P{Cc}]+) '([\P{Cc}]+)':([a-zA-Z0-9 ]+)", RegexOptions.Compiled, TimeSpan.FromSeconds (5));

            var line = new StringBuilder ();
            foreach (var point in points)
                line.AppendFormat ("{0}\n", point.ConvertToInfluxLineProtocol ());
            //remove last \n
            line.Remove (line.Length - 1, 1);

            ByteArrayContent requestContent = new ByteArrayContent (Encoding.UTF8.GetBytes (line.ToString ()));
            var endPoint = new Dictionary<string, string> () {
                { "db", dbName },
                { "precision", precisionLiterals[(int)precision] } };
            if (!String.IsNullOrWhiteSpace (retention))
                endPoint.Add ("rp", retention);
            HttpResponseMessage response = await PostAsync (endPoint, requestContent);

            if (response.StatusCode == HttpStatusCode.Unauthorized || response.StatusCode == HttpStatusCode.BadGateway || (response.StatusCode == HttpStatusCode.InternalServerError && response.ReasonPhrase == "INKApi Error")) //502 Connection refused
                throw new UnauthorizedAccessException ("InfluxDB needs authentication. Check uname, pwd parameters");
            //if(response.StatusCode==HttpStatusCode.NotFound)
            else if (response.StatusCode == HttpStatusCode.BadRequest)
            {
                var content = await response.Content.ReadAsStringAsync ();
                //regex assumes error text from https://github.com/influxdata/influxdb/blob/master/models/points.go ParsePointsWithPrecision
                //fmt.Sprintf("'%s': %v", string(block[start:len(block)])
                List<string> parts = null; string l = "";

                if (content.Contains ("partial write"))
                {
                    try
                    {
                        if (content.Contains ("\\n"))
                            parts = multiLinePattern.Matches (content.Substring (content.IndexOf ("partial write:\\n") + 16)).ToList ();
                        else
                            parts = oneLinePattern.Matches (content.Substring (content.IndexOf ("partial write:\\n") + 16)).ToList ();

                        if (parts[1].Contains ("\\n"))
                            l = parts[1].Substring (0, parts[1].IndexOf ("\\n")).Unescape ();
                        else
                            l = parts[1].Unescape ();
                    }
                    catch (Exception)
                    {

                    }

                    var point = points.Where (p => p.ConvertToInfluxLineProtocol () == l).FirstOrDefault ();
                    if (point != null)
                        throw new InfluxDBException ("Partial Write", $"Partial Write : {parts?[0]} due to {parts?[2]}", point);
                    else
                        throw new InfluxDBException ("Partial Write", $"Partial Write : {parts?[0]} due to {parts?[2]}", l);
                }
                else
                {
                    throw InfluxDBException.ProcessInfluxDBError (content);
                }
            }
            else if (response.StatusCode == HttpStatusCode.NoContent)
                return true;
            else
                return false;
        }
        #endregion

Same methods

InfluxDBClient::PostPointsAsync ( string dbName, IEnumerable Points ) : Task

Usage Example

        public async Task TestBachingPostPointsAsync()
        {
            try
            {
                var client = new InfluxDBClient (influxUrl, dbUName, dbpwd);

                var points = new List<IInfluxDatapoint> ();

                var today = DateTime.Now.ToShortDateString ();
                var now = DateTime.Now.ToShortTimeString ();
                var start = DateTime.Now.AddDays (-5);
                var end = DateTime.Now;

                for ( int i = 0; i < 5000; i++ )
                {
                    var valDouble = new InfluxDatapoint<double> ();
                    valDouble.UtcTimestamp = DataGen.RandomDate (start, end);
                    valDouble.Tags.Add ("TestDate", today);
                    valDouble.Tags.Add ("TestTime", now);
                    valDouble.Fields.Add ("Doublefield", DataGen.RandomDouble ());
                    valDouble.Fields.Add ("Doublefield2", DataGen.RandomDouble ());
                    valDouble.MeasurementName = measurementName;
                    valDouble.Precision = (TimePrecision) ( DataGen.RandomInt () % 6 ) + 1;

                    var valInt = new InfluxDatapoint<int> ();
                    valInt.UtcTimestamp = DataGen.RandomDate (start, end);
                    valInt.Tags.Add ("TestDate", today);
                    valInt.Tags.Add ("TestTime", now);
                    valInt.Fields.Add ("Intfield", DataGen.RandomInt ());
                    valInt.Fields.Add ("Intfield2", DataGen.RandomInt ());
                    valInt.MeasurementName = measurementName;
                    valInt.Precision = (TimePrecision) ( DataGen.RandomInt () % 6 ) + 1;

                    var valBool = new InfluxDatapoint<bool> ();
                    valBool.UtcTimestamp = DataGen.RandomDate (start, end);
                    valBool.Tags.Add ("TestDate", today);
                    valBool.Tags.Add ("TestTime", now);
                    valBool.Fields.Add ("Booleanfield", DateTime.Now.Ticks % 2 == 0);
                    valBool.MeasurementName = measurementName;
                    valBool.Precision = (TimePrecision) ( DataGen.RandomInt () % 6 ) + 1;

                    var valString = new InfluxDatapoint<string> ();
                    valString.UtcTimestamp = DataGen.RandomDate (start, end);
                    valString.Tags.Add ("TestDate", today);
                    valString.Tags.Add ("TestTime", now);
                    valString.Fields.Add ("Stringfield", DataGen.RandomString ());
                    valString.MeasurementName = measurementName;
                    valString.Precision = (TimePrecision) ( DataGen.RandomInt () % 6 ) + 1;


                    points.Add (valString);
                    points.Add (valInt);
                    points.Add (valDouble);
                    points.Add (valBool);
                }

                var r = await client.PostPointsAsync (dbName, points);
                Assert.IsTrue (points.TrueForAll (p => p.Saved == true), "PostPointsAsync did not save all points");

            }
            catch ( Exception e )
            {

                Assert.Fail ("Unexpected exception of type {0} caught: {1}",
                            e.GetType (), e.Message);
                return;
            }
        }
All Usage Examples Of AdysTech.InfluxDB.Client.Net.InfluxDBClient::PostPointsAsync