Beispiel #1
0
        private async Task <bool> PostMessage(Event <LogEventData> evt)
        {
            if (evt == null)
            {
                return(false);
            }

            if ((LogEventLevelList?.Count ?? 0) > 0 && !LogEventLevelList.Contains(evt.Data.Level))
            {
                return(false);
            }

            if (!(Channel ?? "").HasValue())
            {
                return(false);
            }

            var apiBaseUrl = RocketApiUrl.NormalizeHostOrFQDN();
            var client     = new JsonRestClient(apiBaseUrl);

            client.DoNotAuthorize = true;

            // Get the auth ticket
            _step = "Will authenticate: " + client.GetUriForResource("login");
            var authTicket =
                await
                client.PostAsync <RocketAuthTicket, RocketAuthPayload>("login", new RocketAuthPayload { username = Username, password = Password })
                .ConfigureAwait(false);

            if (authTicket?.data == null || authTicket.status != "success")
            {
                var e = new ApplicationException("Can not authenticate Rocket.Chat with the specified username/passwod");
                Log.Error(e, "Rocket.Chat authentication failure");
                return(false);
            }

            _step = "Done authenticate";

            var renderedMessage = (evt?.Data?.RenderedMessage ?? "");
            var summary         = renderedMessage.CleanCRLF().TruncateWithEllipsis(255);


            var channel  = Channel.StartsWith("#") ? Channel.Trim() : $"#{Channel.Trim()}";
            var seqUrl   = SeqUrl.NormalizeHostOrFQDN();
            var eventUrl = $"{seqUrl}#/events?filter=@Id%20%3D%20'{evt.Id}'";


            var propValuesInTitle = BuildPropertyValuesString(evt);

            // Create the rocket message
            var rocketMessage = new RocketChatMessage
            {
                channel = channel,
                text    = $"[ View Event ]({eventUrl}) {(propValuesInTitle.HasValue() ? propValuesInTitle + " : " : "")}{summary}"
            };

            // Attach the rendered message
            if (renderedMessage.HasValue())
            {
                var attachment = new RocketChatMessageAttachment
                {
                    color = RocketChatMessageAttachment.ColorByLevel(evt.Data.Level),
                    title = "Message",
                    //title_link = eventUrl,
                    collapsed = true,
                };

                var field = new RocketChatMessageAttachmentField
                {
                    @short = false,
                    value  = renderedMessage,
                };

                attachment.fields = attachment.fields ?? new List <RocketChatMessageAttachmentField>();
                attachment.fields.Add(field);

                rocketMessage.attachments = rocketMessage.attachments ?? new List <RocketChatMessageAttachment>();
                rocketMessage.attachments.Add(attachment);
            }

            // If event has exception attach that Exception
            if (AttachException && (evt?.Data?.Exception ?? "").HasValue())
            {
                var attachment = new RocketChatMessageAttachment
                {
                    color = RocketChatMessageAttachment.ColorByLevel(LogEventLevel.Fatal),
                    title = "Exception",
                    //title_link = eventUrl,
                    collapsed = true,
                };

                var field = new RocketChatMessageAttachmentField
                {
                    @short = false,
                    value  = evt.Data.Exception,
                };

                attachment.fields = attachment.fields ?? new List <RocketChatMessageAttachmentField>();
                attachment.fields.Add(field);

                rocketMessage.attachments = rocketMessage.attachments ?? new List <RocketChatMessageAttachment>();
                rocketMessage.attachments.Add(attachment);
            }


            // Attach structured properties
            if (AttachProperties && (evt?.Data?.Properties?.Count ?? 0) > 0)
            {
                var attachment = new RocketChatMessageAttachment
                {
                    title = "Additional Data",
                    //title_link = eventUrl,
                    collapsed = true
                };

                var allProps         = evt.Data.Properties;
                var additionPropList = AdditionalPropertiesList;

                foreach (var kvp in allProps)
                {
                    if (additionPropList?.Count > 0 && !additionPropList.Contains(kvp.Key))
                    {
                        continue;
                    }

                    var field = new RocketChatMessageAttachmentField
                    {
                        @short = false,
                        title  = kvp.Key,
                        value  = kvp.Value != null?JsonConvert.SerializeObject(kvp.Value) : ""
                    };
                    attachment.fields = attachment.fields ?? new List <RocketChatMessageAttachmentField>();
                    attachment.fields.Add(field);
                }

                rocketMessage.attachments = rocketMessage.attachments ?? new List <RocketChatMessageAttachment>();
                rocketMessage.attachments.Add(attachment);
            }

            // Add auth token data to request header
            Dictionary <string, string> authHeaders = new Dictionary <string, string>
            {
                ["X-User-Id"]    = authTicket.data.userId,
                ["X-Auth-Token"] = authTicket.data.authToken,
            };

            _step = "Will post message";

            // Post the message
            var postMessageResult = await client.PostAsync <RocketChatPostMessageResult, RocketChatMessage>("chat.postMessage", rocketMessage, authHeaders).ConfigureAwait(false);

            if (postMessageResult == null || !postMessageResult.success)
            {
                var e     = new ApplicationException("Can not post message to Rocket.Chat");
                var error = (postMessageResult?.error ?? "");
                Log.Error(e, "Rocket.Chat post message failure : {error}", error);
                return(false);
            }

            _step = "Done post message";
            return(true);
        }
