Exemplo n.º 1
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();
                }
            }
        }