private async Task <long> GetCountQuery(Guid dashboardId, int groupIndex, int itemIndex, ItemDuration duration, DateTime durationFrom, DateTime durationTo, string[] queryParts)
        {
            var    item = _config.Dashboards[dashboardId].Select(d => d.Value).ToList()[groupIndex][itemIndex];
            string itemQuery;

            if (duration == ItemDuration.Custom)
            {
                itemQuery = GetQueryString(item, durationFrom, durationTo, durationFrom.GetIntervalString(durationTo));
            }
            else
            {
                var durationString = duration.GetString();
                var intervalString = duration.GetIntervalString();
                itemQuery = GetQueryString(item, durationString, intervalString);
            }

            var structuredQuery = QueryBuilder.Parse(itemQuery);
            var queryGroup      = new QueryGroup(structuredQuery);

            queryGroup.AddParts(queryParts);
            queryGroup.RemoveProjectAndSummarize();
            queryGroup.Append(QueryBuilder.Parse("| summarize sum(itemCount)"));
            var query = queryGroup.ToString();
            var table = await AppInsightsClient.GetTableQuery(item.ApiToken.Id, item.ApiToken.Key, query);

            return(table.Rows.First()[0] as long? ?? 0);
        }
Example #2
0
        protected void Application_Error(Object sender, EventArgs e)
        {
            // Process exception
            var raisedException = Server.GetLastError();

            if (raisedException == null)
            {
                return;
            }

            //Add to the log
            ErrorLog.WriteLine(raisedException.ToString());

            //Track the exception with Application Insights if it is available
            AppInsightsClient?.TrackException(raisedException);

            if (!HttpContext.Current.IsCustomErrorEnabled)
            {
                return;
            }

            if (raisedException is HttpException)
            {
                HttpContext.Current.Response.Redirect("~/Error?code=" + ((HttpException)raisedException).GetHttpCode());
            }
            else
            {
                HttpContext.Current.Response.Redirect("~/Error");
            }
        }
Example #3
0
        private void ServiceFabricTraceEvent(TraceEvent data)
        {
            var eventId         = (ushort)data.ID;
            var eventIsRelevant =
                (
                    (data.Level <= TraceEventLevel.Error && data.Level >= TraceEventLevel.Critical) ||
                    (
                        ServiceFabricEtw.Operational.ClusterEventsFilter(eventId, data) ||
                        ServiceFabricEtw.Operational.NodeEventsFilter(eventId, data)
                    ));

            if (!eventIsRelevant)
            {
                return;
            }

            var properties = data.PayloadNames
                             .Select((name, index) =>
            {
                if (data.PayloadValue(index) is DateTime dateTimeValue)
                {
                    return(new KeyValuePair <string, string>(name, dateTimeValue.ToString("o")));
                }
                return(new KeyValuePair <string, string>(name, data.PayloadString(index, Culture)));
            })
                             .ToDictionary(x => x.Key, x => x.Value);

            properties.Add("eventID", data.ID.ToString());
            properties.Add("name", data.EventName);
            properties.Add("timeStamp", data.TimeStamp.ToString("o"));

            AppInsightsClient.TrackTrace(data.FormattedMessage, data.ToSeverityLevel(), properties);
        }
Example #4
0
 public void Stop()
 {
     EtwSession?.Dispose();
     EtwSession = null;
     AppInsightsClient?.Flush();
     AppInsightsConfig = null;
 }
