Esempio n. 1
0
        public TraceResponse Report([FromBody] MyTraceModel model)
        {
            var builders = model?.Builders.Cast <ISpanBuilder>().ToArray();

            //var builders = new ISpanBuilder[0];
            if (model == null || model.AppId.IsNullOrEmpty() || builders == null || builders.Length == 0)
            {
                return(null);
            }

            // 校验应用
            var app = AppTracer.FindByName(model.AppId);

            if (app == null)
            {
                app = new AppTracer
                {
                    Name        = model.AppId,
                    DisplayName = model.AppName,
                    Enable      = Setting.Current.AutoRegister,
                };
                app.Save();
            }
            if (!app.Enable)
            {
                throw new Exception($"无效应用[{model.AppId}/{model.AppName}]");
            }

            // 插入数据
            var ip = HttpContext.GetUserHost();

            if (ip.IsNullOrEmpty())
            {
                ip = ManageProvider.UserHost;
            }

            Task.Run(() => ProcessData(app, ip, builders));

            _stat.Add(app.ID);
            _appStat.Add(app.ID);

            // 构造响应
            return(new TraceResponse
            {
                Period = app.Period,
                MaxSamples = app.MaxSamples,
                MaxErrors = app.MaxErrors,
            });
        }
Esempio n. 2
0
        public ActionResult RetryStat()
        {
            foreach (var item in SelectKeys)
            {
                var stat = FindByID(item.ToInt());
                if (stat != null)
                {
                    XTrace.WriteLine("重新统计 {0}/{1} {2}", stat.AppName, stat.AppId, stat.StatDate);

                    _appStat.Add(stat.StatDate);
                    //TraceStat.Add(stat.AppId, stat.StatDate);
                    //TraceStat.Add(stat.AppId, stat.StatDate.AddDays(1));
                    //TraceStat.Add(stat.AppId, stat.StatDate.AddDays(1).AddSeconds(-1));
                    for (var time = stat.StatDate; time < stat.StatDate.AddDays(1); time = time.AddMinutes(5))
                    {
                        _traceStat.Add(stat.AppId, time);
                    }
                }
            }

            return(JsonRefresh("成功!"));
        }
Esempio n. 3
0
        private void ProcessData(AppTracer app, TraceModel model, String ip, ISpanBuilder[] builders)
        {
            // 排除项
            var excludes = app.Excludes.Split(",", ";") ?? new String[0];

            var now     = DateTime.Now;
            var traces  = new List <TraceData>();
            var samples = new List <SampleData>();

            foreach (var item in builders)
            {
                // 剔除指定项
                if (item.Name.IsNullOrEmpty())
                {
                    continue;
                }
                if (excludes != null && excludes.Any(e => e.IsMatch(item.Name)))
                {
                    continue;
                }
                if (item.Name.EndsWithIgnoreCase("/Trace/Report"))
                {
                    continue;
                }

                // 拒收超长项
                if (item.Name.Length > TraceData._.Name.Length)
                {
                    continue;
                }

                var td = TraceData.Create(item);
                td.AppId      = app.ID;
                td.ClientId   = model.ClientId ?? ip;
                td.CreateIP   = ip;
                td.CreateTime = now;

                traces.Add(td);

                samples.AddRange(SampleData.Create(td, item.Samples, true));
                samples.AddRange(SampleData.Create(td, item.ErrorSamples, false));
            }

            traces.Insert(true);
            samples.Insert(true);

            // 更新统计
            _stat.Add(traces);
            _appStat.Add(now.Date);
            if (now.Hour == 0 && now.Minute <= 10)
            {
                _appStat.Add(now.Date.AddDays(-1));
            }

            if (!ip.IsNullOrEmpty() && ip.Length >= 3)
            {
                // 应用节点数
                var nodes = app.Nodes?.Split(",").ToList() ?? new List <String>();
                if (!nodes.Contains(ip))
                {
                    // 如果超过一定时间没有更新,则刷新它
                    if (_cache.Add("appNodes:" + app.ID, 1, 3600))
                    {
                        nodes.Clear();
                    }

                    nodes.Insert(0, ip);
                    if (nodes.Count > 32)
                    {
                        nodes = nodes.Take(32).ToList();
                    }

                    // 排序,避免Nodes字段频繁更新
                    app.Nodes = nodes.OrderBy(e => e).Join();
                    app.SaveAsync();
                }
            }
        }