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()); }
public void Write(string data) { using (WriteApi writeApi = _client.GetWriteApi()) { writeApi.WriteRecord(DB_BUCKET, DB_ORGANIZATION, InfluxDB.Client.Api.Domain.WritePrecision.Ms, data); } }
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); }
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()); }
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); }
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); }
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); }
protected override void WriteRecord(string records) { _writeApi.WriteRecord(InfluxDb2Bucket, InfluxDb2Org, InfluxDb2Precision, records); Interlocked.Increment(ref Counter); }