public async Task CreateThresholdCheck() { var now = DateTime.UtcNow; var greater = new GreaterThreshold(value: 80F, level: CheckStatusLevel.CRIT, allValues: true, type: GreaterThreshold.TypeEnum.Greater); var lesser = new LesserThreshold(value: 20F, level: CheckStatusLevel.OK, type: LesserThreshold.TypeEnum.Lesser); var range = new RangeThreshold(min: 50F, max: 70F, level: CheckStatusLevel.WARN, within: false, type: RangeThreshold.TypeEnum.Range); var thresholds = new List <Threshold> { greater, lesser, range }; var name = GenerateName("th-check"); var threshold = await _checksApi.CreateThresholdCheckAsync(name, "from(bucket: \"foo\") |> range(start: -1d, stop: now()) |> aggregateWindow(every: 1m, fn: mean) |> filter(fn: (r) => r._field == \"usage_user\") |> yield()", "1h", "Check: ${ r._check_name } is: ${ r._level }", thresholds, _orgId); Assert.IsNotNull(threshold); Assert.AreEqual(ThresholdCheck.TypeEnum.Threshold, threshold.Type); Assert.AreEqual(3, threshold.Thresholds.Count); var greaterThreshold = (GreaterThreshold)threshold.Thresholds[0]; Assert.AreEqual(GreaterThreshold.TypeEnum.Greater, greaterThreshold.Type); Assert.AreEqual(80F, greaterThreshold.Value); Assert.AreEqual(CheckStatusLevel.CRIT, greater.Level); Assert.IsTrue(greaterThreshold.AllValues); var lesserThreshold = (LesserThreshold)threshold.Thresholds[1]; Assert.AreEqual(LesserThreshold.TypeEnum.Lesser, lesserThreshold.Type); Assert.AreEqual(20F, lesserThreshold.Value); Assert.AreEqual(CheckStatusLevel.OK, lesserThreshold.Level); Assert.IsFalse(lesserThreshold.AllValues); var rangeThreshold = (RangeThreshold)threshold.Thresholds[2]; Assert.AreEqual(RangeThreshold.TypeEnum.Range, rangeThreshold.Type); Assert.AreEqual(50F, rangeThreshold.Min); Assert.AreEqual(70F, rangeThreshold.Max); Assert.AreEqual(CheckStatusLevel.WARN, rangeThreshold.Level); Assert.IsFalse(rangeThreshold.AllValues); Assert.IsFalse(rangeThreshold.Within); Assert.IsNotEmpty(threshold.Id); Assert.AreEqual(name, threshold.Name); Assert.AreEqual(_orgId, threshold.OrgID); Assert.Greater(threshold.CreatedAt, now); Assert.Greater(threshold.UpdatedAt, now); Assert.IsNotNull(threshold.Query); Assert.AreEqual( "from(bucket: \"foo\") |> range(start: -1d, stop: now()) |> aggregateWindow(every: 1m, fn: mean) |> filter(fn: (r) => r._field == \"usage_user\") |> yield()", threshold.Query.Text); Assert.AreEqual(TaskStatusType.Active, threshold.Status); Assert.AreEqual("1h", threshold.Every); Assert.IsNull(threshold.Offset); Assert.IsNull(threshold.Tags); Assert.IsNull(threshold.Description); Assert.AreEqual("Check: ${ r._check_name } is: ${ r._level }", threshold.StatusMessageTemplate); Assert.IsEmpty(threshold.Labels); Assert.IsNotNull(threshold.Links); Assert.AreEqual($"/api/v2/checks/{threshold.Id}", threshold.Links.Self); Assert.AreEqual($"/api/v2/checks/{threshold.Id}/labels", threshold.Links.Labels); Assert.AreEqual($"/api/v2/checks/{threshold.Id}/members", threshold.Links.Members); Assert.AreEqual($"/api/v2/checks/{threshold.Id}/owners", threshold.Links.Owners); }
public async Task CreateMonitoringAndAlerting() { MockServer .Given(Request.Create().UsingGet()) .RespondWith(CreateResponse("{}", "application/json")); MockServer .Given(Request.Create().UsingPost()) .RespondWith(CreateResponse("{}", "application/json")); var org = (await _client.GetOrganizationsApi().FindOrganizationsAsync()) .First(organization => organization.Name.Equals("my-org")); var checksApi = _client.GetChecksApi(); var notificationEndpointsApi = _client.GetNotificationEndpointsApi(); var notificationRulesApi = _client.GetNotificationRulesApi(); var checks = await checksApi.FindChecksAsync(org.Id, new FindOptions()); foreach (var delete in checks._Checks.Where(ne => ne.Name.EndsWith("-IT"))) { await checksApi.DeleteCheckAsync(delete); } var rules = await notificationRulesApi.FindNotificationRulesAsync(org.Id, new FindOptions()); foreach (var delete in rules._NotificationRules.Where(ne => ne.Name.EndsWith("-IT"))) { await notificationRulesApi.DeleteNotificationRuleAsync(delete); } var endpoints = await notificationEndpointsApi.FindNotificationEndpointsAsync(org.Id, new FindOptions()); foreach (var delete in endpoints._NotificationEndpoints.Where(ne => ne.Name.EndsWith("-IT"))) { await notificationEndpointsApi.DeleteNotificationEndpointAsync(delete); } // // Create Threshold Check // // Set status to 'Critical' if the 'current' value for 'stock' measurement is lesser than '35' // var query = "from(bucket: \"my-bucket\") " + "|> range(start: v.timeRangeStart, stop: v.timeRangeStop) " + "|> filter(fn: (r) => r._measurement == \"stock\") " + "|> filter(fn: (r) => r.company == \"zyz\") " + "|> aggregateWindow(every: 5s, fn: mean) " + "|> filter(fn: (r) => r._field == \"current\") " + "|> yield(name: \"mean\")"; var threshold = new LesserThreshold(value: 35F, level: CheckStatusLevel.CRIT, type: LesserThreshold.TypeEnum.Lesser); var message = "The Stock price for XYZ is on: ${ r._level } level!"; await checksApi.CreateThresholdCheckAsync(AbstractItClientTest.GenerateName("XYZ Stock value"), query, "5s", message, threshold, org.Id); // // Create Slack Notification endpoint // var url = MockServerUrl; var endpoint = await notificationEndpointsApi.CreateSlackEndpointAsync( AbstractItClientTest.GenerateName("Slack Endpoint"), url, org.Id); // // Create Notification Rule // // Send message if the status is 'Critical' // await notificationRulesApi.CreateSlackRuleAsync( AbstractItClientTest.GenerateName("Critical status to Slack"), "10s", "${ r._message }", RuleStatusLevel.CRIT, endpoint, org.Id); // // Write Data // var now = DateTime.UtcNow; var point1 = PointData .Measurement("stock") .Tag("company", "zyz") .Field("current", 33.65) .Timestamp(now, WritePrecision.Ns); var writeApi = _client.GetWriteApi(); var listener = new WriteApiTest.EventListener(writeApi); writeApi.WritePoint("my-bucket", "my-org", point1); writeApi.Flush(); listener.WaitToSuccess(); var start = DateTime.UtcNow; while (!MockServer.LogEntries.Any() && (DateTime.UtcNow - start).TotalSeconds < 30) { Thread.Sleep(100); } var requestEntry = MockServer.LogEntries.Last(); Assert.AreEqual($"{MockServerUrl}/", requestEntry.RequestMessage.Url); var json = (JObject)requestEntry.RequestMessage.BodyAsJson; Assert.IsNotNull(json.GetValue("attachments")); var attachments = (JArray)json.GetValue("attachments"); Assert.AreEqual(1, attachments.Count); Assert.AreEqual("The Stock price for XYZ is on: crit level!", attachments[0]["text"].ToString()); }