예제 #1
0
        private static void AddEventRow(StringBuilder sb, StatsEvent ev)
        {
            var eventView = new EventViewModel((StEvent)ev.Event, ev.UserId, ev.Time, (DeviceType)ev.DeviceType);

            sb.Append(ev.Id);
            sb.Append(";");
            sb.Append(ev.Event);
            sb.Append(";");
            sb.Append("\"" + eventView.evt + "\"");

            sb.Append(";");
            sb.Append(ev.DiscussionId);
            sb.Append(";");
            sb.Append("\"" + ev.DiscussionName + "\"");
            sb.Append(";");
            sb.Append(ev.TopicId);
            sb.Append(";");
            sb.Append("\"" + ev.TopicName + "\"");
            sb.Append(";");
            sb.Append(ev.UserId);
            sb.Append(";");
            sb.Append("\"" + ev.UserName + "\"");
            sb.Append(";");
            sb.Append(ev.Time.ToString("dd.MM.yyyy HH:mm:ss"));
            sb.Append(";");
            sb.Append(ev.DeviceType);
            sb.Append(";");
            sb.AppendLine("\"" + eventView.devType + "\"");
        }
        private static void AssertSerialize(
            string expectValue,
            string title           = null,
            string text            = null,
            string alertType       = null,
            string aggregationKey  = null,
            string sourceType      = null,
            int?dateHappened       = null,
            string priority        = null,
            string hostname        = null,
            string[] tags          = null,
            bool truncateIfTooLong = false)
        {
            var serializer = CreateSerializer();
            var statsEvent = new StatsEvent
            {
                Title             = title,
                Text              = text,
                AlertType         = alertType,
                AggregationKey    = aggregationKey,
                SourceType        = sourceType,
                DateHappened      = dateHappened,
                Priority          = priority,
                Hostname          = hostname,
                TruncateIfTooLong = truncateIfTooLong,
                Tags              = tags,
            };

            var serializedMetric = new SerializedMetric();

            serializer.SerializeTo(ref statsEvent, serializedMetric);
            Assert.AreEqual(expectValue, serializedMetric.ToString());
        }
예제 #3
0
        public static bool Log(DiscCtx ctx, StEvent e, int userId, int discussionId, int topicId, DeviceType devType)
        {
            var pers = ctx.Person.FirstOrDefault(p0 => p0.Id == userId);

            if (pers == null && userId != -1)
            {
                return(false);
            }

            var disc = ctx.Discussion.FirstOrDefault(d0 => d0.Id == discussionId);

            if (disc == null)
            {
                return(false);
            }

            var topic = ctx.Topic.FirstOrDefault(t0 => t0.Id == topicId);

            if (topic == null)
            {
                return(false);
            }

            if (!topic.Running && e != StEvent.RecordingStarted &&
                e != StEvent.RecordingStopped)
            {
                return(false);
            }

            var s = new StatsEvent
            {
                DiscussionId   = discussionId,
                DiscussionName = disc.Subject,
                TopicId        = topicId,
                TopicName      = topic.Name,
                UserId         = userId
            };

            if (pers != null)
            {
                s.UserName = pers.Name;
            }
            else
            {
                s.UserName = "******";
            }
            s.Event      = (int)e;
            s.Time       = DateTime.Now;
            s.DeviceType = (int)devType;

            ctx.AddToStatsEvent(s);
            ctx.SaveChanges();

            return(true);
        }
