Пример #1
0
        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());
        }