Ejemplo n.º 1
0
        /// <summary>
        /// 更新在线状态
        /// </summary>
        /// <param name="app"></param>
        /// <param name="clientId"></param>
        /// <param name="ip"></param>
        /// <param name="token"></param>
        /// <returns></returns>
        public static ConfigOnline UpdateOnline(AppConfig app, String clientId, String ip, String token)
        {
            var online = GetOrAddClient(clientId) ?? GetOrAddClient(ip, token);

            online.AppId = app.Id;
            //online.Name = app.Name;
            online.Category = app.Category;
            online.Token    = token;
            online.PingCount++;
            if (online.CreateIP.IsNullOrEmpty())
            {
                online.CreateIP = ip;
            }
            online.Creator = Environment.MachineName;

            var appOnline = AppOnline.FindByToken(token);

            if (appOnline != null)
            {
                online.UpdateInfo(app, appOnline);
            }

            online.SaveAsync(3_000);

            return(online);
        }
Ejemplo n.º 2
0
        public PeerModel[] GetPeers()
        {
            var app = Session["App"] as App;

            var olts = AppOnline.FindAllByAppID(app.ID);

            return(olts.Select(e => e.ToModel()).ToArray());
        }
Ejemplo n.º 3
0
        //每10s清除一次UpdateTime超10分钟未更新的
        private static void ClearOnline(Object state)
        {
            var ls = AppOnline.GetOnlines(10);

            foreach (var item in ls)
            {
                item.Delete();
            }
        }
Ejemplo n.º 4
0
        AppOnline GetOnline(IApp app, INetSession ns)
        {
            if (Session["AppOnline"] is AppOnline online)
            {
                return(online);
            }

            var ip  = ns.Remote.Host;
            var ins = ns.Remote.EndPoint + "";

            online = AppOnline.FindByInstance(ins) ?? new AppOnline {
                CreateIP = ip
            };
            online.AppID    = app.ID;
            online.Instance = ins;

            return(online);
        }
Ejemplo n.º 5
0
        AppOnline GetOnline(App app, INetSession ns)
        {
            if (Session["AppOnline"] is AppOnline online)
            {
                return(online);
            }

            var ip  = ns.Remote.Host;
            var ins = ns.Remote.EndPoint + "";

            online = AppOnline.FindByClient(ins) ?? new AppOnline {
                CreateIP = ip
            };
            online.AppId  = app.Id;
            online.Client = ins;

            return(online);
        }
Ejemplo n.º 6
0
        /// <summary>更新信息</summary>
        /// <param name="app"></param>
        /// <param name="online"></param>
        public void UpdateInfo(AppConfig app, AppOnline online)
        {
            //PingCount++;

            //AppId = app.Id;
            //Name = app.Name;

            if (online != null)
            {
                Name        = online.Name;
                Version     = online.Version;
                UserName    = online.UserName;
                ProcessId   = online.Id;
                ProcessName = online.ProcessName;
                StartTime   = online.StartTime;
            }

            //Creator = Environment.MachineName;

            //SaveAsync();
        }
Ejemplo n.º 7
0
        public PeerModel[] GetPeers()
        {
            var olts = AppOnline.FindAllByAppID(_App.ID);

            return(olts.Select(e => e.ToModel()).ToArray());
        }
Ejemplo n.º 8
0
        public TraceResponse Report([FromBody] TraceModel model, String token)
        {
            var builders = model?.Builders;

            if (model == null || model.AppId.IsNullOrEmpty())
            {
                return(null);
            }

            var ip = HttpContext.GetUserHost();

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

            var set = Setting.Current;

            // 新版验证方式,访问令牌
            App ap = null;

            if (!token.IsNullOrEmpty() && token.Split(".").Length == 3)
            {
                ap = _service.DecodeToken(token, set);
                //if (ap == null || ap.Name != model.AppId) throw new InvalidOperationException($"授权不匹配[{model.AppId}]!=[{ap?.Name}]!");
                if (ap == null)
                {
                    throw new InvalidOperationException($"授权不匹配[{model.AppId}]!=[{ap?.Name}]!");
                }
            }
            App.UpdateInfo(model, ip);

            var clientId = model.ClientId;

            if (clientId.IsNullOrEmpty())
            {
                var(jwt, ex) = _service.DecodeToken(token, set.TokenSecret);
                clientId     = jwt?.Id;
            }
            AppOnline.UpdateOnline(ap, clientId, ip, token, model.Info);

            // 该应用的追踪配置信息
            var app = AppTracer.FindByName(model.AppId);

            if (app == null)
            {
                app = new AppTracer
                {
                    Name        = model.AppId,
                    DisplayName = model.AppName,
                    Enable      = set.AutoRegister,
                };
                app.Save();
            }

            // 校验应用
            if (app == null || !app.Enable)
            {
                throw new Exception($"无效应用[{model.AppId}/{model.AppName}]");
            }

            // 插入数据
            if (builders != null && builders.Length > 0)
            {
                Task.Run(() => ProcessData(app, model, ip, builders));
            }

            // 构造响应
            var rs = new TraceResponse
            {
                Period     = app.Period,
                MaxSamples = app.MaxSamples,
                MaxErrors  = app.MaxErrors,
                Timeout    = app.Timeout,
                //Excludes = app.Excludes?.Split(",", ";"),
            };

            // Vip客户端。高频次大样本采样,10秒100次,逗号分割,支持*模糊匹配
            if (app.IsVip(model.ClientId))
            {
                rs.Period     = 10;
                rs.MaxSamples = 100;
            }

            // 新版本才返回Excludes,老版本客户端在处理Excludes时有BUG,错误处理/
            if (!model.Version.IsNullOrEmpty())
            {
                rs.Excludes = app.Excludes?.Split(",", ";");
            }

            return(rs);
        }