AdysTech.InfluxDB.Client.Net.InfluxDBClient.QueryMultiSeriesAsync C# (CSharp) Method

QueryMultiSeriesAsync() public method

Queries Influx DB and gets a time series data back. Ideal for fetching measurement values. The return list is of InfluxSeries, and each element in there will have properties named after columns in series
public QueryMultiSeriesAsync ( string dbName, string measurementQuery, TimePrecision precision = TimePrecision.Nanoseconds ) : Task>
dbName string Name of the database
measurementQuery string Query text, Only results with single series are supported for now
precision TimePrecision epoch precision of the data set
return Task>
        public async Task<List<IInfluxSeries>> QueryMultiSeriesAsync (string dbName, string measurementQuery, TimePrecision precision = TimePrecision.Nanoseconds)
        {
            var response = await GetAsync (new Dictionary<string, string> () { { "db", dbName }, { "q", measurementQuery }, { "epoch", precisionLiterals[(int) precision] } });
            if (response.StatusCode == HttpStatusCode.OK)
            {
                var results = new List<IInfluxSeries> ();
                var rawResult = JsonConvert.DeserializeObject<InfluxResponse> (await response.Content.ReadAsStringAsync ());

                if (rawResult?.Results?.Count > 1)
                    throw new ArgumentException ("The query is resulting in a format, which is not supported by this method yet");

                if (rawResult?.Results[0]?.Series != null)
                {
                    foreach (var series in rawResult?.Results[0]?.Series)
                    {
                        var result = new InfluxSeries ();
                        result.HasEntries = false;
                        results.Add (result);
                        result.SeriesName = series.Name;
                        result.Tags = series.Tags;
                        var entries = new List<dynamic> ();
                        for (var row = 0; row < series?.Values?.Count; row++)
                        {
                            result.HasEntries = true;
                            dynamic entry = new ExpandoObject ();
                            entries.Add (entry);
                            for (var col = 0; col < series.Columns.Count; col++)
                            {
                                var header = char.ToUpper (series.Columns[col][0]) + series.Columns[col].Substring (1);

                                if (header == "Time")
                                    ((IDictionary<string, object>) entry).Add (header, EpochHelper.FromEpoch (series.Values[row][col], precision));
                                else
                                    ((IDictionary<string, object>) entry).Add (header, series.Values[row][col]);
                            }
                        }
                        result.Entries = entries;
                    }
                }
                return results;
            }
            return null;
        }

Usage Example

        public async Task <double> SumTheWaterLevel(string endpoint, string database)
        {
            var client = new InfluxDBClient(endpoint);

            var query = "SELECT water_level FROM h2o_feet";

            var results = await client.QueryMultiSeriesAsync(database, query);

            var serie = results.Single();

            double total = 0;

            foreach (dynamic entry in serie.Entries)
            {
                // Not sure why but water_level comes back as a string.
                total += double.Parse(entry.Water_level);
            }

            return(total);
        }