Beispiel #2
0
        private async Task <bool> CreateIssue(Event <LogEventData> evt)
        {
            if (evt == null)
            {
                return(false);
            }

            if ((LogEventLevelList?.Count ?? 0) > 0 && !LogEventLevelList.Contains(evt.Data.Level))
            {
                return(false);
            }

            if (!(GitLabProjectName ?? "").HasValue() || !(GitLabPrivateToken ?? "").HasValue())
            {
                return(false);
            }

            object projectNamePropValue = null;

            evt?.Data?.Properties?.TryGetValue(GitLabProjectName, out projectNamePropValue);
            var projectName = projectNamePropValue?.ToString() ?? GitLabProjectName;

            if (!(projectName ?? "").HasValue())
            {
                return(false);
            }


            var apiBaseUrl = GitLabRestApiUrl.NormalizeHostOrFQDN();
            var client     = new JsonRestClient(apiBaseUrl);

            client.DoNotAuthorize = true;

            // Add private token data to request header
            Dictionary <string, string> headers = new Dictionary <string, string>
            {
                ["PRIVATE-TOKEN"] = GitLabPrivateToken
            };

            _step = $"Will get project id for {projectName}";



            var searchResult = await client.GetAsync <List <IdDto> >($"projects/search/{projectName}", headers)
                               .ConfigureAwait(false);

            var projectId = searchResult.FirstOrDefault();

            if (projectId == null)
            {
                Log.Error($"Project not found {projectName}");
                return(false);
            }

            var renderedMessage = (evt?.Data?.RenderedMessage ?? "");
            var summary         = renderedMessage.CleanCRLF().TruncateWithEllipsis(255);

            _step = $"DONE get project id for {projectName}";



            var seqUrl            = SeqUrl.NormalizeHostOrFQDN();
            var eventUrl          = $"{seqUrl}#/events?filter=@Id%20%3D%20'{evt.Id}'";
            var propValuesInTitle = BuildPropertyValuesString(evt, TitlePropertiesList);
            var labels            = BuildPropertyValuesString(evt, LabelPropertiesList, ",", (AddLogLevelAsLabel ? new string[1] {
                evt.Data.Level.ToString()
            } : null));
            StringBuilder sb      = new StringBuilder();



            // Attach the rendered message
            if (renderedMessage.HasValue())
            {
                sb.AppendLine($"**Message** [View Event]({eventUrl})");
                sb.AppendLine("```");
                sb.AppendLine(renderedMessage);
                sb.AppendLine("```");
                sb.AppendLine("");
            }

            // If event has exception attach that Exception
            if (AttachException && (evt?.Data?.Exception ?? "").HasValue())
            {
                sb.AppendLine("**Exception**");
                sb.AppendLine("```");
                sb.AppendLine(evt?.Data?.Exception);
                sb.AppendLine("```");
                sb.AppendLine("");
            }


            // Attach structured properties
            if (AttachProperties && (evt?.Data?.Properties?.Count ?? 0) > 0)
            {
                sb.AppendLine("**Properties**");

                var allProps         = evt.Data.Properties;
                var additionPropList = AdditionalPropertiesList;
                sb.AppendLine("```");
                foreach (var kvp in allProps)
                {
                    if (additionPropList?.Count > 0 && !additionPropList.Contains(kvp.Key))
                    {
                        continue;
                    }

                    sb.AppendLine($"* {kvp.Key} : {(kvp.Value != null ? JsonConvert.SerializeObject(kvp.Value) : "")}");;
                }
                sb.AppendLine("```");
                sb.AppendLine("");
            }


            // Create the issue
            var gitLabIssue = new NewIssuePayload
            {
                id          = projectId.id,
                title       = $"{(propValuesInTitle.HasValue() ? propValuesInTitle + " : " : "")}{summary}",
                description = sb.ToString(),
                labels      = labels
            };

            _step = $"Will create issue for {projectId.id} -> {projectName}";

            // Post the message
            var createIssueResult = await client.PostAsync <NewIssueResponsePayload, NewIssuePayload>($"projects/{projectId.id}/issues", gitLabIssue, headers)
                                    .ConfigureAwait(false);

            if (createIssueResult == null || !createIssueResult.id.HasValue)
            {
                var e     = new ApplicationException($"Can not create issue for project {projectId.id} -> {projectName}");
                var error = (createIssueResult?.error ?? "");
                Log.Error(e, "GitLab create issue failure : {error}", error);
                return(false);
            }

            _step = $"DONE create issue {projectId.id} -> {projectName}";
            return(true);
        }
