/// <summary> /// 获取首页数据 /// </summary> /// <param name="filterOption"></param> /// <returns></returns> public async Task <IndexPageData> GetIndexPageDataAsync(IndexPageDataFilterOption filterOption) { string where = BuildSqlFilter(filterOption); string sql = $@"Select COUNT(1) Total From RequestInfo {where}; Select COUNT(1) Code404 From RequestInfo {where} AND StatusCode = 404; Select COUNT(1) Code500 From RequestInfo {where} AND StatusCode = 500; Select Count(1) From ( Select Distinct Url From RequestInfo ) A; Select AVG(Milliseconds) ART From RequestInfo {where};"; TraceLogSql(sql); IndexPageData result = new IndexPageData(); await LoggingSqlOperation(async connection => { using (var resultReader = await connection.QueryMultipleAsync(sql).ConfigureAwait(false)) { result.Total = resultReader.ReadFirstOrDefault <int>(); result.NotFound = resultReader.ReadFirstOrDefault <int>(); result.ServerError = resultReader.ReadFirstOrDefault <int>(); result.APICount = resultReader.ReadFirst <int>(); result.ErrorPercent = result.Total == 0 ? 0 : Convert.ToDouble(result.ServerError) / Convert.ToDouble(result.Total); result.AvgResponseTime = double.TryParse(resultReader.ReadFirstOrDefault <string>(), out var avg) ? avg : 0; } }, "获取首页数据异常").ConfigureAwait(false); return(result); }
/// <summary> /// 获取首页数据 /// </summary> /// <param name="filterOption"></param> /// <returns></returns> public async Task <IndexPageData> GetIndexPageDataAsync(IndexPageDataFilterOption filterOption) { string where = BuildSqlFilter(filterOption); string sql = $@" Select 'Total' KeyField, COUNT(1) ValueField From RequestInfo {where} Union Select 'Code404' KeyField, COUNT(1) ValueField From RequestInfo {where} AND StatusCode = 404 Union Select 'Code500' KeyField, COUNT(1) ValueField From RequestInfo {where} AND StatusCode = 500 Union Select 'APICount' KeyField, Count(1) ValueField From ( Select Distinct Url From RequestInfo ) A Union Select 'ART' KeyField, Round(AVG(Milliseconds),2) ValueField From RequestInfo {where} "; TraceLogSql(sql); IndexPageData result = new IndexPageData(); await LoggingSqlOperation(async connection => { var data = await connection.QueryAsync <KVClass <string, string> >(sql).ConfigureAwait(false); result.Total = data.Where(x => x.KeyField == "Total").FirstOrDefault().ValueField.ToInt(); result.NotFound = data.Where(x => x.KeyField == "Code404").FirstOrDefault().ValueField.ToInt(); result.ServerError = data.Where(x => x.KeyField == "Code500").FirstOrDefault().ValueField.ToInt(); result.APICount = data.Where(x => x.KeyField == "APICount").FirstOrDefault().ValueField.ToInt(); result.ErrorPercent = result.Total == 0 ? 0 : Convert.ToDouble(result.ServerError) / Convert.ToDouble(result.Total); result.AvgResponseTime = data.Where(x => x.KeyField == "ART").FirstOrDefault().ValueField.ToDouble(); }, "获取首页数据异常").ConfigureAwait(false); return(result); }
public async Task <IndexPageData> GetIndexPageDataAsync(IndexPageDataFilterOption option) { IndexPageData result = new IndexPageData(); var Total = await Client.SearchAsync <RequestInfo>(x => x.Index(GetIndexName <RequestInfo>()) .Query(c => c.HasDateWhere(option.StartTime, option.EndTime) && c.Terms(f => f.Field(e => e.Node).Terms(option.Service.ToLowerInvariant()))) .Aggregations(c => c.ValueCount("Id", d => d.Field(e => e.Id))).Size(0) ); if (Total != null && Total.IsValid) { result.Total = Convert.ToInt32(Total.Total); } var NotFound = await Client.SearchAsync <RequestInfo>(x => x.Index(GetIndexName <RequestInfo>()) .Query(c => c.HasDateWhere(option.StartTime, option.EndTime) && c.Terms(f => f.Field(e => e.Node).Terms(option.Service.ToLowerInvariant())) && c.Term(f => f.StatusCode, 404) ) .Aggregations(c => c.ValueCount("Id", d => d.Field(e => e.Id))).Size(0) ); if (NotFound != null && NotFound.IsValid) { result.NotFound = Convert.ToInt32(NotFound.Total); } var ServerError = await Client.SearchAsync <RequestInfo>(x => x.Index(GetIndexName <RequestInfo>()) .Query(c => c.HasDateWhere(option.StartTime, option.EndTime) && c.Terms(f => f.Field(e => e.Node).Terms(option.Service.ToLowerInvariant())) && c.Term(f => f.StatusCode, 500) ) .Aggregations(c => c.ValueCount("Id", d => d.Field(e => e.Id))).Size(0) ); if (ServerError != null && ServerError.IsValid) { result.ServerError = Convert.ToInt32(ServerError.Total); } var APICount = await Client.SearchAsync <RequestInfo>(x => x.Index(GetIndexName <RequestInfo>()) .Query(c => c.HasDateWhere(option.StartTime, option.EndTime) && c.Terms(f => f.Field(e => e.Node).Terms(option.Service.ToLowerInvariant()))) .Aggregations(c => c.Cardinality("url", t => t.Field(e => e.Url))) .Size(0) ); if (APICount != null && APICount.IsValid) { if (APICount.Aggregations.Count > 0) { var model = (APICount.Aggregations.FirstOrDefault().Value as Nest.ValueAggregate); result.APICount = model.Value.HasValue ? model.Value.Value.ToInt() : 0; } } var Avg = await Client.SearchAsync <RequestInfo>(x => x.Index(GetIndexName <RequestInfo>()) .Query(c => c.HasDateWhere(option.StartTime, option.EndTime) && c.Terms(f => f.Field(e => e.Node).Terms(option.Service.ToLowerInvariant()))) .Aggregations(c => c.Average("average", d => d.Field(e => e.Milliseconds))) .Size(0) ); if (Avg != null && Avg.IsValid) { if (Avg.Aggregations.Count > 0) { var model = (Avg.Aggregations.FirstOrDefault().Value as Nest.ValueAggregate); result.AvgResponseTime = model.Value.HasValue ? model.Value.Value.ToInt() : 0; } } result.ErrorPercent = result.Total == 0 ? 0 : Convert.ToDouble(result.ServerError) / Convert.ToDouble(result.Total); return(result); }
public Task <IndexPageData> GetIndexPageDataAsync(IndexPageDataFilterOption filterOption) { throw new NotImplementedException(); }
public async Task <string> GetServiceBasicData(QueryRequest request) { var start = request.Start.ToDateTime(); var end = request.End.ToDateTime(); #region BuildService if (request.Service.IsEmpty() || request.Service == "ALL") { request.Service = ""; } if (request.Instance.IsEmpty() || request.Instance == "ALL") { request.LocalIP = ""; request.LocalPort = 0; } else { request.LocalIP = request.Instance.Substring(0, request.Instance.LastIndexOf(':')); request.LocalPort = request.Instance.Substring(request.Instance.LastIndexOf(':') + 1).ToInt(); } #endregion IndexPageDataFilterOption option = new IndexPageDataFilterOption { Service = request.Service, LocalIP = request.LocalIP, LocalPort = request.LocalPort, StartTime = start, EndTime = end, StartTimeFormat = "yyyy-MM-dd HH:mm:ss", EndTimeFormat = "yyyy-MM-dd HH:mm:ss", Take = 6 }; BasicFilter filter = new BasicFilter { Service = request.Service, Instance = request.Instance, StartTime = start, EndTime = end, Count = 6 }; var route = await _storage.GetGroupData(filter, GroupType.Route); var instance = await _storage.GetGroupData(filter, GroupType.Instance); var range = GetTimeRange(option.StartTime.Value, option.EndTime.Value); var app = await _storage.GetAppStatus(filter, range); return(Json(new HttpResultEntity(1, "ok", new { route = route, instance = instance, range = range, app = app }))); }
public async Task <string> GetIndexBasicData(QueryRequest request) { Stopwatch stopwatch = new Stopwatch(); stopwatch.Start(); var start = request.Start.ToDateTime(); var end = request.End.ToDateTime(); #region BuildService if (request.Service.IsEmpty() || request.Service == "ALL") { request.Service = ""; } if (request.Instance.IsEmpty() || request.Instance == "ALL") { request.LocalIP = ""; request.LocalPort = 0; } else { request.LocalIP = request.Instance.Substring(0, request.Instance.LastIndexOf(':')); request.LocalPort = request.Instance.Substring(request.Instance.LastIndexOf(':') + 1).ToInt(); } #endregion IndexPageDataFilterOption option = new IndexPageDataFilterOption { Service = request.Service, LocalIP = request.LocalIP, LocalPort = request.LocalPort, StartTime = start, EndTime = end, StartTimeFormat = "yyyy-MM-dd HH:mm:ss", EndTimeFormat = "yyyy-MM-dd HH:mm:ss", Take = 6 }; BasicFilter filter = new BasicFilter { Service = request.Service, Instance = request.Instance, StartTime = start, EndTime = end, Count = 6 }; var a0 = stopwatch.ElapsedMilliseconds; var basic = await _storage.GetIndexBasicDataAsync(filter); var a1 = stopwatch.ElapsedMilliseconds; var top = await _storage.GetGroupData(filter, GroupType.Service); var a2 = stopwatch.ElapsedMilliseconds; var range = GetTimeRange(option.StartTime.Value, option.EndTime.Value); var trend = await _storage.GetServiceTrend(filter, range); var a3 = stopwatch.ElapsedMilliseconds; var heatmap = await _storage.GetServiceHeatMap(filter, range); var a4 = stopwatch.ElapsedMilliseconds; //await Task.WhenAll(basic,top,trend,heatmap); stopwatch.Stop(); return(Json(new HttpResultEntity(1, "ok", new { Total = basic.Total, ServerError = basic.ServerError, Service = basic.Service, Instance = basic.Instance, Top = top, Trend = trend, HeatMap = heatmap, Cost = stopwatch.ElapsedMilliseconds }))); }