Example #1
0
 public static bool IsValidateGetMetrics(MonitoringRequest monitoringRequest, out string Message)
 {
     if (!MonitoringConstants.NameSpace.Any(x => x.Equals(monitoringRequest.NameSpace)))
     {
         Message = $"Invalid namespace:{monitoringRequest.NameSpace}, Please provide a proper namespace; It should be {String.Join(",", MonitoringConstants.NameSpace.ToList())}";
         return(false);
     }
     if (!MonitoringConstants.Ec2Metrics.Any(x => x.Equals(monitoringRequest.Metrics)))
     {
         Message = $"Invalid Metrics value:{monitoringRequest.Metrics}, it should be {String.Join(",", MonitoringConstants.Ec2Metrics)}";
         return(false);
     }
     Message = "Request is valid";
     return(true);
 }
Example #2
0
        public async Task <IActionResult> GetMetrics([FromBody] MonitoringRequest monitoringRequest, [FromQuery] string MetricType)
        {
            if (!ValidationHelper.IsValidMonitorRequest(monitoringRequest, MetricType, out string message))
            {
                return(BadRequest(new { Message = message }));
            }
            var metrics = await monitoringOperations.GetMetrics(monitoringRequest.Region, monitoringRequest.NameSpace, monitoringRequest.Metrics);

            var filterMetrics = metrics.Where(x => monitoringRequest.ResourceIds.Any(y => x.Dimensions.Any(z => z.Value.Equals(y)))).ToList();
            var response      = await monitoringOperations.GetMetricsData(monitoringRequest, filterMetrics);

            var mapResponse = monitoringOperations.MapResponse(response.MetricResponse, MetricType, monitoringRequest.Limit);

            return(Ok(mapResponse));
        }
