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; } } }
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; } }
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)); } } } } }