Example #5
0
        public async Task <IItemStatus> GetStatus()
        {
            var requestsCount               = AppInsightsClient.GetRequestsCount(ApplicationId, ApiKey, AppInsightsTimeSpan.PT1H);
            var requestsFailed              = AppInsightsClient.GetExceptionsServer(ApplicationId, ApiKey, AppInsightsTimeSpan.PT1H);
            var requestsDuration            = AppInsightsClient.GetRequestsDurationPercentile(ApplicationId, ApiKey, 90);
            var requestsCount10Min          = AppInsightsClient.GetRequestsCount(ApplicationId, ApiKey, AppInsightsTimeSpan.PT10M);
            var requestsFailed10Min         = AppInsightsClient.GetExceptionsServer(ApplicationId, ApiKey, AppInsightsTimeSpan.PT10M);
            var availabilityPercentage10Min = AppInsightsClient.GetAvailabilityPercentage(ApplicationId, ApiKey, AppInsightsTimeSpan.PT10M);
            await Task.WhenAll(requestsCount, requestsFailed, requestsDuration, requestsCount10Min, requestsFailed10Min, availabilityPercentage10Min);

            var requests               = requestsCount.Result / 60;
            var responseTime           = requestsDuration.Result ?? 0;
            var errorRate              = requestsCount.Result.HasValue && requestsFailed.Result.HasValue && requestsCount.Result.Value > 0 && requestsFailed.Result.Value >= SiteSettings.ErrorCountMinimum ? Math.Round(100.0 / requestsCount.Result.Value * requestsFailed.Result.Value, 1) : 0;
            var errorRate10Min         = requestsCount10Min.Result.HasValue && requestsFailed10Min.Result.HasValue && requestsCount10Min.Result > 0 && requestsFailed10Min.Result >= SiteSettings.ErrorCountMinimum ? Math.Round(100.0 / requestsCount10Min.Result.Value * requestsFailed10Min.Result.Value, 1) : 0;
            var availabilityErrorLevel = availabilityPercentage10Min.Result < 50 ? ErrorLevel.Error : ErrorLevel.Normal;

            if (requestsFailed.Result.HasValue && requestsFailed.Result.Value > 0 && (!requestsCount.Result.HasValue || requestsCount.Result.Value == 0))
            {
                errorRate = 100;
            }

            if (requestsFailed10Min.Result.HasValue && requestsFailed10Min.Result.Value > 0 && (!requestsCount10Min.Result.HasValue || requestsCount10Min.Result.Value == 0))
            {
                errorRate10Min = 100;
            }

            var result = new SiteStatus
            {
                RequestsPerMinute         = requests ?? 0,
                AvgResponseTime           = Convert.ToInt32(responseTime),
                ErrorRate                 = errorRate,
                ErrorRate10Min            = errorRate10Min,
                AvgResponseTimeErrorLevel = responseTime > SiteSettings.AvgResponseTimeWarning ? ErrorLevel.Warning : ErrorLevel.Normal,
                ErrorRateLevel            = GetErrorRateLevel(errorRate, SiteSettings),
                ErrorRateLevel10Min       = GetErrorRateLevel(errorRate10Min, SiteSettings)
            };

            var errorLevels = new[]
            {
                result.AvgResponseTimeErrorLevel,
                result.ErrorRateLevel,
                result.ErrorRateLevel10Min,
                availabilityErrorLevel
            };

            if (errorLevels.Any(r => r == ErrorLevel.Error))
            {
                result.ErrorLevel = ErrorLevel.Error;
            }
            else if (errorLevels.Any(r => r == ErrorLevel.Warning))
            {
                result.ErrorLevel = ErrorLevel.Warning;
            }
            else if (errorLevels.Any(r => r == ErrorLevel.Normal))
            {
                result.ErrorLevel = ErrorLevel.Normal;
            }

            return(result);
        }
Example #6
0
        public ApplicationInsightsPanelViewModel(ConnectedAccount account)
        {
            Account = account;

            _client = new AppInsightsClient(
                account.StorageConnectionString.Get("appId"),
                account.StorageConnectionString.Get("apiKey"));
        }
