Example #1
0
        public static string InfluxCon(LineProtocolConnectionParameters conobj, string query)
        {
            var client      = new WebClient();
            var queryString = Uri.EscapeUriString("db=" + Uri.EscapeDataString(conobj.DBName) + "&q=" + query);//SELECT * FROM \"weather\"");
            var queryUrl    = conobj.Address + "query?" + queryString;

            return(client.DownloadString(queryUrl));
        }
        /// <summary>
        /// InfluxClient Constructor. The constructor expects LineProtocolConnectionParameters in params. It does initialization of HTTP Client and HTTP Client Handler.
        /// It also does initialization of worker buffer and failure handler buffer.
        /// </summary>
        /// <param name="paramsObj">The reference of Line Protocol Connection parameters.</param>
        /// <returns>returns instance of InfluxClient</returns>
        public InfluxClient(LineProtocolConnectionParameters paramsObj)
        {
            //1. populate necessary fields for Influx Connection

            //create HTTP Client for connection to Influx
            _httpClientHandler = new HttpClientHandler {
                AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate
            };
            _httpClient = new HttpClient(_httpClientHandler)
            {
                BaseAddress = paramsObj.Address
            };

            //Create Influx POST request URL
            _requestUri = $"write?db={Uri.EscapeDataString(paramsObj.DBName)}";
            if (!string.IsNullOrEmpty(paramsObj.User))
            {
                _requestUri += $"&u={Uri.EscapeDataString(paramsObj.User)}&p={Uri.EscapeDataString(paramsObj.Password)}";
            }


            //2. populate necessary fields for buffer ( Using reactive Programming Rx )

            //Create Subject for first buffer (worker buffer)
            Subject <string> subject = new Subject <string>();

            _synSubject = Subject.Synchronize(subject);

            //Create first buffer ( worker buffer) with provided buffer flush time or buffer item limit for flush
            _subscription = _synSubject
                            .Buffer(TimeSpan.FromSeconds(paramsObj.FlushBufferSeconds), paramsObj.FlushBufferItemsSize)
                            .Subscribe(onNext: async(pointsList) => await SendToInflux(pointsList, true));



            //Second buffer in case first fails. If requests fail in first buffer it will queue in 2nd buffer
            //Create Subject for second buffer (failure handler buffer)
            Subject <string> subjectSecondQueue = new Subject <string>();

            _synSubjectSecondQueue = Subject.Synchronize(subjectSecondQueue);

            //Create second buffer ( failure handler buffer) with provided buffer flush time or buffer item limit for flush
            _subscriptionSecondQueue = _synSubjectSecondQueue
                                       .Buffer(TimeSpan.FromSeconds(paramsObj.FlushSecondBufferSeconds), paramsObj.FlushSecondBufferItemsSize)
                                       .Subscribe(onNext: async(pointsListSecondQueue) => await SendToInflux(pointsListSecondQueue, false));
        }
        public static LineProtocolConnectionParameters InitConfiguration()
        {
            var confFileobj = new LineProtocolConnectionParameters
            {
                Address                    = new Uri("http://influxdb:8086"),
                DBName                     = "telemetry",
                User                       = "",
                Password                   = "",
                FlushBufferItemsSize       = 2,
                FlushBufferSeconds         = 2,
                FlushSecondBufferItemsSize = 2,
                FlushSecondBufferSeconds   = 3,
                UseGzipCompression         = true
            };


            return(confFileobj);
        }