예제 #4
0
        public void SerializeTo(ref StatsEvent statsEvent, SerializedMetric serializedMetric)
        {
            serializedMetric.Reset();
            string processedTitle = SerializerHelper.EscapeContent(statsEvent.Title);
            string processedText  = SerializerHelper.EscapeContent(statsEvent.Text);
            var    builder        = serializedMetric.Builder;

            builder.Append("_e{");
            builder.AppendFormat(CultureInfo.InvariantCulture, "{0}", processedTitle.Length);
            builder.Append(',');
            builder.AppendFormat(CultureInfo.InvariantCulture, "{0}", processedText.Length);
            builder.Append("}:");
            builder.Append(processedTitle);
            builder.Append('|');
            builder.Append(processedText);

            if (statsEvent.DateHappened != null)
            {
                builder.AppendFormat(CultureInfo.InvariantCulture, "|d:{0}", statsEvent.DateHappened.Value);
            }

            SerializerHelper.AppendIfNotNull(builder, "|h:", statsEvent.Hostname);
            SerializerHelper.AppendIfNotNull(builder, "|k:", statsEvent.AggregationKey);
            SerializerHelper.AppendIfNotNull(builder, "|p:", statsEvent.Priority);
            SerializerHelper.AppendIfNotNull(builder, "|s:", statsEvent.SourceType);
            SerializerHelper.AppendIfNotNull(builder, "|t:", statsEvent.AlertType);

            _serializerHelper.AppendTags(builder, statsEvent.Tags);

            if (builder.Length > MaxSize)
            {
                if (statsEvent.TruncateIfTooLong)
                {
                    var overage = builder.Length - MaxSize;
                    if (statsEvent.Title.Length > statsEvent.Text.Length)
                    {
                        statsEvent.Title = SerializerHelper.TruncateOverage(statsEvent.Title, overage);
                    }
                    else
                    {
                        statsEvent.Text = SerializerHelper.TruncateOverage(statsEvent.Text, overage);
                    }

                    statsEvent.TruncateIfTooLong = true;
                    SerializeTo(ref statsEvent, serializedMetric);
                }
                else
                {
                    throw new Exception(string.Format("Event {0} payload is too big (more than 8kB)", statsEvent.Title));
                }
            }
        }
예제 #5
0
 private void RaiseCommStatsUpdateEvent(object sender, CommStatsEventArgs args)
 {
     CommStats = args;
     StatsEvent?.Invoke(this, new CommStatsEventArgs()
     {
         ID = CommStats.ID,
         CompleteProfilesReceived = CommStats.CompleteProfilesReceived,
         ProfileRate   = CommStats.ProfileRate,
         BytesReceived = CommStats.BytesReceived,
         Evicted       = CommStats.Evicted,
         DataRate      = CommStats.DataRate,
         BadPackets    = CommStats.BadPackets,
         GoodPackets   = CommStats.GoodPackets
     });
 }
        private void StatsThread()
        {
            long lastCheck = timeBase.ElapsedMilliseconds;
            long bytesReceivedSinceLastCheck    = 0;
            long profilesReceivedSinceLastCheck = 0;

            while (true)
            {
                try
                {
                    token.ThrowIfCancellationRequested();
                    Task.Delay(200, token).Wait(token);
                    long   now         = timeBase.ElapsedMilliseconds;
                    double dataRate    = (bytesReceived - bytesReceivedSinceLastCheck) * 1000.0 / (now - lastCheck);
                    long   profileRate = (CompleteProfilesReceivedCount - profilesReceivedSinceLastCheck) * 1000 /
                                         (now - lastCheck);

                    commStats.ID = scanHead.ID;
                    commStats.CompleteProfilesReceived = CompleteProfilesReceivedCount;
                    commStats.ProfileRate   = profileRate;
                    commStats.BytesReceived = bytesReceived;
                    commStats.Evicted       = evictedForTimeout + IncompleteProfilesReceivedCount;
                    commStats.DataRate      = dataRate;
                    commStats.BadPackets    = BadPacketsCount;
                    commStats.GoodPackets   = goodPackets;

                    StatsEvent?.Invoke(this, new CommStatsEventArgs()
                    {
                        ID = commStats.ID,
                        CompleteProfilesReceived = commStats.CompleteProfilesReceived,
                        ProfileRate   = commStats.ProfileRate,
                        BytesReceived = commStats.BytesReceived,
                        Evicted       = commStats.Evicted,
                        DataRate      = commStats.DataRate,
                        BadPackets    = commStats.BadPackets,
                        GoodPackets   = commStats.GoodPackets
                    });

                    lastCheck = now;
                    bytesReceivedSinceLastCheck    = bytesReceived;
                    profilesReceivedSinceLastCheck = CompleteProfilesReceivedCount;
                }
                catch (OperationCanceledException)
                {
                    break;
                }
            }
        }
