Exemple #1
0
        public async Task Recovery()
        {
            var bucketName = _bucket.Name;

            _writeApi = Client.GetWriteApi();
            var listener = new WriteApiTest.EventListener(_writeApi);

            _writeApi.WriteRecord(bucketName, _organization.Id, WritePrecision.Ns,
                                  "h2o_feet,location=coyote_creek level\\ water_level=1.0 1x");
            _writeApi.Flush();

            var error = listener.Get <WriteErrorEvent>();

            Assert.IsNotNull(error);
            Assert.AreEqual(
                "unable to parse 'h2o_feet,location=coyote_creek level\\ water_level=1.0 1x': bad timestamp",
                error.Exception.Message);

            _writeApi.WriteRecord(bucketName, _organization.Id, WritePrecision.Ns,
                                  "h2o_feet,location=coyote_creek level\\ water_level=1.0 1");
            _writeApi.Flush();

            listener.Get <WriteSuccessEvent>();

            var query = await _queryApi.QueryAsync(
                $"from(bucket:\"{bucketName}\") |> range(start: 1970-01-01T00:00:00.000000001Z)",
                _organization.Id);

            Assert.AreEqual(1, query.Count);
            Assert.AreEqual(1, query[0].Records.Count);
            Assert.AreEqual("coyote_creek", query[0].Records[0].GetValueByKey("location"));
            Assert.AreEqual("level water_level", query[0].Records[0].GetValueByKey("_field"));
            Assert.AreEqual(1, query[0].Records[0].GetValue());
        }
Exemple #2
0
 public void Write(string data)
 {
     using (WriteApi writeApi = _client.GetWriteApi())
     {
         writeApi.WriteRecord(DB_BUCKET, DB_ORGANIZATION, InfluxDB.Client.Api.Domain.WritePrecision.Ms, data);
     }
 }
Exemple #3
0
        public async Task Jitter()
        {
            var bucketName = _bucket.Name;

            var writeOptions = WriteOptions.CreateNew().BatchSize(1).JitterInterval(5_000).Build();

            _writeApi = Client.GetWriteApi(writeOptions);

            var record = "h2o_feet,location=coyote_creek level\\ water_level=1.0 1";

            _writeApi.WriteRecord(bucketName, _organization.Id, WritePrecision.Ns, record);

            var query = await _queryApi.QueryAsync(
                $"from(bucket:\"{bucketName}\") |> range(start: 1970-01-01T00:00:00.000000001Z)",
                _organization.Id);

            Assert.AreEqual(0, query.Count);

            Thread.Sleep(5_000);

            query = await _queryApi.QueryAsync(
                $"from(bucket:\"{bucketName}\") |> range(start: 1970-01-01T00:00:00.000000001Z)",
                _organization.Id);

            Assert.AreEqual(1, query.Count);
        }
Exemple #4
0
        public async Task Flush()
        {
            var bucketName = _bucket.Name;

            var writeOptions = WriteOptions.CreateNew().BatchSize(10).FlushInterval(100_000).Build();

            _writeApi = Client.GetWriteApi(writeOptions);
            var listener = new WriteApiTest.EventListener(_writeApi);

            var record = "h2o_feet,location=coyote_creek level\\ water_level=1.0 1";

            _writeApi.WriteRecord(bucketName, _organization.Id, WritePrecision.Ns, record);
            _writeApi.Flush();
            listener.WaitToSuccess();

            var query = await _queryApi.QueryAsync(
                $"from(bucket:\"{bucketName}\") |> range(start: 1970-01-01T00:00:00.000000001Z)",
                _organization.Id);

            Assert.AreEqual(1, query.Count);

            var records = query[0].Records;

            Assert.AreEqual(1, records.Count);
            Assert.AreEqual("h2o_feet", records[0].GetMeasurement());
            Assert.AreEqual(1, records[0].GetValue());
            Assert.AreEqual("level water_level", records[0].GetField());

            var instant = Instant.Add(Instant.FromUnixTimeMilliseconds(0), Duration.FromNanoseconds(1L));

            Assert.AreEqual(instant, records[0].GetTime());
        }
