Geoptima 移动网络事件日志收集
摘要
Geoptima 是一款用于收集在蜂窝网络上运行的移动设备上的被动和主动事件的应用程序。事件日志可用于分析用户对移动网络的体验,并帮助跟踪性能问题。例如,在网络的特定区域访问 Facebook 时,iPhone 4 的性能是否优于或劣于 iPhone 5?有关创建此数据的产品的更多信息,请参阅Geoptima的描述。或者观看我在 vimeo 上的原始视频https://vimeo.com/17321571。
此 GraphGist 描述了一种收集和管理瑞典名为“Operator X”的假设移动网络数据的方法。我自己的手机,一部 HTC One,是显示的主要示例设备,但大多数其他信息都是匿名化的。
数据模型
可以使用 graphviz dot 图显示数据模型。

底部的浅色节点表示主要信息载体,即事件的 JSON 编码文件。此模型不管理事件本身,仅管理文件,因为目的是针对每个文件做出关于此数据所属位置的决策。谁应该访问数据,以及如何访问它。管理此规则的规则在绿色子图中管理,图的其余部分为我们将对图执行的查询类型提供了方便的结构。一旦我们看到下面的示例查询,这将变得有意义。
使用 Cypher 构建模型
我们将分阶段构建模型。从最简单的部分开始,用户和项目。可以使用下面的 Cypher 查询构建此子图。
现在我们有一个简单的图,包含一个项目和三个用户,为了方便起见,还包含了用于遍历项目和用户的节点。我们还将用户分配给项目,这意味着访问权限。在实际应用中,访问权限的处理方式要复杂得多,但对于此示例,我们将保持简单,因为我们希望重点关注事件日志数据管理。
可视化方便地将用户着色为蓝色,将项目着色为红色,这是基于我们使用了 Neo4j 2.0 标准将标签分配给节点的事实。在构建更复杂的图之前,让我们执行几个简单的查询。
查询图
我们将在此图上显示一些有用的查询,例如
-
谁有权访问该项目?
-
此项目使用哪些规则来决定数据所有权?
-
“Craig”为多少个设备收集数据?
-
“Craig”收集了多少数据?
-
“Craig”收集数据持续了多少天?
上面只有第一个查询可以在目前的简单图上进行,所以在构建更多内容之前,让我们先尝试一下。
项目
让我们做一个基本的查询。谁有权访问“Operator X”数据?
MATCH (u)-[:su]->(p)
WHERE p.name = 'Operator X'
RETURN u.name AS `Users with access to Operator X data`
三个定义的用户中有两个有权访问“Operator X”数据。
项目分配规则
现在项目的目的是收集数据。我们需要定义要收集哪些数据的规则。让我们从添加两组规则开始,一组根据设备的内部设备标识号,另一组根据设备实际运行的移动网络。在实际网络中,两种类型的规则都普遍使用。
MATCH (project:Project)
WHERE project.name = 'Operator X'
CREATE
(filter_plmn:Filter {name:"Filter PLMN"}),
(filter_devices:Filter {name:"Filter Devices"}),
(f1:FilterPLMN {name:"Operator X", mcc:'240', mnc:'08'}),
(f2:FilterPLMN {name:"My Operator", mcc:'240', mnc:'18'}),
(f3:FilterPLMN {name:"XTele 2", mcc:'240', mnc:'28'}),
(fd:FilterDevices {name:"Test Devices", devices:[
'354436058915420','358506046830281','356451041578183','351503053121388','353328059211902'
]}),
(project)-[:filter]->(filter_plmn),
(project)-[:filter]->(filter_devices),
(filter_plmn)-[:filter]->(f1),
(filter_plmn)-[:filter]->(f2),
(filter_plmn)-[:filter]->(f3),
(filter_devices)-[:filter]->(fd)
现在我们可以问以下问题
-
选择了多少个运营商?
-
还包含了多少个特定的测试设备?
设备管理
到目前为止,我们只查看了用于决定应收集哪些数据的模型。现在让我们看看实际收集的数据。我们将为上面过滤器中列出的设备之一,即我自己的手机,一部标识号为“354436058915420”的 HTC One 设备,建模示例数据。
现在图看起来相当复杂。这实际上是页面顶部 graphviz 示例的完整版本。我们对布局的控制不如 graphviz,因此这更难以理解,但现在我们可以使用 Cypher 查询它。
收集的数据
让我们在此图上尝试两个查询
-
“Craig”收集了多少个事件?
-
“Craig”收集数据持续了多少天?
MATCH (u:User)-[:USED_DEVICE]->(d)-[:ASSOC]->(ds)-[:files]->(f)-[:DATE]->(dd)
WHERE u.name = 'Craig'
RETURN u.name AS Name ,ds.imei AS imei,ds.imsi AS imsi,dd.date AS Date
上述查询回答了第二个问题。我们从用户开始遍历图,穿过该用户使用的设备,以及设备-SIM 卡关联到文件以及文件包含事件的日期。但是,如果我们只想要天数,则不应写入整个表格。相反,我们可以使用 count() 函数,例如
MATCH (u:User)-[:USED_DEVICE]->(d)-[:ASSOC]->(ds)-[:files]->(f)-[:DATE]->(dd)
WHERE u.name = 'Craig'
RETURN count(dd.date) AS `# Days`
现在我们可以看到我们收集了 9 天的数据。
既然我们现在知道如何使用像 count() 这样的函数,让我们尝试另一个函数 sum() 将所有事件文件的事件属性加在一起
MATCH (u:User)-[:USED_DEVICE]->(d)-[:ASSOC]->(ds)-[:files]->(f)-[:DATE]->(dd)-[:JSON]->(json)
WHERE u.name = 'Craig'
RETURN count(json.events) AS `# Events`,sum(json.events) AS `Total Events`,sum(json.events)/count(json.events) AS `Avg Events/File`,min(json.events) AS `Min Events/File`,max(json.events) AS `Maximum Events/File`
因此,我们可以清楚地看到,我们在三个文件中收集了 1005 个事件,每个文件的平均事件数为 335 个。
总结
以上示例是在AmanziTel对Geoptima数据采集系统的数据采集组件进行升级时,作为内部文档的一部分,在进行可能的数据库模型头脑风暴过程中产生的。这不是正在使用的实际数据采集系统的精确模型,但确实代表了实际系统正在执行的一些决策逻辑。使用Neo4j作为数据库,既有利于产品管理的数据建模方面,也有利于实际产品的开发。
此页面是否有帮助?