public static string GetString(this ItemDuration duration) { switch (duration) { case ItemDuration.OneHour: return("1h"); case ItemDuration.SixHours: return("6h"); case ItemDuration.TwelveHours: return("12h"); case ItemDuration.OneDay: return("1d"); case ItemDuration.ThreeDays: return("3d"); case ItemDuration.SevenDays: return("7d"); case ItemDuration.ThirtyDays: return("30d"); case ItemDuration.NinetyDays: return("90d"); default: throw new ArgumentOutOfRangeException(nameof(duration), duration, null); } }
public async Task <dynamic> Details(Guid dashboardId, int groupIndex, int itemIndex, ItemDuration duration, DateTime durationFrom, DateTime durationTo, string searchQuery, string[] queryParts) { var dashboard = _config.Dashboards[dashboardId]; var groupKey = dashboard.Keys.ToList()[groupIndex]; var item = _config.Dashboards[dashboardId].Select(d => d.Value).ToList()[groupIndex][itemIndex]; string itemQuery; string intervalString; if (duration == ItemDuration.Custom) { intervalString = durationFrom.GetIntervalString(durationTo); itemQuery = GetQueryString(item, durationFrom, durationTo, intervalString); } else { intervalString = duration.GetIntervalString(); itemQuery = GetQueryString(item, duration.GetString(), intervalString); } var structuredQuery = QueryBuilder.Parse(itemQuery); var queryGroup = new QueryGroup(structuredQuery); queryGroup.AddParts(queryParts); if (!string.IsNullOrWhiteSpace(searchQuery)) { foreach (var searchQueryPart in GetSearchQueryParts(searchQuery)) { queryGroup.AddWhere(searchQueryPart); } } var values = await GetChartValues(item, queryGroup.ToString()); // Fallback when all values are errors if ((queryGroup.IsRequestsQuery() || queryGroup.IsExceptionsQuery()) && values.Count > 4 && (int)values.OrderByDescending(v => v.Value).Skip(values.Count / 2).Take(values.Count / 2).Max(v => v.Value) == (int)values.OrderByDescending(v => v.Value).Skip(values.Count / 2).Take(values.Count / 2).Average(v => v.Value)) { queryGroup.RemoveProjectAndSummarize(); queryGroup.Append(QueryBuilder.Parse($"summarize _count=sum(itemCount) by bin(timestamp, {intervalString}) | project timestamp, _count")); values = await GetChartValues(item, queryGroup.ToString()); } List <(DateTime Date, double Value)> chart; if (duration == ItemDuration.Custom) { chart = FillEmptySlotsInTimeRange(values, durationFrom, durationTo, intervalString.GetTimeSpan()); } else { chart = FillEmptySlotsInTimeRange(values, duration.GetString().GetTimeSpan(), intervalString.GetTimeSpan()); } var chartMax = chart.Any() ? chart.Max(c => c.Value) : 0; var minMax = item.MinChartValue / item.Duration.GetIntervalString().GetTimeSpan().TotalMinutes *intervalString.GetTimeSpan().TotalMinutes; minMax = Math.Min(minMax, chartMax * 5); var max = Math.Max(minMax, chartMax); queryGroup.RemoveProjectAndSummarize(); var count = await GetCountQuery(dashboardId, groupIndex, itemIndex, duration, durationFrom, durationTo, queryParts); return(new { Name = $"{groupKey} / {item.Name}", ChartValues = chart.Select(c => new { c.Date, c.Value }), ChartMax = max, Query = queryGroup.ToString(), Count = count }); }
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); }
public async Task <dynamic> Analyzer(Guid dashboardId, int groupIndex, int itemIndex, string analyzer, ItemDuration duration, DateTime durationFrom, DateTime durationTo, string searchQuery, 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 { itemQuery = GetQueryString(item, duration.GetString(), duration.GetIntervalString()); } var query = QueryBuilder.Parse(itemQuery); if (!string.IsNullOrWhiteSpace(searchQuery)) { var queryGroup = new QueryGroup(query); foreach (var searchQueryPart in GetSearchQueryParts(searchQuery)) { queryGroup.AddWhere(searchQueryPart); } query = QueryBuilder.Parse(queryGroup.ToString()); } switch (analyzer) { case "RequestsAnalyzer": return(await RequestsAnalyzer.Analyze(item.ApiToken.Id, item.ApiToken.Key, query, queryParts)); case "UrlAnalyzer": return(await UrlAnalyzer.Analyze(item.ApiToken.Id, item.ApiToken.Key, query, queryParts)); case "DomainAnalyzer": return(await DomainAnalyzer.Analyze(item.ApiToken.Id, item.ApiToken.Key, query, queryParts)); case "StatusCodesAnalyzer": return(await StatusCodesAnalyzer.Analyze(item.ApiToken.Id, item.ApiToken.Key, query, queryParts)); case "RequestExceptionsAnalyzer": return(await ExceptionsAnalyzer.Analyze(item.ApiToken.Id, item.ApiToken.Key, query, queryParts)); case "StacktraceAnalyzer": return(await StacktraceAnalyzer.Analyze(item.ApiToken.Id, item.ApiToken.Key, query, queryParts)); case "ExceptionMessageAnalyzer": return(await ExceptionMessageAnalyzer.Analyze(item.ApiToken.Id, item.ApiToken.Key, query, queryParts)); } throw new InvalidOperationException($"Analyzer \"{analyzer}\" was not found."); }
// Methods public void PostItem( string name, string description, ItemSection section, int categoryId, int amount, ItemCondition condition, ItemWarranty warranty, ItemDuration duration, int userId) { // Check if parameters are valid... if (string.IsNullOrEmpty(name.Trim()) | name.Trim().Length > 50) { throw new ValidationException("Item name is either blank or has exceeded 50 characters."); } if (string.IsNullOrEmpty(description.Trim()) | description.Trim().Length > 500) { throw new ValidationException("Description is either blank or has exceeded 500 characters."); } if (categoryId <= 0) { throw new ValidationException("Category is invalid."); } if (amount <= 0) { throw new ValidationException("Amount is invalid"); } if (userId <= 0) { throw new ValidationException("User is invalid."); } // Get date and time stamps... var timeStamp = DateTime.Now; // Insert header... var header = _headerRepository.Insert( new Header() { Title = name, UserId = userId, Created = timeStamp, Updated = timeStamp }); if (header.Id <= 0) { throw new ApplicationException(@"Failure inserting to table ""Header""."); } // Insert entry... var entry = _entryRepository.Insert( new Entry() { Message = description, HeaderId = header.Id, UserId = userId, Created = timeStamp, Updated = timeStamp }); // Insert item... var item = _itemRepository.Insert( new Item() { HeaderId = header.Id, CategoryId = categoryId, UserId = userId, Amount = amount, Section = section, Condition = condition, Warranty = warranty, Created = timeStamp, Updated = timeStamp, Expiry = timeStamp.AddDays((int)duration) }); // Commit - let the caller of this method handle the transaction... //var inserted = _unitOfWork.Commit(); //return inserted; }
// Methods public void PostItem( string name, string description, ItemSection section, int categoryId, int amount, ItemCondition condition, ItemWarranty warranty, ItemDuration duration, int userId) { // Check if parameters are valid... if (string.IsNullOrEmpty(name.Trim()) | name.Trim().Length > 50) { throw new ValidationException("Item name is either blank or has exceeded 50 characters."); } if (string.IsNullOrEmpty(description.Trim()) | description.Trim().Length > 500) { throw new ValidationException("Description is either blank or has exceeded 500 characters."); } if (categoryId <= 0) { throw new ValidationException("Category is invalid."); } if (amount <= 0) { throw new ValidationException("Amount is invalid"); } if (userId <= 0) { throw new ValidationException("User is invalid."); } // Get date and time stamps... var timeStamp = DateTime.Now; // Insert header... var header = _headerRepository.Insert( new Header() { Title = name, UserId = userId, Created = timeStamp, Updated = timeStamp }); if (header.Id <= 0) { throw new ApplicationException(@"Failure inserting to table ""Header""."); } // Insert entry... var entry = _entryRepository.Insert( new Entry() { Message = description, HeaderId = header.Id, UserId = userId, Created = timeStamp, Updated = timeStamp }); // Insert item... var item = _itemRepository.Insert( new Item() { HeaderId = header.Id, CategoryId = categoryId, UserId = userId, Amount = amount, Section = section, Condition = condition, Warranty = warranty, Created = timeStamp, Updated = timeStamp, Expiry = timeStamp.AddDays((int)duration) }); // Commit - let the caller of this method handle the transaction... //var inserted = _unitOfWork.Commit(); //return inserted; }
public static string GetIntervalString(this ItemDuration duration, int splits = 30) { var minutes = Math.Max(duration.GetString().GetTimeSpan().TotalMinutes / splits, 1); return($"{minutes:0}m"); }