Exemple #5
0
        public async Task FlushByOne()
        {
            var bucketName = _bucket.Name;

            var writeOptions = WriteOptions.CreateNew().BatchSize(1).FlushInterval(500_000).Build();

            _writeApi = Client.GetWriteApi(writeOptions);

            var eventListener = new WriteApiTest.EventListener(_writeApi);

            const string record1 = "h2o_feet,location=coyote_creek level\\ water_level=1.0 1";
            const string record2 = "h2o_feet,location=coyote_creek level\\ water_level=2.0 2";
            const string record3 = "h2o_feet,location=coyote_creek level\\ water_level=3.0 3";
            const string record4 = "h2o_feet,location=coyote_creek level\\ water_level=4.0 4";
            const string record5 = "h2o_feet,location=coyote_creek level\\ water_level=5.0 5";

            _writeApi.WriteRecord(bucketName, _organization.Id, WritePrecision.Ns, record1);
            Thread.Sleep(100);
            _writeApi.WriteRecord(bucketName, _organization.Id, WritePrecision.Ns, record2);
            Thread.Sleep(100);
            _writeApi.WriteRecord(bucketName, _organization.Id, WritePrecision.Ns, record3);
            Thread.Sleep(100);
            _writeApi.WriteRecord(bucketName, _organization.Id, WritePrecision.Ns, record4);
            Thread.Sleep(100);
            _writeApi.WriteRecord(bucketName, _organization.Id, WritePrecision.Ns, record5);
            Thread.Sleep(100);

            Assert.AreEqual(record1, eventListener.Get <WriteSuccessEvent>().LineProtocol);
            Assert.AreEqual(record2, eventListener.Get <WriteSuccessEvent>().LineProtocol);
            Assert.AreEqual(record3, eventListener.Get <WriteSuccessEvent>().LineProtocol);
            Assert.AreEqual(record4, eventListener.Get <WriteSuccessEvent>().LineProtocol);
            Assert.AreEqual(record5, eventListener.Get <WriteSuccessEvent>().LineProtocol);

            var query = await _queryApi.QueryAsync(
                $"from(bucket:\"{bucketName}\") |> range(start: 1970-01-01T00:00:00.000000000Z)",
                _organization.Id);

            Assert.AreEqual(1, query.Count);

            var records = query[0].Records;

            Assert.AreEqual(5, records.Count);
            Assert.AreEqual(0, eventListener.EventCount());
        }
        public void RetryContainsMessage()
        {
            MockServer.Reset();
            _writeApi.Dispose();

            const string json = "{\"code\":\"too many requests\"," +
                                "\"message\":\"org 04014de4ed590000 has exceeded limited_write plan limit\"}";
            var response = CreateResponse(
                json,
                "application/json")
                           .WithHeader("Retry-After", "5")
                           .WithStatusCode(429);

            MockServer
            .Given(Request.Create().WithPath("/api/v2/write").UsingPost())
            .InScenario("RetryWithRetryAfter")
            .WillSetStateTo("RetryWithRetryAfter Started")
            .RespondWith(response);

            MockServer
            .Given(Request.Create().WithPath("/api/v2/write").UsingPost())
            .InScenario("RetryWithRetryAfter")
            .WhenStateIs("RetryWithRetryAfter Started")
            .WillSetStateTo("RetryWithRetryAfter Finished")
            .RespondWith(CreateResponse("{}"));

            var options = WriteOptions.CreateNew()
                          .BatchSize(1)
                          .RetryInterval(100)
                          .MaxRetries(1)
                          .Build();

            _writeApi = _influxDbClient.GetWriteApi(options);

            var listener = new EventListener(_writeApi);

            var writer = new StringWriter();

            Trace.Listeners.Add(new TextWriterTraceListener(writer));

            _writeApi.WriteRecord("b1", "org1", WritePrecision.Ns,
                                  "h2o_feet,location=coyote_creek level\\ description=\"feet 1\",water_level=1.0 1");

            // One attempt
            listener.Get <WriteRetriableErrorEvent>();

            const string message = "The retriable error occurred during writing of data. " +
                                   "Reason: 'org 04014de4ed590000 has exceeded limited_write plan limit'. " +
                                   "Retry in: 5s.";

            StringAssert.Contains(message, writer.ToString());
        }
        public void Retry()
        {
            var listener = new EventListener(_writeApi);

            MockServer
            .Given(Request.Create().WithPath("/api/v2/write").UsingPost())
            .InScenario("Retry")
            .WillSetStateTo("Retry Started")
            .RespondWith(CreateResponse("token is temporarily over quota", 429));

            MockServer
            .Given(Request.Create().WithPath("/api/v2/write").UsingPost())
            .InScenario("Retry")
            .WhenStateIs("Retry Started")
            .WillSetStateTo("Retry Finished")
            .RespondWith(CreateResponse("{}"));

            _writeApi.WriteRecord("b1", "org1", WritePrecision.Ns,
                                  "h2o_feet,location=coyote_creek level\\ description=\"feet 1\",water_level=1.0 1");

            //
            // First request got Retry exception
            //
            var retriableErrorEvent = listener.Get <WriteRetriableErrorEvent>();

            Assert.AreEqual("token is temporarily over quota", retriableErrorEvent.Exception.Message);
            Assert.AreEqual(429, ((HttpException)retriableErrorEvent.Exception).Status);
            Assert.AreEqual(1000, retriableErrorEvent.RetryInterval);

            //
            // Second request success
            //
            var writeSuccessEvent = listener.Get <WriteSuccessEvent>();

            Assert.AreEqual("h2o_feet,location=coyote_creek level\\ description=\"feet 1\",water_level=1.0 1",
                            writeSuccessEvent.LineProtocol);

            Assert.AreEqual(2, MockServer.LogEntries.Count());

            Assert.AreEqual($"{MockServer.Urls[0]}/api/v2/write?org=org1&bucket=b1&precision=ns",
                            MockServer.LogEntries.ToList()[0].RequestMessage.Url);
            Assert.AreEqual("h2o_feet,location=coyote_creek level\\ description=\"feet 1\",water_level=1.0 1",
                            MockServer.LogEntries.ToList()[0].RequestMessage.Body);

            Assert.AreEqual($"{MockServer.Urls[0]}/api/v2/write?org=org1&bucket=b1&precision=ns",
                            MockServer.LogEntries.ToList()[1].RequestMessage.Url);
            Assert.AreEqual("h2o_feet,location=coyote_creek level\\ description=\"feet 1\",water_level=1.0 1",
                            MockServer.LogEntries.ToList()[1].RequestMessage.Body);
        }
