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, }); }
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("成功!")); }
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(); } } }