Esempio n. 1
0
        public IEnumerable<DataDogEvent> Convert(INimatorResult result)
        {
            if (!result.LayerResults.Any())
            {
                yield return ConvertToDataDogEvent(result.Level, 
                    result.GetFirstFailedLayerName(), 
                    result.GetFirstFailedCheckName(), 
                    result.Message, result.RenderPlainText(settings.Threshold));
                yield break;
            }

            var layerResults = result.LayerResults.Where(l => l?.Level >= settings.Threshold);

            foreach (var layerResult in layerResults)
            {
                var layerName = layerResult.LayerName;
                var checkResults = layerResult.CheckResults.Where(c => c?.Level >= settings.Threshold);

                foreach (var checkResult in checkResults)
                {
                    yield return ConvertToDataDogEvent(checkResult.Level, 
                        layerName, 
                        checkResult.CheckName, 
                        checkResult.RenderPlainText());
                }
            }
        }
Esempio n. 2
0
        /// <inheritdoc/>
        public OpsGenieAlertRequest Convert(INimatorResult result)
        {
            if (result == null)
            {
                throw new ArgumentNullException(nameof(result));
            }

            var message = string.IsNullOrEmpty(result.Message) ?
                          "Unknown message" :
                          result.Message.Truncate(MaxOpsgenieMessageLength);

            var failingLayerName = result.GetFirstFailedLayerName() ?? "UnknownLayer";

            return(new OpsGenieAlertRequest(message)
            {
                Alias = "nimator-failure",
                Description = result.RenderPlainText(settings.Threshold).Truncate(MaxOpsgenieDescriptionLength),
                Responders = new[]
                {
                    new OpsGenieResponder
                    {
                        Type = OpsGenieResponderType.Team,
                        Name = settings.TeamName
                    }
                },
                Tags = new[] { "Nimator", failingLayerName.Truncate(MaxOpsgenieTagLength) }
            });
        }
Esempio n. 3
0
 public void Notify(INimatorResult result)
 {
     if (result.Level >= settings.Threshold)
     {
         writeLine(result.RenderPlainText(settings.Threshold));
     }
 }
        public void IntegrationWithDatabaseAndNimator()
        {
            //Arrange
            var logger   = A.Dummy <ILog>();
            var notifier = A.Fake <INotifier>();

            NotifierMockSettings.Notifier = notifier;
            var nimatorSettingsJson = EmbeddedResource.Read("config.json");
            var nimator             = Nimator.FromSettings(logger, nimatorSettingsJson);

            INimatorResult nimatorResult = null;

            A.CallTo(() => notifier.Notify(A <INimatorResult> ._))
            .Invokes(call => nimatorResult = (INimatorResult)call.Arguments[0]);

            //Act
            nimator.TickSafe(logger);

            //Assert
            nimatorResult.Should().NotBeNull();
            A.CallTo(() => notifier.Notify(A <INimatorResult> ._)).MustHaveHappened();
            nimatorResult.Level.Should()
            .Be(NotificationLevel.Warning);
            var layerResult = nimatorResult.LayerResults.Should().ContainSingle().Subject;

            layerResult.CheckResults.Should().HaveCount(2)
            .And.ContainSingle(r => r.CheckName == "DocumentsNumberCheck" && r.Level == NotificationLevel.Warning)
            .And.ContainSingle(r => r.CheckName == "RamUsageCheck" && r.Level == NotificationLevel.Okay);
        }
Esempio n. 5
0
        public void Notify(INimatorResult result)
        {
            SendHeartbeat();

            if (result.Level >= settings.Threshold)
            {
                NotifyFailureResult(result);
            }
        }
Esempio n. 6
0
        /// <inheritdoc/>
        public void Notify(INimatorResult result)
        {
            client.SendHeartbeat();

            if (result.Level >= settings.Threshold)
            {
                var request = converter.Convert(result);
                client.SendAlert(request);
            }
        }
Esempio n. 7
0
        private void NotifyFailureResult(INimatorResult result)
        {
            var failingLayerName = (result.GetFirstFailedLayerName() ?? "UnknownLayer").Truncate(MaxOpsgenieTagLength);
            var message          = result.Message.Truncate(MaxOpsgenieMessageLength);

            var request = new OpsGenieCreateAlertRequest(this.settings.ApiKey, message)
            {
                Alias       = "nimator-failure",
                Description = result.RenderPlainText(settings.Threshold),
                Teams       = new[] { this.settings.TeamName },
                Tags        = new[] { "Nimator", failingLayerName }
            };

            SimpleRestUtils.PostToRestApi(AlertUrl, request);
        }
Esempio n. 8
0
        private void SendDataDogHealthMetrics(INimatorResult nimatorResult)
        {
            foreach (var resultLayerResult in nimatorResult.LayerResults)
            {
                foreach (var checkResult in resultLayerResult.CheckResults)
                {
                    string[] tags = new string[]
                    {
                        $"layer:{resultLayerResult.LayerName}",
                        $"level:{checkResult.Level.ToString()}"
                    };

                    SendCheckResultToDataDog(checkResult, tags);
                    SendIsHealthyToDataDog(checkResult, tags);
                }
            }
        }
Esempio n. 9
0
        public void Notify(INimatorResult result)
        {
            if (result == null)
            {
                throw new ArgumentNullException(nameof(result));
            }

            if (result.Level >= _settings.Threshold)
            {
                foreach (var dataDogEvent in _dataDogEventConverter.Convert(result))
                {
                    NotifyDataDogEvent(dataDogEvent);
                }
            }

            SendDataDogHealthMetrics(result);
        }
Esempio n. 10
0
        public SlackMessage(INimatorResult result, NotificationLevel minLevelForDetails, string sourceEnvironment)
        {
            // Because "text" will be shown (a) full-width and (b) full height without
            // a 'Show More...' link, we prefer that to use for the full description.
            // The "attachments" will then be a simpler things, drawing attention with
            // specific coloring and icons.

            Text = GetEnvironmentMessage(sourceEnvironment)
                   + result.Message
                   + $":\n```{result.RenderPlainText(minLevelForDetails)}```";

            SlackMessageAttachments = new[]
            {
                new SlackMessageAttachment
                {
                    Text  = CallToActionForLevel(result.Level),
                    Color = GetHexForLevel(result.Level)
                }
            };
        }
Esempio n. 11
0
        public void Notify(INimatorResult result)
        {
            if (settings.DebounceTimeInSecs > 0 && DateTime.Now < dontAlertBefore)
            {
                return;
            }

            if (result.Level >= settings.Threshold)
            {
                var message = new SlackMessage(result, settings.Threshold, settings.SourceEnvironment);

                if (settings.DebounceTimeInSecs > 0)
                {
                    dontAlertBefore = DateTime.Now.AddSeconds(settings.DebounceTimeInSecs);
                    message.AddAttachment("Debouncing messages until at least *" + dontAlertBefore.ToString("yyyy-MM-dd, HH:mm:ss") + "*, even if more problems arise.");
                }

                SimpleRestUtils.PostToRestApi(settings.Url, message);
            }
        }