コード例 #1
0
        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)));
        }
コード例 #2
0
        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);
        }
コード例 #3
0
        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);
        }