public TraceDayStat GetOrAdd(DateTime date, Int32 appId, String name, out String key) { var model = new TraceStatModel { Time = date, AppId = appId, Name = name }; key = model.Key; return(GetOrAdd(key, k => TraceDayStat.FindOrAdd(model))); }
private void DoTraceStat(Object state) { // 拿到需要统计的应用 var appIds = new List <Int32>(); while (_bag.TryTake(out var id)) { appIds.Add(id); } if (appIds.Count == 0) { return; } // 统计日期,凌晨0点10分之前统计前一天 var time = DateTime.Now; if (time.Hour == 0 && time.Minute < 10) { time = time.AddDays(-1); } var date = time.Date; // 统计数据 var list = TraceData.SearchGroupAppAndName(date, appIds.ToArray()); if (list.Count == 0) { return; } // 统计对象 var sts = TraceDayStat.Search(date, list.Select(e => e.AppId).ToArray()); // 聚合 foreach (var item in list) { var st = sts.FirstOrDefault(e => e.AppId == item.AppId && e.Name == item.Name); if (st == null) { st = new TraceDayStat { StatDate = date, AppId = item.AppId, Name = item.Name }; sts.Add(st); } st.Total = item.Total; st.Errors = item.Errors; st.TotalCost = item.TotalCost; st.MaxCost = item.MaxCost; st.MinCost = item.MinCost; } // 保存统计 sts.Save(true); }
private void Process(DateTime date) { // 统计数据,每日跟踪根据应用和类型分组 var list = TraceDayStat.SearchGroupApp(date); if (list.Count == 0) { return; } // 统计对象 var sts = AppDayStat.Search(date, null); // 聚合,按应用分组,每一组内每个类型一行 var dic = list.GroupBy(e => e.AppId); foreach (var item in dic) { var appId = item.Key; if (appId <= 0) { continue; } var ds = item.ToList(); var st = sts.FirstOrDefault(e => e.AppId == appId); if (st == null) { st = new AppDayStat { StatDate = date, AppId = appId }; sts.Add(st); } st.Total = ds.Sum(e => e.Total); st.Errors = ds.Sum(e => e.Errors); st.TotalCost = ds.Sum(e => e.TotalCost); st.MaxCost = ds.Max(e => e.MaxCost); st.MinCost = ds.Min(e => e.MinCost); // 分类统计,应用有可能缺失某些类别 st.Apis = ds.Where(e => e.Type == "api").Sum(e => e.Total); st.Https = ds.Where(e => e.Type == "http").Sum(e => e.Total); st.Dbs = ds.Where(e => e.Type == "db").Sum(e => e.Total); st.Mqs = ds.Where(e => e.Type == "mq").Sum(e => e.Total); st.Redis = ds.Where(e => e.Type == "redis").Sum(e => e.Total); st.Others = ds.Where(e => e.Type == "other").Sum(e => e.Total); } // 保存统计 sts.Save(false); }