예제 #7
0
        static bool EventPassesFilter(StatsEvent ev, List <ReportParameters> reportParams)
        {
            bool userTest = reportParams.Any(p => p.requiredUsers.Contains(ev.UserId));

            if (!userTest)
            {
                return(false);
            }

            if (ev.TopicId == -1)
            {
                return(true);
            }

            return(reportParams.Any(p => p.topic.Id == ev.TopicId));
        }
        public void SendEventWithMessageThatIsTooLong()
        {
            var length  = (8 * 1024) - 16; // 16 is the number of characters in the final message that is not the title
            var builder = BuildLongString(length);
            var title   = builder;

            var serializer = CreateSerializer();
            var exception  = Assert.Throws <Exception>(
                () =>
            {
                var statsEvent = new StatsEvent {
                    Title = title + "x", Text = "Text"
                };
                serializer.SerializeTo(ref statsEvent, new SerializedMetric());
            });

            Assert.That(exception.Message, Contains.Substring("payload is too big"));
        }
예제 #9
0
        public override void OnActionReceived(ActionBuffers actionBuffers)
        {
            var actions = actionBuffers.ContinuousActions.Array;

            vehicle.Motor.value    = actions[0];
            vehicle.Steering.value = actions[1];

            Vector3 fwd = vehicle.transform.forward;
            Vector3 pos = vehicle.transform.position;

            bool  chunkAdded = road.OnUpdate(pos);
            Frame frame      = road.AgentFrame;

            stats.action0          = actions[0];
            stats.action1          = actions[1];
            stats.speed            = Vector3.Dot(frame.Forward, vehicle.Rigidbody.velocity);
            stats.steer            = vehicle.Steering.CrntNormValue;
            stats.offset           = frame.LocalPosition(pos).x;
            stats.orientation      = Vector3.SignedAngle(frame.Forward, fwd, frame.Up);
            stats.collisions       = vehicle.CollisionCount;
            vehicle.CollisionCount = 0;

            updateTime = chunkAdded ? Time.time : updateTime;
            bool hasTimedOut = Time.time - updateTime > timeout;

            if (hasTimedOut || IsOffMesh())
            {
                AddReward(-1);
                ResetAgent();
            }
            else
            {
                float offRoad = Mathf.Abs(stats.offset) - Chunk.RoadExtent + 1;
                stats.reward  = offRoad > 0 ? -offRoad : stats.speed * 0.02f;
                stats.reward -= stats.collisions * 0.5f;
                AddReward(stats.reward);
            }

            StatsEvent?.Invoke(name, stats);
        }
예제 #10
0
        private TreeViewItem GetEvent(StatsEvent e, DiscCtx ctx)
        {
            var res       = new TreeViewItem();
            var eventView = new EventViewModel((StEvent)e.Event, e.UserId, e.Time, (DeviceType)e.DeviceType);

            res.Header = eventView.evt;

            res.Items.Add(GetUser(ctx.Person.FirstOrDefault(p0 => p0.Id == e.UserId)));

            if (!string.IsNullOrEmpty(e.TopicName))
            {
                res.Items.Add(e.TopicName);
            }
            if (!string.IsNullOrEmpty(e.DiscussionName))
            {
                res.Items.Add(e.DiscussionName);
            }
            res.Items.Add(eventView.dateTime);
            res.Items.Add(eventView.devType);

            return(res);
        }
예제 #11
0
        public static void recordEvent(TimelineEvent evt, DateTime startTime)
        {
            var _ctx = DbCtx.Get();

            var pers = _ctx.Person.FirstOrDefault(p0 => p0.Id == evt.userId);
            var disc = _ctx.Discussion.FirstOrDefault(d0 => d0.Id == evt.discussionId);

            if (disc == null)
            {
                return;
            }
            var topic = _ctx.Topic.FirstOrDefault(t0 => t0.Id == evt.topicId);

            var s = new StatsEvent();

            s.DiscussionId   = evt.discussionId;
            s.DiscussionName = disc.Subject;

            s.TopicId = evt.topicId;
            if (topic != null)
            {
                s.TopicName = topic.Name;
            }
            else
            {
                s.TopicName = "";
            }

            s.UserId     = evt.userId;
            s.UserName   = pers.Name;
            s.Event      = (int)evt.e;
            s.Time       = startTime.Add(evt.Span);
            s.DeviceType = (int)evt.devType;

            _ctx.AddToStatsEvent(s);
        }
 public StatsCollectRequestBuilder(StatsEvent kevent)
     : this()
 {
     this.Kevent = kevent;
 }
 public static StatsCollectRequestBuilder Collect(StatsEvent kevent)
 {
     return(new StatsCollectRequestBuilder(kevent));
 }