Example #7
0
        public static async Task <IAnalyzerResult> Analyze(Guid appid, string apikey, StructuredQuery query, string[] queryParts)
        {
            query = QueryBuilder.RemoveProject(query);
            query = QueryBuilder.RemoveSummarize(query);
            var        isExceptionsQuery = query.FirstOrDefault()?.Trim().StartsWith("exceptions", StringComparison.OrdinalIgnoreCase) == true;
            QueryGroup queryGroup;

            var whereQuery = @"
                | where details[0].parsedStack[0].fileName != ''
                | project itemCount, filename = extract('([^\\\\/]+)$', 1, tostring(details[0].parsedStack[0].fileName)), type, line = tostring(details[0].parsedStack[0].line)
                | summarize sum(itemCount) by filename, type, line
                | order by sum_itemCount";

            if (isExceptionsQuery)
            {
                queryGroup = new QueryGroup(query);
                queryGroup.AddParts(queryParts);
                queryGroup.Append(QueryBuilder.Parse(whereQuery));
            }
            else
            {
                var exceptionsQuery = QueryBuilder.Parse(
                    $@"
                exceptions
                | {query.First(q => q.Contains("timestamp >"))}
                {whereQuery}");

                queryGroup = new QueryGroup(exceptionsQuery);
                queryGroup.Replace(query.First().Trim(), query);
                queryGroup.AddParts(queryParts);
            }

            var queryString = queryGroup.ToString();
            var result      = await AppInsightsClient.GetTableQuery(appid, apikey, queryString);

            result.Columns[0].Name = "File";
            result.Columns[1].Name = "Exception";
            result.Columns[3].Name = "Count";
            result.Columns.RemoveAt(2);

            foreach (var row in result.Rows)
            {
                row.Add($"where details[0].parsedStack[0].fileName endswith '{row[0]}' and details[0].parsedStack[0].line == {row[2]}");
                row.Add($"where details[0].parsedStack[0].fileName !endswith '{row[0]}' or details[0].parsedStack[0].line != {row[2]}");

                row[0] = $"{row[0]} ({row[2]})";
                var exception = (string)row[1];
                row[1] = exception.Substring(exception.LastIndexOf('.') + 1);
                row.RemoveAt(2);
            }

            return(new TableAnalyzerResult("Stacktraces", true, result));
        }
Example #8
0
        public static async Task <IAnalyzerResult> Analyze(ApiToken apiToken, StructuredQuery query, string[] queryParts)
        {
            query = QueryBuilder.RemoveProject(query);
            query = QueryBuilder.RemoveSummarize(query);
            var        isRequestsQuery = query.FirstOrDefault()?.Trim().StartsWith("requests", StringComparison.OrdinalIgnoreCase) == true;
            QueryGroup queryGroup;

            var whereQuery = @"
                | project domain = extract('^(https|http)://(.*?)/', 2, url), duration, itemCount, success
                | summarize duration = avg(duration), failedCount=sumif(itemCount, success == false), totalCount=sum(itemCount) by domain
                | order by totalCount desc
                | take 20
                | project domain, totalCount, duration, failedCount, failedPercentage = 100.0 / totalCount * failedCount";

            if (isRequestsQuery)
            {
                queryGroup = new QueryGroup(query);
                queryGroup.AddParts(queryParts);
                queryGroup.Append(QueryBuilder.Parse(whereQuery));
            }
            else
            {
                var requestsQuery = QueryBuilder.Parse(
                    $@"
                requests
                | {query.First(q => q.Contains("timestamp >"))}
                {whereQuery}");

                queryGroup = new QueryGroup(requestsQuery);
                queryGroup.Replace(query.First().Trim(), query);
                queryGroup.AddParts(queryParts);
            }

            var queryString = queryGroup.ToString();
            var result      = await AppInsightsClient.GetTableQuery(apiToken, queryString);

            result.Columns[0].Name = "Domain";
            result.Columns[1].Name = "Count";
            result.Columns[2].Name = "Duration";
            result.Columns[3].Name = "Failures";
            result.Columns[4].Name = "Percentage";

            foreach (var row in result.Rows)
            {
                row[2] = $"{row[2]:0} ms";
                row[4] = $"{row[4]:0} %";
                row.Add($"where url contains '{row[0]}'");
                row.Add($"where url !contains '{row[0]}'");
            }

            return(new TableAnalyzerResult("Domains", true, result));
        }
        public static async Task <IAnalyzerResult> Analyze(ApiToken apiToken, StructuredQuery query, string[] queryParts)
        {
            query = QueryBuilder.RemoveProject(query);
            query = QueryBuilder.RemoveSummarize(query);
            var        isRequestsQuery = query.FirstOrDefault()?.Trim().StartsWith("requests", StringComparison.OrdinalIgnoreCase) == true;
            QueryGroup queryGroup;

            var whereQuery = @"
                | summarize _count=sum(itemCount) by resultCode
                | project resultCode, _count
                | sort by _count desc";

            if (isRequestsQuery)
            {
                queryGroup = new QueryGroup(query);
                queryGroup.AddParts(queryParts);
                queryGroup.Append(QueryBuilder.Parse(whereQuery));
            }
            else
            {
                var requestsQuery = QueryBuilder.Parse(
                    $@"
                requests
                | {query.First(q => q.Contains("timestamp >"))}
                {whereQuery}");

                queryGroup = new QueryGroup(requestsQuery);
                queryGroup.Replace(query.First().Trim(), query);
                queryGroup.AddParts(queryParts);
            }

            var queryString = queryGroup.ToString();
            var result      = await AppInsightsClient.GetTableQuery(apiToken, queryString);

            result.Columns[0].Name = "Status code";
            result.Columns[1].Name = "Count";

            foreach (var row in result.Rows)
            {
                row.Add($"where resultCode == {row[0]}");
                row.Add($"where resultCode != {row[0]}");
            }

            return(new TableAnalyzerResult("Status codes", true, result));
        }
        public static async Task <IAnalyzerResult> Analyze(Guid appid, string apikey, StructuredQuery query, string[] queryParts)
        {
            query = QueryBuilder.RemoveProject(query);
            query = QueryBuilder.RemoveSummarize(query);
            var        isExceptionsQuery = query.FirstOrDefault()?.Trim().StartsWith("exceptions", StringComparison.OrdinalIgnoreCase) == true;
            QueryGroup queryGroup;

            var whereQuery = @"
                | summarize _count = sum(itemCount) by type
                | sort by _count desc
                | take 20";

            if (isExceptionsQuery)
            {
                queryGroup = new QueryGroup(query);
                queryGroup.AddParts(queryParts);
                queryGroup.Append(QueryBuilder.Parse(whereQuery));
            }
            else
            {
                var exceptionsQuery = QueryBuilder.Parse(
                    $@"
                exceptions
                | {query.First(q => q.Contains("timestamp >"))}
                {whereQuery}");

                queryGroup = new QueryGroup(exceptionsQuery);
                queryGroup.Replace(query.First().Trim(), query);
                queryGroup.AddParts(queryParts);
            }

            var queryString = queryGroup.ToString();
            var result      = await AppInsightsClient.GetTableQuery(appid, apikey, queryString);

            result.Columns[0].Name = "Exception type";
            result.Columns[1].Name = "Count";

            foreach (var row in result.Rows)
            {
                row.Add($"where type == '{row[0]}'");
                row.Add($"where type != '{row[0]}'");
            }

            return(new TableAnalyzerResult("Exceptions", true, result));
        }
        private async Task <double> GetValueQuery(ConfigLogic.Dashboard.DashboardItem item, string query)
        {
            var table = await AppInsightsClient.GetTableQuery(item.ApiToken.Id, item.ApiToken.Key, query);

            var value = 0.0;

            if (table.Rows.Count > 0 && table.Rows[0].Count > 1 && (table.Rows[0][1] is double || table.Rows[0][1] is long))
            {
                value = table.Rows[0][1];
            }

            if (item.Total == ItemTotal.Rpm)
            {
                return(value / item.Duration.GetString().GetTimeSpan().TotalMinutes);
            }

            return(value);
        }
        public async Task <dynamic> Overview(Guid dashboardId, int groupIndex, int itemIndex)
        {
            var item      = _config.Dashboards[dashboardId].Select(d => d.Value).ToList()[groupIndex][itemIndex];
            var itemQuery = GetQueryString(item, item.Duration.GetString(), item.Duration.GetIntervalString());
            var table     = await AppInsightsClient.GetTableQuery(item.ApiToken.Id, item.ApiToken.Key, itemQuery);

            var values = table.Rows.Select(row => new RowItem(row[0], row[1])).ToList();
            var value  = await GetValueQuery(item, GetQueryString(item, item.Duration.GetString(), "90d"));

            var chart  = TransformQuery(values, item.Duration.GetString().GetTimeSpan(), item.Duration.GetIntervalString().GetTimeSpan());
            var max    = Math.Max(item.MinChartValue, chart.Any() ? chart.Max() : 0);
            var status = item.GetStatus(item, value, chart);

            return(new
            {
                Value = item.FormatValue(value),
                ChartValues = chart,
                ChartMax = max,
                Status = status
            });
        }
        private async Task <List <RowItem> > GetChartValues(ConfigLogic.Dashboard.DashboardItem item, string query)
        {
            var table = await AppInsightsClient.GetTableQuery(item.ApiToken.Id, item.ApiToken.Key, query);

            return(table.Rows.Select(row => new RowItem(row[0], row[1])).ToList());
        }
Example #14
0
        public static async Task <IAnalyzerResult> Analyze(Guid appid, string apikey, StructuredQuery query, string[] queryParts)
        {
            query = QueryBuilder.RemoveProject(query);
            query = QueryBuilder.RemoveSummarize(query);
            var        isExceptionsQuery = query.FirstOrDefault()?.Trim().StartsWith("exceptions", StringComparison.OrdinalIgnoreCase) == true;
            QueryGroup queryGroup;

            var whereQuery = @"
                | project itemCount, message = strcat(outerMessage, ' \n\n ', customDimensions['AdditionalErrorDetails'], ' \n\n ', customDimensions['additionalDetails'])
                | project itemCount, message = replace(@'[0-9a-fA-F]{8}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{12}', '[GUID]', message) 
                | project itemCount, message = replace(@'(^|[ ''])(http:|https:)*[/]{1,2}(.*?)([ ]|$|\n)', ' [URL] ', message)
                | project itemCount, message = replace(@'[0-9]', '[X]', message)
                | where message !contains 'username' or message !contains 'password' 
                | summarize sum(itemCount) by message
                | order by sum_itemCount desc
                | take 20";

            if (isExceptionsQuery)
            {
                queryGroup = new QueryGroup(query);
                queryGroup.AddParts(queryParts);
                queryGroup.Append(QueryBuilder.Parse(whereQuery));
            }
            else
            {
                var exceptionsQuery = QueryBuilder.Parse(
                    $@"
                exceptions
                | {query.First(q => q.Contains("timestamp >"))}
                {whereQuery}");

                queryGroup = new QueryGroup(exceptionsQuery);
                queryGroup.Replace(query.First().Trim(), query);
                queryGroup.AddParts(queryParts);
            }

            var queryString = queryGroup.ToString();
            var result      = await AppInsightsClient.GetTableQuery(appid, apikey, queryString);

            result.Columns[0].Name = "Exception message";
            result.Columns[1].Name = "Count";

            foreach (var row in result.Rows)
            {
                var rowText     = (string)row[0];
                var commandText = ((string)row[0]).Trim();

                rowText = rowText.Replace("[X]", "X");
                rowText = Regex.Replace(rowText, "[X]+", "X");

                var lines = new List <string>();

                foreach (var line in Regex.Split(rowText, @"\n").SelectMany(line => Regex.Split(Regex.Replace(line, @"\. ", ".. "), @"\. ")))
                {
                    var trimmedLine = Regex.Replace(line, @"^[ ]*\[[A-Z]+\][ ]*", "").Trim();
                    if (!string.IsNullOrWhiteSpace(trimmedLine) && lines.All(l => l != trimmedLine))
                    {
                        lines.Add(trimmedLine);
                    }
                }

                rowText = string.Join("\n", lines);
                row[0]  = rowText.Trim();

                var matches = Regex.Matches(commandText, @"(^|\])(.*?)($|\[)");

                if (matches.Any(match => match.Groups[2].Length > 10))
                {
                    commandText = matches
                                  .First(match => match.Groups[2].Length > 10)
                                  .Groups[2].Value.Trim();
                }

                commandText = commandText.Replace("'", @"\'");
                row.Add($"where outerMessage contains '{commandText}' or customDimensions['AdditionalErrorDetails'] contains '{commandText}' or customDimensions['additionalDetails'] contains '{commandText}'");
                row.Add($"where outerMessage !contains '{commandText}' and customDimensions['AdditionalErrorDetails'] !contains '{commandText}' and customDimensions['additionalDetails'] !contains '{commandText}'");
            }

            return(new TableAnalyzerResult("Exception messages", true, result));
        }
 public Task <double?> GetStatus()
 {
     return(AppInsightsClient.TryGetTelemetryQuery(ApiToken.ApplicationId, ApiToken.ApiKey, Query));
 }
        /// <summary>
        /// Every so often clean up the files.
        /// </summary>
        public static void CleanupFiles(string directoryPath, bool forceNow = false)
        {
            if (forceNow)
            {
                NextCleanup = DateTime.Now;
            }

            if (ShouldCleanup() && directoryPath != null)
            {
                try
                {
                    var directory          = $"{Path.GetDirectoryName(directoryPath)}{Path.DirectorySeparatorChar}";
                    var postersDeleted     = 0;
                    var sharedDeleted      = 0;
                    var tempPostersDeleted = 0;
                    var twitterDeleted     = 0;

                    // Loop through the MoviePosters.

                    foreach (var file in Directory.GetFiles(directory, $"{MOVIE_POSTER_PREFIX}*"))
                    {
                        if (file.IndexOf(".temp") > 0)
                        {
                            // Just delete the temp files each possible pass.

                            File.Delete(file);

                            tempPostersDeleted++;
                        }
                        else if (File.GetCreationTime(file) < DateTime.Now.AddDays(MOVIE_EXPIRATION_DAYS * -1))
                        {
                            File.Delete(file);

                            postersDeleted++;
                        }
                    }

                    // Loop through the Shared images.

                    foreach (var file in Directory.GetFiles(directory, "Shared_*"))
                    {
                        if (File.GetCreationTime(file) < DateTime.Now.AddMinutes(SHARED_EXPIRATION_MINUTES * -1))
                        {
                            File.Delete(file);

                            sharedDeleted++;
                        }
                    }

                    // Loop through the Twitter images.

                    foreach (var file in Directory.GetFiles(directory, "Twitter_*"))
                    {
                        if (File.GetCreationTime(file) < DateTime.Now.AddMinutes(TWITTER_EXPIRATION_MINUTES * -1))
                        {
                            File.Delete(file);

                            twitterDeleted++;
                        }
                    }

                    NextCleanup = DateTime.Now.AddMinutes(SHARED_EXPIRATION_MINUTES);

                    AppInsightsClient?.TrackTrace("Cleanup Files: ", SeverityLevel.Information
                                                  , new Dictionary <string, string> {
                        { "tempPostersDeleted", tempPostersDeleted.ToString() }
                        , { "postersDeleted", postersDeleted.ToString() }
                        , { "sharedDeleted", sharedDeleted.ToString() }
                        , { "twitterDeleted", twitterDeleted.ToString() }
                        , { "NextCleanup", NextCleanup.ToString() }
                    });
                }
                finally
                {
                    // Make sure this gets set back NO MATTER WHAT, otherwise it will NEVER clean up!!
                    _isCleaningUp = false;
                }
            }
        }