Esempio n. 1
0
        void GetStatsEvents(MessagePrefixesPair msgPfx, Queue <Event> buffer, string loggableId)
        {
            Match m;
            var   msg = msgPfx.Message;

            if ((m = statsConnQualityRegex.Match(msg.Text)).Success)
            {
                string sessionId;
                if (statsIdToSessionId.TryGetValue(loggableId, out sessionId))
                {
                    buffer.Enqueue(new PropertyChange(
                                       msg, sessionId, MeetingsStateInspector.MeetingSessionTypeInfo, "connection quality", m.Groups["value"].Value));
                }
            }
            else if ((m = statsObjectPropRegex.Match(msg.Text)).Success ||
                     (m = statsObjectGoneRegex.Match(msg.Text)).Success)
            {
                var id   = m.Groups["id"].Value;
                var prop = m.Groups["prop"].Value;
                if (prop.Length > 0 && !webRtcStatsObjectAllAllowedProps.Contains(prop))
                {
                    return;
                }
                string sessionId;
                if (!statsIdToSessionId.TryGetValue(loggableId, out sessionId))
                {
                    sessionId = "(no session)";
                }
                Dictionary <string, WebRtcStatsObjectInfo> sessionStatsObjects;
                if (!webRtcStatsObjects.TryGetValue(sessionId, out sessionStatsObjects))
                {
                    webRtcStatsObjects[sessionId] = sessionStatsObjects = new Dictionary <string, WebRtcStatsObjectInfo>();
                }
                WebRtcStatsObjectInfo objInfo;
                if (!sessionStatsObjects.TryGetValue(id, out objInfo))
                {
                    sessionStatsObjects[id] = objInfo = new WebRtcStatsObjectInfo()
                    {
                        stateInspectorObjectId = WebRtcStatsObjectInfo.MakeStateInspectorObjectId(id, loggableId),
                        statsId = loggableId,
                        cluster = new HashSet <string> {
                            id
                        }
                    };
                }
                objInfo.messages.Add(msg);
                if (prop == "type")
                {
                    objInfo.type = m.Groups["value"].Value;
                }
            }
        }
Esempio n. 2
0
        void MergeClusters(WebRtcStatsObjectInfo obj1, WebRtcStatsObjectInfo obj2, Dictionary <string, WebRtcStatsObjectInfo> sessionStatsObjects)
        {
            if (obj1.cluster == obj2.cluster)
            {
                return;
            }
            var newCluster = new HashSet <string>();

            newCluster.UnionWith(obj1.cluster);
            newCluster.UnionWith(obj2.cluster);
            foreach (var id in newCluster)
            {
                sessionStatsObjects[id].cluster = newCluster;
            }
        }
Esempio n. 3
0
        void GetFinalStatsObjectsEvents(Queue <Event> buffer)
        {
            var metaProcessed = webRtcStatsObjectTypesMeta.Select(m => new
            {
                k = m.Key,
                v = m.Value
                    .Select(p => new WebRTCStatsObjectPropertyMeta(p))
                    .ToDictionary(p => p.name)
            }).ToDictionary(x => x.k, x => x.v);

            foreach (var sessionStatsObjects in webRtcStatsObjects.Values)
            {
                foreach (var statsObjEntry in sessionStatsObjects.ToArray())
                {
                    var statsObj = statsObjEntry.Value;
                    if (statsObj.type == null || !metaProcessed.ContainsKey(statsObj.type))
                    {
                        continue;
                    }
                    var    meta = metaProcessed[statsObj.type];
                    string sessionId;
                    if (!statsIdToSessionId.TryGetValue(statsObj.statsId, out sessionId))
                    {
                        continue;
                    }
                    buffer.Enqueue(new ObjectCreation(
                                       statsObj.messages[0], statsObj.stateInspectorObjectId, webRtcStatsObjectObjectType));
                    foreach (var msg in statsObj.messages)
                    {
                        Match m;
                        if ((m = statsObjectPropRegex.Match(msg.Text)).Success)
                        {
                            var prop  = m.Groups["prop"].Value;
                            var value = m.Groups["value"].Value;
                            if (!meta.ContainsKey(prop))
                            {
                                continue;
                            }
                            if (meta[prop].needsEscaping)
                            {
                                value = valuesEscapingRegex.Replace(value, "_");
                            }
                            buffer.Enqueue(new PropertyChange(
                                               msg, statsObj.stateInspectorObjectId, webRtcStatsObjectObjectType, prop,
                                               meta[prop].isLink ?
                                               WebRtcStatsObjectInfo.MakeStateInspectorObjectId(value, statsObj.statsId) :
                                               value,
                                               meta[prop].isLink ?
                                               Analytics.StateInspector.ValueType.Reference :
                                               Analytics.StateInspector.ValueType.Scalar
                                               ));
                            if (meta[prop].isCluster)
                            {
                                foreach (var stateObjId2 in value
                                         .Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries))
                                {
                                    WebRtcStatsObjectInfo statsObj2;
                                    if (sessionStatsObjects.TryGetValue(stateObjId2, out statsObj2))
                                    {
                                        MergeClusters(statsObj, statsObj2, sessionStatsObjects);
                                    }
                                    else
                                    {
                                        sessionStatsObjects[stateObjId2] = statsObj;
                                    }
                                }
                            }
                        }
                        else if ((m = statsObjectGoneRegex.Match(msg.Text)).Success)
                        {
                            buffer.Enqueue(new ObjectDeletion(
                                               msg, statsObj.stateInspectorObjectId, webRtcStatsObjectObjectType));
                        }
                    }
                }
            }
        }