Example #3
0
        public static bool IsValidMonitorRequest(MonitoringRequest monitoringRequest, string MetricType, out string Message)
        {
            if (monitoringRequest.ResourceIds == null || !monitoringRequest.ResourceIds.Any())
            {
                Message = $"There is no ResourceId corresponding to the metrics";
                return(false);
            }
            DateTime temp;

            if (monitoringRequest.IsDateCustom)
            {
                if (!DateTime.TryParse(monitoringRequest.StartDateTime.ToString(), out temp))
                {
                    Message = $"Invalid Start Date:{monitoringRequest.StartDateTime.ToString()}";
                    return(false);
                }
                if (!DateTime.TryParse(monitoringRequest.EndDateTime.ToString(), out temp))
                {
                    Message = $"Invalid End Date:{monitoringRequest.EndDateTime.ToString()}";
                    return(false);
                }
            }
            else
            {
                if (monitoringRequest.RelativeMinutes <= 0)
                {
                    Message = $"Invalid relative time:{monitoringRequest.RelativeMinutes}";
                    return(false);
                }
            }
            if (!MonitoringConstants.MetricType.Any(x => x.Equals(MetricType)))
            {
                Message = $"Invalid MetricType:{MetricType}, Please enter proper MetricType; It should be {String.Join(",", MonitoringConstants.MetricType.ToList())}";
                return(false);
            }
            if (!MonitoringConstants.NameSpace.Any(x => x.Equals(monitoringRequest.NameSpace)))
            {
                Message = $"Invalid namespace:{monitoringRequest.NameSpace}, Please provide a proper namespace; It should be {String.Join(",", MonitoringConstants.NameSpace.ToList())}";
                return(false);
            }
            Message = "Request is valid";
            return(true);
        }
        public async Task <MonitoringResponse> GetMetricsData(MonitoringRequest monitoringRequest, List <Metric> metrics)
        {
            cloudWatchRepository.Region = monitoringRequest.Region;
            var metricDataRequest = GenerateMetricRequest(monitoringRequest, metrics);

            if (!metricDataRequest.MetricDataQueries.Any())
            {
                return(new MonitoringResponse()
                {
                    MetricResponse = new List <MonitoritingMetrics>()
                });
            }
            var response = await cloudWatchRepository.GetMetricData(metricDataRequest);

            var mapResponse = mapper.Map <List <MonitoritingMetrics> >(response.MetricDataResults);

            return(new MonitoringResponse()
            {
                NextToken = response.NextToken, MetricResponse = mapResponse
            });
        }
        private GetMetricDataRequest GenerateMetricRequest(MonitoringRequest monitoringRequest, List <Metric> metrics)
        {
            var startDate = DateTime.Now.AddMinutes((-1) * monitoringRequest.RelativeMinutes);
            var endDate   = DateTime.Now;

            if (monitoringRequest.IsDateCustom)
            {
                startDate = monitoringRequest.StartDateTime.Value;
                endDate   = monitoringRequest.EndDateTime.Value;
            }
            var metricQueryCollection = new List <MetricDataQuery>();
            int counter = 0;
            var period  = (int)(Math.Ceiling((endDate - startDate).TotalSeconds / 12) / 60) * 60;

            foreach (var metric in metrics)
            {
                metricQueryCollection.Add(new MetricDataQuery()
                {
                    Id         = "m" + counter.ToString(),
                    MetricStat = new MetricStat()
                    {
                        Stat   = "Average",
                        Period = period,
                        Metric = metric
                    }
                });
                counter++;
            }
            return(new GetMetricDataRequest()
            {
                NextToken = monitoringRequest.NextToken,
                StartTimeUtc = startDate,
                EndTimeUtc = endDate,
                MetricDataQueries = metricQueryCollection
            });
        }
        private static async Task <MessageCard> CreateMessageCardAsync(
            string title, string summary, MonitoringRequest monitoringRequest,
            IApplication httpApp, IHttpRequest request,
            Func <MessageCard.Section> getRequestInformation)
        {
            var appName = AppSettings.ApplicationInsights.TeamsAppIdentification
                          .ConfigurationString(
                x => x,
                (why) => httpApp.GetType().FullName);
            var appImage = AppSettings.ApplicationInsights.TeamsAppImage
                           .ConfigurationString(
                x => new Uri(x),
                (why) => default);
            var content = await ReadContentAsync();

            var utcOffset = "Central Standard Time"
                            .FindSystemTimeZone()
                            .GetUtcOffset(DateTime.UtcNow);

            var sections = new MessageCard.Section[]
            {
                new MessageCard.Section
                {
                    activityTitle    = appName,
                    activitySubtitle = (DateTime.UtcNow + utcOffset).ToString("f"),
                    activityImage    = appImage,
                },
                getRequestInformation(),
                new MessageCard.Section
                {
                    title    = "Headers",
                    markdown = false,     // so that underscores are not stripped
                    facts    = request.Headers
                               .Select(
                        header => new MessageCard.Section.Fact
                    {
                        name  = $"{header.Key}:",
                        value = header.Value.Join(","),
                    })
                               .ToArray(),
                },
                new MessageCard.Section
                {
                    title = "Content",
                    text  = $"<blockquote>{content}</blockquote>",
                }
            };



            if (request.Properties.ContainsKey(HttpApplication.DiagnosticsLogProperty))
            {
                var diagnosticsLogs = (string[])request.Properties[HttpApplication.DiagnosticsLogProperty];
                sections = sections
                           .Append(
                    new MessageCard.Section
                {
                    title = "Log",
                    text  = $"<blockquote>{diagnosticsLogs.Join("<br />")}</blockquote>",
                })
                           .ToArray();
            }


            if (request.Properties.TryGetValue(EnableProfilingAttribute.ResponseProperty, out object profileObj))
            {
                var profile = (IProfile)profileObj;
                var log     = profile.Events
                              .NullToEmpty()
                              .OrderBy(kvp => kvp.Key)
                              .Select(diagEvent => $"<b>{diagEvent.Key}</b>:<i>{diagEvent.Value}</i>")
                              .Join("<br />");
                sections = sections
                           .Append(
                    new MessageCard.Section
                {
                    title = "Diagnostics",
                    text  = $"<blockquote>{log}</blockquote>",
                })
                           .ToArray();
            }

            var postmanLink = new QueryableServer <Api.Azure.Monitoring.MonitoringRequest>(request)
                              .Where(mr => mr.monitoringRequestRef == monitoringRequest.monitoringRequestRef)
                              .Where(mr => mr.when == monitoringRequest.when)
                              .HttpAction(MonitoringRequest.PostmanAction)
                              .Location()
                              .SignWithAccessTokenAccount(Guid.NewGuid(), Guid.NewGuid(), DateTime.UtcNow.AddYears(1),
                                                          url => url);

            var message = new MessageCard
            {
                summary         = summary,
                themeColor      = "F00807",
                title           = title,
                sections        = sections,
                potentialAction = new MessageCard.ActionCard[]
                {
                    new MessageCard.ActionCard
                    {
                        name    = "Postman",
                        type    = "OpenUri",
                        targets = new MessageCard.ActionCard.Target[]
                        {
                            new MessageCard.ActionCard.Target
                            {
                                os  = "default",
                                uri = postmanLink,
                            }
                        }
                    },
                    new MessageCard.ActionCard
                    {
                        name    = "Application Insights",
                        type    = "OpenUri",
                        targets = new MessageCard.ActionCard.Target[]
                        {
                            new MessageCard.ActionCard.Target
                            {
                                os  = "default",
                                uri = new Uri("https://www.example.com/ai/message/1234"),
                            }
                        }
                    },
                    new MessageCard.ActionCard
                    {
                        type   = "ActionCard",
                        name   = "Run in TestFramework",
                        inputs = new MessageCard.ActionCard.Input[]
                        {
                            new MessageCard.ActionCard.Input
                            {
                                type        = "TextInput",
                                id          = "comment",
                                title       = "Test ID",
                                isMultiline = false,
                            },
                            new MessageCard.ActionCard.Input
                            {
                                type    = "MultichoiceInput",
                                id      = "move",
                                title   = "Pick a test function",
                                choices = new MessageCard.ActionCard.Input.Choice []
                                {
                                    new MessageCard.ActionCard.Input.Choice
                                    {
                                        display = "Unauthenticated",
                                        value   = "unauthenticated",
                                    },
                                    new MessageCard.ActionCard.Input.Choice
                                    {
                                        display = "Physicial Redirect",
                                        value   = "redirect",
                                    },
                                    new MessageCard.ActionCard.Input.Choice
                                    {
                                        display = "Session Authenticated",
                                        value   = "session",
                                    },
                                    new MessageCard.ActionCard.Input.Choice
                                    {
                                        display = "Account Authenticated",
                                        value   = "account",
                                    },
                                },
                            }
                        }
                    },
                }
            };

            return(message);

            async Task <string> ReadContentAsync()
            {
                if (!request.HasBody)
                {
                    return(string.Empty);
                }

                try
                {
                    if (request.RequestHeaders.ContentType.IsTextType())
                    {
                        return(await request.ReadContentAsStringAsync());
                    }

                    var byteContent = await request.ReadContentAsync();

                    return(byteContent.ToBase64String());
                }
                catch (Exception)
                {
                    return(string.Empty);
                }
            }
        }