public async Task<ServerPullData> PullAsync(MonitoringQuery query)
        {
            var server = _servers.GetOrAdd(query.Server.Id, hash => new ServerInfo());

            var serverData = _serversData.GetOrAdd(query.Server.Id, hash => new InMemoryServerData()).ToList();

            if(!serverData.Any())
                return new ServerPullData();

            var items = new List<ServerStatisticsDataItem>();

            foreach (var sData in serverData)
            {
                var item = new ServerStatisticsDataItem
                {
                    Name = sData.Key,
                    Order = sData.Value.Order,
                    CurrentValue = await sData.Value.LastValue(),
                    CurrentValueDisplay = sData.Value.Display,
                    Type = sData.Value.Type,
                    Data = await sData.Value.FilterData(query)
                };

                items.Add(item);
            }

            var result = new ServerPullData { LastPush = server.LastPush, Items = items.OrderBy(x => x.Order) };

            return await Task.FromResult(result);
        }
        public async Task InternalPush(ServerStatisticsDataItem item)
        {
            _monitoringData.Enqueue(new InMemoryTimeValue(item.CurrentValue, DateTime.UtcNow));

            Order = item.Order;
            Display = item.CurrentValueDisplay;

            await Task.CompletedTask;
        }