Exemple #8
0
        public void ListenWriteErrorEvent()
        {
            var bucketName = _bucket.Name;

            _writeApi = Client.GetWriteApi();
            var listener = new WriteApiTest.EventListener(_writeApi);

            _writeApi.WriteRecord(bucketName, _organization.Id, WritePrecision.Ns,
                                  "h2o_feet,location=coyote_creek level\\ water_level=1.0 123456.789");
            _writeApi.Flush();

            var error = listener.Get <WriteErrorEvent>();

            Assert.IsNotNull(error);
            Assert.AreEqual(
                "unable to parse 'h2o_feet,location=coyote_creek level\\ water_level=1.0 123456.789': bad timestamp",
                error.Exception.Message);
        }
Exemple #9
0
        public void ListenWriteSuccessEvent()
        {
            var bucketName = _bucket.Name;

            _writeApi = Client.GetWriteApi();
            var listener = new WriteApiTest.EventListener(_writeApi);

            _writeApi.WriteRecord(bucketName, _organization.Id, WritePrecision.Ns,
                                  "h2o_feet,location=coyote_creek level\\ water_level=1.0 1");
            _writeApi.Flush();

            var success = listener.Get <WriteSuccessEvent>();

            Assert.IsNotNull(success);
            Assert.AreEqual(success.Organization, _organization.Id);
            Assert.AreEqual(success.Bucket, bucketName);
            Assert.AreEqual(success.Precision, WritePrecision.Ns);
            Assert.AreEqual(success.LineProtocol, "h2o_feet,location=coyote_creek level\\ water_level=1.0 1");
        }
        public void ListenWriteErrorEvent()
        {
            var bucketName = _bucket.Name;

            WriteErrorEvent error = null;

            _writeApi = Client.GetWriteApi();
            _writeApi.EventHandler += (sender, args) => { error = args as WriteErrorEvent; };

            _writeApi.WriteRecord(bucketName, _organization.Id, WritePrecision.Ns,
                                  "h2o_feet,location=coyote_creek level\\ water_level=1.0 123456.789");
            _writeApi.Flush();

            Thread.Sleep(100);

            Assert.IsNotNull(error);
            Assert.AreEqual(
                "unable to parse points: unable to parse 'h2o_feet,location=coyote_creek level\\ water_level=1.0 123456.789': bad timestamp",
                error.Exception.Message);
        }
        public void ListenWriteSuccessEvent()
        {
            var bucketName = _bucket.Name;

            WriteSuccessEvent success = null;

            _writeApi = Client.GetWriteApi();
            _writeApi.EventHandler += (sender, args) => { success = args as WriteSuccessEvent; };

            _writeApi.WriteRecord(bucketName, _organization.Id, WritePrecision.Ns,
                                  "h2o_feet,location=coyote_creek level\\ water_level=1.0 1");
            _writeApi.Flush();

            Thread.Sleep(100);

            Assert.IsNotNull(success);
            Assert.AreEqual(success.Organization, _organization.Id);
            Assert.AreEqual(success.Bucket, bucketName);
            Assert.AreEqual(success.Precision, WritePrecision.Ns);
            Assert.AreEqual(success.LineProtocol, "h2o_feet,location=coyote_creek level\\ water_level=1.0 1");
        }
        public void RetryOnNetworkError()
        {
            MockServer.Stop();
            _writeApi.Dispose();

            var options = WriteOptions.CreateNew()
                          .BatchSize(1)
                          .MaxRetryDelay(2_000)
                          .MaxRetries(3)
                          .Build();

            _writeApi = _influxDbClient.GetWriteApi(options);

            var listener = new EventListener(_writeApi);

            _writeApi.WriteRecord("b1", "org1", WritePrecision.Ns,
                                  "h2o_feet,location=coyote_creek level\\ description=\"feet 1\",water_level=1.0 1");

            // Three attempts
            listener.Get <WriteRetriableErrorEvent>();
            listener.Get <WriteRetriableErrorEvent>();
            listener.Get <WriteRetriableErrorEvent>();
        }
        public async Task FlushByCount()
        {
            var bucketName = _bucket.Name;

            var writeOptions = WriteOptions.CreateNew().BatchSize(6).FlushInterval(500_000).Build();

            _writeApi = Client.GetWriteApi(writeOptions);

            var listener = new WriteApiTest.EventListener(_writeApi);

            const string record1 = "h2o_feet,location=coyote_creek level\\ water_level=1.0 1";
            const string record2 = "h2o_feet,location=coyote_creek level\\ water_level=2.0 2";
            const string record3 = "h2o_feet,location=coyote_creek level\\ water_level=3.0 3";
            const string record4 = "h2o_feet,location=coyote_creek level\\ water_level=4.0 4";
            const string record5 = "h2o_feet,location=coyote_creek level\\ water_level=5.0 5";
            const string record6 = "h2o_feet,location=coyote_creek level\\ water_level=6.0 6";

            _writeApi.WriteRecord(bucketName, _organization.Id, WritePrecision.Ns, record1);
            _writeApi.WriteRecord(bucketName, _organization.Id, WritePrecision.Ns, record2);
            _writeApi.WriteRecord(bucketName, _organization.Id, WritePrecision.Ns, record3);
            _writeApi.WriteRecord(bucketName, _organization.Id, WritePrecision.Ns, record4);
            _writeApi.WriteRecord(bucketName, _organization.Id, WritePrecision.Ns, record5);

            var query = await _queryApi.Query(
                "from(bucket:\"" + bucketName + "\") |> range(start: 1970-01-01T00:00:00.000000001Z)",
                _organization.Id);

            Assert.AreEqual(0, query.Count);

            _writeApi.WriteRecord(bucketName, _organization.Id, WritePrecision.Ns, record6);

            listener.Get <WriteSuccessEvent>();

            query = await _queryApi.Query(
                "from(bucket:\"" + bucketName + "\") |> range(start: 1970-01-01T00:00:00.000000001Z)",
                _organization.Id);

            Assert.AreEqual(1, query.Count);

            var records = query[0].Records;

            Assert.AreEqual(6, records.Count);
        }
Exemple #14
0
 protected override void WriteRecord(string records)
 {
     _writeApi.WriteRecord(InfluxDb2Bucket, InfluxDb2Org, InfluxDb2Precision, records);
     Interlocked.Increment(ref Counter);
 }