Beispiel #3
0
        private async Task <bool> CreateIssue(Event <LogEventData> evt)
        {
            if (evt == null)
            {
                return(false);
            }

            if ((LogEventLevelList?.Count ?? 0) > 0 && !LogEventLevelList.Contains(evt.Data.Level))
            {
                return(false);
            }

            if (!(GitHubRepoName ?? "").HasValue() ||
                !(GitHubRepoOwnerName ?? "").HasValue() ||
                !(GitHubUsername ?? "").HasValue()
                )
            {
                return(false);
            }

            Uri entUri = null;

            if ((GitHubEntUrl ?? "").HasValue() && !Uri.TryCreate(GitHubEntUrl, UriKind.RelativeOrAbsolute, out entUri))
            {
                return(false);
            }


            var phv = new ProductHeaderValue("SeqApp.GitHub");

            if (entUri != null)
            {
                _step = $"Will probe GitHub enterprise {entUri}";
                var probe  = new EnterpriseProbe(phv);
                var result = await probe.Probe(entUri);

                _step = $"DONE probe GitHub enterprise {entUri}";
                if (result != EnterpriseProbeResult.Ok)
                {
                    Log.Error("Probe enterprise GitHub failed with result {result}", result);
                    return(false);
                }
            }


            object repoNamePropValue = null;

            evt?.Data?.Properties?.TryGetValue(GitHubRepoName, out repoNamePropValue);
            var repoName = repoNamePropValue?.ToString() ?? GitHubRepoName;

            if (!(repoName ?? "").HasValue())
            {
                return(false);
            }

            object repoOwnerNamePropValue = null;

            evt?.Data?.Properties?.TryGetValue(GitHubRepoOwnerName, out repoOwnerNamePropValue);
            var repoOwnerName = repoOwnerNamePropValue?.ToString() ?? GitHubRepoOwnerName;

            if (!(repoOwnerName ?? "").HasValue())
            {
                return(false);
            }

            var creds = (GitHubPassword ?? "").HasValue()
                ? new Credentials(GitHubUsername, GitHubPassword)
                : new Credentials(GitHubUsername);

            var client = entUri == null ? new GitHubClient(phv) : new GitHubClient(phv, entUri);

            client.Credentials = creds;

            var renderedMessage   = (evt?.Data?.RenderedMessage ?? "");
            var summary           = renderedMessage.CleanCRLF().TruncateWithEllipsis(255);
            var seqUrl            = SeqUrl.NormalizeHostOrFQDN();
            var eventUrl          = $"{seqUrl}#/events?filter=@Id%20%3D%20'{evt.Id}'";
            var propValuesInTitle = BuildPropertyValuesString(evt, TitlePropertiesList);

            StringBuilder sb = new StringBuilder();

            // Attach the rendered message
            if (renderedMessage.HasValue())
            {
                sb.AppendLine($"**Message** [View Event]({eventUrl})");
                sb.AppendLine("```");
                sb.AppendLine(renderedMessage);
                sb.AppendLine("```");
                sb.AppendLine("");
            }

            // If event has exception attach that Exception
            if (AttachException && (evt?.Data?.Exception ?? "").HasValue())
            {
                sb.AppendLine("**Exception**");
                sb.AppendLine("```");
                sb.AppendLine(evt?.Data?.Exception);
                sb.AppendLine("```");
                sb.AppendLine("");
            }


            // Attach structured properties
            if (AttachProperties && (evt?.Data?.Properties?.Count ?? 0) > 0)
            {
                sb.AppendLine("**Properties**");

                var allProps         = evt.Data.Properties;
                var additionPropList = AdditionalPropertiesList;
                sb.AppendLine("```");
                foreach (var kvp in allProps)
                {
                    if (additionPropList?.Count > 0 && !additionPropList.Contains(kvp.Key))
                    {
                        continue;
                    }

                    sb.AppendLine($"* {kvp.Key} : {(kvp.Value != null ? JsonConvert.SerializeObject(kvp.Value) : "")}");;
                }
                sb.AppendLine("```");
                sb.AppendLine("");
            }


            // Create the issue
            var title = $"{(propValuesInTitle.HasValue() ? propValuesInTitle + " : " : "")}{summary}";

            var newIssue = new NewIssue(title)
            {
                Body = sb.ToString(),
            };
            var labels = GetPropertyValuesAsList(evt, LabelPropertiesList, ",", (AddLogLevelAsLabel ? new string[1] {
                evt.Data.Level.ToString()
            } : null));

            if (labels?.Count > 0)
            {
                labels.ForEach(lb => newIssue.Labels.Add(lb));
            }

            _step = $"Will create issue for {GitHubRepoOwnerName}/{GitHubRepoName}";

            var createdIssue = await client.Issue.Create(GitHubRepoOwnerName, GitHubRepoName, newIssue).ConfigureAwait(false);

            _step = $"DONE create issue for {GitHubRepoOwnerName}/{GitHubRepoName}";
            return(true);
        }